第十章 單片機典型模塊應用_第1頁
第十章 單片機典型模塊應用_第2頁
第十章 單片機典型模塊應用_第3頁
第十章 單片機典型模塊應用_第4頁
第十章 單片機典型模塊應用_第5頁
已閱讀5頁,還剩102頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第十章第十章 單片機典型模塊應用單片機典型模塊應用1、任務:點亮LED燈在在KeilKeil軟件編輯窗口輸軟件編輯窗口輸入以下程序:入以下程序:#include sbit P3_0=P30;void main(void) while(1) P3_0=0; 2、AT89S51單片機最小系統(tǒng)介紹單片機要工單片機要工作必須具備作必須具備以下條件:以下條件:(1 1)+5V+5V電電源;(源;(2 2)起振電路;起振電路;(3 3)復位)復位電路;電路;(4 4)一塊)一塊正常的單片正常的單片機。機。注意:注意:另外P0 口要加上拉電阻,才有足夠的驅(qū)動能力驅(qū)動外圍器件工作;EA接高電平,表示單片機使用

2、的是片內(nèi)FLASH ROM。3、任務:閃爍燈#include void delay02s(void) unsigned char i,j,k; for(i=20;i0;i-) for(j=20;j0;j-) for(k=248;k0;k-); void main(void) while(1) P3_0=0; delay02s(); P3_0=1; delay02s(); 要求:前面例子是讓要求:前面例子是讓LEDLED燈亮,燈亮,現(xiàn)在實現(xiàn)現(xiàn)在實現(xiàn)LEDLED燈的閃爍。燈的閃爍。4、任務:流水燈要求:要求:做廣告燈的左移右移,八個發(fā)光二極管分別接在單片機的P3.0P3.7 接口上,輸出“0”時,

3、發(fā)光二極管亮,左移右移按D1D2D3D4D8D7D6 D1 亮,重復循環(huán)。4、任務:流水燈程序:程序:#include unsigned char i; unsigned char temp; void delay(void) /延時子程序延時子程序 unsigned char m,n,s; for(m=20;m0;m-) for(n=20;n0;n-) for(s=248;s0;s-); void main(void) /主程序主程序 while(1) /循環(huán)條件永遠為真,以下程序一直執(zhí)行下去。循環(huán)條件永遠為真,以下程序一直執(zhí)行下去。 續(xù)前頁:續(xù)前頁: temp=0 x7f; P3=temp

4、; /直接對直接對I/O口口P3賦值,使賦值,使P3.7輸出低點平。輸出低點平。delay(); /延時延時for(i=1;i1)|0 x80; P3=temp;delay(); temp=0 xfe; P3=temp;delay(); for(i=1;i8;i+) /實現(xiàn)廣告燈的從實現(xiàn)廣告燈的從D7到到D1移動移動 temp=(temp1)|0 x01; P3=temp;delay(); 思考:如何實現(xiàn)更為復雜的花樣燈?參考程序:參考程序:#include reg51.h#define uchar unsigned charconst uchar tab= 0 xfe,0 xfd,0 xfb

5、,0 xf7,0 xef,0 xdf,0 xbf,0 x7f, /下移下移 0 xbf,0 xdf,0 xef,0 xf7,0 xfb,0 xfd,0 xfe, /上移上移 0 xef,0 xbd,0 xdb,0 xfe, /兩邊向中間移兩邊向中間移 0 xdb,0 xbd,0 xef, /中間向兩邊移中間向兩邊移 0 xaa,0 x55,0 xaa,0 x55,0 xaa,0 x55, /1357,2468交替交替3次次 0 xf0,0 x0f,0 xf0,0 x0f, /1234,5678交替交替2次次 0 x33,0 xcc,0 x33,0 xcc,0 x33,0 xcc, /1256,

6、3478交替交替3次次 0 x00 ; /結束碼結束碼uchar t=0;/以下初始化子函數(shù)以下初始化子函數(shù)/void sys_init(void) TMOD=0 x01; TH0=0 xd8; 續(xù)前頁:續(xù)前頁: TL0=0 xef; ET0=1; EA=1; TR0=1;/以下主函數(shù)以下主函數(shù)/void main(void) uchar i=0; P3=tabi;i+; sys_init(); while(1) while(t100); t=0; if(tabi=0 x00) i=0; P3=tabi;i+; 續(xù)左頁:續(xù)左頁:/以下定時器以下定時器0中斷函數(shù)中斷函數(shù)/void timer0(

7、void) interrupt 1 TR0=0; TH0=0 xd8; TL0=0 xef; t+; TR0=1;5、任務:按鍵識別要求:要求:通過按下一次按鍵通過按下一次按鍵INT0INT0,使小燈,使小燈D1 D1 亮滅交替變換。亮滅交替變換。實驗原理:實驗原理:只要判斷只要判斷P3.2 的電平就可的電平就可以知道按鍵是否被按下;以知道按鍵是否被按下;而在按鍵按下的過程中,而在按鍵按下的過程中,由于機械抖動,將產(chǎn)生干由于機械抖動,將產(chǎn)生干擾,電平高低變化擾,電平高低變化。可以可以采用軟件濾波的方法去除采用軟件濾波的方法去除這些干擾信號,在程序設這些干擾信號,在程序設計時,一旦發(fā)現(xiàn)計時,一旦

8、發(fā)現(xiàn)P3.2 為低為低電平,進入按鍵判斷狀態(tài)電平,進入按鍵判斷狀態(tài),軟件延時,軟件延時10-20ms,從,從而避開了干擾信號區(qū)域,而避開了干擾信號區(qū)域,再重新檢測再重新檢測P3.2 狀態(tài),看狀態(tài),看按鍵是否真的已經(jīng)按下。按鍵是否真的已經(jīng)按下。參考程序:參考程序:include sbit INT_0=P32; /定義按鍵的輸入端定義按鍵的輸入端 sbit D1=P30; /D1小燈定義小燈定義void delay10ms(void) /延時程序延時程序 unsigned char i,j; for(i=20;i0;i-) for(j=248;j0;j-); key( ) /按鍵判斷程序按鍵判斷程

