《單片機控制技術項目式課程》(第2版)課件 王璇 項目7-11 模擬電子鬧鐘的設計- STC高性能51單片機的應用設計_第1頁
《單片機控制技術項目式課程》(第2版)課件 王璇 項目7-11 模擬電子鬧鐘的設計- STC高性能51單片機的應用設計_第2頁
《單片機控制技術項目式課程》(第2版)課件 王璇 項目7-11 模擬電子鬧鐘的設計- STC高性能51單片機的應用設計_第3頁
《單片機控制技術項目式課程》(第2版)課件 王璇 項目7-11 模擬電子鬧鐘的設計- STC高性能51單片機的應用設計_第4頁
《單片機控制技術項目式課程》(第2版)課件 王璇 項目7-11 模擬電子鬧鐘的設計- STC高性能51單片機的應用設計_第5頁
已閱讀5頁,還剩361頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

項目7

模擬電子鬧鐘的設計了解常用鍵盤的分類。了解行業標準中電子元器件的規范。掌握鍵盤的工作原理。掌握矩陣鍵盤的識別和控制方法。掌握電子秒表的設計方法。掌握模擬電子鬧鐘的硬件設計和軟件設計方法。能獨立分析和解決硬件設計和軟件設計中的問題。掌握完成工作項目的完整步驟和具體實施方法。能利用團隊的力量完成任務,培養團隊合作精神。學習目標

敘述鍵盤的類別和工作原理;敘述矩陣鍵盤的識別方法;設計秒表的硬件電路和控制程序;設計模擬鬧鐘的硬件電路和控制程序。工作任務

任務7.1鍵盤的應用項目7模擬電子鬧鐘的設計任務7.2電子秒表的設計項目拓展STC89C52實驗板簡易電子琴的設計

項目小結任務7.3模擬電子鬧鐘的設計

鍵盤概述是一種常見的輸入設備,根據按鍵的識別方法分類,鍵盤有編碼鍵盤和非編碼鍵盤兩種。根據鍵盤的結構分類,鍵盤可分為獨立式按鍵鍵盤和行列式按鍵鍵盤。

任務7.1鍵盤的應用

(a)四腳直插式按鍵(b)四腳貼片式按鍵(c)兩腳貼片式按鍵(d)自鎖按鍵單片機與鍵盤的接口及其軟件的任務主要包括以下幾個方面:(1)檢測并判斷是否有鍵按下;(2)按鍵開關的延時去抖動功能;(3)計算并確定按鍵的鍵值;(4)程序根據計算出的鍵值進行一系列的動作處理和執行

7.1.1獨立鍵盤控制LED點亮7.1.1.1獨立鍵盤的工作原理獨立式按鍵鍵盤的每個按鍵都單獨接到單片機的一個I/O口上,通過判斷按鍵端口的電位即可識別按鍵操作。例如:K1鍵的一端接地,另一端接P1.0,當K1鍵按下,P1.0端口就會檢測到低電平“0”信號,否則檢測到的應該是高電平“1”信號。所以一旦查詢到P1.0口為“0”就說明K1鍵按下了,也就是識別了按鍵。

在按鍵被按下或釋放時按鍵會出現抖動現象,這種現象會干擾按鍵的識別。因此需要對按鍵進行消抖動處理,也稱為去抖動。按鍵去抖動一般有硬件和軟件兩種方法。硬件去抖通常采用R-S觸發器或單穩電路構成去抖電路。每一個按鍵都要連接一個硬件去抖動的電路,所以當電路中按鍵較多時電路就顯得十分復雜。硬件去抖判斷按鍵被按下后,加一個10ms的延時程序,待按鍵穩定后,再次檢測按鍵,按鍵仍處于被按下狀態,就可以確認確實有按鍵被按下。軟件去抖

7.1.1.2獨立鍵盤控制LED點亮的設計方法應用實例1:要求K1或K2按下時D1或D2點亮,松開時對應LED熄滅;K3或K4按下并釋放時D3或D4點亮,再次按下并釋放時對應LED熄滅。操作實例源程序編寫如下://宏定義#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint//端口位定義sbitD1=P0^0;sbitD2=P0^1;sbitD3=P0^2;sbitD4=P0^3;sbitK1=P1^0;sbitK2=P1^1;sbitK3=P1^2;sbitK4=P1^3;//延時1ms子程序voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}//按鍵控制LED燈主程序voidmain(){P1=0xFF;//讓P1口處于高電平狀態

P0=0xFF;//讓P0口處于高電平狀態

while(1){D1=K1;//將K1按下后P1.0的值直接送給P0.0去點亮D1D2=K2;//將K2按下后P1.1的值直接送給P0.1去點亮D2if(K3==0)//判斷K3是否按下

{while(K3==0);//等待K3釋放

D3=~D3;}if(K4==0)//判斷K4是否按下

{while(K4==0);//等待K4被釋放

D4=~D4;}DelayMS(10);}}

7.1.1.2獨立鍵盤控制LED的點亮應用實例2:P1.0~P1.3連接了4個獨立按鍵,P0.0~P0.7連接8個LED燈。要求按下K1鍵逐個點亮D1~D8,按下K2鍵點亮D1~D4,按下K3鍵點亮D5~D8,按下K4鍵熄滅D1~D8。源程序編寫如下://宏定義#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint//延時1ms子程序voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}//按鍵控制LED燈主程序voidmain(){uchark,t,Key_State;P1=0xFF;

