51單片機(jī)的基本外圍電路設(shè)計(jì)以及相關(guān)C語(yǔ)言程序免積分_第1頁(yè)
51單片機(jī)的基本外圍電路設(shè)計(jì)以及相關(guān)C語(yǔ)言程序免積分_第2頁(yè)
51單片機(jī)的基本外圍電路設(shè)計(jì)以及相關(guān)C語(yǔ)言程序免積分_第3頁(yè)
51單片機(jī)的基本外圍電路設(shè)計(jì)以及相關(guān)C語(yǔ)言程序免積分_第4頁(yè)
51單片機(jī)的基本外圍電路設(shè)計(jì)以及相關(guān)C語(yǔ)言程序免積分_第5頁(yè)
已閱讀5頁(yè),還剩65頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

2、電平時(shí), STC-89C51端口灌入電流達(dá) 20mA,可直接驅(qū)動(dòng)小負(fù)載.圖 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驅(qū)動(dòng)LED電路原理R2 1KLED1R3 1KLED20加電復(fù)位電路,同時(shí)要求單片機(jī)的 31引腳EA接C1、C2為獨(dú)石電容,用于微小調(diào)整單片機(jī)時(shí)鐘的C3為電解電容器;整個(gè)電路由 +5V電壓供電.電單片機(jī)的最小系統(tǒng)包括晶體振蕩電路, 高電平.時(shí)鐘頻率主要由晶體 CY決定, 振蕩頻率;R1和C3組

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

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

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

7、以利用 proteus軟件仿真調(diào)試,也可以檢驗(yàn)?zāi)愕某绦蛟O(shè)計(jì)結(jié)果.2.程序設(shè)計(jì)(1)利用P0.0 口驅(qū)動(dòng)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ù)主函數(shù)程序死循環(huán)/P0.0輸出低電平,LED滅調(diào)用延時(shí)函數(shù),延時(shí)一段時(shí)間,約 0.3秒,不精確/P0.0輸出高電平,LED亮/*/(2)利用P0.7端口驅(qū)動(dòng)LED閃爍,低電平有效/*/#include<reg51.h>sbit LED = P0A7;void delay(unsigned char x)(unsigned char i,j;for(i = 0;i<x;i+)包含頭文件,程序?yàn)樾?5號(hào)字延時(shí)函數(shù)文案大全實(shí)用標(biāo)準(zhǔn)文檔for(j = 0;j < 1000;j+);)void main(void) while(1

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

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

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

12、,每一個(gè)函數(shù)有時(shí)也可以用"/*.*/上下隔開(kāi)這樣有助于提升程序的層次感和可讀性.3.1.2利用P0 口驅(qū)動(dòng)8個(gè)LED ,產(chǎn)生跑馬燈或流水燈效果、參考電路實(shí)驗(yàn)電路見(jiàn)圖3-3-2所示,在單片機(jī)的最小系統(tǒng)的根底上,P0 依次接入8個(gè)LED ,P0 口的上拉電阻可以使用 8個(gè)1KC電阻.文案大全實(shí)用標(biāo)準(zhǔn)文檔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軟件仿真時(shí),可以用電阻排代替.單片