9、序 if(INT_0=0) /判斷是否按下鍵盤判斷是否按下鍵盤 delay10ms( ); /延時延時,軟件去干擾軟件去干擾if(INT_0=0) /確認按鍵按下確認按鍵按下 D1=!D1; /D1亮滅交替變化亮滅交替變化 while(INT_0=0);/按鍵鎖定按鍵鎖定,每按一次每按一次D1只變化一次只變化一次 續(xù)前頁:續(xù)前頁: main()while(1) /永遠循環(huán)永遠循環(huán),掃描判斷按鍵是否按下掃描判斷按鍵是否按下 key(); /對于此處對于此處CPU只按鍵判斷只按鍵判斷 一直掃描一直掃描;課后請實踐:1.1.用兩個按鍵來控制用兩個按鍵來控制D1 D1 的亮滅;的亮滅;2. 2. 使用

10、一個按鍵,控制小燈亮的順序使用一個按鍵,控制小燈亮的順序D1D2D3D4D8D7D1D2D3D4D8D7D0 D0 亮重復循環(huán);亮重復循環(huán);6、任務:數(shù)碼管靜態(tài)顯示要求:要求:用數(shù)碼管用數(shù)碼管LED LED 的個位,靜態(tài)顯示數(shù)字的個位,靜態(tài)顯示數(shù)字“4”4”字樣字樣;注意:因采用共陰數(shù)碼顯示管,故此圖因采用共陰數(shù)碼顯示管,故此圖P0P0口還應接口還應接1K1K或或10K10K的排阻作為上拉電阻。的排阻作為上拉電阻。參考程序:參考程序:#include sbit GE=P13;code unsigned char seg7code10=0 x3f,0 x06,0 x5b,0 x4f,0 x66,

11、0 x6d,0 x7d,0 x07,0 x7f,0 x6f; /顯示段碼顯示段碼main() unsigned char display_date=4; /定義并賦值要顯示的數(shù)據(jù)定義并賦值要顯示的數(shù)據(jù)while(1) P0=seg7codedisplay_date; /查表查表,輸出輸出 GE=0; /P13為低電平為低電平,相當于把數(shù)碼管的相當于把數(shù)碼管的4H端接地端接地課后請實踐:1.1.讓顯示的數(shù)據(jù)動起來,比如做一個讓顯示的數(shù)據(jù)動起來,比如做一個0 0 到到9 9 的秒表(用軟件延時);的秒表(用軟件延時);2.2.和按鍵判斷程序結合,用按鍵控制數(shù)字變化;和按鍵判斷程序結合,用按鍵控制數(shù)

12、字變化;7、任務:數(shù)碼管動態(tài)顯示要求:要求:用數(shù)碼管用數(shù)碼管LED LED 的顯示四位數(shù)據(jù),比如顯示數(shù)字的顯示四位數(shù)據(jù),比如顯示數(shù)字“1234”1234”;參考程序:參考程序:#include sbit qian=P10;sbit bai=P11;sbit shi=P12;sbit ge=P13;code unsigned char seg7code10=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f; /顯示段碼顯示段碼void Delay(unsigned int tc) /延時程序延時程序while( tc != 0

13、 )/如果如果tc為為0則終止延時則終止延時unsigned int i;/局部正整數(shù)變量局部正整數(shù)變量 ifor(i=0; i100; i+);/執(zhí)行執(zhí)行400次將耗時次將耗時1毫秒毫秒tc-;/tc計數(shù)減一計數(shù)減一續(xù)前頁:續(xù)前頁:void Led(int date) /顯示函數(shù)顯示函數(shù)qian=0; /P1.0輸出低電平,選通千位數(shù)輸出低電平,選通千位數(shù)P0=seg7codedate/1000; /取出千位數(shù),查表,輸出。取出千位數(shù),查表,輸出。Delay(10); /延時延時qian=1; /銷隱銷隱bai=0; /P1.1輸出低電平,選通百位數(shù)輸出低電平,選通百位數(shù)P0=seg7cod

14、edate%1000/100; /取出百位數(shù),查表,輸出。取出百位數(shù),查表,輸出。Delay(10); /延時延時bai=1; /銷隱銷隱shi=0; /P1.2輸出低電平,選通十位數(shù)輸出低電平,選通十位數(shù)P0=seg7codedate%100/10; /取出十位數(shù),查表,輸出。取出十位數(shù),查表,輸出。Delay(10); /延時延時shi=1; /銷隱銷隱ge=0;/P1.3輸出低電平,選通十位數(shù)輸出低電平,選通十位數(shù)P0=seg7codedate%10; /取出個位數(shù),查表,輸出。取出個位數(shù),查表,輸出。Delay(10);ge=1;續(xù)前頁:續(xù)前頁:main() int display_d

15、ate=1234; /定義并賦值要顯示的數(shù)據(jù)定義并賦值要顯示的數(shù)據(jù) while(1) Led(display_date);/調(diào)用顯示函數(shù)顯示數(shù)據(jù)調(diào)用顯示函數(shù)顯示數(shù)據(jù)display_date 上述數(shù)碼管動態(tài)顯示程序的另一種寫法參考程序:參考程序:#include unsigned char datebit=0 xfe,0 xfd,0 xfb,0 xf7;/存儲數(shù)碼管的位選值存儲數(shù)碼管的位選值unsigned char tvdate=0 x3f,0 x06,0 x5b,0 x4f,0 x66, 0 x6d,0 x7d,0 x07,0 x7f,0 x6f,;unsigned int disdata;