P0=0xFF;while(1){t=P1;//將鍵值保存起來if(t!=0xFF)//判斷有鍵按下{DelayMS(10);//再次檢查按鍵是否按下,去抖動if(t!=P1)continue;//如果按鍵沒有按下,下一次循環Key_State=~t;//取得4位按鍵值,由1111xxxx變為0000xxxxk=0;//獲取按鍵號kwhile(Key_State!=0){k++;Key_State>>=1;}switch(k){case1:if(P0==0x00)P0=0xFF;P0<<=1;//逐個點亮D1~D8DelayMS(200);break;case2:P0=0xF0;break;//點亮D1~D4case3:P0=0x0F;break;//點亮D5~D8case4:P0=0xFF;//熄滅D1~D8}}}}7.1.2矩陣鍵盤控制數碼管顯示7.1.2.1矩陣鍵盤的工作原理矩陣鍵盤由行線和列線組成,按鍵位于行、列的交叉點上。如圖所示,1個4×4的行、列結構可以構成1個含有16個按鍵的鍵盤。在按鍵數量較多的場合,矩陣鍵盤與獨立鍵盤相比要節省很多I/O口線。7.1.2矩陣鍵盤控制數碼管顯示7.1.2.1矩陣鍵盤的工作原理矩陣鍵盤的按鍵識別方法:掃描法和線反轉法掃描法第一步:識別鍵盤是否有鍵閉合第二步:識別具體閉合的按鍵掃描法線反轉法第一步:將行線編程為輸入線,列線編程為輸出線,并使輸出線輸出為全零電平,則行線中電平由高到低所在行為按鍵所在行。第二步:將行線編程為輸出線,列線編程為輸入線,并使輸出線為全零電平,則列線中電平由高到低所在列為按鍵所在列。綜合一二步的結果可確定按鍵所在行和列,從而識別出所按的鍵。矩陣按鍵鍵盤常用的有2種編碼方式:(1)對于矩陣式鍵盤,按鍵的位置由行號和列號確定,分別對行號和列號進行二進制編碼,然后將兩值合成1個字節,高4位表示行號,低4位表示列號。如12H表示第1行第2列的按鍵。(2)采用依次排列鍵號的方式對按鍵進行編碼。以4×4鍵盤為例,可以將鍵號編碼為:0x00、0x01、0x02、…、0x0D、0x0E、0x0F共16個。對鍵盤的控制方式主要有:定時掃描中斷掃描定時掃描就是每隔一定的時間讀取一次鍵盤I/O口狀態。中斷方式下,當有鍵按下時,就會有一根行線被拉為低電平,經過與門之后就會觸發一次外中斷,這種方式避免了對鍵盤的空掃描,可以提高CPU的效率。任務操作1.任務要求設計一個電路,AT89C51單片機的P1口連接一個4×4矩陣鍵盤,其中P1.0~P1.3為行線,P1.4~P1.7為列線,P0端口連接一只共陰極的一位數碼管,要求按下一只按鍵時在數碼管上顯示器對應的鍵號,如按下K1則顯示“1”,按下K2則顯示“2”……,按下KF則顯示“F”。

7.1.2.2矩陣鍵盤控制數碼管顯示的設計方法2.任務分析鍵號2進制鍵值取反的2進制鍵值取反的16進制鍵值K011101110000100010x11K111101101000100100x12K211101011000101000x14K311100111000110000x18K411011110001000010x21K511011101001000100x22K611011011001001000x24K711010111001010000x28K810111110010000010x41K910111101010000100x42KA10111011010001000x44KB10110111010010000x48KC01111110100000010x81KD01111101100000100x82KE01111011100001000x84KF01110111100010000x88矩陣鍵盤按鍵特征碼值表3.任務設計(1)器件的選擇器件名稱數量(只)AT89C51112MHz晶體122pF瓷片電容210uF電解電容110kΩ電阻11kΩX8排阻1輕觸按鍵16一位共陰極數碼管1矩陣鍵盤設計器件列表(2)硬件原理圖設計(3)軟件程序設計

源程序編寫如下://宏定義#include<reg51.h>#include<intrins.h>#defineucharunsignedchar//0~F的數碼管共陰極段碼表ucharcodeDSY_CODE[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//矩陣鍵盤按鍵特征碼表ucharcodeKeyCodeTable[]={0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,

0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88};//延時子函數voidDelay(){uchari;for(i=0;i<200;i++);}//矩陣鍵盤掃描子函數ucharKeys_Scan()

{ucharsCode,kCode,i,k;

P1=0xF0;//低4位置0,放入四行

if((P1&0xF0)!=0xF0){Delay();if((P1&0xF0)!=0xF0){sCode=0xFE;//行掃描碼初值

for(k=0;k<4;k++)//對4行分別掃描

{P1=sCode;if((P1&0xF0)!=0xF0){kCode=~P1;for(i=0;i<16;i++)//查表得到按鍵序號并返回

if(kCode==KeyCodeTable[i])returni;}elsesCode=_crol_(sCode,1);}}}return-1;}//主函數voidmain()

