51單片機的基本外圍電路設計以及相關C語言程序免積分_第1頁
51單片機的基本外圍電路設計以及相關C語言程序免積分_第2頁
51單片機的基本外圍電路設計以及相關C語言程序免積分_第3頁
51單片機的基本外圍電路設計以及相關C語言程序免積分_第4頁
51單片機的基本外圍電路設計以及相關C語言程序免積分_第5頁
免費預覽已結束,剩余65頁可下載查看

下載本文檔

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

文檔簡介

1、實用標準文檔主要學習51單片機的外部引腳和內部結構等,表達一下.本書任務驅動教學,引入案 例有淺變深,循序漸進,給讀者留下思考和發(fā)揮空間.3.1 利用單片機的I/O 口驅動LED3.1.1 利用單片機的P0.0端口驅動1只LED閃爍編程的目的是利用 C語言限制單片機I/O端口按要求輸出矩形波脈沖信號,信號的周期由延時函數(shù)決定.、電路原理STC-89C51單片機的P0 采用為OD門輸出,不存在拉出電流,因此利用 P0驅動負 載時有兩種接法:一種是加上拉電阻R2,見圖3-1-1 ,既用1KC電阻接電源正極,此時 P0口輸出高電平時 LED亮;另一種電路為 P0.7低電平驅動有效,在 P0.7輸出低

2、電平時, STC-89C51端口灌入電流達 20mA,可直接驅動小負載.圖 3-3-1中的R3為限流電阻,限 制LED2的工作電流.VCC (+5V)R1 1K-1C3 10 心OVCCAXTAL1P0.0/AD0P0.1/AD1P0.2/AD2XTAL2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7RESETP2.0/A8P2.1/A9P2.2/A10PSENP2.3/A11P2.4/A12P2.5/A13EAP2.6/A14P2.7/A15P1.0P3.0/RXDP1.1P3.1/TXDP1.2P3.2/IWP1.3P3.3/INT1P1.4P3.4/T0

3、P1.5P3.5/T1P1.6P3.6/WRP1.7P3.7/RDIC STC89C5118929393830311011121314151621-22-232425 2620 27281234567C1 30P CY 12MHz 19, 19C2 30P tk5-36735 5433-32-圖3-1-1驅動LED電路原理R2 1KLED1R3 1KLED20加電復位電路,同時要求單片機的 31引腳EA接C1、C2為獨石電容,用于微小調整單片機時鐘的C3為電解電容器;整個電路由 +5V電壓供電.電單片機的最小系統(tǒng)包括晶體振蕩電路, 高電平.時鐘頻率主要由晶體 CY決定, 振蕩頻率;R1和C3組

4、成加電復位電路, 路使用的元件參數(shù)見表 3.1.1.表3.1.1 3-1-1電路元件表序號標稱單片機ICSTC89C51DIP40核心芯片電容器C130PF獨石振蕩電容器C230PF獨石振蕩電容器C310 "F點解電容器復位文案大全實用標準文檔晶振CY12MHzS型振蕩電阻R11K'11/4W,金屬膜電容器C3放電電阻電阻R21K'J1/4W,金屬膜端口電位上拉電阻電阻R31K'J1/4W,金屬膜限流電阻發(fā)光二極管LED1:'/' 5紅色高亮顯示發(fā)光二極管LED2中5紅色高亮顯示、程序設計1.程序設計平臺程序設計采用 keil C 軟件,為了養(yǎng)

5、成一個良好的文件治理習慣,建議:編程前,在計算機的某個硬盤分區(qū)下建立一個目錄,目錄的名字為你編寫程序的主題,然后把keil C產(chǎn)生的所有文件都放在該目錄下.程序設計步驟如下:(1)運行keil C ,創(chuàng)立一個工程.利用 keil C 菜單欄中project-new project 創(chuàng)立, 工程的名字為你編程的主題,如本案例可以用“ LED_1.uv2或“一個LED閃爍實驗.uv2 , 存放目錄為你的主題目錄下;(2)創(chuàng)立建一個文件,然后以“ .c后綴名,文件存放在你的主題目錄下;(3)把c文件添加在你的工程中, 在project workspace窗口利用add file to group 實