16、 /定義要顯示的數(shù)據(jù)定義要顯示的數(shù)據(jù)unsigned char disdat4; /存儲要顯示的四位數(shù)據(jù)存儲要顯示的四位數(shù)據(jù)void delay(time) unsigned char i,j; for(j=0;jtime;j+) for(i=0;i250;i+); display(void)unsigned char k;disdata=1234;/顯示顯示1234續(xù)前頁:續(xù)前頁: disdat0=disdat/1000;/取出千位取出千位disdat1=disdat%1000/100; /取出百位取出百位disdat2=disdat%100/10;/取出十位取出十位disdat3=disd

17、at%10;/取出個位取出個位for(k=0;k4;k+) /顯示四位數(shù)據(jù)顯示四位數(shù)據(jù) P0=tvdatedisdatk; /送出要顯示數(shù)據(jù)的段碼送出要顯示數(shù)據(jù)的段碼P1=datebitk;/P2位選位選delay(10);/延時延時 main() while(1) display(); 這種寫法比上一種復雜這種寫法比上一種復雜, ,占用空間要多一些占用空間要多一些. .但是使但是使用方便用方便, ,可以在此基礎上方便的加上比如顯示小數(shù)可以在此基礎上方便的加上比如顯示小數(shù)點點, ,指定某位數(shù)碼管閃爍等。指定某位數(shù)碼管閃爍等。課后思考:課后思考:如何用軟件延時來做一個如何用軟件延時來做一個0 0

18、 到到60 60 秒的計數(shù)器嗎?秒的計數(shù)器嗎?8、任務:4X4矩陣鍵盤識別要求:要求:用用AT89S51 AT89S51 的并行口的并行口P2 P2 接接4 44 4 矩陣鍵盤,以矩陣鍵盤,以P3.0P3.0P3.3 P3.3 作輸入線作輸入線,以,以P3.4P3.4P3.7 P3.7 作輸出線;在每一個數(shù)碼管上顯示每個按鍵的作輸出線;在每一個數(shù)碼管上顯示每個按鍵的“0 0F”F”序號序號。 實驗原理實驗原理 每個按鍵有它的行值和列值,行每個按鍵有它的行值和列值,行值和列值的組合就是識別這個按值和列值的組合就是識別這個按鍵的編碼。矩陣的行線和列線分鍵的編碼。矩陣的行線和列線分別通過兩并行接口和

19、別通過兩并行接口和CPU CPU 通信。通信。鍵盤處理程序的任務是:確定有鍵盤處理程序的任務是:確定有無鍵按下,判斷哪一個鍵按下,無鍵按下,判斷哪一個鍵按下,鍵的功能是什么;還要消除按鍵鍵的功能是什么;還要消除按鍵在閉合或斷開時的抖動。兩個并在閉合或斷開時的抖動。兩個并行口中,一個輸出掃描碼,使按行口中,一個輸出掃描碼,使按鍵逐行動態(tài)接地,另一個并行口鍵逐行動態(tài)接地,另一個并行口輸入按鍵狀態(tài),由行掃描值和回輸入按鍵狀態(tài),由行掃描值和回饋信號共同形成鍵編碼而識別按饋信號共同形成鍵編碼而識別按鍵,通過軟件查表,查出該鍵的鍵,通過軟件查表,查出該鍵的功能。功能。鍵盤識別的兩種方法逐行掃描法逐行掃描法

20、:(1 1)首先判斷有無鍵按下:令矩陣行線輸出全)首先判斷有無鍵按下:令矩陣行線輸出全0 0信號,檢測信號,檢測列線狀態(tài),若有一列電平為低,則有鍵按下。列線狀態(tài),若有一列電平為低,則有鍵按下。(2 2)確定閉合鍵位置:依次將各行線置為低電平,逐行檢)確定閉合鍵位置:依次將各行線置為低電平,逐行檢測各列線的電平狀態(tài),若某列為低,則該行線和列線交叉處測各列線的電平狀態(tài),若某列為低,則該行線和列線交叉處按鍵就是閉合鍵。按鍵就是閉合鍵。線反轉(zhuǎn)法線反轉(zhuǎn)法:(1 1)令矩陣鍵盤列線輸出全)令矩陣鍵盤列線輸出全0 0信號,行線作為輸入接口接收信號,行線作為輸入接口接收信號,可判斷按鍵處于哪一行。信號,可判斷

21、按鍵處于哪一行。(2 2)令矩陣鍵盤行線輸出全)令矩陣鍵盤行線輸出全0 0信號,列線作為輸入接口接收信號,列線作為輸入接口接收信號,可判斷按鍵處于哪一列。信號,可判斷按鍵處于哪一列。(3 3)將輸入信號相或后形成鍵盤的唯一鍵碼。)將輸入信號相或后形成鍵盤的唯一鍵碼。程序程序:(線反轉(zhuǎn)法):(線反轉(zhuǎn)法)#include unsigned char code seg7code=0 x3f,0 x06,0 x5b,0 x4f, 0 x66,0 x6d,0 x7d,0 x07, 0 x7f,0 x6f,0 x77,0 x7c, 0 x39,0 x5e,0 x79,0 x71; unsigned cha

22、r k;void delay10ms(void) /延時程序延時程序 unsigned char i,j; for(i=20;i0;i-) for(j=248;j0;j-); void Getch ( ) unsigned char X,Y,Z; P2=0 xff; P2=0 x0f; /先對先對P2置數(shù)置數(shù) 行掃描行掃描if(P2!=0 x0f) /判斷是否有鍵按下判斷是否有鍵按下 delay10ms(); /延時延時,軟件去干擾軟件去干擾 if(P2!=0 x0f) /確認按鍵按下確認按鍵按下X = P2; 續(xù)前頁:續(xù)前頁: X=P2; /保存行掃描時有鍵按下時狀態(tài)保存行掃描時有鍵按下時狀