{ucharKeyNo=-1;//按鍵序號,-1表示無按鍵

while(1){KeyNo=Keys_Scan();//掃描鍵盤獲取按鍵序號KeyNoif(KeyNo!=-1)P0=DSY_CODE[KeyNo];//數碼管顯示按鍵序號}}任務7.2電子秒表的設計1.任務要求設計一只電子秒表,從0秒計到59秒,并用兩只一位的共陰極數碼管實時顯示當前的秒數,按鍵控制秒表的啟動和清零。2.任務分析

采用T0的定時工作方式1,則TMOD=0x01,由于晶體振蕩頻率為12MHz,機器周期就為1us,設置定時時間為50000us(50ms),反復計數20次就為1s。把計數的實時數值用兩只一位的共陰極數碼管顯示,采用靜態的顯示方式,計數值的十位和個位分別顯示在不同的數碼管上即可。在任意的兩根口線上分別連接一只輕觸按鍵,分別控制秒表的啟動和數碼管清零。3.任務設計(1)器件的選擇器件名稱數量(只)AT89C51112MHz晶體122pF瓷片電容210uF電解電容110kΩ電阻11kΩX8排阻1輕觸按鍵1一位共陰極數碼管2電子秒表設計器件列表(2)硬件原理圖設計(3)軟件程序設計

源程序編寫如下://宏定義#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitK1=P3^2;sbitK2=P3^3;//0~9的數碼管共陰極段碼表ucharcodeDSY_CODE[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//延時1ms子程序voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}//定時1s子程序voidsTime(){uinti;TMOD=0x01;//設定時器1為方式0TH0=(65536-50000)/256;//置定時器初值

TL0=(65536-50000)%256;TR0=1;//啟動T1for(i=0;i<=20;){if(TF0==1)//查詢計數溢出

{i++;TF0=0;TH0=(65536-50000)/256;//重新置定時器初值

TL0=(65536-50000)%256;}}return;}//秒表主程序voidmain(){uchars;P0=DSY_CODE[0];

P2=DSY_CODE[0];

K1=1;

K2=1;

while(1)

{if(K1==0)//K1鍵按下

{DelayMS(10);//按鍵去抖動

if(K1==0)//再次檢查按鍵

{for(s=1;s<=60;s++)//從0到59顯示秒數

{P0=DSY_CODE[s/10];//顯示秒的十位

P2=DSY_CODE[s%10];//顯示秒的個位

sTime();//調用1s定時

}

}

}

if(K2==0)

{DelayMS(10);//按鍵去抖動

if(K2==0)//再次檢查按鍵

{P0=DSY_CODE[0];//十位清零

P2=DSY_CODE[0];

//個位清零

}}}}任務7.3矩陣鍵盤控制模擬電子鬧鐘的設計

任務準備

蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。蜂鳴器的驅動電路一般包含以下幾個部分:三極管、蜂鳴器、續流二極管和電源濾波電容。蜂鳴器實物圖蜂鳴器的驅動電路1.任務要求設計一只模擬電子鬧鐘,要求用矩陣鍵盤輸入設置,用4位共陽極的數碼管顯示模擬時間,用蜂鳴器提醒設置的時間已到。具體要求如下:(1)用按鍵K0、K1、K2、K3、K4、K5、K6、K7、K8、K9輸入0000~9999中的任意一個數值作為設定時間,數值的1表示1s,比如輸入0060就表示60s即1分鐘,輸入0600就表示600s即10分鐘。(2)數值由四位共陽極的數碼管動態顯示,實時顯示當前的數值(時間);(3)K10鍵作為開始鍵,按下后設置的數值以1s的時間間隔減1倒數;(4)K11鍵作為取消鍵,按下后取消前面的輸入重新設置;(5)當設置的數值減到0時蜂鳴器報警。2.任務分析采用矩陣鍵盤:用AT89C51的P1.0~P1.3作為矩陣鍵盤的行線,P1.4~P1.7作為列線。采用一只4位的共陽極數碼管,動態地顯示模擬的時間,由于4位最大只能顯示9999,所以顯示的時間范圍是0~9999秒。用AT89C51的P0口連接數碼管的段線,用P2.0~P2.3連接位線。由定時/計數器的中斷來實現1s定時??梢圆捎肨1的8位自動重裝載初值方式2,TMOD為0x20,采用12MHz晶體,設置定時時間為250us中斷,中斷4000次就為1s。鍵盤一位一位地輸入需要設置的時間數值,按下開始鍵后,定時器開始計數,每過1s數值減1,直到數值減為0則啟動蜂鳴器報警。3.任務設計(1)器件的選擇器件名稱數量(只)AT89C51112MHz晶體122pF瓷片電容210uF電解電容110kΩ電阻1510Ω電阻1輕觸按鍵164位共陽極數碼管1BC850B三極管4BC858B三極管1有源蜂鳴器1模擬電子鬧鐘設計器件列表(2)硬件原理圖設計①主函數main():②T1初始化子函數init_time1():初始化定時器1③T1的1s定時減1中斷函數timer1():定時250us

④減1子函數plus():⑤動態顯示子函數display():顯示⑥鍵盤掃描子函數keyscan():矩陣鍵盤掃描⑦延時1ms子程序DelayMS():延時1ms。(3)軟件程序設計:模塊程序設計源程序編寫如下://宏定義#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsbitBEEP=P2^7;//矩陣鍵盤鍵值表ucharcodeKeyCodeTable[]={0x11,0x21,0x41,0x81,0x12,0x22,0x42,0x82,0x14,0x24,0x44,0x84,0x18,0x28,0x48,0x88};//共陽極數碼管段碼表ucharcodeDisplayTable[]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//定義全局變量uchardigbit; //字位ucharwordbuf[4]; //字型碼緩沖區ucharcount; //字型碼緩沖區計數 intt1count; //定時器1計數//延時1ms子程序voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}//鍵盤掃描子函數ucharkeyscan(){ucharsCode,kCode,i,k;P1=0xF0;//低4位行線置0