6、現(xiàn).如果軟件界面不顯示這個窗口,運行 keil C 菜單欄中的view-project window .(4)設置編譯器,是編譯過程中能生成“ .hex文件.默認文件名與主題名字相同.運行 project-option for 'target 1' -output 窗口下,點擊 create HEX file .(5)在編程區(qū)域寫你的程序,結束后存儲文件并編譯,要做檢查,盡量預防警告出現(xiàn),直到程序編譯無誤為止.(6)程序燒寫并試運行.這個過程稱為軟件和硬件聯(lián)合調試,如果實驗板無誤,程序 編譯通過,但在硬件上運行不成功是常用的事情,需要對程序進行屢次調試.在沒有實驗板的情況下,可

7、以利用 proteus軟件仿真調試,也可以檢驗你的程序設計結果.2.程序設計(1)利用P0.0 口驅動LED閃爍,高電平有效/*/#include<reg51.h>sbit LED = P0A0;void delay(unsigned char x)(unsigned char i,j;for(i = 0;i < x;i+)for(j = 0;j < 200;j+);)void main(void)(While(1)(LED = 0;void delay(100);LED = 1;void delay(100); )包含頭文件/ LED 接 P0.0.在 kell C5

8、1 軟件中,定義 P0.0 為 P0A.,延時函數(shù)主函數(shù)程序死循環(huán)/P0.0輸出低電平,LED滅調用延時函數(shù),延時一段時間,約 0.3秒,不精確/P0.0輸出高電平,LED亮/*/(2)利用P0.7端口驅動LED閃爍,低電平有效/*/#include<reg51.h>sbit LED = P0A7;void delay(unsigned char x)(unsigned char i,j;for(i = 0;i<x;i+)包含頭文件,程序為小 5號字延時函數(shù)文案大全實用標準文檔for(j = 0;j < 1000;j+);)void main(void) while(1

9、)(LED =LED;void delay(100);)主函數(shù)/LED初始狀態(tài)為滅,執(zhí)行一次,延時一段時間LED改變一次狀態(tài)/*/三、程序說明1 .應為使用的單片機芯片為STC89C51 ,因此程序開始處參加 #include<reg51.h> ,文件reg51.h中包含了 51芯片所有特殊功能存放器的名稱定義和相對應的地址值;2 .單片機程序單步順序執(zhí)行,先執(zhí)行主函數(shù),在主函數(shù)可以調用分函數(shù),分函數(shù)可以 調用分函數(shù),但分函數(shù)不能調用主函數(shù),程序執(zhí)行一條命令再執(zhí)行下一條,單片機等待的過程是執(zhí)行了一個循環(huán)命令或一個浪費時間的程序,實際執(zhí)行過程永遠不會結束.delay ()為函數(shù)延,單

10、片機在執(zhí)行此函數(shù)相關指令時占用的時間過長,在執(zhí)行過程中,如果沒有中斷,單片機只能忙這一件事情.利用delay ()不能得到精確的延時.延時函數(shù)還可以利用下面的函數(shù)實現(xiàn)./*/ void delay (unsigned int x)while(x)x-;/*/3 .利用位定義命令讓 LED等價于P0.0或P0.7,等于先sbit P0_0 = P0A0 ,然后#defined LED P0_0 ,也在程序前面不做此類定義,在程序里面直接寫成P0A0 = 1或P0A0 = 0 ,先定義是為亍增加程序的可讀性.程序執(zhí)行P0A0 = 1后,P0.0對以的單片機內部位存放器就設置為高電平,同時 P0.0

11、端口也輸出高電平,單片機的所有 I/O 口都可位未定義,也可以字 節(jié)定義.4 .單片機C語言程序設計需要的 C語言關鍵字不多,并且在 keil C中用到的關鍵字是 獨有的,因此對于沒有學習過C語言的人學習單片機 C語言程序設計困難并不是很大,主要掌握單片機 C語言書寫格式,怎樣用 C語言限制單片機的硬件資源,另外在編程時,還 要有清楚的邏輯思維頭腦和認真實踐,由淺逐步深入學習,當你堅持到最后時,單片機C語言程序設計實際上很簡單.5 .每個人在編寫程序時都有自己的風格.一般情況下,函數(shù)的字符左行距為0,其下每條語句前留一個“ tab鍵空.算數(shù)邏輯符號的左右留一個空格,關鍵語句要有中文或英文 說明