23、態(tài)P2=0 xf0; /列掃描列掃描Y=P2; /保存列掃描時有鍵按下時狀態(tài)保存列掃描時有鍵按下時狀態(tài)Z=X|Y; /取出鍵值取出鍵值switch ( Z ) /判斷鍵值(那一個鍵按下)判斷鍵值(那一個鍵按下)case 0 x77: k=0; break; /對鍵值賦值對鍵值賦值case 0 x7b: k=1; break; case 0 x7d: k=2; break; case 0 x7e: k=3; break; case 0 xb7: k=4; break; case 0 xbb: k=5; break; case 0 xbd: k=6; break; case 0 xbe: k=7;

24、 break; case 0 xd7: k=8; break; case 0 xdb: k=9; break; case 0 xdd: k=10;break; case 0 xde: k=11;break; case 0 xe7: k=12;break; case 0 xeb: k=13;break; 續(xù)前頁:續(xù)前頁: case 0 xed: k=14;break; case 0 xee: k=15;break; void main(void) while(1) P2=0 xff; Getch( ); P0=seg7codek; /查表查表LED輸出輸出 P1=0 xf0; /輸出相同的四位數(shù)

25、據(jù)。輸出相同的四位數(shù)據(jù)。 9、任務:按鍵中斷識別要求:要求:采用中斷技術,每按一下按鍵,計數(shù)器加采用中斷技術,每按一下按鍵,計數(shù)器加1 1,并用,并用LED LED 顯示出來,注顯示出來,注意只顯示意只顯示2 2位十進制數(shù)。位十進制數(shù)。原理:原理:以上的兩個關于按鍵識別的實驗的程序都是采用掃描的方式來實現(xiàn)的以上的兩個關于按鍵識別的實驗的程序都是采用掃描的方式來實現(xiàn)的,CPUCPU的利用率比較低;按鍵判斷還可以用中斷方式來判斷。中斷方式可以滿的利用率比較低;按鍵判斷還可以用中斷方式來判斷。中斷方式可以滿足快速響應的要求。足快速響應的要求。程序程序:#include unsigned char c

26、ode table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;unsigned char dispcount=0; /計數(shù)計數(shù)sbit gewei=P13; /個位選通定義個位選通定義sbit shiwei=P12; /十位選通定義十位選通定義void Delay(unsigned int tc) /延時程序延時程序while( tc != 0 )unsigned int i;for(i=0; i=10) /顯示兩位數(shù)顯示兩位數(shù)shiwei=0;P0=tabledispcount/10;Delay(8);shiwei

27、=1;gewei=0;P0=tabledispcount%10;Delay(5);gewei=1;else /顯示一位數(shù)顯示一位數(shù) 續(xù)前頁:續(xù)前頁:shiwei=1;gewei=0;P0=tabledispcount;Delay(8); void main() TCON=0 x01; /下降沿觸發(fā)下降沿觸發(fā) IE=0 x81; /開總中斷和允許外部中斷開總中斷和允許外部中斷 while(1) /循環(huán)執(zhí)行循環(huán)執(zhí)行 LED( ); /調(diào)用顯示函數(shù)調(diào)用顯示函數(shù)/*課后思考:課后思考:在程序在硬件運行過程中在程序在硬件運行過程中, ,有時候按一下鍵會加幾個數(shù)有時候按一下鍵會加幾個數(shù), ,是因為沒有去除

28、按鍵干是因為沒有去除按鍵干擾請您想一想怎么消除抖動擾請您想一想怎么消除抖動. ./*/ 10、任務:定時器T0的應用9.9秒計時設計要求:要求:開始時,顯示開始時,顯示“00”00”,第,第1 1 次按下次按下INT0 INT0 后就開始計時。后就開始計時。第第2 2 次按次按INT0 INT0 后,計時停止。第后,計時停止。第3 3 次按次按INT0 INT0 后,計時歸零。后,計時歸零。程序程序:#include unsigned char code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66, 0 x6d,0 x7d,0 x07, 0 x7f,0 x6f, ;

29、unsigned char sec; /定義計數(shù)值,每過定義計數(shù)值,每過1/10 秒,秒,sec 加一加一unsigned char keycnt=1; /鍵值判斷鍵值判斷unsigned int tcnt; /中斷次數(shù)計數(shù)器中斷次數(shù)計數(shù)器 sbit gewei=P13; /個位選通定義個位選通定義sbit shiwei=P12; /十位選通定義十位選通定義sbit INT_0=P32; /按鍵定義位按鍵定義位void Delay(unsigned int tc) /延時程序延時程序while( tc != 0 )unsigned int i;for(i=0; i0;i-) /延時去干擾延時去

30、干擾for(j=248;j0;j-);續(xù)前頁:續(xù)前頁:if(INT_0=0)switch(keycnt) /按下次數(shù)判斷按下次數(shù)判斷case 1: /第一次按下第一次按下TH0=0 x06; /對對TH0 TL0 賦值賦值TL0=0 x06;TR0=1; /開始定時開始定時keycnt=2; /為第二次做準備為第二次做準備break;case 2: /第二次按下第二次按下TR0=0; /定時結束定時結束keycnt=3; /為第三次按下做準備為第三次按下做準備break;case 3: /第三次按下第三次按下keycnt=1; /重新開始判斷鍵值重新開始判斷鍵值sec=0; /計數(shù)重新從零開始