if((P1&0xF0)!=0xF0) {DelayMS(10); if((P1&0xF0)!=0xF0) {sCode=0xFE;//設置行掃描碼初值

for(k=0;k<4;k++)//對4行分別掃描

{P1=sCode; if((P1&0xF0)!=0xF0) {kCode=~P1; do{P1=0xF0;} //等待按鍵彈起 while((P1&0xF0)!=0xF0);

for(i=0;i<16;i++)//查表得到按鍵序號并返回

if(kCode==KeyCodeTable[i])returni;

}

elsesCode=_crol_(sCode,1);

}

}

}

return-1;}

//減1子函數voidplus() {inti;i=wordbuf[0]*1000+wordbuf[1]*100+wordbuf[2]*10+wordbuf[3];//將千百十個位合成一整數

i--;if(i<=0)//數值減為0時使蜂鳴器響BEEP=0;wordbuf[0]=i/1000;//減1后的數值再分為一位一位的放入數組去顯示

wordbuf[1]=i%1000/100;wordbuf[2]=i%100/10;wordbuf[3]=i%10;}//初始化定時器1函數(定時器1,8位自動重裝載初值模式2,250次計數)voidinit_time1(){TMOD=0x20;TH1=0x06;TL1=0x06;EA=1;ET1=1;TR1=1;}//定時器1,1s定時減1中斷函數

timer1()interrupt3{t1count++;if(t1count==4000) //進入中斷4000次為1s{t1count=0; plus();//調用減1函數

}}//數碼管動態顯示子函數voiddisplay(){uchari;switch(digbit) {case1: i=0; break; case2: i=1; break; case4: i=2; break; case8: i=3; break; default: break; }P2=0x00; //關閉顯示P0=DisplayTable[wordbuf[i]];//送字型碼P2=digbit; //送字位碼

DelayMS(2);if(digbit<0x08) //共4位digbit=digbit*2; //左移一位elsedigbit=0x01;}

//主函數voidmain(){intm,j,key;count=0; //初始沒有輸入,計數器設為0for(j=0;j<4;j++) //剛加電時,初始0000wordbuf[j]=0;while(count<5){ key=keyscan(); //調用鍵盤掃描函數

if(key>=0&&key<10)m=1; //輸入0~9 elseif(key==10)m=2; //開始倒計時鍵

elseif(key==11)m=3; //取消鍵

elsem=4; //其他按鍵

