


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、主要學(xué)習(xí)51單片機(jī)的外部引腳和內(nèi)部結(jié)構(gòu)等,敘述一下。本書任務(wù)驅(qū)動教學(xué),例有淺變深,循序漸進(jìn),給讀者留下思考和發(fā)揮空間。引入案3.1利用單片機(jī)的I/O口驅(qū)動LED3.1.1利用單片機(jī)的P0.0端口驅(qū)動1只LED閃爍編程的目的是利用C語言控制單片機(jī)I/O端口按要求輸出矩形波脈沖信號,由延時(shí)函數(shù)決定。信號的周期、電路原理STC-89C51單片機(jī)的P0口采用為OD門輸出,不存在拉出電流,因此利用載時(shí)有兩種接法:一種是加上拉電阻R2,見圖3-1-1,既用1KQ電阻接電源正極,此時(shí)P0口輸出高電平時(shí)LED亮;另一種電路為P0.7低電平驅(qū)動有效,在P0.7輸出低電平時(shí),STC-89C51端口灌入電流達(dá)制LE
2、D2的工作電流。P0驅(qū)動負(fù)20mA,可直接驅(qū)動小負(fù)載。圖3-3-1中的R3為限流電阻,限VCC(+5V)R31KC130P.CY12MHz19Tt19C230PtkTR11KICSTC89C51R21K18卜XTAL1XTAL2P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD73938RESETLED1LED2OVCC-1C3102930311T34567PSENALEEAP2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15-3673554332
3、-21-222324-25G-2728pi.opi.iP1.2P1.3P1.4P1.5P1.6P1.7P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RDioit1213141516圖3-1-1驅(qū)動LED電路原理加電復(fù)位電路,同時(shí)要求單片機(jī)的31引腳EA接C1、C2為獨(dú)石電容,用于微小調(diào)整單片機(jī)時(shí)鐘的C3為電解電容器;整個(gè)電路由+5V電壓供電。電單片機(jī)的最小系統(tǒng)包括晶體振蕩電路,高電平。時(shí)鐘頻率主要由晶體CY決定,振蕩頻率;R1和C3組成加電復(fù)位電路,路使用的元件參數(shù)見表3.1.1。序號標(biāo)稱單片機(jī)ICSTC89C51DIP
4、40核心芯片電容器C130PF獨(dú)石振蕩電容器C230PF獨(dú)石振蕩電容器C310阡點(diǎn)解電容器復(fù)位表3.1.13-1-1電路元件表晶振CY12MHzS型振蕩電阻R11K11/4W,金屬膜電容器C3放電電阻電阻R21KJ1/4W,金屬膜端口電位上拉電阻電阻R31KJ1/4W,金屬膜限流電阻發(fā)光二極管LED1:.:,5紅色高亮顯示發(fā)光二極管LED2:.:,5紅色高亮顯示1.程序設(shè)計(jì)平臺程序設(shè)計(jì)采用keilC軟件,為了養(yǎng)成一個(gè)良好的文件管理習(xí)慣,建議:編程前,在計(jì)算機(jī)的某個(gè)硬盤分區(qū)下建立一個(gè)目錄,目錄的名字為你編寫程序的主題,然后把產(chǎn)生的所有文件都放在該目錄下。程序設(shè)計(jì)步驟如下:(1) 運(yùn)行keilC,
5、創(chuàng)建一個(gè)項(xiàng)目。利用keilC菜單欄中project-newproject項(xiàng)目的名字為你編程的主題,如本案例可以用“LED_1.uv2”或“一個(gè)LED閃爍實(shí)驗(yàn)存放目錄為你的主題目錄下;(2) 創(chuàng)建建一個(gè)文件,然后以“.c”后綴名,(3) 把c文件添加在你的項(xiàng)目中,在project實(shí)現(xiàn)。如果軟件界面不顯示這個(gè)窗口,運(yùn)行keilC文件存放在你的主題目錄下;workspace窗口利用addfileto菜單欄中的view-projectwindowkeilC創(chuàng)建,.uv2”,(4) 設(shè)置編譯器,是編譯過程中能生成.hex”文件。默認(rèn)文件名與主題名字相同。運(yùn)行project-optionfortarget
6、1-output窗口下點(diǎn)擊createHEXfile(5) 在編程區(qū)域?qū)懩愕某绦颍Y(jié)束后存儲文件并編譯,要做檢查,盡量避免警告出現(xiàn),直到程序編譯無誤為止。(6) 程序燒寫并試運(yùn)行。這個(gè)過程稱為軟件和硬件聯(lián)合調(diào)試,如果實(shí)驗(yàn)板無誤,編譯通過,但在硬件上運(yùn)行不成功是常用的事情,需要對程序進(jìn)行多次調(diào)試。的情況下,可以利用proteus軟件仿真調(diào)試,也可以檢驗(yàn)?zāi)愕某绦蛟O(shè)計(jì)結(jié)果。2.程序設(shè)計(jì)(1)利用P0.0口驅(qū)動LED閃爍,高電平有效程序在沒有實(shí)驗(yàn)板/*/#includesbitLED=P0A0;voiddelay(unsignedcharx)包含頭文件/LED接P0.0o在kellC51軟件中,定義P
7、0.0為延時(shí)函數(shù)P0A0,unsignedchari,j;for(i=0;ix;i+)for(j=0;j200;j+);)voidmain(void)/主函數(shù)While(1)/程序死循環(huán)LED=0;voiddelay(100);LED=1;voiddelay(100);/P0.0輸出低電平,LED滅調(diào)用延時(shí)函數(shù),延時(shí)一段時(shí)間,約0.3秒,不精確/P0.0輸出高電平,LED亮/*/(2)利用P0.7端口驅(qū)動LED閃爍,低電平有效/*/#includesbitLED=P0A7;voiddelay(unsignedcharx)unsignedchari,j;for(i=0;ix;i+)包含頭文件,程
8、序?yàn)樾?號字延時(shí)函數(shù)二、程序設(shè)計(jì)for(j=0;j1000;j+);)voidmain(void)(while(1)(LED=LED;voiddelay(100);)/主函數(shù)/LED初始狀態(tài)為滅,執(zhí)行一次,延時(shí)一段時(shí)間LED改變一次狀態(tài)/*/)三、程序說明應(yīng)為使用的單片機(jī)芯片為STC89C51,因此程序開始處加入#include,文件reg51.h中包含了51芯片所有特殊功能寄存器的名稱定義和相對應(yīng)的地址值;單片機(jī)程序單步順序執(zhí)行,先執(zhí)行主函數(shù),在主函數(shù)可以調(diào)用分函數(shù),分函數(shù)可以單片機(jī)等待的過delay()如果沒有中斷,delay()不能得到精確的延時(shí)。延時(shí)函數(shù)還可以利用下面調(diào)用分函數(shù),但分函
9、數(shù)不能調(diào)用主函數(shù),程序執(zhí)行一條命令再執(zhí)行下一條,程是執(zhí)行了一個(gè)循環(huán)命令或一個(gè)浪費(fèi)時(shí)間的程序,實(shí)際執(zhí)行過程永遠(yuǎn)不會結(jié)束。為函數(shù)延,單片機(jī)在執(zhí)行此函數(shù)相關(guān)指令時(shí)占用的時(shí)間過長,在執(zhí)行過程中,單片機(jī)只能忙這一件事情。利用的函數(shù)實(shí)現(xiàn)。/*/voiddelay(unsignedintx)(while(x)x-;)/*/利用位定義命令讓LED等價(jià)于P0.0或P0.7,等于先sbitP0_0=P0A0,然后#definedLEDP0_0,也在程序前面不做此類定義,在程序里面直接寫成P0A0=1或P0A0=0,義是為亍增加程序的可讀性。程序執(zhí)行P0A0=1后,P0.0對以的單片機(jī)內(nèi)部位寄存器就設(shè)置為高電平,同
10、時(shí)P0.0端口也輸出高電平,單片機(jī)的所有I/O口都可位未定義,也可以字節(jié)定義。單片機(jī)C語言程序設(shè)計(jì)需要的C語言關(guān)鍵字不多,并且在keilC中用到的關(guān)鍵字是獨(dú)有的,因此對于沒有學(xué)習(xí)過C語言的人學(xué)習(xí)單片機(jī)C語言程序設(shè)計(jì)困難并不是很大,主要掌握單片機(jī)C語言書寫格式,怎樣用C語言控制單片機(jī)的硬件資源,另外在編程時(shí),還要有清晰的邏輯思維頭腦和認(rèn)真實(shí)踐,由淺逐步深入學(xué)習(xí),當(dāng)你堅(jiān)持到最后時(shí),單片機(jī)C語言程序設(shè)計(jì)實(shí)際上很簡單。每個(gè)人在編寫程序時(shí)都有自己的風(fēng)格。一般情況下,函數(shù)的字符左行距為0,其下每條語句前留一個(gè)“tab”鍵空。算數(shù)邏輯符號的左右留一個(gè)空格,關(guān)鍵語句要有中文或英文說明,每一個(gè)函數(shù)有時(shí)也可以用“
11、/*.*/”上下隔開這樣有助于提高程序的層次感和可讀性。3.1.2利用P0口驅(qū)動8個(gè)LED,產(chǎn)生跑馬燈或流水燈效果、參考電路實(shí)驗(yàn)電路見圖3-3-2所示,在單片機(jī)的最小系統(tǒng)的基礎(chǔ)上,P0口依次接入8個(gè)LED,P0口的上拉電阻可以使用8個(gè)1K。電阻。圖3-1-2流水燈電路在利用Proteus軟件仿真時(shí),可以用電阻排代替。單片機(jī)最小系統(tǒng)在單片機(jī)元件放置后已經(jīng)默認(rèn),即C1、C2、C3、CY、R1可以省略。其它元件選取見表3.1.2所示。表3.1.13-1-2電路Proteus軟件元件表元件名稱component總類Category分類Sub-CategoryResultsModeltype單片機(jī)Mic
12、oroprocessorIC8051Family80C51電阻排ResistorResistorPackRESPACK-8ANALOG發(fā)光二極管OptoelectronicsLEDsled-redDIGITAL二、參考程序C130PMCY12MHz19C230P=R11KT18C3293031VCC1234567ICSTC89C51/TAL1XTAL2RESETPSENALEEAP1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A
13、9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0-P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD212223-2425-2628101213141516VCC(+5V)R291K3938373635343332LED1-8/*/#includevoiddelay(void)unsignedchari,j;for(i=0;i255;i+)for(j=0;j255;j+);voidmain(void)unsignedcharj=0x01;while(1)j=j1;if(j
14、=0x00)j=0x01;P0=j;delay();/*/三、程序說明1. 語句j=j1,執(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,if語句條件滿足,j=0x01,P0.0連接的LED亮,其它滅,然后依次變化下去。如果P0口驅(qū)動8個(gè)LED低電平有效,如下修該:/*/voidmain(void)unsignedcharj=0xfe;while(1)j=(j1)|0x01;if(j=0xff)j=0xfe;P0=j;delay();2. delay()函數(shù)
15、無形參,延時(shí)時(shí)間不能設(shè)置。3.1.3利用P0口驅(qū)動一個(gè)數(shù)碼管,顯示0-9,并循環(huán)參考電路實(shí)驗(yàn)電路在單片機(jī)的最小系統(tǒng)基礎(chǔ)上,P0口接一只共陽數(shù)碼管,見圖3-1-3。帶小數(shù)點(diǎn)的數(shù)碼管是由8個(gè)LED組成,七個(gè)LED組成數(shù)字,另一只LED用來顯示小數(shù)點(diǎn)。如果數(shù)碼管內(nèi)部的8只LED的正極接在一起,負(fù)極分別引出,引腳依次命名為a、b、c、d、e、f、g和dot,稱為帶小數(shù)點(diǎn)的7段共陽極性數(shù)碼管。R11C30VCCC130PCY12MHz伯19C230P;IKxKkXTAL1P0.0/AD0P0.1/AD1P0.2/AD2XTAL2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/A
16、D7RESETP2.0/A8P2.1/A9P2.2/A10PSENP2.3/A11ALEP2.4/A12P2.5/A13EAP2.6/A14P2.7/A15P1.0P30/RXDP1.1P1.2P3.1/TXDPR2/INT:P1.4P3.4/T0P1.5P3.5/TTP1.6P3.6/WRP1.7P3.7/RDICSTC89C51189293031212223252627283938123,45610111213-14161737363534333Z圖3-1-3單片機(jī)驅(qū)動共陽數(shù)碼管電路VCC(+5V)SEVEN_SEG單片機(jī)的P0.0-P0.7口分別接數(shù)碼管的a-dot引腳,如果讓數(shù)碼管顯示
17、1,數(shù)碼管b、c段亮,程序控制P0輸出0xbe十六進(jìn)制編碼即可,因此共陽數(shù)碼管顯示0-9十進(jìn)制數(shù)字,需要利用10個(gè)顯示碼組成的數(shù)組。對于共陰數(shù)碼管,也有相應(yīng)的編碼要求。小數(shù)點(diǎn)在不用時(shí)一般不讓顯示,高位端口P0.7輸出高電平即可。由于P0每個(gè)端口的灌電流達(dá)20mA,數(shù)碼管每段LED正常顯示5mA即可,因此需要R29用來制數(shù)碼管每一段電流,以防止驅(qū)動電流過大而燒毀器件。利用Proteus軟件仿真時(shí),數(shù)碼管采用Optoelectronics元件庫中7-SegmentDisplays下的7-SEG-COM-ANODE。、參考程序/*/#includecodeunsignedcharseven_seg1
18、0=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;voiddelay(void)/*時(shí)間延遲函數(shù)*/unsignedchari,j;for(i=0;i255;i+)for(j=0;j=255;j+);voidmain(void)unsignedchari;/*變量i用來儲存09*/*無窮循環(huán)*/while(1)for(i=0;i10;i+)P0=seven_segi;delay();/*輸出09到共陽七段顯示器*/*調(diào)用時(shí)間延遲函數(shù)delay*/)/*/三、程序說明1.當(dāng)程序中使用常量數(shù)據(jù)時(shí),可以把數(shù)據(jù)存儲在單片機(jī)的程序存儲器中,對此類數(shù)據(jù)
19、聲明時(shí),前面需要加上關(guān)鍵字code或const,如本實(shí)驗(yàn)中的共陽數(shù)碼管數(shù)字顯示需要的編碼,表3-1-3是共陽數(shù)碼管編碼,表3-1-4是共陰數(shù)碼管編碼。單片機(jī)驅(qū)動液晶顯示器顯示的漢字也是一種常量數(shù)據(jù)。表3-1-3共陽數(shù)碼管顯示編碼dotgfedcba160110000000xc01111110010xf92101001000xa43101100000xb04100110010x995100100100x926100000100x827111110000xf88100000000x809100100000x90表3-1-4共陰數(shù)碼管顯示編碼dotgfedcba160001111110x3f1000
20、001100x062010110110x5b3010011110x4f4011001100x665011011010x6d6011111010x7d7000001110x078011111110x7f9011011110x6f2.本程序數(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)體嵌套在while循環(huán)體中,如管回循環(huán)顯示09,永不結(jié)束,除非電路斷電。利用數(shù)碼管也可以顯示日期和時(shí)間,在以后的程序
21、設(shè)計(jì)案例中就可以學(xué)到。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或Timerl的編程控制方法,會利用Timer0或Timerl中斷精確定時(shí)。同時(shí)掌握數(shù)碼管動態(tài)顯示原理,學(xué)會6位數(shù)字顯示的程序設(shè)計(jì)。本案例使用的電路為圖3-1-3。、程序設(shè)計(jì)/*/#includecodeunsignedcharseven_seg10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;unsignedcharcp,i;voidtimer0_isr(void)inter
22、rupt1一TR0=0;TL0=0x11;TH0=0xee;TR0=0;cp+;if(cp=200)cp=0;i+;if(i=10)i=0;P0=seven_segi-voidtimer0_initialize(void)一EA=0;TMOD=0x01;TR0=0;TL0=0x11;TH0=0xee;/聲明全局變量/timer0中斷服務(wù)函數(shù)/停止計(jì)數(shù)/TL0重新預(yù)置/TH0重新預(yù)置開始計(jì)數(shù)/timer0中斷1次,變量cp加1/中斷200次,時(shí)間剛好為1秒PT0=1;ET0=1;EA=1;TR0=1;voidmain(void)timer0_initialize()while(1);/P0輸出顯
23、示數(shù)據(jù)/timer0中斷初始化函數(shù)/設(shè)置中斷允許寄存器IE中的EA位,關(guān)閉中斷總開關(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微妙,Timer0每1微秒加1/計(jì)數(shù),加滿溢出變產(chǎn)生中斷,從計(jì)數(shù)到中斷剛好為5毫秒/設(shè)置中斷優(yōu)先次序寄存器IP中的PT0位,Timer0中斷優(yōu)先/設(shè)置中斷允許寄存器IE中ET0的位,開啟中斷小開關(guān)/打開中斷總開關(guān)開始計(jì)數(shù)/timer0初始化,為中斷做好準(zhǔn)備等待中斷/*/、程序說明1.中斷服務(wù)函數(shù)名
24、中,interruput為關(guān)鍵字,1為timer0中斷號。在reg51.h頭文件中已經(jīng)定義,表3.2.1為單片機(jī)常用中斷的中斷號。在使用中斷服務(wù)函數(shù)時(shí),直接在名后加interruput和中斷號即可。表3.2.1reg51.h中單片機(jī)常用中斷號定義中斷源中斷觸發(fā)原因中斷號INT0外部INT0引腳有低電平或下降沿信號輸入0Timer0Timer0計(jì)數(shù)溢出1INT1外部INT0引腳有低電平或下降沿信號輸入2Timer1Timer1計(jì)數(shù)溢出3串行中斷串口緩存SBUF寫入數(shù)據(jù)或讀出數(shù)據(jù)42.timer0可以用作計(jì)數(shù),也可以用來定時(shí),由由TMOD寄存器中C/T為決定,作為計(jì)數(shù)器使用時(shí),接受單片機(jī)外部引腳P
25、3.4輸入的脈沖加計(jì)數(shù);作為定時(shí)器使用時(shí),接受單片機(jī)內(nèi)部的機(jī)器周期脈沖。如果單片機(jī)的振蕩頻率為f,振蕩周期為t=1f,則機(jī)器周期為T=12/f。本案例中f=12MHz,則T=1微秒,timerO工作在模式1為16為加計(jì)數(shù)器,當(dāng)計(jì)數(shù)器初始值為0xee11時(shí),則從開始計(jì)數(shù)到產(chǎn)生中斷需要的時(shí)間為Oxffff0xee11個(gè)微秒,剛好為5000微秒,也即5毫秒。本案例timerO的初裝也可以利用下面語句完成:/*/#definedTEMORO_COUNT0xee11TL0=TEMORO_COUNT&OxOOff;THO=TEMORO_COUNT8;/*/利用定時(shí)器/計(jì)數(shù)器定時(shí)時(shí),、/二/取TEMOR0_
26、COUNT的低字節(jié)并裝入TL0/TEMOR0_COUNT左移8位,并將彳氐字節(jié)裝入TEMOR0_COUNT需要現(xiàn)設(shè)置工作模式,并計(jì)算它的初裝值,計(jì)算初裝值不好計(jì)算,常利用計(jì)算機(jī)中的計(jì)算器工具輔助。timer。工作在模式1可以最大65535微秒中斷1次,如工作模式2,最大256微秒中斷1次。3. 當(dāng)程序中只涉及一個(gè)中斷時(shí),可以不對中斷的優(yōu)先級進(jìn)行設(shè)置,因此在本案例中語句PT0=1可以省略。程序中有多個(gè)中斷但沒有進(jìn)行優(yōu)先級設(shè)定的情況下,單片機(jī)中斷優(yōu)先級默認(rèn)按終端號遞增而依次降低。4. 數(shù)碼管顯示語句放在了timer。中斷服務(wù)函數(shù)里面,由于5毫秒中斷1次,因此數(shù)碼管顯示的數(shù)據(jù)會每5毫秒更新1次。1秒
27、內(nèi)更新200次,更新過程是把原來的數(shù)據(jù)覆蓋,但顯示數(shù)據(jù)1秒內(nèi)變化1次。3.2.2利用4個(gè)數(shù)碼管,實(shí)現(xiàn)秒信號加計(jì)數(shù)、電路原理P2口,中間加非門驅(qū)動。因P2.7輸出低電平,P2的其它端口輸出高電Proteuse軟件仿真時(shí),數(shù)碼管SEVEN_SEG使用NOT選用74HCseries類型中Gates&Inverters分類下的74HC04。C130P.|CY12MHzbIITC230PR11KfIC310ICSTC89C51SEVENSEGVCC19-XTAL1182930311TXTAL2RESETPSENALEEAP2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5
28、/A13P2.6/A14P2.7/A15F-736135433I!-32_1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD739R29200212223-25-26-288.0.8RNOT1-NOT2-NOT3NOT4pi.0pi.iP1.2P1.3P1.4P1.5P1.6P1.7P3.0/RXDP3.1/TXDP3.2/INT0-P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD10JIT2T3T4T5-1617圖3-2-1所示的電路中,4位七段數(shù)碼管采用4只單個(gè)數(shù)碼管組成,可以顯示000
29、09999,數(shù)據(jù)輸入端并聯(lián)后接P0口,位選即每個(gè)數(shù)碼管的陽極分別接為P2口反相驅(qū)動,因此,如果千位數(shù)碼管顯示,平,并且此時(shí)P0輸出千位數(shù)據(jù)。在利用7SEG-MPX4-CA,非門電阻R29是限流電阻。圖3-2-14位七段數(shù)碼管顯示二、程序設(shè)計(jì)/*/#include#definedunsignedcharuchar#definedunsignedintuintcodeucharseven_seg10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;codeucharseg_scan4=0xef,0xdf,0xbf,0x7f;/各個(gè)數(shù)碼管對應(yīng)的位選
30、最據(jù)/個(gè)位、十位、百位和千位數(shù)ucharcounter4=0,0,0,0;uintcp,i;voidtimer0_isr(void)interrupt1ucharj;TR0=0;/停止計(jì)數(shù)TL0=0x11;/TL0重新預(yù)置TH0=0xee;/TH0重新預(yù)置TR0=0;開始計(jì)數(shù)cp+;/timer0中斷1次,變量cp加1if(cp=200)/中斷200次,時(shí)間剛好為1秒/timer0中斷服務(wù)函數(shù)(個(gè)位數(shù),1秒加1cp=0;counter0+;if(counter0=10)if(counter1=10)if(counter2=10)if(counter3=10)(counter0=0;counte
31、r1+;(counter1=0;counter2+;(counter2=0;counter3+;counter3=0;P0=seven_segcounterj;P2=seg_scanj;j+;if(j=4)j=0;/P0輸出數(shù)據(jù)編碼/P2輸出位選信號voidtimer0_initialize(void)EA=0;TMOD=0x01;TR0=0;TL0=0x11;TH0=0xee;PT0=1;ET0=1;EA=1;TR0=1;voidmain(void)/timer0中斷初始化函數(shù)timer0_initialize()while(1);/*/三、程序說明1. imer0第1次中斷,j=0,顯示個(gè)
32、位,顯示5毫秒后,timer0第2次中斷,j=1,顯示十位,以后隨著中斷依次顯示百位和千位,最后重新顯示個(gè)位。每位顯示停留的時(shí)間為5毫秒。中斷4次才能讓4為依次掃描顯示完,占用的時(shí)間為20毫秒,1秒鐘內(nèi),4位數(shù)碼管掃描顯示50遍,根據(jù)人眼視覺暫留特點(diǎn),你看到的結(jié)果是4位數(shù)據(jù)同時(shí)顯示,這種顯示方法為動態(tài)掃描顯示。2, 變量j=0時(shí),counter0是個(gè)位十進(jìn)制數(shù),執(zhí)行P0=seven_segcounter0,P0口輸出個(gè)位顯示數(shù)據(jù)編碼;數(shù)碼管的位選信號只利用了P2的高4位,執(zhí)行P2=seg_scan0,P2=0xef,經(jīng)過非門反相,加在數(shù)碼管上的位選信號只有個(gè)位是高電平,此時(shí)只顯示個(gè)位。1個(gè)變量
33、代替,在顯示時(shí)需做下面處理3.數(shù)組counterj也可以用/*/uintx;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ù)碼管共陽極設(shè)置為高電平/P0輸出百位數(shù)據(jù)編碼/千位數(shù)碼管共陽極設(shè)置為高電平/P0輸出十位數(shù)據(jù)編碼P2=seg_scan1;/千位數(shù)碼管共陽極設(shè)置為高電平P0=seven_segx%1000%100%10;/P0輸出千位數(shù)據(jù)編碼P2=seg_scan0;/千位數(shù)碼管共陽極設(shè)置為高電平/*/4,思考題(1)
34、要讓數(shù)碼管在電路加電開始就顯示1230,怎樣更改有關(guān)數(shù)據(jù)?(2) 為什么不用P2口直接驅(qū)動數(shù)碼管?(3) 本案例如果200微秒中斷1次,也可以實(shí)現(xiàn)1定時(shí),顯示結(jié)果會怎樣?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)行秒閃爍。、參考電路二、參考程序/*/#include#definedunsignedcharucharcodeucharseven_seg10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9
35、0;codeucharseg_scan6=0xfb,0xf7,0xef,0xdf,0bf,0x7f;/各個(gè)數(shù)碼管對應(yīng)的位選數(shù)據(jù)/時(shí)位、分位和秒位ucharcounter3=0,0,0;uchartick,cp,i,j;voiddispaly(void)/tick:秒信號,cp:中斷次數(shù)累計(jì)uchard;d=d*tick;d=d|0x7f;swich(i)/d的值1秒內(nèi)改變/d的值1秒內(nèi)改變次,要么0x00,要么0xff次,要么0x7f,要么0xffcase0:P0=seven_segcounter0%10;break;case1:P0=seven_segcounter0/10;break;ca
36、se2:P0=d&seven_segcounter0%10;break;case3:P0=seven_segcounter0/10;break;case4:P0=0x7f&seven_segcounter0%10;break;case5:P0=seven_segcounter0/10;break;/顯示秒個(gè)位/顯示秒十位/數(shù)據(jù)高8位1秒改變1次,實(shí)現(xiàn)小數(shù)點(diǎn)秒閃爍/顯示分十位顯示數(shù)據(jù)高8位為低電平,小數(shù)點(diǎn)常亮/顯示時(shí)十位break;P2=seg_scani;i+;if(i=6)i=0;voidtimer0_isr(void)interrupt1TR0=0;TL0=0x11;TH0=0xee;TR
37、0=0;cp+;if(cp=100)cp=0;tick=tick;j+;if(j=2)j=0;counter0+;/timer0中斷服務(wù)函數(shù)/停止計(jì)數(shù)/TL0重新預(yù)置/TH0重新預(yù)置/開始計(jì)數(shù)/timer0中斷1次,變量cp加1/中斷100次,時(shí)間剛好為0.5秒/秒脈沖信號/剛好1秒個(gè)位數(shù),1秒加1if(counter0=60)if(counter1=60)if(counter2=24)counter0=0;counter1+;counter1=0;counter2+;counter2=0;display();)voidtimer0_initialize(void)/timer0中斷初始化函數(shù)
38、(一EA=0;TMOD=0x01;TR0=0;TL0=0x11;TH0=0xee;PT0=1;ET0=1;EA=1;TR0=1;)voidmain(void)(timer0_initialize()/timer0初始化,為中斷做好準(zhǔn)備while(1);)/*/三、程序說明1. 利用counter2、counter1和counter0變量分別表示時(shí)、分和秒位的數(shù)值大小,也可以利用結(jié)構(gòu)體定義這些變量,如:/*/typedefstruct(ucarhour;ucarmin;ucarsec;)time;/now是數(shù)據(jù)類型為time的變量timenow;/*/然后就可以用now.hour,now.min
39、和now.sec分另U代替counter2、counter1和counter0.變量執(zhí)行timer。中斷服務(wù)函數(shù)時(shí)調(diào)用了dispaly()函數(shù),直接把dispaly()的函數(shù)體程序?qū)懺谥袛嗪瘮?shù)體內(nèi)也行,但中斷服務(wù)函數(shù)會顯得臃腫。timer0每5毫秒中斷1次,調(diào)用dispaly()函數(shù)執(zhí)行1次,在執(zhí)行dispaly()過程中,當(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è)周期變化的量即可。2. 程序與復(fù)雜,使用的變量就愈多,在程序分析和設(shè)計(jì)時(shí),需要注意使用
40、的變量最好使用有一定含義的字符表示。3.3鍵盤程序設(shè)計(jì)按鍵是一種開關(guān),通過外界作用力,導(dǎo)電金屬或?qū)щ姺墙饘俳佑|與分離實(shí)現(xiàn)電路通斷的控制是按鍵的基本機(jī)械原理,如計(jì)算機(jī)鍵盤、手機(jī)、MP3以及電子表按鍵。按鍵是計(jì)算機(jī)系統(tǒng)輸入設(shè)備,也是人機(jī)信息交換的主要途徑。按鍵按下會產(chǎn)生抖動現(xiàn)象,不能安全有效的對系統(tǒng)控制,本節(jié)根據(jù)按鍵產(chǎn)生的抖動機(jī)理,提出以中斷、延時(shí)等措施消除鍵盤輸入過程中的不穩(wěn)定因素,實(shí)現(xiàn)單片機(jī)系統(tǒng)鍵盤的穩(wěn)定輸入。3.3.1鍵盤抖動現(xiàn)象按鍵按下都會發(fā)出一聲響,誰然有的按鍵聲音很輕微,但這都是導(dǎo)體碰撞產(chǎn)生的震動。這種現(xiàn)象稱為鍵盤抖動。如果不對鍵盤的抖動進(jìn)行處理,按鍵會對系統(tǒng)電路或程序產(chǎn)生意外的干擾。
41、為了觀察按鍵的抖動現(xiàn)象,我們先做一個(gè)小實(shí)驗(yàn),分析一下一個(gè)微觸按鍵產(chǎn)生抖動對系統(tǒng)的影響。低電平T1T2T3T5T4R圖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í)會發(fā)現(xiàn),按鍵按下1次,計(jì)數(shù)器不是加1,而是跳躍一次性增加3或4。原因是按鍵按下在導(dǎo)體接觸的瞬間產(chǎn)生了震動。圖3-3-2是按鍵按下過程中CP端實(shí)際電平改變情況。T1為不按按鍵時(shí)刻,
42、T2為按鍵按下瞬間的抖動,T3為按鍵按下穩(wěn)定時(shí)刻,T4為按CP5ms鍵放開時(shí)刻瞬間,T5為按鍵放開時(shí)刻。從圖中可以了解到,按鍵按下的瞬間由于震動會是按鍵內(nèi)部的導(dǎo)體穩(wěn)定接觸,而是在導(dǎo)通和不導(dǎo)通之間來回彈跳,雖然時(shí)間一瞬間,但使端獲得了多個(gè)電平的上升沿。按鍵抖動時(shí)間的長短由按鍵的機(jī)械特性決定,一般為10ms。因此不能直接把按鍵作為1個(gè)脈沖的輸入。在數(shù)字電路中,常利用觸發(fā)器消除鍵盤抖動,但在單片機(jī)系統(tǒng)中,按鍵可以直接接在單片機(jī)的I/O口上,常利用鍵盤程序來消除鍵盤的抖動現(xiàn)象。3.3.2利用外部中斷INT0實(shí)現(xiàn)鍵盤輸入本案列利用外部中斷INT0作為鍵盤輸入端,當(dāng)按鍵按下時(shí),讓單片機(jī)執(zhí)行外部中斷服務(wù)程序
43、,在中斷服務(wù)中完成鍵盤控制。、參考電路在最小系統(tǒng)基礎(chǔ)上,單片機(jī)的P0.0口接一只LED,鍵盤接在P3.2端口,按鍵不按時(shí),由于P3.2接有上啦電阻R3,所以P3.2此時(shí)為高電平+5V,如果按鍵按下,P3.2電源地短路,P3.2為低電平。為了消除鍵盤抖動現(xiàn)象,鍵盤兩端并聯(lián)濾波電容器C4。HpC310VCCXTAL1P0.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/A13EAP2.6/A14P2.7/A
44、15P1.0P3.0/RXDP1.1P3.1/TXDP1.2P3.2/rNT0-P1.3P3.3/rNTTP14P3.4/T0P1.5P3.5/TTP1.6P3.6/WRP1.7P3.7/RDC130P.CY12MHzHIJ_C230PR11KICSTC89C511918943938373635333221222930316781224252627LED1VCC(+5V)R21K還C40.115161710F|Jr310KKEY#includesbitLED=P0A0;voidint0_isr(void)interrrupt0(unsignedchari=0;i=i;LED=i;delay()
45、;)voidmain(void)(LED=0;EA=0;EX0=1;PX0=1;EA=1;while(1);)圖3-3-3利用外部中斷INT0實(shí)現(xiàn)鍵盤輸入電路、程序設(shè)計(jì)/*/INT0中斷服務(wù)函數(shù),INT0的中斷號為0/INT0中斷1次,i值改變1次/INT0中斷1次,LED工作狀態(tài)變化1次調(diào)用延時(shí)函數(shù)/芯片初始化時(shí),LED滅/開啟INT0中斷/INT0中斷優(yōu)先,可以省去開啟總中斷開關(guān)/等待按鍵按下,中斷發(fā)生/*/三、程序說明這里沒有設(shè)置INT0是下降沿觸發(fā)中斷或是低電平觸發(fā)中斷,原因是按鍵按下,不管產(chǎn)生不產(chǎn)生鍵抖現(xiàn)象,總能使INT0引腳產(chǎn)生1個(gè)下降沿和低電平。如果設(shè)置只有下降沿才觸發(fā)INT0中
46、斷,需要利用設(shè)置計(jì)時(shí)器控制寄存器TCON的IT0=1位,按鍵按下是否產(chǎn)生中斷,可以利用程序檢測TCON的IE0位。利用外部中斷觸發(fā)作為按鍵輸入很好的解決了鍵盤抖動問題。如果需要多個(gè)鍵盤,把INT0口與I/O口之間用鍵盤連接,I/O輸出低電平掃面信號即可。在數(shù)碼管動態(tài)顯示電路中,為了節(jié)省硬件資源,可以在INT0口和P2口之間接入鍵盤,實(shí)現(xiàn)8只按鍵輸入。3.3.3利用延時(shí)程序防止鍵盤抖動,實(shí)現(xiàn)鍵盤輸入按鍵按下產(chǎn)生的抖動現(xiàn)象持續(xù)的時(shí)間不會很久,因此在按鍵按下后,可延時(shí)一段時(shí)間跳過抖動,再對按鍵的狀態(tài)檢測,從而實(shí)現(xiàn)鍵盤輸入。本案例完成通過兩個(gè)鍵盤設(shè)計(jì),實(shí)現(xiàn)對數(shù)碼管顯示數(shù)據(jù)的調(diào)整。一、電路原理在單片機(jī)最系統(tǒng)的基礎(chǔ)上,KEY1、KEY2兩個(gè)鍵盤一端分別接P3.0、P3.1,另一端接地,見圖3-3-2所示。數(shù)碼管仍使用共陽型。在Proteuse軟件中,按鍵的英文名字為BUTTON,在Switches&Relasy下的Switches里。VCC(+5V)QC310VCC-XTAL1P0.0/AD0P0.1/AD1P0.2/AD2XTAL2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7RE
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 幾何圖形初步認(rèn)識-2023年中考數(shù)學(xué)一輪復(fù)習(xí)高頻考點(diǎn)
- 吉林省吉林市2025年中考語文一模試卷(含答案)
- 2025至2030年中國熱塑性預(yù)浸材料行業(yè)市場發(fā)展監(jiān)測及投資前景展望報(bào)告
- 2025至2030年中國包裝產(chǎn)業(yè)園區(qū)行業(yè)發(fā)展前景及投資戰(zhàn)略咨詢報(bào)告
- 2025至2030年中國丙稀酸樹脂行業(yè)發(fā)展全景監(jiān)測及投資方向研究報(bào)告
- 2025至2030年中國普寧市服裝行業(yè)市場調(diào)查研究及發(fā)展戰(zhàn)略規(guī)劃報(bào)告
- 學(xué)生復(fù)學(xué)審批表
- 2025至2030年中國自動變速箱油行業(yè)市場深度分析及未來發(fā)展趨勢預(yù)測報(bào)告
- 2025至2030年中國原膠原木刨花板行業(yè)發(fā)展前景預(yù)測及投資戰(zhàn)略咨詢報(bào)告
- MySQL數(shù)據(jù)庫應(yīng)用實(shí)戰(zhàn)教程(慕課版)(第2版)實(shí)訓(xùn)指導(dǎo)-3-5 字段操作
- 2025年錦州社區(qū)專職工作人員招聘真題
- 成本收入管理辦法
- 2025年事業(yè)單位招聘考試時(shí)事政治試題庫及參考答案詳解1套
- 2023年淮安市第一人民醫(yī)院醫(yī)護(hù)人員招聘考試題庫及答案解析
- 鐵路建設(shè)項(xiàng)目質(zhì)量安全紅線管理考試試題及答案
- 胃食管健康教育培訓(xùn)課件
- 換填承載力計(jì)算(自動版)
- 短視頻:策劃+拍攝+制作+運(yùn)營課件(完整版)
- 七升八暑假數(shù)學(xué)銜接學(xué)習(xí)講義
- 電子專用設(shè)備裝調(diào)工國家職業(yè)技能標(biāo)準(zhǔn)
- JG-T-368-2012-鋼筋桁架樓承板
評論
0/150
提交評論