12、,每一個函數(shù)有時也可以用"/*.*/上下隔開這樣有助于提升程序的層次感和可讀性.3.1.2利用P0 口驅動8個LED ,產(chǎn)生跑馬燈或流水燈效果、參考電路實驗電路見圖3-3-2所示,在單片機的最小系統(tǒng)的根底上,P0 依次接入8個LED ,P0 口的上拉電阻可以使用 8個1KC電阻.文案大全實用標準文檔VCC (+5V)R2-9 1KC1 30P .CY 12MHzC2 30P=R1 1K IC STC89C51VCC19“TAL1P0.0/AD039-38-18P0.1/AD1P0.2/AD2XTAL2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7RE

13、SETP2.0/A8P2.1/A9P2.2/A10PSENP2.3/A11P2.4/A12ALEP2.5/A13EAP2.6/A14P2.7/A15P1.0P3.0/RXDP1.1P3.1/TXD-37-36-935-34-S3-32212229-23- -24-2530-26-T7-311T8-102-312P1.2P3.2/rNT0-P1.3P3.3/rNTTP1.4P3.4/T0P1.5P3.5/TTP1.6P3.6WP1.7P3.7/RD413514615716-8-17OODDOOO0 必q IILED1-8圖3-1-2流水燈電路在利用Proteus軟件仿真時,可以用電阻排代替.單片

14、機最小系統(tǒng)在單片機元件放置后已經(jīng)默認,即C1、C2、C3、CY、R1可以省略.其它元件選取見表 3.1.2所示.表3.1.1 3-1-2電路Proteus軟件元件表元件名稱component總類 Category分類 Sub- CategoryResultsModel type單片機Micoroprocessor IC8051 Family80C51電阻排ResistorResistor PackRESPACK-8ANALOG發(fā)光二極管OptoelectronicsLEDsled-redDIGITAL、參考程序/*/#include<reg51.h>void delay(void)

15、unsigned char i,j;for(i = 0;i < 255;i+) for(j = 0;j < 255;j+);void main(void)unsigned char j = 0x01;while (1)j = j << 1;if(j = 0x00) j = 0x01;P0 = j;delay();/*/三、程序說明1.語句j = j << 1 ,執(zhí)行的目的是限制P0整個字節(jié)的數(shù)據(jù)在循環(huán)時左移變化,程序循環(huán)第一次, P0 = 0x02, P0.1連接的LED亮,其它滅;循環(huán)第七次, P0.7連接的LED亮,其 它滅;循環(huán)第八次,j = 0x00

16、, if語句條件滿足,j = 0x01 , P0.0連接的LED亮,其它滅,然 后依次變化下去.如果P0 口驅動8個LED低電平有效,如下修該:/*/ void main(void) 文案大全實用標準文檔unsigned char j = 0xfe;while (1)(j =(j << 1) | 0x01 ;if(j = 0xff) j = 0xfe;P0 = j;delay();2. delay()函數(shù)無形參,延時時間不能設置.3.1.3利用P0 口驅動一個數(shù)碼管,顯示 0 - 9,并循環(huán)一、參考電路實驗電路在單片機的最小系統(tǒng)根底上,P0 口接一只共陽數(shù)碼管,見圖 3-1-3.帶

17、小數(shù)點的數(shù)碼管是由8個LED組成,七個LED組成數(shù)字,另一只 LED用來顯示小數(shù)點.如果數(shù) 碼管內部的8只LED的正極接在一起,負極分別引出,引腳依次命名為a、b、c、d、e、f、g和dot,稱為帶小數(shù)點的 7段共陽極性數(shù)碼管.VCC (+5V)0VCCC1 30PCY12MHzHI J_C2 30PHHclJR1IC STC89C511XTAL1P0.0/AD0P0.1/AD1P0.2/AD2XTAL2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7RESETP2.0/A8P2.1/A9P2.2/A10PSENP2.3/A11ALEP2.4/A12P2.5/A

18、13EAP2.6/A14P2.7/A15P1.0P3 0/RXDP1.1P3.1/TXDP1.2P3.2/INT0pa -P1.4P3.4/T0P1.5P3.5/TTP1.6P3.6/WRP1.7P3.7/RD1918929303125262728123 ,45610111213 -14151617R29 200AC39"38o-b37i c36d35e=e3411-g-32dF=L212223SEVENSEG圖3-1-3單片機驅動共陽數(shù)碼管電路單片機的P0.0-P0.7 分別接數(shù)碼管的a-dot引腳,如果讓數(shù)碼管顯示1,數(shù)碼管b、c段亮,程序限制P0輸出0xbe十六進制編碼即可,因

19、此共陽數(shù)碼管顯示0-9十進制數(shù)字,需要利用10個顯示碼組成的數(shù)組.對于共陰數(shù)碼管,也有相應的編碼要求.小數(shù)點在不用時 一般不讓顯示,高位端口P0.7輸出高電平即可.由于P0每個端口的灌電流達 20mA,數(shù)碼管每段LED正常顯示5mA即可,因此需要 R29用來P士制數(shù)碼管每一段電流, 以預防驅動電流過大而燒毀器件.利用Proteus軟件仿真時,數(shù)碼管采用 Optoelectronics 元件庫中 7-Segment Displays 下的 7-SEG-COM-ANODE .、參考程序/*/ #include<reg51.h>code unsigned char seven_seg10