31、計數(shù)重新從零開始break; 續(xù)前頁:續(xù)前頁:while(INT_0=0);void t0(void) interrupt 1 using 0 /定時中斷服務函數(shù)定時中斷服務函數(shù)tcnt+; /每過每過250us,tcnt 加一加一if(tcnt=400) /計滿計滿400 次(次(0.1 秒)時秒)時tcnt=0; /重新再計重新再計sec+;if(sec=100) /定時定時10 秒,在從零開始計時秒,在從零開始計時sec=0;續(xù)前頁:續(xù)前頁:void main(void)TMOD=0 x02; /定時器工作在方式定時器工作在方式2 自動重裝方式自動重裝方式ET0=1; /允許允許T0 產(chǎn)

32、生中斷產(chǎn)生中斷EA=1; /開總中斷開總中斷sec=0;while(1)KEY();LED();11、任務:PC機與單片機通信要求:要求:單片機串口通信的應用,通過串口,電腦和單片機系統(tǒng)進行通信。電單片機串口通信的應用,通過串口,電腦和單片機系統(tǒng)進行通信。電腦作為上位機,向下位機單片機系統(tǒng)發(fā)送十六進制或者腦作為上位機,向下位機單片機系統(tǒng)發(fā)送十六進制或者ASCLLASCLL碼,單片機系統(tǒng)碼,單片機系統(tǒng)接收后,用接收后,用LED LED 顯示接收到的數(shù)據(jù)和向上位機發(fā)回原樣數(shù)據(jù)。顯示接收到的數(shù)據(jù)和向上位機發(fā)回原樣數(shù)據(jù)。單片機串口相關知識回顧(1) MCS-51串行口的原理結構圖 單片機串口相關知識回

33、顧(2) 串行口控制寄存器SCON SM0SM1SM2RENTB8RB8TIRI D7 D6 D5 D4 D3 D2 D1 D0 SMODGF1GF0PDIDL D7 D6 D5 D4 D3 D2 D1 D0 (3) 特殊功能寄存器PCON 單片機串口相關知識回顧(4) 串口通信的波特率 對于方式對于方式0,波特率是固定的波特率是固定的, ,為單片機時鐘的為單片機時鐘的1/12,1/12,即即fosc/12。對于方式對于方式2,2,波特率有兩種可供選擇波特率有兩種可供選擇, ,即即fosc/32fosc/32和和fosc/64fosc/64。對應于以下公式:。對應于以下公式: 波特率波特率=f

34、osc(2SMOD)/64 對于方式對于方式1 1和方式和方式3,3,波特率都由定時器波特率都由定時器T1T1的溢出率來決定的溢出率來決定, ,對應于以下公式:對應于以下公式: 波特率波特率=(2SMOD/32)(定時器定時器T1的溢出率的溢出率) 而定時器而定時器T1T1的溢出率則和所采用的定時器工作方式有關的溢出率則和所采用的定時器工作方式有關, ,并并可用以下公式表示:可用以下公式表示: 定時器定時器T1T1的溢出率的溢出率=fosc/12=fosc/12(2n-X)(2n-X)程序程序:#include unsigned char dat; /用于存儲單片機接收發(fā)送緩沖寄存器用于存儲單

35、片機接收發(fā)送緩沖寄存器SBUF 里面的內(nèi)容里面的內(nèi)容sbit gewei=P13; /個位選通定義個位選通定義sbit shiwei=P12; /十位選通定義十位選通定義unsigned char code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66, 0 x6d,0 x7d,0 x07, 0 x7f,0 x6f;void Delay(unsigned int tc) /延時程序延時程序while( tc != 0 )unsigned int i;for(i=0; i100; i+);tc-;void LED( ) /LED 顯示接收到的數(shù)據(jù)(十進制)顯示接收到的數(shù)

36、據(jù)(十進制)shiwei=0;P0=tabledat/10;Delay(5);續(xù)前頁:續(xù)前頁:shiwei=1;gewei=0;P0=tabledat%10;Delay(5);gewei=1;void Init_Com(void) /功能功能:串口初始化串口初始化,波特率波特率9600,方式,方式1TMOD = 0 x20;PCON = 0 x00;SCON = 0 x50;TH1 = 0 xFd;TL1 = 0 xFd;TR1 = 1;續(xù)前頁:續(xù)前頁:void main() /實現(xiàn)接收數(shù)據(jù)并把接收到的數(shù)據(jù)原樣發(fā)送回去實現(xiàn)接收數(shù)據(jù)并把接收到的數(shù)據(jù)原樣發(fā)送回去/Init_Com(); /串口初始

37、化串口初始化while(1)if ( RI ) /掃描判斷是否接收到數(shù)據(jù),掃描判斷是否接收到數(shù)據(jù),dat = SBUF; /接收數(shù)據(jù)接收數(shù)據(jù)SBUF 賦與賦與datRI=0; /RI 清零(必須用軟件清零)清零(必須用軟件清零)SBUF = dat; /再原樣把數(shù)據(jù)發(fā)送回去再原樣把數(shù)據(jù)發(fā)送回去LED( ); /顯示接收到的數(shù)據(jù)顯示接收到的數(shù)據(jù)12、任務:數(shù)模轉(zhuǎn)換器ADC0804的應用(擴展)要求:要求:從從ADC0804ADC0804的通道的通道IN+IN+輸入輸入0 05V 5V 之間的模擬量,通過之間的模擬量,通過ADC0804 ADC0804 轉(zhuǎn)換成轉(zhuǎn)換成數(shù)字量在數(shù)碼管上以十進制形成顯示