switch(m){ case1:if(count<4) {wordbuf[count]=key; //將按鍵序號即數字存入數組

P0=DisplayTable[key];//每次輸入一個數字時4位都顯示該數

count++; }break; case2:count=5; //按下開始鍵就跳出此循環

break; case3:count=0; //計數清零

for(j=0;j<4;j++) {wordbuf[j]=0; //數碼管顯示0000 P0=DisplayTable[0]; } break; default:break;}}digbit=0x01;init_time1(); //打開T1的1s計時while(1){display(); } //調用動態顯示}項目拓展STC89C52實驗板簡易電子琴的設計

在實驗板上設計一個簡易的電子琴,具體要求:按K1鍵發1音,按K2鍵發2音……按K8鍵發高音1。由蜂鳴器來發出相應的音調。1.任務要求2.任務分析音樂主要是由音符和節拍決定的,“哆、唻、咪、法、嗦、啦、唏”音符對應于不同的聲波頻率,而節拍則表達的是聲音持續的時間。通過控制單片機定時器的定時時間可以產生不同頻率的方波,用于驅動無源蜂鳴器就能發出不同的音符,然后利用延時子程序來控制發音時間的長短,即可控制節拍。把樂譜中的音符和相應的節拍變換成定時常數和延時常數,做成數據表格存放在存儲器中。由程序查表得到定時常數和延時常數,用1個定時器控制產生方波的頻率,用延時程序控制發出該頻率方波的持續時間。當延時時間到后再查詢下1個音符的定時常數和延遲常數,依次進行下去即可。發音原理:在方式1的定時狀態下,改變定時器的計數初值來產生不同的頻率。音符(低音)頻率/Hz簡譜碼(T值)音符(中音)頻率/Hz簡譜碼(T值)音符(高音)頻率/Hz簡譜碼(T值)低126263628152364580高1104765058低229463835258764684高2117565110低333064021365964777高3131965157低434964103469964820高4139765178低539264260578464898高5156965127低644064400688064968高6176065252低749464524798865030高7197665283C調音符、頻率、定時常數關系表用杜邦線將單片機外圍的J22的3腳與J42的7腳連接,就用P1.2控制喇叭的發聲了;J26連接8只獨立按鍵K1~K8,見“獨立按鍵”電路,用杜邦線將J22的10~17腳與J26連接上,這樣就用P3口控制8只獨立按鍵。3.任務設計簡易電子琴源程序如下://宏定義#include<reg52.h>#defineKeyPortP3//定義全局變量unsignedcharHigh,Low;//定時器預裝值的高8位和低8位sbitSPK=P1^2;//定義喇叭接口unsignedcharcodefreq[][2]={0x44,0xFC,//523Hz“1”

0xAC,0xFC,//587Hz“2”

0x09,0xFD,//659Hz“3”

0x34,0xFD,//699Hz“4”

0x82,0xFD,//784Hz“5”

0xC8,0xFD,//880Hz“6”

0x06,0xFE,//988Hz“7”

0x22,0xFE,//1047Hz“高1”}//函數聲明voidInit_Timer0(void);//初始化定時器//主函數voidmain(void){unsignedcharnum;Init_Timer0();//初始化定時器0SPK=0;//在未按鍵時,喇叭低電平,防止長期高電平損壞喇叭while(1)//主循環

{switch(KeyPort) {case0xfe:num=1;break; case0xfd:num=2;break; case0xfb:num=3;break; case0xf7:num=4;break; case0xef:num=5;break; case0xdf:num=6;break; case0xbf:num=7;break; case0x7f:num=8;break; default:num=0;break; }

if(num==0){TR0=0;SPK=0;//在未按鍵時,喇叭低電平,防止長期高電平損壞喇叭

}else{High=freq[num-1][1]; Low=freq[num-1][0]; TR0=1; }}}//定時器0初始化子程序voidInit_Timer0(void){TMOD=0x01; //使用模式1,16位定時器EA=1;//總中斷打開

ET0=1;//定時器中斷打開

TR0=1;//定時器開關打開}//定時器中斷子程序voidTimer0_isr(void)interrupt1{TH0=High;TL0=Low;SPK=!SPK;}項目小結鍵盤有編碼鍵盤和非編碼鍵盤兩種。非編碼鍵盤又分為獨立鍵盤和矩陣(行列式)鍵盤。獨立鍵盤的識別比較簡單,通過判斷按鍵端口的電位即可識別按鍵操作,但獨立鍵盤比較浪費端口線。矩陣鍵盤節約了端口線,比如8根端口線就可以控制16個按鍵,但是它的識別方法相對復雜一些。對按鍵的識別矩陣鍵盤的按鍵識別方法有掃描法和線反轉法。按鍵應用時一定要去抖動一般有硬件去抖和軟件去抖兩種方法。我們一般采用軟件去抖動的方法,在識別按鍵后延時10ms后再次進行識別。應用鍵盤、數碼管和單片機的定時/計數器、中斷等知識我們在本項目中主要學習了電子秒表和電子鬧鐘的設計方法。在項目拓展中學習了運用單片機的定時/計數器和蜂鳴器實現樂音的方法。

項目8單片機通信系統的設計了解串行通信的基本知識。了解RS-232C接口。了解MCS-51系列單片機串行口的組成。掌握MCS-51系列單片機串行口的工作原理及應用方法。掌握MCS-51系列單片機串行口工作電路的分析與設計方法。掌握單片機與PC串行口通信系統的設計方法。能熟練編寫單片機串行口通信的發送和接收數據的程序。能獨立分析和解決硬件設計和軟件設計中的問題。能利用團隊的力量完成任務,培養團隊合作精神。學習目標敘述RS-232C串行通信接口標準;敘述51單片機的串行口工作原理;設計單片機與單片機之間的通信電路和工作軟件;設計單片機與PC機之間的通信電路和工作軟件。工作任務任務8.1MCS-51單片機之間的串行通信設計任務8.2單片機與計算機通信系統的設計項目拓展STC89C52實驗板串口和USB口軟件下載的設計項目小結項目8單片機通信系統的設計任務8.1MCS-51系列單片機之間的串行通信設計

CPU與外部的信息交換稱為通信?;镜耐ㄐ欧绞接袃煞N:并行通信和串行通信8.1.1RS232串行通信標準

8.1.1.1串行通信

并行通信是數據的各位同時發送或同時接收;并行通信優點:傳送速度快

缺點:不便長距離傳送串行通信優點:便于長距離傳送

缺點:傳送速度較慢串行通信是數據的各位依次逐位發送或接收。1.串行通信的分類(1)異步通信(AsynchronousCommunication)

異步通信中數據是以字符為單位組成字符幀傳送,每一幀數據低位在前,高位在后。發送端和接收端可由各自獨立的時鐘來控制數據的發送和接收,互不同步。字符幀格式:異步通信的重要指標。接收端依靠字符幀格式來判斷發送端發送的開始和結束。優點:對硬件要求較低,實現較簡單、靈活,適用于數據的隨機發送/接收。缺點:工作速度較低,每個字節都要建立一次同步(額外附加兩位)。單片機主要采用異步通信方式。

字符幀(CharacterFrame)也叫數據幀,由起始位、數據位、奇偶校驗位和停止位等4部分組成。

起始位:位于字符幀開頭,只占1位,為邏輯“0”電平,用于向接收設備表示發送端開始發送一幀信息。

數據位:D0~D7緊跟起始位之后,用戶根據情況可取5~8位,低位在前,高位在后。

奇偶校驗位:位于數據位之后,僅占1位,用來表征串行通信中采用奇校驗還是偶校驗,由用戶決定。

停止位:位于字符幀最后,為邏輯“1”電平。通??扇?位、1.5位或2位,用于向接收端表示一幀字符信息已經發送完,也為發送下一幀作準備。圖8.1串行異步通信的字符幀格式(a)無空閑位字符幀(b)有空閑位字符幀(2)同步通信(SynchronousCommunication)

同步通信是指在發送設備和接收設備同步時鐘頻率的情況下,發送設備先發送串行通信數據同步信號給接收設備,接收設備接收到同步信號后,開始進行串行數據塊的傳送,當串行數據塊傳送完畢時,發送設備發送結束串行通信同步數據,停止串行通信。優點:數據傳輸速率較高,通常可達56000b/s或更高。

缺點:要求發送時鐘和接收時鐘必須保持嚴格同步。圖8.2串行同步通信的數據塊格式2.串行通信的波特率(BaudRate)

波特率:每秒鐘傳送二進制數碼的位數,也叫比特數,單位為b/s,即位/秒。波特率表征數據傳輸的速度,波特率越高,數據傳輸速度越快。字符的實際傳輸速率是每秒內所傳字符幀的幀數,和字符幀格式有關。異步通信的波特率通常為50~9600b/s,同步通信的波特率可達56kb/s或更高。

3.串行通信方式(制式)

串行通信根據數據傳送的方向及時間關系可分為單工、半雙工和全雙工三種制式。

單工制式(Simplex)單工制式是指甲乙雙方通信時只能單向傳送數據,發送方和接收方固定。半雙工制式(HalfDuplex)半雙工制式是指通信雙方都具有發送器和接收器,既可發送也可接收,但不能同時接收和發送,發送時不能接收,接收時不能發送。全雙工制式(FullDuplex)全雙工制式指通信雙方均設有發送器和接收器,并且信道劃分為發送信道和接收信道,因此全雙工制式可實現甲乙雙方同時發送和接收數據,發送時能接收,接收時也能發送。4.串行通信協議串行通信的格式及約定(如:同步方式、通訊速率、數據塊格式、信號電平……等)不同,形成了多種串行通信的協議與接口標準:?通用異步收發器(UART)——本課程介紹的串口?通用串行總線(USB)?I2C總線?CAN總線?SPI總線?RS-485,RS-232C,RS422A標準……等等異步通信的硬件電路稱為UART,即通用異步接收器/發送器(UniversalAsychronousReceiver/Transmitter)同步通信的硬件電路稱為USRT(UniversalSychronousReceiver/Transmitter)異步和同步通信共用的硬件電路稱為USART(UniversalSychronousAsychronousReceiver/Transmitter)8.1.1.2RS-232C簡介

RS-232C的全稱是EIARS232C標準,EIA(ElectronicIndustryAssociation)代表美國電子工業協會,RS(RecommendedStandard)代表EIA的“推薦標準”,232為標識號。

RS-232C主要用來定義計算機系統的一些數據終端設備(DTE)和數據電路終接設備(DCE)之間的電氣性能。例如:CRT、打印機與CPU的通信

MCS-51單片機與PC機的通信

RS-232C適用范圍:設備間的通信距離不大于15m

傳輸速率最大為20kb/s

1.?RS-232C信息格式標準

RS-232C采用串行格式。標準規定:信息的開始為起始位,信息的結束為停止位;信息本身可以是5、6、7、8位再加一位奇偶校驗位。如果兩個信息之間無信息,則寫“1”,表示空。RS-232C信息格式

2.?RS-232C引腳定義

RS-232C接口規定使用25針“D”型口連接器?,F在微型計算機通信中,常用的只有9根信號引腳,所以用9針“D”型接口(DB9)連接器替代25針連接器。

DB9連接器的引腳排列插針序號信號名稱功能1PGND保護接地2(3)TXD發送數據(串行輸出)3(2)RXD接收數據(串行輸入)4(7)RTS請求發送RTS(輸出)5(8)CTS消除發送CTS(輸入)6(6)DSRDCE就緒(數據建立就緒)7(5)SGND信號接地8(1)DCD載波檢測20(4)DRTDTE就緒(數據終端準備就緒)22(9)RI振鈴指示表8.1RS-232C標準接口主要引腳定義

注:插針序號()內為9針非標準連接器的引腳號。

3.RS-232C電器特性

RS-232C的電氣標準采用負邏輯:

邏輯“0”:+5V~+15V

邏輯“1”:-5V~-15V

注意:RS-232C必須進行電平轉換后才能和TTL電平直接相連,否則將把TTL電路燒壞。

RS232與TTL之間的電平轉換目前多采用MAX232、MAX220、HIN232等芯片,它們同時集成了RS-232電平與TTL電平之間的互換。第一部分是電荷泵電路。由1、2、3、4、5、6腳和4只電容構成。功能是產生+12v和-12v兩個電源,提供給RS-232串口電平的需要。第二部分是數據轉換通道。由7、8、9、10、11、12、13、14腳構成兩個數據通道。其中13腳(R1IN)、12腳(R1OUT)、11腳(T1IN)、14腳(T1OUT)為第一數據通道。

8腳(R2IN)、9腳(R2OUT)、10腳(T2IN)、7腳(T2OUT)為第二數據通道。

TTL/CMOS數據從T1IN、T2IN輸入轉換成RS-232數據從T1OUT、T2OUT送到電腦DP9插頭;DP9插頭的RS-232數據從R1IN、R2IN輸入轉換成TTL/CMOS數據后從R1OUT、R2OUT輸出。第三部分是供電。15腳DNG、16腳VCC(+5v)。TTL/CMOSINPUTS端口:輸入TLL或CMOS信號,一般為0-5V,低電平為零,高電平為VCC。TTL/CMOSOUTPUTS端口:輸出TLL或CMOS信號,輸出電壓一般為0-5V,低電平為零,高電平為VCC。RS232OUTPUTS

端口:把TTL或CMOS的信號轉為RS232的信號輸出,輸出為正負12V連接到電腦。RS232INPUTS端口:接收到電腦發出的正負12伏,由RS232輸出轉為TTL或CMOS信號。MAX232內部有二組RS232轉換電路,使用時

11-----14

13----12為一組.10-----7

8----9為一組圖8.7MAX232通信接口電路8.1.2MCS-51單片機串行口的工作原理

51單片機內部有一個可編程的全雙工的異步串行通信接口,它通過數據接收引腳RXD(P3.0)和數據發送引腳TXD(P3.1)與外設進行串行通信,可以同時發送和接收數據。這個串行口既可以實現異步通信,又可以用于網絡通信,還可以作為同步移位寄存器使用。其幀格式有8位、10位和11位,并能設置各種波特率。

1.串行口內部結構串行口包含的特殊功能寄行器有SBUF、SCON、PCON51系列單片機串行口的結構框圖(1)串行口數據緩沖器SBUF在邏輯上只有一個,既表示發送寄存器,又表示接收寄存器,具有同一個單元地址99H,用同一寄存器名SBUF。在物理上有兩個,一個是發送緩沖寄存器,另一個是接收緩沖寄存器。

發送時,只需將發送數據輸入SBUF,CPU將自動啟動和完成串行數據的發送;

接收時,CPU將自動把接收到的數據存入SBUF,用戶只需從SBUF中讀出接收數據。

SBUF=0xFF

啟動一次數據發送,可向SBUF

再發送下一個數

P1=SBUF

完成一次數據接收,SBUF可再接收下一個數(2)串行口控制寄存器SCON

SCON用來控制串行口的工作方式和狀態,可以位尋址,字節地址為98H。單片機復位時,SCON的所有位全為0。圖8.9SCON的各位定義

SM0、SM1:串行方式選擇位,其定義如表8.2所示。

表8.2串行口方式的定義

SM2:多機通信控制位,用于方式2和方式3中。在方式2、3處于接收方式時,若SM2=1,且接收到的第9位數據RB8為0,則不激活RI;若SM2=1,且RB8=1,則置RI=1。在方式2、3處于接收或發送方式時,若SM2=0,則不論接收到的第9位RB8為0還是為1,TI、RI都以正常方式被激活。在方式1處于接收時,若SM2=1,則只有當收到有效的停止位后,RI才置1。在方式0中,SM2應為0。

REN:允許串行接收位。它由軟件置位或清零。REN=1時,允許接收;REN=0時,禁止接收。

TB8:發送數據的第9位。在方式2和方式3下,TB8由軟件置位或復位,可用做奇偶校驗位。在多機通信中,TB8可作為區別地址幀或數據幀的標識位:地址幀時TB8為1;數據幀時TB8為0。

RB8:接收數據的第9位。功能同TB8。

TI:發送中斷標志位。在方式0下,發送完8位數據后,TI由硬件置位;在其它方式中,TI在發送停止位之初由硬件置位。TI是發送完一幀數據的標志,可以用指令查詢是否發送結束。TI=1時,也可向CPU申請中斷,響應中斷后,必須由軟件清除TI。RI:接收中斷標志位。在方式0下,接收完8位數據后,RI由硬件置位;在其它方式中,RI在接收停止位的中間由硬件置位。同TI一樣,也可以通過指令查詢是否接收完一幀數據。RI=1時,也可申請中斷,響應中斷后,必須由軟件清除RI。(3)電源及波特率選擇寄存器PCON

PCON主要是為CHMOS型單片機的電源控制而設置的專用寄存器,不可以位尋址,字節地址為87H。在HMOS的8051單片機中,PCON除了最高位以外,其它位都是虛設的。只有SMOD與串行通信有關。SMOD為波特率選擇位。在方式1、2和3下,串行通信的波特率與SMOD有關。當SMOD=1時,通信波特率乘2;當SMOD=0時,波特率不變。

2.串行口的工作方式(1)

方式0在方式0下,串行口作為同步移位寄存器使用,其波特率固定為fosc/12。串行數據從RXD(P3.0)端輸入或輸出,同步移位脈沖由TXD(P3.1)送出。移位數據的發送和接收以8位為一幀,不設起始位和停止位,無論輸入/輸出,均低位在前高位在后。

這種方式常用于擴展I/O口。

①方式0用于擴展輸出口(發送)當一個數據寫入串行口發送緩沖器SBUF時,串行口將8位數據以fosc/12的波特率從RXD引腳輸出(低位在前),發送完置中斷標志TI為1,請求中斷。在再次發送數據之前,必須由軟件清TI為0。74LS164為串入并出移位寄存器(SIPO)。圖8.12方式0擴展輸出口電路應用實例1:用單片機的串行口外接74LS164,控制8只LED滾動顯示。源程序:#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintvoidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}voidmain(){ucharc=0x80;SCON=0x00;//串行模式0TI=0;//TI清零

while(1){c=_crol_(c,1);SBUF=c;while(TI==0);TI=0;DelayMS(400);}}