20、 = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;void delay (void)/* 時間延遲函數(shù) */unsigned char i,j;for (i = 0;i < 255;i+) for (j = 0;j = 255;j+);void main (void)unsigned char i;/*變量i用來儲存 09 */*無窮循環(huán) */while (1) for (i = 0; i<10; i+)文案大全實用標準文檔P0 = seven_segi;/*輸出09到共陽七段顯示器*/delay();)/*調用時間延遲函數(shù)d

21、elay*/*/三、程序說明1 .當程序中使用常量數(shù)據(jù)時,可以把數(shù)據(jù)存儲在單片機的程序存儲器中,對此類數(shù)據(jù)聲明時,前面需要加上關鍵字code或const,如本實驗中的共陽數(shù)碼管數(shù)字顯示需要的編碼,表 3-1-3是共陽數(shù)碼管編碼, 表3-1-4是共陰數(shù)碼管編碼.單片機驅動液晶顯示器顯示的漢字也是一種常量數(shù)據(jù).表3-1-3共陽數(shù)碼管顯示編碼dotgfedcba160110000000xc01111110010xf92101001000xa43101100000xb04100110010x995100100100x926100000100x827111110000xf88100000000x8091

22、00100000x90表3-1-4共陰數(shù)碼管顯示編碼dotgfedcba160001111110x3f1000001100x062010110110x5b3010011110x4f4011001100x665011011010x6d6011111010x7d7000001110x078011111110x7f9011011110x6f2 .本程序數(shù)碼管顯示使用了一個for循環(huán),讓變量i依次由0遞增到9,并將數(shù)字顯示碼送到 P0,需要注意,seven_seg10有10各數(shù)據(jù),seven_seg0為第一個數(shù)據(jù),seven_seg9為第10個數(shù)據(jù).數(shù)碼管顯 示的數(shù)據(jù)變化時間由延時函數(shù)決定.for循環(huán)