14、機(jī)最小系統(tǒng)在單片機(jī)元件放置后已經(jīng)默認(rèn),即C1、C2、C3、CY、R1可以省略.其它元件選取見(jiàn)表 3.1.2所示.表3.1.1 3-1-2電路Proteus軟件元件表元件名稱component總類 Category分類 Sub- CategoryResultsModel type單片機(jī)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();/*/三、程序說(shuō)明1.語(yǔ)句j = j << 1 ,執(zhí)行的目的是限制P0整個(gè)字節(jié)的數(shù)據(jù)在循環(huán)時(shí)左移變化,程序循環(huán)第一次, P0 = 0x02, P0.1連接的LED亮,其它滅;循環(huán)第七次, P0.7連接的LED亮,其 它滅;循環(huán)第八次,j = 0x00

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

17、小數(shù)點(diǎn)的數(shù)碼管是由8個(gè)LED組成,七個(gè)LED組成數(shù)字,另一只 LED用來(lái)顯示小數(shù)點(diǎn).如果數(shù) 碼管內(nèi)部的8只LED的正極接在一起,負(fù)極分別引出,引腳依次命名為a、b、c、d、e、f、g和dot,稱為帶小數(shù)點(diǎn)的 7段共陽(yáng)極性數(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單片機(jī)驅(qū)動(dòng)共陽(yáng)數(shù)碼管電路單片機(jī)的P0.0-P0.7 分別接數(shù)碼管的a-dot引腳,如果讓數(shù)碼管顯示1,數(shù)碼管b、c段亮,程序限制P0輸出0xbe十六進(jìn)制編碼即可,因

19、此共陽(yáng)數(shù)碼管顯示0-9十進(jìn)制數(shù)字,需要利用10個(gè)顯示碼組成的數(shù)組.對(duì)于共陰數(shù)碼管,也有相應(yīng)的編碼要求.小數(shù)點(diǎn)在不用時(shí) 一般不讓顯示,高位端口P0.7輸出高電平即可.由于P0每個(gè)端口的灌電流達(dá) 20mA,數(shù)碼管每段LED正常顯示5mA即可,因此需要 R29用來(lái)P士制數(shù)碼管每一段電流, 以預(yù)防驅(qū)動(dòng)電流過(guò)大而燒毀器件.利用Proteus軟件仿真時(shí),數(shù)碼管采用 Optoelectronics 元件庫(kù)中 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í)間延遲函數(shù) */unsigned char i,j;for (i = 0;i < 255;i+) for (j = 0;j = 255;j+);void main (void)unsigned char i;/*變量i用來(lái)儲(chǔ)存 09 */*無(wú)窮循環(huán) */while (1) for (i = 0; i<10; i+)文案大全實(shí)用標(biāo)準(zhǔn)文檔P0 = seven_segi;/*輸出09到共陽(yáng)七段顯示器*/delay();)/*調(diào)用時(shí)間延遲函數(shù)d

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

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

23、體嵌套在 while循環(huán)體中,癡血管回循環(huán)顯示09,永不結(jié)束,除非電路斷電.利用數(shù)碼管也可以顯示日期和時(shí)間,在以后的程序設(shè)計(jì)案例中就可以學(xué)到.文案大全實(shí)用標(biāo)準(zhǔn)文檔3.2單片機(jī)定時(shí)器/計(jì)數(shù)器應(yīng)用3.2.1 利用Timer0中斷產(chǎn)生1秒延時(shí),讓數(shù)1個(gè)碼管顯示秒計(jì)數(shù)本案例主要目的是熟練掌握單片機(jī)內(nèi)部Timer0或Timeri的編程限制方法,會(huì)利用Timer0或Timeri中斷精確定時(shí).同時(shí)掌握數(shù)碼管動(dòng)態(tài)顯示原理,學(xué)會(huì)6位數(shù)字顯示的程序設(shè)計(jì).本案例使用的電路為圖3-1-3.一、程序設(shè)計(jì)/*/#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ù)停止計(jì)數(shù)/ TL0重新預(yù)置/ TH0重新預(yù)置開(kāi)始計(jì)數(shù)/ timer0中斷1次,變量cp加1中斷200次,時(shí)間剛好為1秒PT0 = 1;ET0 = 1;EA = 1;TR0 = 1;void main (void)timer0_initialize() while (1);/ P0輸出顯示數(shù)據(jù)/ timer0中斷初始化函數(shù)設(shè)置中斷允許存放器IE中的EA位,關(guān)閉中斷總開(kāi)關(guān)設(shè)置計(jì)時(shí)器模式限制存放器,Time0工作在定時(shí)方式1設(shè)置計(jì)時(shí)器限制存放器 TCON存放器的TR0位為0, Timer0停止計(jì)數(shù)/ Timer0的16位計(jì)數(shù)器初始值為 0xee11, 12MHz晶體振頻率,單片機(jī)的機(jī)器周期為1微妙

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

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

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

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

30、00009999, 數(shù)據(jù)輸入端并聯(lián)后接 P0 口,位選即每個(gè)數(shù)碼管的陽(yáng)極分別接P2 口,中間加非門驅(qū)動(dòng).因?yàn)镻2 口反相驅(qū)動(dòng),因此,如果千位數(shù)碼管顯示,P2.7輸出低電平,P2的其它端口輸出高電平,并且此時(shí) P0輸出千位數(shù)據(jù).在利用Proteuse軟件仿真時(shí),數(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ù)碼管顯示、程序設(shè)計(jì)/*/ #include<reg51.h>#defined unsigned char uchar文案大全實(shí)用標(biāo)準(zhǔn)文檔#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;/各個(gè)數(shù)碼管對(duì)應(yīng)的位選數(shù)據(jù)個(gè)位、

33、十位、百位和千位數(shù)void timer0_isr(void) interrupt 1一/ timer0中斷效勞函數(shù)uchar j;TR0 = 0; TL0 = 0x11;TH0 = 0xee;TR0 = 0;cp+; if(cp = 200) 停止計(jì)數(shù)/ TL0重新預(yù)置/ TH0重新預(yù)置開(kāi)始計(jì)數(shù)/ timer0中斷1次,變量cp加1中斷200次,時(shí)間剛好為1秒cp = 0; counter0+;個(gè)位數(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輸出位選信號(hào)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);/*/三、程序說(shuō)明1 . imer0第1次中斷,j = 0 ,顯示個(gè)位,顯示5毫秒后,timer0第2次中斷,j = 1 ,顯示十位,以后隨 著中斷依次顯示百位和千位,最后重新顯示個(gè)位.每位顯示停留的時(shí)間為5毫秒.中斷4次才能讓4為依次掃描顯示完,占用的時(shí)間為 20毫秒,1秒鐘內(nèi),4位數(shù)碼管掃描顯示50遍,根據(jù)人眼視覺(jué)暫留特點(diǎn),你 看到的結(jié)果是4位數(shù)據(jù)同時(shí)顯示,這種顯示方法為動(dòng)態(tài)掃描顯示.2 .變量j = 0時(shí),counter0是個(gè)位十進(jìn)制數(shù),執(zhí)行 P0 = seven_segcounter0, P0 口輸出個(gè)位顯示數(shù)據(jù) 編碼;數(shù)碼管的位選信號(hào)只利用了 P2的高4位,執(zhí)行P2 =