②方式0用于擴展輸入口(接收)在滿足REN=1和RI=0的條件下,串行口即開始從RXD端以fosc/12的波特率輸入數據(低位在前),當接收完8位數據后,置中斷標志RI為1,請求中斷。在再次接收數據之前,必須由軟件清RI為0。具體接線圖如圖8.15所示。其中,74LS165為并入串出移位寄存器(PISO)。串行控制寄存器SCON中的TB8和RB8在方式0中未用。值得注意的是,每當發送或接收完8位數據后,硬件會自動置TI或RI為1,CPU響應TI或RI中斷后,必須由用戶用軟件清0。方式0時,SM2必須為0。圖8.15方式0擴展輸入口電路應用實例2:用74LS165連接的8位撥碼開關從單片機串行口輸入控制8只LED的顯示。

while(1){SPL=0;//置數,讀入并行輸入8位數據

SPL=1;//移位,輸入封鎖,串行轉換

while(RI==0);//未收到等待

RI=0;P0=SBUF;DelayMS(20);}}源程序:#include<reg51.h>#include<intrins.h>#include<stdio.h>#defineucharunsignedchar#defineuintunsignedintsbitSPL=P2^5;voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}voidmain(){SCON=0x10;//串行模式0,允許串口接收(2)方式1工作在方式1時,串行口為波特率可調的10位通用異步接口UART。發送或接收的一幀信息包括1位起始位0,8位數據位和1位停止位1。圖8.17串行口方式1的數據格式