23、體嵌套在 while循環(huán)體中,癡血管回循環(huán)顯示09,永不結束,除非電路斷電.利用數(shù)碼管也可以顯示日期和時間,在以后的程序設計案例中就可以學到.文案大全實用標準文檔3.2單片機定時器/計數(shù)器應用3.2.1 利用Timer0中斷產(chǎn)生1秒延時,讓數(shù)1個碼管顯示秒計數(shù)本案例主要目的是熟練掌握單片機內部Timer0或Timeri的編程限制方法,會利用Timer0或Timeri中斷精確定時.同時掌握數(shù)碼管動態(tài)顯示原理,學會6位數(shù)字顯示的程序設計.本案例使用的電路為圖3-1-3.一、程序設計/*/#include<reg51.h>code unsigned char seven_seg10 =

24、0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;unsigned char cp,i;void timer0_isr(void) interrupt 1一TR0 = 0;TL0 = 0x11;TH0 = 0xee;TR0 = 0;cp+;if(cp = 200)cp = 0;i +; if(i = 10) i = 0;P0 = seven_segi一void timer0_initialize(void)一EA = 0;TMOD = 0x01 ;TR0 = 0;TL0 = 0x11;TH0 = 0xee;聲明全局變量/ timer0中斷效勞函

25、數(shù)停止計數(shù)/ TL0重新預置/ TH0重新預置開始計數(shù)/ timer0中斷1次,變量cp加1中斷200次,時間剛好為1秒PT0 = 1;ET0 = 1;EA = 1;TR0 = 1;void main (void)timer0_initialize() while (1);/ P0輸出顯示數(shù)據(jù)/ timer0中斷初始化函數(shù)設置中斷允許存放器IE中的EA位,關閉中斷總開關設置計時器模式限制存放器,Time0工作在定時方式1設置計時器限制存放器 TCON存放器的TR0位為0, Timer0停止計數(shù)/ Timer0的16位計數(shù)器初始值為 0xee11, 12MHz晶體振頻率,單片機的機器周期為1微妙

26、,Timer0每1微秒加1計數(shù),加滿溢出變產(chǎn)生中斷,從計數(shù)到中斷剛好為 5毫秒設置中斷優(yōu)先次序存放器 IP中的PT0位,Timer0中斷優(yōu)先設置中斷允許存放器IE中ET0的位,開啟中斷小開關翻開中斷總開關開始計數(shù)/ timer0初始化,為中斷做好準備 等待中斷/*/、程序說明1 .中斷效勞函數(shù)名中,interruput為關鍵字,1為timer0中斷號.在reg51.h頭文件中已 經(jīng)定義,表3.2.1為單片機常用中斷的中斷號.在使用中斷效勞函數(shù)時,直接在名后加interruput和中斷號即可.表3.2.1 reg51.h中單片機常用中斷號定義中斷源中斷觸發(fā)原因中斷號INT0外部INT0引腳有低電

27、平或下降沿信號輸入0Timer0Timer0計數(shù)溢出1INT1外部INT0引腳有低電平或下降沿信號輸入2文案大全實用標準文檔Timer1Timer1計數(shù)溢出3串行中斷串口緩存SBUF寫入數(shù)據(jù)或讀出數(shù)據(jù)42 .timer0 可以用作計數(shù),也可以用來定時,由由 TMOD存放器中C/為決定,作為計數(shù)器使用時,接受單片機外部引腳P3.4輸入的脈沖加計數(shù);作為定時器使用時,接受單片機內部的機器周期脈沖.如果單片機的振蕩頻率為f ,振蕩周期為t=1f ,那么機器周期為T =12/f.本案例中f =12MHz ,那么T =1微秒,timer0工作在模式1為16為加計數(shù)器,當計 數(shù)器初始值為0xee11時,那

28、么從開始計數(shù)到產(chǎn)生中斷需要的時間為0xffff 0xee11個微秒,剛好為5000微秒,也即5毫秒.本案例timer.的初裝也可以利用下面語句完成:/*/#defined TEMOR0_COUNT 0xee11 TL0 = TEMOR0_COUNT & 0x00ff; TH0 = TEMOR0_COUNT >> 8;/*/利用定時器/計數(shù)器定時時,取TEMOR0_COUNT的低字節(jié)并裝入TL0/ TEMOR0_COUNT左移8位,并將低字節(jié)裝入 TEMOR0_COUNT需要現(xiàn)設置工作模式,并計算它的初裝值, 計算初裝值不好計算,常利用計算機中的計算器工具輔助.timer0工

29、作在模式1可以最大65535微秒中斷1次,如工作模式2,最大256微秒中斷1次.3 .當程序中只涉及一個中斷時,可以不對中斷的優(yōu)先級進行設置,因此在本案例中語句 PT0 = 1可以省略.程序中有多個中斷但沒有進行優(yōu)先級設定的情況下,單片機中斷優(yōu)先級 默認按終端號遞增而依次降低.4 .數(shù)碼管顯示語句放在了 timer0中斷效勞函數(shù)里面,由于5毫秒中斷1次,因此數(shù)碼管顯示的數(shù)據(jù)會每5毫秒更新1次.1秒內更新200次,更新過程是把原來的數(shù)據(jù)覆蓋,但顯 示數(shù)據(jù)1秒內變化1次.3.2.2 利用4個數(shù)碼管,實現(xiàn)秒信號加計數(shù)、電路原理圖3-2-1所示的電路中,4位七段數(shù)碼管采用 4只單個數(shù)碼管組成,可以顯示