36、 seg_scan0, P2 = 0xef,經(jīng)過(guò)非門反相,力口在數(shù) 碼管上的位選信號(hào)只有個(gè)位是高電平,此時(shí)只顯示個(gè)位.3 .數(shù)組counterj也可以用/*/uint x ;1個(gè)變量代替,在顯示時(shí)需做下面處理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ù)碼管共陽(yáng)極設(shè)置為高電平/ P0輸出百位數(shù)據(jù)編碼千位數(shù)碼管共陽(yáng)極設(shè)置為高電平/ P0輸出十位數(shù)據(jù)編碼文案大全實(shí)用標(biāo)準(zhǔn)文檔P2 = seg_scan1;P0

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

38、e<reg51.h>#defined unsigned char uchar各個(gè)數(shù)碼管對(duì)應(yīng)的位選數(shù)據(jù)時(shí)位、分位和秒位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 :秒信號(hào),cp:中斷次數(shù)累計(jì)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秒內(nèi)改變/d的值1秒內(nèi)改變次,要么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;/顯示秒個(gè)位/顯示秒十位/數(shù)據(jù)高8位1秒改變1次,實(shí)現(xiàn)小數(shù)點(diǎn)秒閃爍顯示分十位顯示數(shù)據(jù)高8位為低電平,小數(shù)點(diǎn)常亮顯示時(shí)十位void timer0_isr(void) interrupt 1一TR0 = 0;TL0 = 0x11;TH0 = 0xee;TR0 = 0;cp+;if(cp = 100)/ timer0中斷效勞函數(shù)停止計(jì)數(shù)/ TL0重新預(yù)置/ TH0重新預(yù)置開(kāi)始計(jì)數(shù)/ timer0中斷1次,變量cp加1/中斷100次,時(shí)間剛好為 0.5

41、秒cp = 0;tick = tick; j+;秒脈沖信號(hào)if(j = 2) 剛好1秒j = 0;counter0+;個(gè)位數(shù),1秒加1if(counter0 = 60)if(counter1 = 60)if(counter2 = 24)counter0= 0; counter1+; counter1= 0; counter2+; counter2= 0;文案大全實(shí)用標(biāo)準(zhǔn)文檔display();/ timer0中斷初始化函數(shù)/ timer0初始化,為中斷做好準(zhǔn)備)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);) /*/三、程序說(shuō)明1 .利用counter2、counter1和counter0變量分別表示時(shí)、分和秒位的數(shù)值大小,也 可以利用結(jié)構(gòu)體定義這些變量,如:/*/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ù)時(shí)調(diào)用了 dispaly()函數(shù),直接把dispaly()的函數(shù)體程序?qū)懺?中斷函數(shù)體內(nèi)也行,但中斷效勞函數(shù)會(huì)顯得臃腫.timer0每5毫秒中斷1次,調(diào)用dispaly()函數(shù)執(zhí)行1次,在執(zhí)行dispaly()過(guò)程中,當(dāng)i = 0時(shí),只顯示秒個(gè)位,當(dāng)i = 1時(shí),只顯示秒 十位,依次類推.為了讓小時(shí)的個(gè)位小數(shù)點(diǎn)常亮,讓小時(shí)個(gè)位顯示時(shí),把顯示編碼數(shù)據(jù)的高8位設(shè)置為0;為了分個(gè)位小數(shù)點(diǎn)秒閃爍,把分個(gè)位小數(shù)點(diǎn)位設(shè)置一個(gè)周期變化的量即可.3 .程序與復(fù)雜,使用的變量就愈多,在程序分析和設(shè)計(jì)時(shí),需要注意使用的變量最好使 用有一定

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

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

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論