38、出來。數(shù)字量在數(shù)碼管上以十進制形成顯示出來。程序程序:#include code unsigned char seg7code10=0 x3f,0 x06,0 x5b,0 x4f,0 x66, 0 x6d,0 x7d,0 x07,0 x7f,0 x6f; /顯示段碼顯示段碼sbit int1=P33; /定義管腳功能定義管腳功能sbit cs=P32;sbit wr=P36;sbit rd=P37;void Delay(unsigned int tc) /顯示延時程序顯示延時程序while( tc != 0 )unsigned int i;for(i=0; i100; i+);tc-;unsi

39、gned char adc0804( void ) /讀讀AD0804 子程序子程序 unsigned char addata,i;rd=1;wr=1;int1=1; /讀讀ADC0804 前準備前準備P1=0 xff; /P1 全部置一準備全部置一準備cs=0;wr=0;wr=1; /啟動啟動ADC0804 開始測電壓開始測電壓while(int1=1); /查詢等待查詢等待A/D 轉(zhuǎn)換完畢產(chǎn)生的轉(zhuǎn)換完畢產(chǎn)生的INT(低電平有效)信號(低電平有效)信號rd=0; /開始讀轉(zhuǎn)換后數(shù)據(jù)開始讀轉(zhuǎn)換后數(shù)據(jù)續(xù)前頁:續(xù)前頁:i=i; i=i; /無意義語句,用于延時等待無意義語句,用于延時等待ADC08