30、00009999, 數(shù)據(jù)輸入端并聯(lián)后接 P0 口,位選即每個數(shù)碼管的陽極分別接P2 口,中間加非門驅動.因為P2 口反相驅動,因此,如果千位數(shù)碼管顯示,P2.7輸出低電平,P2的其它端口輸出高電平,并且此時 P0輸出千位數(shù)據(jù).在利用Proteuse軟件仿真時,數(shù)碼管 SEVEN_SEG使用7SEG-MPX4-CA ,非門 電阻R29是限流電阻.C1IC STC89C51VCCC230PIPCY 12MHz19>XTAL118XTAL2SEVENSEGR1 1KC3 10 科P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0

31、.7/AD73739 R29 2003635343332293031RESETPSENALEEAP2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A152122-25-26-28NOT1NOT2NOT3NOT41 丁P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7P3.0/RXDP3.1/TXDP3.2/INT0-P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD10 JI T2 T3 T4- -15-1617NOT 選用 74 HC series 類型中 Gates & Inv

32、erters 分類下的 74HC04.圖3-2-1 4位七段數(shù)碼管顯示、程序設計/*/ #include<reg51.h>#defined unsigned char uchar文案大全實用標準文檔#defined unsigned int uintcode uchar seven_seg10 = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;code uchar seg_scan4 = 0xef,0xdf,0xbf,0x7f;uchar counter4 = 0,0,0,0;uint cp,i;/各個數(shù)碼管對應的位選數(shù)據(jù)個位、

33、十位、百位和千位數(shù)void timer0_isr(void) interrupt 1一/ timer0中斷效勞函數(shù)uchar j;TR0 = 0; TL0 = 0x11;TH0 = 0xee;TR0 = 0;cp+; if(cp = 200) 停止計數(shù)/ TL0重新預置/ TH0重新預置開始計數(shù)/ timer0中斷1次,變量cp加1中斷200次,時間剛好為1秒cp = 0; counter0+;個位數(shù),1秒加1)if(counter0 = 10)if(counter1 = 10)if(counter2 = 10)if(counter3 = 10)counter0= 0; counter1+;

34、counter1= 0; counter2+; counter2= 0; counter3+; counter3= 0;P0 = seven_segcounterj;P2 = seg_scanj;j+;if(j = 4) j = 0;/ P0輸出數(shù)據(jù)編碼/P2輸出位選信號void timer0_initialize(void)一EA = 0;TMOD = 0x01 ;TR0 = 0;TL0 = 0x11;TH0 = 0xee;PT0 = 1;ET0 = 1;EA = 1;TR0 = 1;void main (void)/ timer0中斷初始化函數(shù)timer0_initialize() whi

35、le (1);/*/三、程序說明1 . imer0第1次中斷,j = 0 ,顯示個位,顯示5毫秒后,timer0第2次中斷,j = 1 ,顯示十位,以后隨 著中斷依次顯示百位和千位,最后重新顯示個位.每位顯示停留的時間為5毫秒.中斷4次才能讓4為依次掃描顯示完,占用的時間為 20毫秒,1秒鐘內,4位數(shù)碼管掃描顯示50遍,根據(jù)人眼視覺暫留特點,你 看到的結果是4位數(shù)據(jù)同時顯示,這種顯示方法為動態(tài)掃描顯示.2 .變量j = 0時,counter0是個位十進制數(shù),執(zhí)行 P0 = seven_segcounter0, P0 口輸出個位顯示數(shù)據(jù) 編碼;數(shù)碼管的位選信號只利用了 P2的高4位,執(zhí)行P2 =