①發送發送時,數據從TXD端輸出,當數據寫入發送緩沖器SBUF后,啟動發送器發送。當發送完一幀數據后,置中斷標志TI為1。方式1所傳送的波特率取決于定時器1的溢出率和PCON中的SMOD位。

②接收接收時,由REN置1,允許接收,串行口采樣RXD,當采樣由1到0跳變時,確認是起始位“0”,開始接收一幀數據。當RI=0,且停止位為1或SM2=0時,停止位進入RB8位,同時置中斷標志RI;否則信息將丟失。所以,采用方式1接收時,應先用軟件清除RI或SM2標志。

③波特率方式1波特率可變,由定時/計數器T1的計數溢出率決定。波特率=2SMOD×(T1溢出率)/32

其中SMOD為PCON寄存器中最高位的值,SMOD=1表示波特率倍增。在實際應用時,通常是先確定波特率,后根據波特率求T1定時初值,因此上式又可寫為:

X=256-2SMOD/32×fosc/(12×波特率)表8.3定時器1產生的常用波特率(3)方式2方式2下,串行口為11位UART,傳送波特率與SMOD有關。發送或接收的一幀數據包括1位起始位0,8位數據位,1位可編程位(用于奇偶校驗)和1位停止位1。圖8.20方式2的數據格式