40、04 讀數(shù)完畢讀數(shù)完畢addata=P1; /讀出的數(shù)據(jù)賦與讀出的數(shù)據(jù)賦與addatard=1;cs=1; /讀數(shù)完畢讀數(shù)完畢return(addata); /返回最后讀出的數(shù)據(jù)返回最后讀出的數(shù)據(jù)unsigned int datpro(void) /ADC0804 讀出的數(shù)據(jù)處理讀出的數(shù)據(jù)處理 unsigned char x;unsigned int dianyah,dianyal; /用于存儲讀出數(shù)據(jù)的高字節(jié)和低字節(jié)用于存儲讀出數(shù)據(jù)的高字節(jié)和低字節(jié)unsigned int dianya=0; /存儲最后處理完的結果注意數(shù)據(jù)類型存儲最后處理完的結果注意數(shù)據(jù)類型for(x=0;x4; /右移四位

41、取出高四位右移四位取出高四位dianyal=dianya&0 x0f; /屏蔽高四位取出低四位屏蔽高四位取出低四位dianya=dianyal*20+dianyah*320; /最后的結果是一個四位數(shù),便于顯示最后的結果是一個四位數(shù),便于顯示return(dianya); /返回最后處理結果返回最后處理結果續(xù)前頁:續(xù)前頁:void Led( ) unsigned int date;date=datpro(); /調(diào)用數(shù)據(jù)處理最后結果調(diào)用數(shù)據(jù)處理最后結果P2=P2&0 xef;P0=seg7codedate/1000|0 x80; /輸出個位數(shù)和小數(shù)點輸出個位數(shù)和小數(shù)點Delay(8); P2=

42、P2|0 xf0; P2=P2&0 xdf;P0=seg7codedate%1000/100; /輸出小數(shù)點后第一位輸出小數(shù)點后第一位Delay(8); P2=P2|0 xf0; P2=P2&0 xbf;P0=seg7codedate%100/10; /輸出小數(shù)點后第二位輸出小數(shù)點后第二位Delay(8); P2=P2|0 xf0; P2=P2&0 x7f;P0=seg7codedate%10; /輸出小數(shù)點后第三位輸出小數(shù)點后第三位Delay(8); P2=P2|0 xf0;main()while(1)Led( ); /只需調(diào)用顯示函數(shù)只需調(diào)用顯示函數(shù)13、任務:模數(shù)轉(zhuǎn)換器DAC0832的應

43、用要求:要求:用兩個按鍵通過單片機控制用兩個按鍵通過單片機控制DAC0832 DAC0832 的輸出,使的輸出,使OUT OUT 端可以輸出端可以輸出005V 5V 的幅值,頻率為的幅值,頻率為1KHZ 1KHZ 的鋸齒波和三角波兩種波形。通上電源后;按下的鋸齒波和三角波兩種波形。通上電源后;按下INT1 INT1 則輸出三角波,再按下則輸出三角波,再按下INT0 INT0 輸出鋸齒波。輸出鋸齒波。實驗原理實驗原理DAC0832DAC0832是是8 8 位全位全MOS MOS 中速中速D/A D/A 轉(zhuǎn)換器,采用轉(zhuǎn)換器,采用RR2RT 2RT 形電阻解碼網(wǎng)絡,轉(zhuǎn)換結果為一對差動電流輸出形電阻解

44、碼網(wǎng)絡,轉(zhuǎn)換結果為一對差動電流輸出,轉(zhuǎn)換時間大約為,轉(zhuǎn)換時間大約為1us1us。使用單電源。使用單電源+5V+5V+15V +15V 供電供電。參考電壓為。參考電壓為-10V-10V+10V+10V。在此我們直接選擇。在此我們直接選擇+5V +5V 作作為參考電壓。為參考電壓。DAC0832 DAC0832 有三種工作方式:直通方式,單緩沖方式有三種工作方式:直通方式,單緩沖方式,雙緩沖方式;在此我們選擇直通的工作方式,將,雙緩沖方式;在此我們選擇直通的工作方式,將XFERXFER、WR1WR1、WR2WR2和和CSCS管腳全部接數(shù)字地。管腳管腳全部接數(shù)字地。管腳8 8 接參接參考電壓,在此我

45、們接的參考電壓是考電壓,在此我們接的參考電壓是+5V+5V。那么經(jīng)過第。那么經(jīng)過第一級運放后,輸出電壓將是一級運放后,輸出電壓將是-5V-5V0V0V,在經(jīng)過第二級,在經(jīng)過第二級運放反相放大運放反相放大1 1 倍以后將可以輸出倍以后將可以輸出0V5V 0V5V 了。再控了。再控制制P1P1口輸出數(shù)據(jù)有規(guī)律的變化將可以產(chǎn)生三角波,鋸口輸出數(shù)據(jù)有規(guī)律的變化將可以產(chǎn)生三角波,鋸齒波,梯型波等波形了。齒波,梯型波等波形了。程序程序:#include unsigned char keycnt=0; /波形標志波形標志unsigned char tcnt=0; /鍵值判斷鍵值判斷bit sjz=0; /產(chǎn)

46、生三角波時上升、下降用到的標志產(chǎn)生三角波時上升、下降用到的標志void delayl( ) /延時子程序延時子程序 unsigned char i,j;for(i=20;i0;i-)for(j=248;j0;j-); void KEY( ) /按鍵掃描程序按鍵掃描程序if(P3_2=0)delayl( ); /延時跳過按下時的抖動延時跳過按下時的抖動if(P3_2=0)keycnt=0; /定時器產(chǎn)生鋸齒波標志定時器產(chǎn)生鋸齒波標志TR0=0; /暫時停止波形輸出暫時停止波形輸出TH0=0 x256-40; /對對TH0 TL0 賦值賦值TL0=0 x256-40;TR0=1; /開始定時開始定

47、時,產(chǎn)生鋸齒波產(chǎn)生鋸齒波續(xù)前頁:續(xù)前頁:while(P3_2=0); /如果一直按著鍵,則等待鍵松開如果一直按著鍵,則等待鍵松開delayl( ); /延時跳過松開后的抖動延時跳過松開后的抖動 if(P3_3=0)delayl( ); /延時跳過按下時的抖動延時跳過按下時的抖動if(P3_3=0)keycnt=1; /定時器產(chǎn)生三角波標志定時器產(chǎn)生三角波標志TR0=0; /暫時停止波形輸出暫時停止波形輸出TH0=0 x256-40; /對對TH0、TL0 賦值賦值TL0=0 x256-40;TR0=1; /開始定時產(chǎn)生三角波開始定時產(chǎn)生三角波while(P3_2=0); /如果一直按著鍵,則等

48、待松鍵開如果一直按著鍵,則等待松鍵開delayl( ); /延時跳過松開后的抖動延時跳過松開后的抖動續(xù)前頁:續(xù)前頁:void t0(void) interrupt 1 using 0 /定時中斷服務函數(shù)定時中斷服務函數(shù)if(keycnt=0) /產(chǎn)生鋸齒波產(chǎn)生鋸齒波P0=tcnt;tcnt=+0 x0a; /步進步進0.2V/一次中斷一次中斷if(tcnt=0 xfb)tcnt=0;if(keycnt=1) /產(chǎn)生三角波產(chǎn)生三角波 if(sjz=0)P0=tcnt;tcnt=+0 x0a; /步進步進0.2V/一次中斷一次中斷if(tcnt=0 xfa)sjz=1;if(sjz=1)續(xù)前頁:續(xù)

49、前頁:P0=tcnt;Tcnt-=0 x0a;if(tcnt=0)sjz=0;void main(void)TMOD=0 x02; /定時器工作在方式定時器工作在方式2ET0=1;EA=1;while(1) KEY( ); 14、任務:24C08的讀寫操作要求:要求:利用利用24C0824C08斷電以后存儲的數(shù)據(jù)不消失的特點,可以做一個斷電保護斷電以后存儲的數(shù)據(jù)不消失的特點,可以做一個斷電保護裝置。首先利用單片機做一個裝置。首先利用單片機做一個099099秒的自動計時器。然后隨機關斷電源,在秒的自動計時器。然后隨機關斷電源,在通電以后計時器接著斷電前的狀態(tài)繼續(xù)計時。通電以后計時器接著斷電前的狀

50、態(tài)繼續(xù)計時。實驗原理實驗原理引腳圖引腳圖實驗原理實驗原理總線協(xié)議總線協(xié)議實驗原理實驗原理寫周期時序和起始、停止時序?qū)懼芷跁r序和起始、停止時序?qū)嶒炘韺嶒炘砥骷ぶ菲骷ぶ穼嶒炘韺嶒炘砥骷ぶ菲骷ぶ穼嶒炘韺嶒炘韺懖僮鲗懖僮髯⒁猓鹤⒁猓篒2CI2C總線數(shù)據(jù)都是高位在前,低位在后!總線數(shù)據(jù)都是高位在前,低位在后!實驗原理實驗原理寫操作寫操作實驗原理實驗原理讀操作讀操作實驗原理實驗原理讀操作讀操作實驗原理實驗原理讀操作讀操作程序程序:#include #include #include unsigned char code table=0 x3f,0 x06,0 x5b,0 x4f,0 x

51、66, 0 x6d,0 x7d,0 x07, 0 x7f,0 x6f;unsigned char sec; /定義計數(shù)值,每過定義計數(shù)值,每過1 秒,秒,sec 加加1unsigned int tcnt; /定時中斷次數(shù)定時中斷次數(shù)bit write=0; /寫寫24C08 的標志;的標志;sbit gewei=P13; /個位選通定義個位選通定義sbit shiwei=P12; /十位選通定義十位選通定義/24C08 讀寫驅(qū)動程序開始讀寫驅(qū)動程序開始/sbit scl=P36; / 24c08 SCLsbit sda=P37; / 24c08 SDAvoid delay1(unsigned

52、char x) unsigned int i;for(i=0;ix;i+);void flash() /延時延時2us ; ; void x24c08_init() /24c08 初始化子程序初始化子程序scl=1;flash();sda=1;flash();void start() /啟動啟動I2C 總線總線sda=1;flash();scl=1;flash();sda=0;flash();scl=0;flash();void stop() /停止停止I2C 總線總線sda=0;flash( );scl=1;flash();sda=1;flash();void writex(unsigned

53、 char j) /寫一個字節(jié)寫一個字節(jié)unsigned char i,temp;temp=j;for (i=0;i8;i+)temp=temp1;scl=0;flash();sda=CY;flash();scl=1;flash();scl=0;flash();sda=1;flash();unsigned char readx( ) /讀一個字節(jié)讀一個字節(jié)unsigned char i,j,k=0;scl=0;flash( );sda=1;for (i=0;i8;i+)flash( );scl=1;flash( );if (sda=1) j=1;else j=0;k=(k1)|j;scl=0;