36、 seg_scan0, P2 = 0xef,經(jīng)過非門反相,力口在數(shù) 碼管上的位選信號只有個位是高電平,此時只顯示個位.3 .數(shù)組counterj也可以用/*/uint x ;1個變量代替,在顯示時需做下面處理P0 = seven_segx/1000;P2 = seg_scan3;P0 = seven_segx%1000/100;P2 = seg_scan2;P0 = seven_segx%1000%100/10;/ P0輸出千位數(shù)據(jù)編碼千位數(shù)碼管共陽極設置為高電平/ P0輸出百位數(shù)據(jù)編碼千位數(shù)碼管共陽極設置為高電平/ P0輸出十位數(shù)據(jù)編碼文案大全實用標準文檔P2 = seg_scan1;P0

37、= seven_segx%1000%100%10;P2 = seg_scan0;千位數(shù)碼管共陽極設置為高電平/ P0輸出千位數(shù)據(jù)編碼千位數(shù)碼管共陽極設置為高電平/*/4 .思考題(1)要讓數(shù)碼管在電路加電開始就顯示1230 ,怎樣更改有關數(shù)據(jù)?(2)為什么不用P2 口直接驅動數(shù)碼管?(3)本案例如果200微秒中斷1次,也可以實現(xiàn)1定時,顯示結果會怎樣?3.2.3 設計一個6位數(shù)碼管時間顯示程序本案例使用6位數(shù)碼管顯示時間,能顯示時/分/秒,顯示格式是 00.00.00到23.59.59.其中小時和分鐘之間的小數(shù)點常亮,分鐘和秒之間的小數(shù)點進行秒閃爍.一、參考電路二、參考程序/*/#includ

38、e<reg51.h>#defined unsigned char uchar各個數(shù)碼管對應的位選數(shù)據(jù)時位、分位和秒位code uchar seven_seg10 = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;code uchar seg_scan6 = 0xfb,0xf7,0xef,0xdf,0bf,0x7f;/tick :秒信號,cp:中斷次數(shù)累計uchar counter3 = 0,0,0;uchar tick,cp,i,j;void dispaly(void)uchar d; d = d * tick; d = d |

39、 0x7f; swich(i) /d的值1秒內改變/d的值1秒內改變次,要么0x00,要么0xff次,要么0x7f,要么0xffcase 0 : P0 = seven_segcounter0%10; break;case 1 : P0 = seven_segcounter0/10; break;case 2 : P0 = d & seven_segcounter0%10; break;case 3 : P0 = seven_segcounter0/10; break;case 4 : P0 = 0x7f & seven_segcounter0%10; break;case 5

40、: P0 = seven_segcounter0/10; break; break;P2 = seg_scani;i+;if(i = 6) i = 0;/顯示秒個位/顯示秒十位/數(shù)據(jù)高8位1秒改變1次,實現(xiàn)小數(shù)點秒閃爍顯示分十位顯示數(shù)據(jù)高8位為低電平,小數(shù)點常亮顯示時十位void timer0_isr(void) interrupt 1一TR0 = 0;TL0 = 0x11;TH0 = 0xee;TR0 = 0;cp+;if(cp = 100)/ timer0中斷效勞函數(shù)停止計數(shù)/ TL0重新預置/ TH0重新預置開始計數(shù)/ timer0中斷1次,變量cp加1/中斷100次,時間剛好為 0.5

41、秒cp = 0;tick = tick; j+;秒脈沖信號if(j = 2) 剛好1秒j = 0;counter0+;個位數(shù),1秒加1if(counter0 = 60)if(counter1 = 60)if(counter2 = 24)counter0= 0; counter1+; counter1= 0; counter2+; counter2= 0;文案大全實用標準文檔display();/ timer0中斷初始化函數(shù)/ timer0初始化,為中斷做好準備)void timer0_initialize(void)(一EA = 0;TMOD = 0x01 ;TR0 = 0;TL0 = 0x1

42、1;TH0 = 0xee;PT0 = 1;ET0 = 1;EA = 1;TR0 = 1;)void main (void)(timer0_initialize() while (1);) /*/三、程序說明1 .利用counter2、counter1和counter0變量分別表示時、分和秒位的數(shù)值大小,也 可以利用結構體定義這些變量,如:/*/typedef struct(ucar hour;ucar min;ucar sec;time;time now;/now是數(shù)據(jù)類型為 time的變量/*/然后就可以用 now.hour, now.min 和 now.sec分另1J代替 counter2

