




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第第1111章章 單片機應用系統(tǒng)設(shè)計實例單片機應用系統(tǒng)設(shè)計實例11.1 單片機電子時鐘的設(shè)計單片機電子時鐘的設(shè)計11.2 多路數(shù)字電壓表的設(shè)計多路數(shù)字電壓表的設(shè)計11.1 單片機電子時鐘的設(shè)計單片機電子時鐘的設(shè)計 通常通過用單片機設(shè)計電子時鐘有兩種方法:通常通過用單片機設(shè)計電子時鐘有兩種方法:1、通過單片機內(nèi)部的定時器、通過單片機內(nèi)部的定時器/計數(shù)器。計數(shù)器。這種方法硬件線路簡單,采這種方法硬件線路簡單,采用軟件編程實現(xiàn)時鐘計數(shù),一般稱為軟時鐘。系統(tǒng)的功能一般與用軟件編程實現(xiàn)時鐘計數(shù),一般稱為軟時鐘。系統(tǒng)的功能一般與軟件設(shè)計相關(guān),通常用在軟件設(shè)計相關(guān),通常用在對時間精度要求不高對時間精度要求不
2、高的場合;的場合;2、采用時鐘芯片。、采用時鐘芯片。如:并行日歷時鐘芯片如:并行日歷時鐘芯片DS12887,串行日歷時,串行日歷時鐘芯片鐘芯片DS1302,它的功能強大,功能部件集成在芯片內(nèi)部,自動,它的功能強大,功能部件集成在芯片內(nèi)部,自動產(chǎn)生時鐘等相關(guān)功能。硬件成本相對較高,軟件編程簡單。通常產(chǎn)生時鐘等相關(guān)功能。硬件成本相對較高,軟件編程簡單。通常用在對用在對時鐘精度要求較高時鐘精度要求較高的場合。的場合。 11.1.1 軟時鐘的基本原理軟時鐘的基本原理 軟時鐘是利用軟時鐘是利用單片機內(nèi)部的定時器單片機內(nèi)部的定時器/計數(shù)器計數(shù)器來實現(xiàn),它的處理來實現(xiàn),它的處理過程如下:過程如下: 首先設(shè)定
3、單片機內(nèi)部的一個定時器首先設(shè)定單片機內(nèi)部的一個定時器/計數(shù)器工作于計數(shù)器工作于方式,方式,對機器周期計數(shù)形成基準時間(如對機器周期計數(shù)形成基準時間(如50ms或或10ms),然后用另一個),然后用另一個定時器定時器/計數(shù)器或軟件計數(shù)的方法對基準時間計數(shù)形成秒(對計數(shù)器或軟件計數(shù)的方法對基準時間計數(shù)形成秒(對50ms記數(shù)記數(shù)20次或次或10ms計數(shù)計數(shù)100次),秒計次),秒計60次形成分,分計次形成分,分計60次形成次形成小時,小時計小時,小時計24次則計滿一天。然后通過數(shù)碼管把它們的內(nèi)容在相次則計滿一天。然后通過數(shù)碼管把它們的內(nèi)容在相應位置顯示出來即可。應位置顯示出來即可。11.1.2 系統(tǒng)
4、硬件電路的設(shè)計系統(tǒng)硬件電路的設(shè)計共陽極共陽極陰極陰極驅(qū)動取反驅(qū)動取反AT89C5211.1.3 系統(tǒng)軟件程序的設(shè)計系統(tǒng)軟件程序的設(shè)計 電子時鐘的軟件系統(tǒng)由電子時鐘的軟件系統(tǒng)由主程序主程序和和子程序子程序組組成,主程序程序包含初始化參數(shù)設(shè)置、按鍵處成,主程序程序包含初始化參數(shù)設(shè)置、按鍵處理、數(shù)碼管顯示模塊等,在設(shè)計時各個模塊都理、數(shù)碼管顯示模塊等,在設(shè)計時各個模塊都采用子程序結(jié)構(gòu)設(shè)計,在主程序中調(diào)用。由于采用子程序結(jié)構(gòu)設(shè)計,在主程序中調(diào)用。由于定時器定時器/計數(shù)器采用中斷方式處理,因此還要編計數(shù)器采用中斷方式處理,因此還要編寫定時器寫定時器/中斷服務(wù)子程序,在定時器中斷服務(wù)子程序,在定時器/計數(shù)
5、器計數(shù)器中斷服務(wù)程序中對時鐘進行調(diào)整。中斷服務(wù)程序中對時鐘進行調(diào)整。開始開始顯示單元清零顯示單元清零T0、T1設(shè)為設(shè)為16位計數(shù)模式位計數(shù)模式允許允許T0中斷中斷調(diào)用顯示子程序調(diào)用顯示子程序進入功能程序進入功能程序按下鍵否?按下鍵否?否否是是一主程序一主程序 主程序執(zhí)行流程如主程序執(zhí)行流程如圖,主程序先對顯示圖,主程序先對顯示單元和定時器單元和定時器/計數(shù)器計數(shù)器初始化,然后重復調(diào)初始化,然后重復調(diào)用數(shù)碼管顯示模塊和用數(shù)碼管顯示模塊和按鍵處理模塊,當有按鍵處理模塊,當有鍵按下,則轉(zhuǎn)入相應鍵按下,則轉(zhuǎn)入相應的功能程序。的功能程序。二數(shù)碼管顯示模塊二數(shù)碼管顯示模塊 本系統(tǒng)共用本系統(tǒng)共用8個數(shù)碼管,
6、個數(shù)碼管,從右到左從右到左依次顯示秒個位、秒十位、依次顯示秒個位、秒十位、橫線、分個位、分十位、橫線、時個位和時十位。數(shù)碼管顯示的信橫線、分個位、分十位、橫線、時個位和時十位。數(shù)碼管顯示的信息用息用8個內(nèi)存單元存放,這個內(nèi)存單元存放,這8個內(nèi)存單元稱為顯示緩沖區(qū),其中秒個個內(nèi)存單元稱為顯示緩沖區(qū),其中秒個位和秒十位、分個位和分十位、時個位和時十位分別由秒數(shù)據(jù)、分位和秒十位、分個位和分十位、時個位和時十位分別由秒數(shù)據(jù)、分數(shù)據(jù)和小時數(shù)據(jù)分拆得到。在本系統(tǒng)中數(shù)碼管顯示采用數(shù)據(jù)和小時數(shù)據(jù)分拆得到。在本系統(tǒng)中數(shù)碼管顯示采用軟件譯碼動軟件譯碼動態(tài)顯示態(tài)顯示。在存儲器中首先建立一張顯示信息的字段碼表,顯示時
7、,。在存儲器中首先建立一張顯示信息的字段碼表,顯示時,先從顯示緩沖區(qū)中取出顯示的信息,然后通過查表程序在字段碼表先從顯示緩沖區(qū)中取出顯示的信息,然后通過查表程序在字段碼表中查出所顯示的信息的字段碼,從中查出所顯示的信息的字段碼,從P0口輸出,同時在口輸出,同時在P2口將對應口將對應的位選碼輸出選中顯示的數(shù)碼管,就能在相應的數(shù)碼管上顯示顯示的位選碼輸出選中顯示的數(shù)碼管,就能在相應的數(shù)碼管上顯示顯示緩沖區(qū)的內(nèi)容。緩沖區(qū)的內(nèi)容。三定時器三定時器/計數(shù)器計數(shù)器T0中斷服務(wù)程序中斷服務(wù)程序 定時器定時器/計數(shù)器計數(shù)器T0用于時間計時。用于時間計時。選擇選擇方式方式1,重復定時,定時,重復定時,定時時間設(shè)
8、為時間設(shè)為50ms,定時時間到則中斷,在中斷服務(wù)程序中用一個計數(shù),定時時間到則中斷,在中斷服務(wù)程序中用一個計數(shù)器對器對50ms計數(shù),計計數(shù),計20次則對秒單元加次則對秒單元加1,秒單元加到,秒單元加到60則對分單元則對分單元加加1,同時秒單元清,同時秒單元清0;分單元加到;分單元加到60則對時單元加則對時單元加1,同時分單元清,同時分單元清0;時單元加到;時單元加到24則對時單元清則對時單元清0,標志一天時間計滿。在對各單元,標志一天時間計滿。在對各單元計數(shù)的同時,把它們的值放到存儲單元的指定位置。定時器計數(shù)的同時,把它們的值放到存儲單元的指定位置。定時器/計數(shù)器計數(shù)器T0中斷服務(wù)程序流程圖如
9、圖。中斷服務(wù)程序流程圖如圖。 開始開始現(xiàn)場保護,重置初值現(xiàn)場保護,重置初值啟動下一個啟動下一個50ms50ms 計數(shù)器加計數(shù)器加1秒單元加秒單元加1,50ms計數(shù)器清計數(shù)器清0,秒寫入秒個位和秒十位秒寫入秒個位和秒十位50ms 計數(shù)器計數(shù)器=20?否否是是分單元加分單元加1,秒單元清,秒單元清0,分寫入分個位和分十位分寫入分個位和分十位秒單元秒單元=60?時單元加時單元加1,分單元清,分單元清0,時寫入時個位和時十位時寫入時個位和時十位分單元分單元=60?時單元清時單元清0時單元時單元=24?中斷返回中斷返回否否否否否否是是是是是是定時器定時器/計數(shù)器計數(shù)器T0中斷服務(wù)程序:中斷服務(wù)程序:四按
10、鍵處理模塊四按鍵處理模塊按鍵處理設(shè)置為:按鍵處理設(shè)置為:如沒有按鍵,則時鐘正常走時。如沒有按鍵,則時鐘正常走時。按下按下K0鍵:進入調(diào)分狀態(tài),時鐘停止走動;鍵:進入調(diào)分狀態(tài),時鐘停止走動;按按K1和和K2鍵:可進行加鍵:可進行加1和減和減1操作;操作;繼續(xù)按繼續(xù)按K0鍵:可分別進行分和小時的調(diào)整;鍵:可分別進行分和小時的調(diào)整;最后按最后按K0鍵:退出調(diào)整狀態(tài),時鐘開始計時運行。鍵:退出調(diào)整狀態(tài),時鐘開始計時運行。五匯編語言源程序清單五匯編語言源程序清單ORG 0000HLJMP STARTORG 000BHLJMP INTT0;主程序;主程序START: MOV R0,#70H MOV R7,
11、#0CHINIT: MOV R0,#00H INC R0 DJNZ R7,INIT ;70H-7CH全部清全部清0 MOV TMOD,#01H ;T0工作在方式工作在方式1 MOV TL0,#0B0H ;T0定時定時50ms MOV TH0,#3CH SETB EA SETB ET0 SETB TR0START1: LCALL SCAN;調(diào)用顯示子程序調(diào)用顯示子程序 LCALL KEYSCAN ;調(diào)用鍵盤子程序調(diào)用鍵盤子程序 SJMP START1;延時;延時1ms子程序子程序DL1MS: PUSH 06H;保護現(xiàn)場保護現(xiàn)場R6的值的值 MOV R6,#14H;1sDL1: MOV R7,#1
12、9H;1sDL2: DJNZ R7,DL2;25次次2s=50s DJNZ R6,DL1 ;2s POP 06H ;恢復現(xiàn)場恢復現(xiàn)場R6的值的值 RET;2s2s+1s+(25次次2s+3s)20次次+2s+2s=1067s=1.067ms1ms;延時;延時20ms子程序子程序DL20MS: ACALL SCAN ACALL SCAN ACALL SCAN RET2T1T1T2T2T2T2T ;數(shù)碼管顯示程序;數(shù)碼管顯示程序 SCAN: MOV A,78H;秒秒 MOV B,#0AH DIV AB;A-商,商,B-余數(shù)余數(shù) MOV 71H,A;秒十位秒十位 MOV 70H,B ;秒個位秒個位
13、MOV A,79H;分分 MOV B,#0AH DIV AB MOV 74H,A MOV 73H,B MOV A,7AH;時時 MOV B,#0AH DIV AB MOV 77H,A MOV 76H,B MOV R1,#70H;循環(huán)掃描循環(huán)掃描8位顯示位顯示 MOV R5,#0FEH;位選碼初值,顯示位選碼初值,顯示D0位位 MOV R6,#08H;8位顯示位顯示SCAN1: MOV A,R5 MOV P2,A ;位選碼位選碼 MOV A,R1 MOV DPTR,#TAB MOVC A,A+DPTR;遠程查表遠程查表 MOV P0,A ;段選碼段選碼 MOV A,R5 LCALL DL1MS
14、INC R1 MOV A,R5 RL A MOV R5,A DJNZ R6,SCAN MOV P2,#0FFH MOV P0,#0FFH RET TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H, 0F8H,80H,90H,0BFH ;“09”,“-”的七段共陽極字段的七段共陽極字段碼碼;定時器;定時器/計數(shù)器計數(shù)器T0中斷服務(wù)程序中斷服務(wù)程序INTT0: PUSH ACC;現(xiàn)場保護現(xiàn)場保護 PUSH PSW CLR ET0 CLR TR0 MOV TL0,#0B0H ;T0定時定時50ms MOV TH0,#3CH SETB TR0 INC 7BH ;50ms定
15、時到記數(shù)定時到記數(shù) MOV A,7BH CJNE A,#14H,OUTT0 ;計計20次次(即即1s) MOV 7BH,#00 INC 78H ;秒加秒加1 MOV A,78H CJNE A,#3CH,OUTT0 ;計計60s MOV 78H,#00 INC 79H ;分加分加1 MOV A,79H CJNE A,#3CH,OUTT0 ;不等跳不等跳,計計60分分 MOV 79H,#00 INC 7AH ;時加時加1 MOV A,7AH CJNE A,#18H,OUTT0 ;計計24時時 MOV 7AH,#00 OUTT0:SETB ET0 RETI;按鍵處理程序;按鍵處理程序KEYSCAN:
16、 CLR EA JNB P1.0,KEYSCAN0 ;為為0跳跳 JNB P1.1,KEYSCAN1 JNB P1.2,KEYSCAN2KEYOUT: SETB EA RETKEYSCAN0: LCALL DL20MS ;K0去抖去抖 JB P1.0,KEYOUT ;為為1跳跳WAIT0: JNB P1.0,WAIT0 ;P1.0=0跳跳 INC 7CH ;K0松開后松開后7CH加加1 CLR ET0 CLR TR0 CJNE A,#03H,KEYOUT ;不等跳不等跳;K0 按按1下或下或2下返回下返回,按按3下下7CH清清0,不能調(diào)秒不能調(diào)秒 MOV 7CH,#00 SETB ET0 SE
17、TB TR0 SJMP KEYOUTKEYSCAN1: LCALL DL20MS ;K1鍵去抖鍵去抖 JB P1.1,KEYOUTWAIT1: JNB P1.1,WAIT1 ;P1.1=0跳跳,等待松開等待松開K1 MOV A,7CH ;按鍵次數(shù)按鍵次數(shù) CJNE A,#02H,KSCAN11 ;不等跳不等跳,K0按按2下下,調(diào)整分調(diào)整分 INC 79H ;分加分加1 MOV A,79H CJNE A,#3CH,KEYOUT ;為為60分嗎?分嗎? MOV 79H,#00 SJMP KEYOUTKSCAN11: INC 7AH ;時加時加1 MOV A,7AH CJNE A,#18H,KEYO
18、UT ;為為24時嗎?時嗎? MOV 7AH,#00 SJMP KEYOUT/按按1下調(diào)時,按下調(diào)時,按2下調(diào)分下調(diào)分KEYSCAN2: LCALL DL20MS ;K2去抖去抖 JB P1.2,KEYOUT ;P1.2=1跳跳WAIT2: JNB P1.2,WAIT2 ;松開松開K2 MOV A,7CH CJNE A,#02H,KSCAN21 ;K2按按2下嗎下嗎?按按2下調(diào)整分下調(diào)整分 DEC 79H ;分減分減1 MOV A,79H CJNE A,#0FFH,KEYOUT MOV 79H,#3BH ;計計59分分 SJMP KEYOUTKSCAN21: DEC 7AH ;時減時減1 MO
19、V A,7AH CJNE A,#0FFH,KEYOUT MOV 7AH,#17H ;計計23時時 SJMP KEYOUT END六六C語言源程序清單語言源程序清單/采用采用8位位LED軟件譯碼動態(tài)顯示程序軟件譯碼動態(tài)顯示程序/使用使用AT89C51單片機,單片機,12MHz晶振,晶振,P0口輸出字段碼,口輸出字段碼,P2口輸出位選碼,口輸出位選碼, 用共陽極用共陽極LED數(shù)碼管,數(shù)碼管,key0為調(diào)時位選擇鍵,為調(diào)時位選擇鍵,key1為加為加1鍵,鍵,key2為減為減1鍵鍵#include “reg51.h”#define char unsigned charchar codedis_712=
20、0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 xff,0 xbf;/共陽極共陽極LED數(shù)碼管數(shù)碼管“09”、“滅滅”和和“-”的字段碼的字段碼char data scan_con8=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f;/位選擇碼位選擇碼char data dis8=0 x00,0 x00,0 x0b,0 x00,0 x00,0 xb0,0 x00,0 x00;/顯示緩沖區(qū),時、分、秒初始為顯示緩沖區(qū),時、分、秒初始為0,0 x0b為為“-”的編碼的編碼cha
21、r data timedata3=0 x00,0 x00,0 x00; /分別為秒、分和小時的值分別為秒、分和小時的值char data ms50=0 x00,con=0 x00,con1=0 x00,con2=0 x00; /計數(shù)次數(shù)初值計數(shù)次數(shù)初值sbit key0=P10;sbit key1=P11;sbit key2=P12;/1ms延時函數(shù)延時函數(shù)delay1ms(int t)int i,j;for (i=0;it;i+)for (j=0;j=3)con=0;TR0=1;ET0=1; if (con!=0)if (key1=0)delay1ms(10); /K1去抖去抖while (
22、key1=0);timedatacon+;if (con=2) con1=24;else con1=60;if (timedatacon=con1)timedatacon=0;if (con!=0)if (key2=0)delay1ms(10); /K2去抖去抖while (key2=0);timedatacon-;if (con=2) con2=23;else con2=59;if (timedatacon=0)timedatacon=con2;EA=1;/數(shù)碼管顯示函數(shù)數(shù)碼管顯示函數(shù)scan( )char k;dis0=timedata0%10;dis1=timedata0/10;/秒秒d
23、is3=timedata1%10;dis4=timedata1/10; /分分dis6=timedata2%10;dis7=timedata2/10; /時時for (k=0;k8;k+)P0=dis_7disk;P2=scan_conk;delay1ms(1);P2=0 xff;/主函數(shù)主函數(shù)main( )TH0=0 x3c;TL0=0 xb0; /T0定時定時50msTMOD=0 x01;ET0=1;TR0=1;EA=1;while (1)scan( );keyscan( );/定時器、計數(shù)器定時器、計數(shù)器T0中斷服務(wù)函數(shù)中斷服務(wù)函數(shù)void time_intt0(void) interr
24、upt 1ET0=0;TR0=0;TH0=0 x3c;TL0=0 xb0;TR0=1;ms50+;If (ms50=20) /循環(huán)循環(huán)20次,計次,計1sms50=0 x00;timedata0+; /秒秒+1if (timedata0=60)timedata0=0;timedata1+; /分分+1if (timedata1=60) timedata1=0;timedata2+; /小時小時+1if (timedata2=24)timedata2=0; ET0=1;11.2 多路數(shù)字電壓表的設(shè)計多路數(shù)字電壓表的設(shè)計11.2.1 多路數(shù)字電壓表的原理及功能多路數(shù)字電壓表的原理及功能 多路數(shù)字式
25、電壓表應用系統(tǒng)主要利用多路數(shù)字式電壓表應用系統(tǒng)主要利用A/D轉(zhuǎn)換器,處理過程如下:轉(zhuǎn)換器,處理過程如下:先用先用A/D轉(zhuǎn)換器對各路電壓值進行轉(zhuǎn)換器對各路電壓值進行,得到相應的數(shù)字量,再按數(shù),得到相應的數(shù)字量,再按數(shù)字量與模擬量成字量與模擬量成正比正比關(guān)系運算得到對應的模擬電壓值,然后把模擬值關(guān)系運算得到對應的模擬電壓值,然后把模擬值通過顯示器顯示出來。設(shè)計時假設(shè)待測的輸入電壓為通過顯示器顯示出來。設(shè)計時假設(shè)待測的輸入電壓為8路,電壓值的路,電壓值的范疇為范疇為05V,要求能在四位,要求能在四位LED數(shù)碼管上輪流顯示或單路選擇顯示。數(shù)碼管上輪流顯示或單路選擇顯示。測量的最小分辨率為測量的最小分辨
26、率為0.019V,測量誤差為,測量誤差為 0.02V。 根據(jù)系統(tǒng)的功能要求,控制系統(tǒng)采用根據(jù)系統(tǒng)的功能要求,控制系統(tǒng)采用AT89C52單片機,單片機,A/D轉(zhuǎn)轉(zhuǎn)換器采用換器采用ADC0809。ADC0809是是8位的位的A/D轉(zhuǎn)換器。當輸入電壓為轉(zhuǎn)換器。當輸入電壓為5.00V時,輸出的數(shù)據(jù)值為時,輸出的數(shù)據(jù)值為255(0FFH),因此最大分辨率為),因此最大分辨率為0.0196V(5/255)。ADC0809的具有的具有8路模擬量輸入端口,通過路模擬量輸入端口,通過3位位地址輸入端能從地址輸入端能從8路中選擇一路進行轉(zhuǎn)換。如每隔一段時間輪流依次路中選擇一路進行轉(zhuǎn)換。如每隔一段時間輪流依次改變改
27、變3位地址輸入端的地址,就能依次對位地址輸入端的地址,就能依次對8路輸入電壓進行測量。路輸入電壓進行測量。LED數(shù)碼管顯示采用軟件譯碼動態(tài)顯示。通過按鍵選擇可數(shù)碼管顯示采用軟件譯碼動態(tài)顯示。通過按鍵選擇可8路循環(huán)顯路循環(huán)顯示,也可單路顯示,單路顯示可通過按鍵選擇顯示的通道數(shù)。示,也可單路顯示,單路顯示可通過按鍵選擇顯示的通道數(shù)。11.2.2 系統(tǒng)硬件電路的設(shè)計系統(tǒng)硬件電路的設(shè)計2分頻分頻共陽極共陽極2MHz1MHz11.2.3 系統(tǒng)軟件程序的設(shè)計系統(tǒng)軟件程序的設(shè)計一主程序一主程序 主程序包含初始化部分、調(diào)用主程序包含初始化部分、調(diào)用A/D轉(zhuǎn)換子程序和調(diào)用顯示程序,轉(zhuǎn)換子程序和調(diào)用顯示程序,如下
28、圖。初始化包含存放通道數(shù)據(jù)的緩沖區(qū)初始化和顯示緩沖區(qū)初如下圖。初始化包含存放通道數(shù)據(jù)的緩沖區(qū)初始化和顯示緩沖區(qū)初始化。另外,對于單路顯示和循環(huán)顯示,系統(tǒng)設(shè)置了一個標志位始化。另外,對于單路顯示和循環(huán)顯示,系統(tǒng)設(shè)置了一個標志位00H控制,初始化時控制,初始化時00H位設(shè)置為位設(shè)置為0,默認為循環(huán)顯示,當它為,默認為循環(huán)顯示,當它為1時時改變?yōu)閱温凤@示控制,改變?yōu)閱温凤@示控制,00H位通過單路位通過單路/循環(huán)按鍵控制。循環(huán)按鍵控制。開始開始初始化初始化調(diào)用調(diào)用A/D轉(zhuǎn)換子程序轉(zhuǎn)換子程序調(diào)用顯示子程序調(diào)用顯示子程序 LED數(shù)碼管采樣軟件譯碼動態(tài)掃描方式。在顯示子數(shù)碼管采樣軟件譯碼動態(tài)掃描方式。在顯示
29、子程序中包含多路循環(huán)顯示程序和單路顯示程序,多路循程序中包含多路循環(huán)顯示程序和單路顯示程序,多路循環(huán)顯示程序把環(huán)顯示程序把8個存儲單元的數(shù)值依次取出送到四個數(shù)個存儲單元的數(shù)值依次取出送到四個數(shù)碼管上顯示,每一路顯示碼管上顯示,每一路顯示1秒。單路顯示程序只對當前秒。單路顯示程序只對當前選中的一路數(shù)據(jù)進行顯示。每路數(shù)據(jù)顯示時需經(jīng)過轉(zhuǎn)換選中的一路數(shù)據(jù)進行顯示。每路數(shù)據(jù)顯示時需經(jīng)過轉(zhuǎn)換變成十進制變成十進制BCD碼,放于四個數(shù)碼管的顯示緩沖區(qū)中。碼,放于四個數(shù)碼管的顯示緩沖區(qū)中。單路或循環(huán)顯示通過標志位單路或循環(huán)顯示通過標志位00H控制。在顯示控制程序控制。在顯示控制程序中加入了對單路或循環(huán)按鍵和通道
30、選擇按鍵的判斷。中加入了對單路或循環(huán)按鍵和通道選擇按鍵的判斷。二二A/D轉(zhuǎn)換子程序轉(zhuǎn)換子程序 A/D轉(zhuǎn)換子程序用于對轉(zhuǎn)換子程序用于對ADC0809八路輸入模擬電八路輸入模擬電壓進行壓進行A/D轉(zhuǎn)換,并將轉(zhuǎn)換的數(shù)值存入轉(zhuǎn)換,并將轉(zhuǎn)換的數(shù)值存入8個相應的存儲個相應的存儲單元中,如下圖。單元中,如下圖。A/D轉(zhuǎn)換子程序每隔一定時間調(diào)用一轉(zhuǎn)換子程序每隔一定時間調(diào)用一次,也即隔一段時間對輸入電壓采樣一次。次,也即隔一段時間對輸入電壓采樣一次。三顯示子程序三顯示子程序開始開始啟動一次轉(zhuǎn)換啟動一次轉(zhuǎn)換取數(shù)據(jù)(取數(shù)據(jù)(OE=0)0809通道地址加通道地址加1返回返回地址數(shù)小于地址數(shù)小于8?A/D轉(zhuǎn)換結(jié)束轉(zhuǎn)換結(jié)
31、束EOC=1?是是否否是是否否四匯編語言源程序清單四匯編語言源程序清單;測量電壓最大值為測量電壓最大值為5V,顯示最大值為,顯示最大值為5.00V;使用使用AT89C52單片機,單片機,12MHz晶振,晶振,P0口讀入口讀入A/D值,值,P2口為口為A/D轉(zhuǎn)轉(zhuǎn)換控制口換控制口;數(shù)碼管為共陽極連接,數(shù)碼管為共陽極連接,P1口為字段碼口,口為字段碼口,P3口為位選口口為位選口;P3.5為單路為單路/循環(huán)顯示轉(zhuǎn)換按鍵,循環(huán)顯示轉(zhuǎn)換按鍵,P3.6為單路顯示時當前通道選擇按鍵為單路顯示時當前通道選擇按鍵;70H-77H存放采樣的存放采樣的8個數(shù)據(jù),個數(shù)據(jù),78H-7BH為顯示緩沖區(qū),分別為個位、為顯示緩
32、沖區(qū),分別為個位、十位、百位和當前通道值十位、百位和當前通道值;00H位為單路位為單路/循環(huán)顯示控制位,當為循環(huán)顯示控制位,當為0時循環(huán)顯示,為時循環(huán)顯示,為1時單路顯示時單路顯示;主程序入口主程序入口 ORG 0000H LJMP START;主程序主程序START: CLR A MOV P2,A MOV R0,#70H MOV R2,#0DHLOOPMEM: MOV R0,A INC R0 DJNZ R2,LOOPMEM MOV 20H,#00H ;00H位在位在20H字節(jié)中字節(jié)中 MOV A,#0FFH MOV P0,A ;數(shù)據(jù)口數(shù)據(jù)口 MOV P1,A ;段碼口段碼口 MOV P3,A
33、 ;字位口字位口MAIN: LCALL TEST ;調(diào)用調(diào)用A/D轉(zhuǎn)換程序轉(zhuǎn)換程序 LCALL DISPLAY ;調(diào)用顯示程序調(diào)用顯示程序 AJMP MAIN;顯示子程序顯示子程序DISPLAY: JB 00H,DISP11 ;為為1跳跳DISP11 MOV R3,#08H ;00H位位=0循環(huán)顯示循環(huán)顯示 MOV R0,#70H ;首地址首地址 MOV 7BH,#00H ;選中選中0通道通道DISLOOP1: LCALL TUNBCD MOV R2,#0FFHDISLOOP2: LCALL DISP LCALL KEYWORK1 DJNZ R2,DISLOOP2 ;延時延時 INC R0 I
34、NC 7BH ;循環(huán)選中循環(huán)選中8通道通道 DJNZ R3,DISLOOP1 RETDISP11: MOV A,7BH ;00H位位=1跳來跳來,實現(xiàn)單路顯示實現(xiàn)單路顯示 SUBB A,#01H MOV 7BH,A ADD A,#70H MOV R0,ADISLOOP11: LCALL TUNBCD MOV R2, #0FFHDISLOOP22: LCALL DISP LCALL KEYWORK2 DJNZ R2,DISLOOP22 ;延時延時 INC 7BH ;通道號加通道號加1 RET ;顯示數(shù)據(jù)轉(zhuǎn)換為顯示數(shù)據(jù)轉(zhuǎn)換為3位位BCD碼子程序碼子程序TUNBCD: MOV A,R0 MOV B,
35、#51 DIV AB ;A-商,商,B-余數(shù)余數(shù) MOV 7AH, A ;7AH-百位百位 MOV A,B ;A-余數(shù)余數(shù) CLR F0 SUBB A,#1AH MOV F0,C ;余數(shù)余數(shù)26,F0=C=0;余數(shù)余數(shù)26,F0=C=1 MOV A,#10 MUL AB ;B-余數(shù)余數(shù),余數(shù)余數(shù)10=BA MOV B,#51 DIV AB ;低字節(jié)低字節(jié)/51 JB F0,LOOP2 ;F0=1跳跳(余數(shù)余數(shù)26) ADD A,#5 LOOP2: MOV 79H,A ;79H-十位十位 MOV A,B ;余數(shù)處理余數(shù)處理 CLR F0 SUBB A,#1AH MOV F0,C MOV A,#1
36、0 MUL AB MOV B,#51 DIV AB JB F0,LOOP3 ADD A,#5 LOOP3: MOV 78H,A ;78H-個位個位 RET;LED掃描顯示子程序掃描顯示子程序DISP: MOV R1,#78H ;個位顯示個位顯示 MOV R5,#0FEH ;位選初值位選初值(顯示個位顯示個位)PLAY: MOV P1,#0FFH MOV A,R5 ANL P3,A MOV A,R1 MOV DPTR,#TAB MOVC A,A+DPTR ;遠程查表遠程查表 MOV P1,A ;輸出字段口輸出字段口 JB P3.2,PLAY1 ;為為1跳跳(整數(shù)位不亮整數(shù)位不亮) CLR P1.
37、7 ;點亮小數(shù)點點亮小數(shù)點PLAY1: LCALL DL1MS INC R1 ;十位顯示十位顯示 MOV A,P3 JNB ACC.3,ENDOUT ;通道號位為通道號位為0跳跳 RL A MOV R5,A MOV P3,#0FFHENDOUT: MOV P3,#0FFH MOV P1,#0FFH ;顯示顯示“滅滅”字字 RETTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H, 82H,F8H,80H,90H,0FFH ;共陽極七段字段碼表(顯示共陽極七段字段碼表(顯示“0”-“9”和和“滅滅”) ;延時子程序延時子程序DL10MS: MOV R6,#0D0H ;1sDL
38、1: MOV R7,#10H ;12sDL2: DJNZ R7,DL2 ;16次次2s=32s DJNZ R6,DL1 ;2sRET ;2sDL1MS: MOV R4,#0FFH ;1sDL3: DJNZ R4,DL3 ;255次次2s=510s MOV R4,0FFH ;1sDL4: DJNZ R4,DL4 ;510s RET ;2s1T1T2T2T2T1T2T1T2T2T;A/D轉(zhuǎn)換子程序轉(zhuǎn)換子程序TEST: CLR A MOV P2,A MOV R0,#70H ;通道號地址通道號地址 MOV R7,#08H ;8個通道個通道 LCALL TESTARTWAIT: JB P3.7,MOVD
39、 ;EOC=P3.7=1跳跳 AJMP WAITTESTART:SETB P2.3 ;ALE=1 NOP NOP CLR P2.3 SETB P2.4 ;START=1 NOP NOP CLR P2.4 NOP NOP NOP NOP RETMOVD: SETB P2.5 ;OE=1 MOV A,P0 MOV R0,A CLR P2.5 INC R0 ;指向下一通道指向下一通道 MOV A,P2 INC A ;地址加地址加1 MOV P2,A CJNE A,#08H,TESTENDTESTEND: JC TESTCON ;C=1跳跳 CLR A MOV P2,A MOV A,#0FFH MOV
40、 P0,A MOV P1,A MOV P2,A RETTESTCON: LCALL TESTART LJMP WAIT 查詢方式查詢方式讀取結(jié)果讀取結(jié)果啟動轉(zhuǎn)換啟動轉(zhuǎn)換;按鍵檢測子程序按鍵檢測子程序KEYWORK1: JNB P3.5,KEY1 ;K1=P3.5=0跳跳KEY1KEYOUT: RETKEY1: LCALL DISP ;按下按下K1后調(diào)用顯示程序后調(diào)用顯示程序 JB P3.5,KEYOUT ;K1=1跳(松開)跳(松開)WAIT11: JNB P3.5,WAIT12 ;K1=0跳跳 CPL 00H ;K1松開后切換顯示方式松開后切換顯示方式 MOV R2,#0AH MOV R3,
41、#01H RETWAIT12: LCALL DISP ;按按K1后調(diào)用顯示后調(diào)用顯示 AJMP WAIT11KEYWORK2: JNB P3.5,KEY1 ;按按K1后跳后跳 JNB P3.6,KEY2 ;K2=0跳跳KEY2 RETKEY2: LCALL DISP ;刷新顯示刷新顯示 JB P3.6,KEYOUT ;K2=1跳跳KEYOUTWAIT22: JNB P3.6,WAIT21 ;K2=0跳跳WAIT21 INC 7BH ;K2=1,通道號通道號+1 MOV A,7BH CJNE A,#08H,KEYOUT11KEYOUT11: JC KEYOUT1 ;C=1跳跳KEYOUT1 MO
42、V 7BH,#00H ;通道號通道號8,7BH清清0KEYOUT1: RETWAIT21: LCALL DISP ;刷新顯示刷新顯示 AJMP WAIT22 END五五C語言源程序清單語言源程序清單/測量電壓最大值為測量電壓最大值為5V,顯示最大值為,顯示最大值為5.00V/使用使用AT89C52單片機,單片機,12MHz晶振,晶振,P0口讀入口讀入A/D值,值,P2口為口為A/D轉(zhuǎn)換控制口轉(zhuǎn)換控制口/數(shù)碼管為共陽極連接,數(shù)碼管為共陽極連接,P1口為字段碼口,口為字段碼口,P3口為位選口口為位選口/KEY1(P3.5)為單路為單路/循環(huán)顯示轉(zhuǎn)換按鍵循環(huán)顯示轉(zhuǎn)換按鍵/KEY2(P3.6)為單路顯
43、示時當前通道選擇按鍵為單路顯示時當前通道選擇按鍵/FLAG為單路為單路/循環(huán)顯示控制位,當為循環(huán)顯示控制位,當為0時循環(huán)顯示,為時循環(huán)顯示,為1時單路顯示時單路顯示#include “reg52.h”#include “intrins.h” /調(diào)用調(diào)用_nop_( )延時函數(shù)延時函數(shù)#define ad_con P2 /ADC0809的控制口的控制口#define addata P0 /ADC0809的數(shù)據(jù)口的數(shù)據(jù)口#define disdata P1 /數(shù)碼管的字段碼輸出口數(shù)碼管的字段碼輸出口#define uchar unsigned char#define uint unsigned i
44、ntuchar number=0 x00; /存放單通道顯示時的當前通道數(shù)存放單通道顯示時的當前通道數(shù)sbit ALE=P23; /ADC0809的地址鎖存信號的地址鎖存信號 sbit START=P24; /ADC0809的啟動信號的啟動信號sbit OE=P25; /ADC0809的允許信號的允許信號sbit EOC=P37; /ADC0809的轉(zhuǎn)換結(jié)束信號的轉(zhuǎn)換結(jié)束信號sbit KEY1=P35; /循環(huán)或單路顯示選擇按鍵循環(huán)或單路顯示選擇按鍵sbit KEY2=P36; /通道選擇按鍵通道選擇按鍵sbit DISX=disdata7; /小數(shù)點位小數(shù)點位sbit FLAG=PSW0;
45、/循環(huán)或單路顯示標志位循環(huán)或單路顯示標志位uchar code dis_711=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8, 0 x80,0 x90,0 xFF; /LED的七段數(shù)碼管的字段碼(的七段數(shù)碼管的字段碼(0-9,滅)滅)uchar code scan_con4=0 xfe,0 xfd,0 xfb,0 xf7; /LED數(shù)碼管的位選碼數(shù)碼管的位選碼uchar data ad_data8=0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00; /ADC0809的的8個通道轉(zhuǎn)換數(shù)據(jù)緩沖區(qū)個通道轉(zhuǎn)
46、換數(shù)據(jù)緩沖區(qū)uint data dis5=0 x00,0 x00,0 x00,0 x00,0 x00; /前前4個為個為LED數(shù)碼管的顯示緩沖區(qū)數(shù)碼管的顯示緩沖區(qū),最后一個為暫存單元最后一個為暫存單元/1ms延時子函數(shù)延時子函數(shù) delay1ms(unit t) uint i,j; for(i=0;it;i+) for(j=0;j120;j+) ; /檢測按鍵子函數(shù)檢測按鍵子函數(shù) keytest( ) if(KEY1=0) /檢測循環(huán)或單路選擇按鍵是否按下?檢測循環(huán)或單路選擇按鍵是否按下? FLAG=!FLAG; /標志位取反,循環(huán)、單路顯示間切換標志位取反,循環(huán)、單路顯示間切換 while(
47、KEY1=0); if(FLAG=1) /單路顯示方式單路顯示方式,檢測通道選擇按鍵是否按下?檢測通道選擇按鍵是否按下? if(KEY2=0) number+; /通道數(shù)通道數(shù)+1 if(number=8) number=0; while(KEY2=0) ; /顯示掃描子函數(shù)顯示掃描子函數(shù) scan( ) uchar k,n; int h; if(FLAG=0) /循環(huán)顯示子程序循環(huán)顯示子程序 dis3=0 x00; /通道值清通道值清0 for(n=0;n8;n+) /8路通道路通道 dis2=ad_datan/51; /當前通道數(shù)據(jù)轉(zhuǎn)換為當前通道數(shù)據(jù)轉(zhuǎn)換為BCD碼存入顯示緩沖區(qū)碼存入顯示緩
48、沖區(qū) dis4=ad_datan%51; /余數(shù)(電壓小數(shù)位)送暫存單元余數(shù)(電壓小數(shù)位)送暫存單元 dis4=dis4*10; /余數(shù)余數(shù)10 dis1= dis4/51; /再除以再除以51,結(jié)果取整送十位結(jié)果取整送十位 dis4= dis4%51; /結(jié)果取余送暫存單元結(jié)果取余送暫存單元 dis4= dis4*10; /余數(shù)余數(shù)10 dis0= dis4/51; /再除以再除以51,結(jié)果取整送個位結(jié)果取整送個位 for(h=0;h500;h+) /每個通道顯示每個通道顯示1s for(k=0;k4;k+) /4位位LED掃描顯示掃描顯示 disdata=dis_7disk; if(k=2
49、) DISX=0; /點亮小數(shù)點點亮小數(shù)點 P3=scan_conk; delay1ms(1);P3=0 xff; dis3+; /通道值加通道值加1 keytest( ); /按鍵檢測按鍵檢測 if(FLAG=1) /單路顯示子程序單路顯示子程序 dis3=number; /當前通道數(shù)送通道顯示當前通道數(shù)送通道顯示 for(k=0;k4;k+) disdata=dis_7disk; if(k=2) DISX=0; P3=scan_conk; delay1ms(1);P3=0 xff; keytest( ); /檢測按鍵檢測按鍵 /ADC0809轉(zhuǎn)換子函數(shù)轉(zhuǎn)換子函數(shù) test( ) uchar
50、 m; uchar s=0 x00; /初始通道為初始通道為0 ad_con=s; /第一通道地址送第一通道地址送ADC0809控制口控制口 for(m=0;m8;m+) ALE=1;_nop_();_nop_(); ALE=0; /鎖存通道地址鎖存通道地址 START=1;_nop_();_nop_(); START=0; /啟動轉(zhuǎn)換啟動轉(zhuǎn)換 _nop_();_nop_() ;_nop_();_nop_(); while(EOC=0); /等待轉(zhuǎn)換結(jié)束等待轉(zhuǎn)換結(jié)束 OE=1;ad_datam=addata;OE=0; /讀取當前通道轉(zhuǎn)換讀取當前通道轉(zhuǎn)換0數(shù)據(jù)數(shù)據(jù) s+;ad_con=s; /
51、改變通道地址改變通道地址 ad_con=0 x00; /通道地址恢復初值通道地址恢復初值 /主函數(shù)主函數(shù)main( ) P0=0 xff; /初始化端口初始化端口 P2=0 x00; P1=0 xff; /初始化為初始化為0通道通道 P3=0 xff; while(1) test( ); /測量轉(zhuǎn)換數(shù)據(jù)測量轉(zhuǎn)換數(shù)據(jù) scan( ); /顯示數(shù)據(jù)顯示數(shù)據(jù) 11.3 單片機數(shù)字顯示溫度計單片機數(shù)字顯示溫度計11.3.1 單片機數(shù)字顯示溫度計的原理單片機數(shù)字顯示溫度計的原理 溫度測量通??梢允褂脙煞N方式來實現(xiàn):一種是用溫度測量通??梢允褂脙煞N方式來實現(xiàn):一種是用熱敏電阻之類的器件,由于感溫效應,熱敏電阻的阻值熱敏電阻之類的器件,由于感溫效應,熱敏電阻的阻值能夠隨溫度發(fā)生變化,當熱敏電阻接入電路,則流過它能夠隨溫度發(fā)生變化,當熱敏電阻接入電路,則流過它的電流或其兩端的電壓就會隨溫度發(fā)生相應的變化,再的電流或其兩端的電壓就會隨溫度發(fā)生相應的變化,再將隨溫度變化的電壓或電流采集過來,進行將隨溫度變化的電壓或電流
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 職業(yè)技能等級認定初級工復習試題含答案
- 遼寧民族師范高等專科學?!镀嚈z測技術(shù)》2023-2024學年第二學期期末試卷
- 茅臺學院《教育經(jīng)典解讀》2023-2024學年第二學期期末試卷
- 江西農(nóng)業(yè)工程職業(yè)學院《工程倫理與藝術(shù)》2023-2024學年第二學期期末試卷
- 內(nèi)蒙古鴻德文理學院《高級微生物》2023-2024學年第二學期期末試卷
- 天津天獅學院《山水臨摹》2023-2024學年第二學期期末試卷
- 山東交通職業(yè)學院《團隊激勵與溝通》2023-2024學年第二學期期末試卷
- 鄭州工業(yè)應用技術(shù)學院《漢語漢字及教學》2023-2024學年第二學期期末試卷
- 新疆農(nóng)業(yè)大學《康復功能評定學》2023-2024學年第二學期期末試卷
- 義烏工商職業(yè)技術(shù)學院《服裝紙樣設(shè)計綜合實訓》2023-2024學年第二學期期末試卷
- 新版統(tǒng)編版一年級道德與法治下冊全冊教案(完整版)教學設(shè)計含教學反思
- 2025年上半年廣東汕尾市城區(qū)招聘政府聘員69人易考易錯模擬試題(共500題)試卷后附參考答案
- 2024年不動產(chǎn)登記代理人《地籍調(diào)查》考試題庫大全(含真題、典型題)
- 2025版MCN公司藝人合作簽約合同范本3篇
- 財務(wù)服務(wù)協(xié)議書
- YC/Z 623-2024煙草商業(yè)企業(yè)卷煙物流應急作業(yè)指南
- GB/T 45098-2024營運純電動汽車換電服務(wù)技術(shù)要求
- 物聯(lián)網(wǎng)安全風險與防護
- 2025年中考英語話題作文范文20篇
- 包裝產(chǎn)品設(shè)計部門規(guī)劃
- 2024年中國一次性內(nèi)褲市場調(diào)查研究報告
評論
0/150
提交評論