54、flash();return(k);void clock( ) / I2C 總線時鐘,確認應答信號總線時鐘,確認應答信號unsigned char i=0;scl=1;flash( );while (sda=1)&(i255)i+;scl=0;flash( );/從從24c08 的地址的地址address 中讀取一個字節(jié)數(shù)據(jù)中讀取一個字節(jié)數(shù)據(jù)/unsigned char x24c08_read(unsigned char address)unsigned char i;/先發(fā)寫命令、寫地址先發(fā)寫命令、寫地址start( );writex(0 xa0);clock( );writex(addre

55、ss);clock( ); /再發(fā)讀命令,讀數(shù)據(jù)再發(fā)讀命令,讀數(shù)據(jù)start( );writex(0 xa1);clock( );i=readx( ); stop( );delay1(10);return(i);/向向24c08 的的address 地址中寫入一字節(jié)數(shù)據(jù)地址中寫入一字節(jié)數(shù)據(jù)info/void x24c08_write(unsigned char address,unsigned char info)EA=0;start( );writex(0 xa0);clock();writex(address);clock( );writex(info);clock();stop();EA

56、=1;delay1(50); /以上以上24C08 讀寫驅(qū)動程序完讀寫驅(qū)動程序完/void Delay(unsigned int tc) /延時程序延時程序while( tc != 0 )unsigned int i;for(i=0; i100; i+);tc-;void LED( ) /LED 顯示函數(shù)顯示函數(shù)shiwei=0;P0=tablesec/10;Delay(5);shiwei=1;gewei=0;P0=tablesec%10; Delay(5);gewei=1;void t0(void) interrupt 1 using 0 /定時中斷服務函數(shù)定時中斷服務函數(shù)TH0=(6553

57、6-50000)/256; /對對TH0 TL0 賦值賦值TL0=(65536-50000)%256; /重裝計數(shù)初值重裝計數(shù)初值tcnt+; /每過每過250ust tcnt 加一加一if(tcnt=20) /計滿計滿20 次(次(1 秒)時秒)時tcnt=0;sec+;write=1; /1 秒寫一次秒寫一次24C08if(sec=100) /定時定時100 秒,在從零開始計時秒,在從零開始計時sec=0;void main(void)TMOD=0 x01; /定時器工作在方式定時器工作在方式1ET0=1;EA=1;x24c08_init( ); /初始化初始化24C08sec=x24c0

58、8_read(2); /讀出保存的數(shù)據(jù)賦于讀出保存的數(shù)據(jù)賦于secTH0=(65536-50000)/256; /對對TH0 TL0 賦值賦值TL0=(65536-50000)%256; /使定時器使定時器0.05 秒中斷一次秒中斷一次TR0=1; /開始計時開始計時while(1) LED( ); if(write=1) /判斷計時器是否計時一秒判斷計時器是否計時一秒 write=0; /清零清零 x24c08_write(2,sec); /在在24c08 的地址的地址2寫入數(shù)據(jù)寫入數(shù)據(jù)sec 15、任務:LCD1602液晶模塊應用要求:要求:LCD1602字符型液晶顯示實驗。在屏幕的第一行

59、顯示字符型液晶顯示實驗。在屏幕的第一行顯示“”,第二行則顯示,第二行則顯示“Tel:1308645xxxx”實驗原理實驗原理LCDLCD基礎知識基礎知識LCDLCD顯示器是一種利用液晶的扭曲顯示器是一種利用液晶的扭曲/ /向列效應制成的向列效應制成的新型顯示器。具有體積小、重量輕、功耗低、抗干新型顯示器。具有體積小、重量輕、功耗低、抗干擾能力強等優(yōu)點,因而在單片機系統(tǒng)中被廣泛應用。擾能力強等優(yōu)點,因而在單片機系統(tǒng)中被廣泛應用。實驗原理實驗原理LCDLCD結構及工作原理結構及工作原理uLCDLCD本身不發(fā)光,是通過借助外界光線照射液晶材料本身不發(fā)光,是通過借助外界光線照射液晶材料而實現(xiàn)顯示的被動

60、顯示器件。而實現(xiàn)顯示的被動顯示器件。u向列型液晶材料被封裝在上、下兩片導電玻璃電極向列型液晶材料被封裝在上、下兩片導電玻璃電極之間,液晶分子平行排列,上下扭曲之間,液晶分子平行排列,上下扭曲9090度,外部入射度,外部入射光線通過上偏振片后形成偏振光,該偏振光通過平行光線通過上偏振片后形成偏振光,該偏振光通過平行排列的液晶材料后被旋轉(zhuǎn)排列的液晶材料后被旋轉(zhuǎn)9090度,再通過與上偏振片垂度,再通過與上偏振片垂直的下偏振片,被反射極反射過來,呈透明狀態(tài)。直的下偏振片,被反射極反射過來,呈透明狀態(tài)。u若在上、下電極之間加一定電壓,在電場的作用下若在上、下電極之間加一定電壓,在電場的作用下迫使加在電極

溫馨提示

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

評論

0/150

提交評論