43、、counter1 和 counter0.2 .執(zhí)行timer0中斷效勞函數(shù)時調用了 dispaly()函數(shù),直接把dispaly()的函數(shù)體程序寫在 中斷函數(shù)體內也行,但中斷效勞函數(shù)會顯得臃腫.timer0每5毫秒中斷1次,調用dispaly()函數(shù)執(zhí)行1次,在執(zhí)行dispaly()過程中,當i = 0時,只顯示秒個位,當i = 1時,只顯示秒 十位,依次類推.為了讓小時的個位小數(shù)點常亮,讓小時個位顯示時,把顯示編碼數(shù)據(jù)的高8位設置為0;為了分個位小數(shù)點秒閃爍,把分個位小數(shù)點位設置一個周期變化的量即可.3 .程序與復雜,使用的變量就愈多,在程序分析和設計時,需要注意使用的變量最好使 用有一定

44、含義的字符表示.文案大全實用標準文檔3.3鍵盤程序設計按鍵是一種開關,通過外界作用力,導電金屬或導電非金屬接觸與別離實現(xiàn)電路通斷的限制是按鍵的根本機械原理,如計算機鍵盤、 、 MP3以及電子表按鍵.按鍵是計算 機系統(tǒng)輸入設備,也是人機信息交換的主要途徑.按鍵按下會產(chǎn)生抖動現(xiàn)象,不能平安有效的對系統(tǒng)限制,本節(jié)根據(jù)按鍵產(chǎn)生的抖動機 理,提出以中斷、延時等舉措消除鍵盤輸入過程中的不穩(wěn)定因素,實現(xiàn)單片機系統(tǒng)鍵盤的穩(wěn)定輸入.3.3.1 鍵盤抖動現(xiàn)象按鍵按下都會發(fā)出一聲響,誰然有的按鍵聲音很稍微,但這都是導體碰撞產(chǎn)生的震動.這種現(xiàn)象稱為鍵盤抖動.如果不對鍵盤的抖動進行處理,按鍵會對系統(tǒng)電路或程序產(chǎn)生意外

45、的干擾.為了觀察按鍵的抖動現(xiàn)象,我們先做一個小實驗,分析一下一個微觸按鍵產(chǎn)生抖動 對系統(tǒng)的影響.高電平低電平T1 T5+VCC8CP CP 加計數(shù)器圖3-3-1加數(shù)計數(shù)小系統(tǒng)圖3-3-2加數(shù)計數(shù)小系統(tǒng)在圖3-3-1所示的一個加數(shù)計數(shù)小系統(tǒng)中,設計數(shù)器的脈沖輸入端CP為上升沿有效,加計數(shù)器初始顯示為 0.按鍵不按時,CP = 0,計數(shù)器不加1計數(shù).一般認為:按鍵按下, CP端由低電平變?yōu)楦唠娖?含有電平上升沿,計數(shù)器加1計數(shù),并且按下1次,計數(shù)器加1.實際實驗時會發(fā)現(xiàn),按鍵按下 1次,計數(shù)器不是加1,而是跳躍一次性增加 3或4.原因 是按鍵按下在導體接觸的瞬間產(chǎn)生了震動.圖3-3-2是按鍵按下過

46、程中 CP端實際電平改變情況.T1為不按按鍵時刻,T2為按鍵按下瞬間的抖動,T3為按鍵按下穩(wěn)定時刻,T4為按鍵放開時刻瞬間,T5為按鍵放開時刻.從圖中可以了解到,按鍵按下的瞬間由于震動會是 按鍵內部的導體穩(wěn)定接觸,而是在導通和不導通之間往返彈跳,雖然時間一瞬間,但使CP端獲得了多個電平的上升沿.按鍵抖動時間的長短由按鍵的機械特性決定,一般為5ms10ms.因此不能直接把按鍵作為1個脈沖的輸入.在數(shù)字電路中,常利用觸發(fā)器消除鍵盤抖動,但在單片機系統(tǒng)中,按鍵可以直接接在 單片機的I/O 口上,常利用鍵盤程序來消除鍵盤的抖動現(xiàn)象.3.3.2 利用外部中斷INT0實現(xiàn)鍵盤輸入本案列利用外部中斷INT0作為鍵盤輸入端,當按鍵按下時,讓單片機執(zhí)行外部中斷服 務程序,在中斷效勞中完成鍵盤限制.一、參考電路在最小系統(tǒng)根底上,單片機的P0.0 口接一只LED,鍵盤接在P3.2端口,按鍵不按時,由于P3

溫馨提示

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

評論

0/150

提交評論