可編程位TB8/RB8既可作奇偶校驗位用,也可作控制位(多機通信)用,其功能由用戶確定。

波特率:方式2波特率固定,即fosc/32和fosc/64。如用公式表示則為:波特率=2SMOD╳fosc/64當SMOD=0時,波特率=20

╳fosc/64=fosc/64當SMOD=1時,波特率=21

╳fosc/64=fosc/32(4)方式3方式3為波特率可變的11位UART通信方式。除了波特率不同以外,方式3和方式2完全相同。注意:單片機進行多機通信時常常采用串行口的工作方式2或工作方式3。

(5)串行口四種工作方式的比較四種工作方式的區別主要表現在幀格式及波特率兩個方面。工作方式幀格式波特率方式08位全是數據位,沒有起始位、停止位固定,每個機器周期傳送一位數據方式110位沒,其中1位起始位,8位數據位,1位停止位不固定,取決于T1溢出率和SMOD方式211位,其中1位起始位,9位數據位,1位停止位固定,即2SMOD×fosc/64方式3同方式2同方式13.串行口的初始化

51單片機的串行口需初始化后,才能完成數據的輸入、輸出。其初始化過程如下:(1)按選定串行口的工作方式設定SCON的SM0、SM1兩位二進制編碼。(2)對于工作方式2或3,應根據需要在TB8中寫入待發送的第9位數據。(3)若選定的工作方式不是方式0,還需設定接收/發送的波特率。(4)設定SMOD的狀態,以控制波特率是否加倍。(5)若選定工作方式1或3,則應對定時器T1進行初始化以設定其溢出率。

例:51單片機的晶振頻率為11.0592MHz,波特率為1200b/s,要求串口發送數據為8位,編寫它的初始化程序。解:假設SMOD=1,T1工作在方式2。初始化程序如下:SCON=0x50;//串口工作于方式1 PCON=0x80;//SMOD=1 TMOD=0x20;//T1工作于方式2定時方式 TH1=0xD0;//設置時間常數(根據公式計算得來或查表) TL1=0xD0;//自動重裝時間常數 TR1=1;//啟動T1

8.1.3單片機之間的雙機串行通信的設計方法

8.1.3.1單片機之間的通信

1.雙機通信距離較近的兩個MCS-51單片機系統可以將它們的串行口直接相連,實現雙機通信。為了增加通信距離,減少通道和電源干擾,可以在通信線路上利用RS-232C等標準接口進行雙機通信。圖8.23單片機雙機通信系統

51單片機串行口的方式2和方式3有一個專門的應用領域,即多機通信。所謂多機通信是指一臺主機和多臺從機之間的通信,構成主從式多機分布通信系統。主機發送的信息可以傳輸到各個從機,各從機只能向主機發送信息,從機之間不能進行相互通信。

2.多機通信

圖8.24單片機多機通信系統單片機作為下位機,主要實現數據采集、檢測與控制等功能。PC機通常作為上位機接收下位機采集的各種數據,并進行數據運算、處理與管理等功能,同時向下位機發出各種指令。通常PC機工作于查詢方式,而51單片機既可以工作于查詢方式,又可以工作于中斷方式。因此,實現PC機與用單片機間數據通信是十分重要的。PC機與單片機之間可以由RS-232C等標準接口相連。

3.單片機和計算機機之間的通信

8.1.3.2MCS-51系列單片機之間的雙機串行通信設計

1.任務要求甲機發送數據,乙機接收數據,甲機的K1按鍵通過串口發送信息控制乙機的LED燈D3和D4閃爍:①第一次按下K1鍵,甲機發送字符“A”,甲機的D1和乙機的D3都閃爍;②第二次按下K1鍵,甲機發送字符“B”,甲機的D2和乙機的D4都閃爍;③第三次按下K1鍵,甲機發送字符“C”,甲機的D1、D2和乙機的D3、D4都閃爍;④第四次按下K1鍵,甲機停止發送,甲機的D1、D2和乙機的D3、D4都停止閃爍。2.任務分析首先要根據任務的要求將兩機串行口工作的方式和其中的參數設置好。兩機的串行口

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論