單片機定時鬧鐘 一、[電路概述]該時鐘電路主要以單片機AT89S52為核心而設計的,通過單片機對信息的分析與處理控制外圍設備。電路整體設計思想是想把它做成一個實用的器件,所以在題目要求的前提下,我們又加入了星期程序,溫度程序,年、月、日程序以及時間的12—24轉換程序。 [關鍵字]:單片機 數碼顯示 溫度傳感器 光識電路 二、[題目分析與方案論證]按照系統設計功能的要求,初步確定設計系統由復位模塊、時鐘模塊、溫度模塊、音樂模塊、光識模塊及顯示模塊共五個模塊組成,后來在時鐘模塊的基礎上又加載了日歷、星期的模塊 從單片機AT89S52入手,通過使用AT89S52的內部的可編程定時器/計數器,結合對外接晶振的調節來確定一個合適的振蕩周期,從而確定出內部的機器周期。再通過對內部中斷程序的設置來設計出時鐘程序,即設計出了電子時鐘的核心。 根據題目的要求,我們設計了以下方案: [方案一]設計中加載了年、月、日的設計,剛開始時打算用18個共陽數碼管,考慮到數碼管太多是畢會給硬件電路帶來麻煩,經過考慮后,決定把年、月、日與時間設置到一組數碼管上來,即六個數碼管即能顯示時間又能顯示年、月、日,這樣一來就方便了硬件電路; [方案二]主控芯片使用51系列AT89S52單片機設計時溫度模塊設計溫度元件用AD590,利用AD590以及接口電路把溫度轉換成模擬電壓,經由ADC0804轉換成數字信號,然后經AT89S52處理顯示溫度。但由于AD590價錢比較貴,且只能轉換成模擬電壓,這樣一來硬件就要增加更多的器件且又不經濟,經查找發現18B20溫度傳感器價錢便宜且可以直接把溫度轉換成數字量測溫范圍為-55—125度,最大分辨率可達0.0625度,采用3線制與單片機相連,減少了外部的硬件電路,具有低成本和易使用的特點,所以我們選擇了18B20溫度傳感器。 附18B20溫度傳感器工作原理:DS18B20溫度傳感器是美國DALLAS半導體公司最新推出的一種改進型智能溫度傳感器,與傳統的熱敏電阻等測溫元件相比,它能直接讀出被測溫度,并可根據實際要求通過簡單的編程實現9—12位的數字值讀數方式。溫度傳感器DS18B20采集溫度信號送該給單片機處理,存儲器通過單片機對某些時間點的數據進行存儲;,DS18B20的性能特點如下: 1、獨特的單線接口僅需要一個引腳進行通信; 2、多個DS18B20可以并聯在唯一的三線上,實現多點組網功能; 3、無須外部器件; 4、可通過數據線供電,電壓范圍為3.0---5.5V; 5、零待機功耗; 6、溫度以9或12位數字量讀出; 7、用戶可定義的非易失性溫度報警設置; 8、報警搜索命令識別并標志超過程序限定溫度(溫度報警條件)的器件; 9、負電壓特性,電源極性接反是,溫度計不會因發熱而燒毀,但不能正常工作。 三、[系統總體結構框圖] [按鍵功能] a鍵:P2.1口12---24轉換 b鍵:P2.3口調整定時、計時的時、調整年 c鍵:P2.5口調整計時的秒和定時狀態及日 d鍵:P2.7口判斷定時到否 e鍵:P2.0口調整星期 f鍵:P2.2口定時、計時轉換 g鍵:P2.4口調整定時、計時的秒和判斷定時狀態、調整日 h鍵:P2.6口調整定時的報警音樂、省電模式 i鍵:復位鍵 j鍵:P3.6口年、月、日的顯示 四、[主要電路原理與設計] (1)系統硬件電路的設計: 電路是由控制部分和顯示部分兩大部分組成。利用單片機程序進行控制,單片機以晶體振蕩器的振蕩周期(或外部引入的時鐘周期)為最小的時序單位,片內的各種微操作都以此周期為時序基準。振蕩頻率二分頻后形成狀態周期或稱s周期,所以,1個狀態周期包含有2個振蕩周期。振蕩頻率foscl2分頻后形成機器周期MC。所以,1個機器周期包含有6個狀態周期或12個振蕩周期。1個到4個機器周期確定一條指令的執行時間,這個時間就是指令周期。AT89S52單片機指令系統中,各條指令的執行時間都在1個到4個機器周期之間。 ,并通過數碼管進行顯示單片機普遍采用鎖相環技術,使單片機的時鐘頻率可由程序控制。鎖相環允許用戶在片外使用頻率較低的晶振,可以很大地減小板級噪聲;而且,由于時鐘頻率可由程序控制,系統時鐘可以在一個很寬的范圍內調整,總線頻率往往能升得很高。但是,使用鎖相環也會帶來額外的功率消耗。單就時鐘方案來講,使用外部晶振且不使用鎖相環是功率消耗最小的一種。AT89S52單片機的時鐘信號通常用兩種電路形式得到:內部振蕩方式和外部振蕩方式。
在引腳XTAL1和XTAL2外接晶體振蕩器(簡稱晶振)或陶瓷諧振器,就構成了內部振蕩方式。由于單片機內部有一個高增益反相放大器,當外接晶振后,就構成了自激振蕩器并產生振蕩時鐘脈沖。內部振蕩方式的外部電路如下圖所示。
圖中,電容器C01,C02起穩定振蕩頻率、快速起振的作用,其電容值一般在5-30pF。晶振頻率的典型值為12MH2,采用6MHz的情況也比較多。內部振蕩方式所得的時鐘情號比較穩定,實用電路中使用較多。
外部振蕩方式是把外部已有的時鐘信號引入單片機內。這種方式適宜用來使單片機的時鐘與外部信號保持同步。外部振蕩方式的外部電路如下圖所示。如圖所示: 各模塊分析: 顯示模塊——電路先通過電源電路送出+5V電壓,單片機AT89S52通過74LS47和CD4515(4—16譯碼器)驅動數碼管顯示數值, 顯示部分采用普通共陽極數碼管顯示,采用動態掃描,以減少硬件電路。考慮到一次掃描12位數碼管顯示時會出現閃爍情況,設計時分兩排顯示,一排顯示時間和年月日,一排顯示星期和溫度, 共陽極數碼管中8個發光二極管的陽極(二極管正端)連在一起。通常,公共陽極接高電平(一般接電源),其它管腳接段驅動電路輸出端。當某段驅動電路的輸入端為低電平時,該端所連接的字段導通并點亮。根據發光字段的不同組合可顯示出各種數字或字符。此時,要求段驅動電路能吸收額定的段導通電流,還需根據外接電源及額定段導通電流來確定相應的限流電阻。采用動態顯示方式,比較節省I/O口,硬件電路也較靜態顯示簡單,但其亮度不如靜態顯示方式,而且在顯示位數較多時,CPU要依次掃描,占用CPU較多時間。
為了提供共陽LED數碼管的驅動電壓,用三極管9012作電源驅動輸出。采用12MHz晶振,有利于提高秒計時的精確性。三極管采用9012。數碼管采用紅色的共陽型LED數碼管,亮度高些,因為是掃描的顯示方式,所以各個數碼管的abcdefg各腳采用了總線并聯,改動510歐姆的電阻可以改變顯示亮度; file:///C:/Users/admin/AppData/Local/Temp/msohtmlclip1/01/clip_image007.gif 時鐘模塊——利用芯片內部的振蕩器,然后在引腳XTAL1和引腳 XTAL2兩端接晶體諧振器,就構成了穩定的自激振蕩器,其發出的脈沖直接送入內部的時鐘電路,如圖外接晶振時,C1和C2的值通常選擇30pF; C1、C2對頻率有微調作用,晶體諧振器的頻率12MHz。為了減少寄生電容,更好地保證振蕩器穩定、可靠地工作,振蕩器和電容應盡可能安裝得與單片機芯片靠近。設置了12—24兩種顯示狀態,調整計時的按鍵、設置定時的按鍵且定時設置了3次定時、還另加載了星期、年、月、日的調整及閏年的自動調整; 溫度模塊——主要由18B20通過單片機AT89S52中的溫度程序不斷的檢測溫度來顯示溫度溫度傳感器DS18B20采集溫度信號送該給單片機處理,存儲器通過單片機對某些時間點的數據進行存儲; 音樂模塊——通過LM386N-1給揚聲器信號來發出音樂,這個模塊主要是為時鐘定時到時發出音樂鬧鈴,而在軟件部分設置了可以一次設置3次定時,每次定時到時,音樂程序中編了6種音樂,它可以自動選擇6種音樂中的任一音樂響1分鐘,如果中間不想讓鬧鈴響可以按一按鍵,鬧鈴就立刻停止 file:///C:/Users/admin/AppData/Local/Temp/msohtmlclip1/01/clip_image008.gif; 復位模塊——單片機復位電路是使CPU和系統中的其他功能部件都處在一個確定的初始狀態,并從該狀態開始工作,例如復位后PC=0000H,使單片機從第一個單元取指令。無論是在單片機剛接上電源時,還是斷電后或者發生故障后都要復位;單片機的復位操作使單片機進入初始化狀態,其中包括使程序計數器PC=0000H,這表明程序從0000H地址單元開始執行。單片機冷啟動后,片內RAM為隨機值,運行中的復位操作不改變片內RAM區中的內容,21個特殊功能寄存器復位后的狀態為確定值,見下表。
值得指出的是,記住一些特殊功能寄存器復位后的主要狀態,對于了解單片機的初態,減少應用程序中的韌始化部分是十分必要的。
說明:表中符號*為隨機狀態;
A=00H,表明累加器已被清零; 特殊功能寄存器 | 初始狀態 | 特殊功能寄存器 | 初始狀態 | A | 00H | TMOD | 00H | B | 00H | TCON | 00H | PSW | 00H | TH0 | 00H | SP | 07H | TL0 | 00H | DPL | 00H | TH1 | 00H | DPH | 00H | TL1 | 00H | P0~P3 | FFH | SBUF | 不定 | IP | ***00000B | SCON | 00H | IE | 0**00000B | PCON | 0*******B |
PSW=00H,表明選寄存器0組為工作寄存器組;
SP=07H,表明堆棧指針指向片內RAM 07H字節單元,根據堆棧操作的先加后壓法則,第一個被壓入的內容寫入到08H單元中;
Po-P3=FFH,表明已向各端口線寫入1,此時,各端口既可用于輸入又可用于輸出;
IP=×××00000B,表明各個中斷源處于低優先級;
IE=0××00000B,表明各個中斷均被關斷; 系統復位是任何微機系統執行的第一步,使整個控制芯片回到默認的硬件狀態下。51單片機的復位是由RESET引腳來控制的,此引腳與高電平相接超過24個振蕩周期后,51單片機即進入芯片內部復位狀態,而且一直在此狀態下等待,直到RESET引腳轉為低電平后,才檢查EA引腳是高電平或低電平,若為高電平則執行芯片內部的程序代碼,若為低電平便會執行外部程序。 光識模塊——同樣也是為定時服務的,只要定時到,組成心字的18只發光二極管就會按程序先做左移位,再全亮全滅3次,然后再右移,再全亮全滅3次如此循環1分鐘; file:///C:/Users/admin/AppData/Local/Temp/msohtmlclip1/01/clip_image009.gif file:///C:/Users/admin/AppData/Local/Temp/msohtmlclip1/01/clip_image010.gif
安全省電模式——電源電路上裝了保險管只要電流大于額定電流保險就斷來保護電路,省電模式:不看時顯示不亮,看時,按下一鍵顯示就亮,盡量達到人性化。 五、[軟件系統設計] 計時程序是實現電子時鐘的核心內容,本程序用中斷time0來控制,計時顯示的單元從50h開始,50h=秒的個位,51h=秒的十位,52h=分的個位,53h=分的十位,54h=時的個位,55h=時的十位 org 000bh
jmp time0 mov tmod,#00010001b mov ie,#10001010b mov ip,#00000010b mov th0,#(65536-2000)/256
mov tl0,#low(65536-2000) mov 4fh,#02;兩個中斷250次為1秒 定時報警程序
作用是判斷時間是否與設置的鬧鐘時間相等,如相等則開啟鬧鐘。
單片機內定時振鈴開關使用軟件開關,即用標志寄存器,且程序設置了3次定時,可見要使電子時鐘定時打鈴,必須同時具備兩個條件,第一:定時振鈴開;第二:當前定時項數不為0項。 因為要使電子時鐘定時打鈴,必須同時具備上述的兩個條件,所以在單片機執行查詢定時各項的程序之前,主程序會首先查詢這兩個條件是否同時滿足,如果滿足的話,則進行一輪查詢,所謂一輪查詢定時,即將當前時間與定時各項一一比較,看是否相符,如果查到某項相符,則調用音樂程序。每查完一項,寄存器中的值會自動減1(即為定時時間的項數)。當定時時間的項數值自動減為0時,則表示這一輪查詢定時時間完畢,只要條件允許(定時音樂開且定時項數不為0),有可以進行一輪新的查詢定時時間。 定時1:33h=分,34h=時,定時2:35h=分,36h=時,定時3:37h=分,38h=時,定時狀態=39h;定時顯示的單元從60h開始,60h=定時狀態,61h=此時;定時狀態的音樂種類,62h=分的個位,63h=分的十位;64h=時的個位,65h=時的十位 溫度程序: 57h=溫度的十位,58h=溫度的個位, wendu:CALL REST;調復位
MOV A,#0CCH CALL WRITE調寫程序 MOV A,#4EH CALL WRITE MOV A,#00H CALL WRITE MOV A,#00H CALL WRITE MOV A,#7FH CALL WRITE CALL REST MOV A,#0CCH CALL WRITE MOV A,#44H CALL WRITE MOV R0,#20 LOOP5:MOV R1,#100 LOOP6:MOV R2,#250 DJNZ R2,$ DJNZ R1,LOOP6 DJNZ R0,LOOP5 CALL REST MOV A,#0CCH CALL WRITE MOV A,#0BEH CALL WRITE CALL READ2;調讀程序 MOV A,#0ECH CALL WRITE CALL HUAN clr 20h.3 ret
file:///C:/Users/admin/AppData/Local/Temp/msohtmlclip1/01/clip_image011.gif
******初始化************************************* org 0000h;計時顯示的單元從50h開始,50h=秒的個位,51h=秒的十位,52h= jmp main;分的個位,53h=分的十位,54h=時的個位,55h=時的十位,56h= org 000bh;星期,57h=溫度的十位,58h=溫度的個位,30h=秒,31h=分,32h=時,定時1:33h=分,34h=時, jmp time0;定時2:35h=分,36h=時,定時3:37h=分,38h=時,定時狀態=39h org 001bh jmp time1 ************主程序******************************** main:mov r0,#00;等待 djnz r0,$ movsp,#6ah ;定時顯示的單元從60h開始,60h=定時狀態,61h=此時 mov tmod,#00010001b ;定時狀態的音樂種類,62h=分的個位,63h= 分的十位 mov ie,#10001010b ;64h=時的個位,65h=時 的十位 mov ip,#00000010b mov th0,#(65536-2000)/256 mov tl0,#low(65536-2000) mov 4fh,#02;兩個中斷250次為1秒 mov 4eh,#00;光報警 mov 2dh,#250;中斷250次為0.5秒 mov 2fh,#00h;設置計時顯示數碼管的編號 mov 2eh,#00h;設置定時顯示數碼管的編號 mov 24h,#00h;設置年月日顯示數碼管的編號 mov 30h,#00h;設置時間的初值 mov 31h,#00h mov 32h,#12h mov 56h,#01h; 設置星期初值 mov 33h,#00h; 設置定時初值 mov 34h,#01h mov 35h,#00h mov 36h,#02h mov 37h,#00h mov 38h,#03h mov 39h,#01h; 設置定時狀態初始值 mov 3ah,#01h;設置定時狀態1時音樂的初始值 mov 3bh,#02h;設置定時狀態2時音樂的初始值 mov 3ch,#03h;設置定時狀態3時音樂的初始值 mov 21h,#00h;設置年初值,00表示2000年 mov 22h,#01h;設置月初值 mov 23h,#01h;設置日初值 setb 20h.0;12,24標志位,1表示12小時制,0表示24小時制 setb 20h.1;定時,計時標志位,1表示計時,0表示定時 clr 20h.2;定時到否標志位,1表示到,0表示不到 setb 20h.3;是否允許檢測溫度標志位,1表示允許 clr 20h.4; 年標志位,1表示閏年 setb 20h.5; 1表示31天,0表示30天 clr 20h.6;1表示顯示年月日 setb p3.0;上下午標志位,1表示上午,0表示下午 clr p1 setb tr0 *************星期設置程序************************************* start:jb p2.0,q1;調整星期 call del;消除抖動 mov a,56h add a,#01h cjne a,#07h,z1 mov 56h,#08h jmp a1 z1:cjne a,#09h,z2 mov 56h,#01h jmp a1 z2:mov 56h,a a1:call del jnb p2.0,a1 jmp start *************設置12--24小時轉換程序******************************** q1:jb p2.1,q2; 12,24小時制轉換 call del; 消除抖動 jnb 20h.0,b1 jnb p3.0,b2;將12小時制轉換為24小時制 jmp a2 b2:mov a,32h add a,#12h da a cjne a,#24h,b3 mov 32h,#00h setb p3.0 jmp a2 b3:mov 32h,a setb p3.0 jmp a2 b1:mov a,32h;將24小時制轉換為12小時制 cjne a,#00h,b7 mov 32h,#12h clr p3.0 jmp a2 b7:cjne a,#20h,b8 mov 32h,#08h clr p3.0 jmp a2 b8:cjne a,#21h,b9 mov 32h,#09h clr p3.0 jmp a2 b9:cjne a,#12h,b4 jmp a2 b4:jnc b5 jmp a2 b5:subb a,#12h mov 32h,a clr p3.0 a2:cpl 20h.0 b6:call del jnb p2.1,b6 jmp start *************定時計時調整程序************************************* q2:jb p2.2,q3;定時,計時轉換 call del; cpl 20h.1 a3:call del jnb p2.2,a3 jmp start q3:jb p2.3,q4;調整定時,計時的時,年 call del;消除抖動 jnb 20h.6,c00 call yearyear jmp a4 c00:jnb 20h.1,c1 jb 20h.0,c2;計時調整 mov a,32h add a,#01h da a cjne a,#24h,c3 mov 32h,#00h jmp a4 c3:mov 32h,a jmp a4 c2:mov a,32h add a,#01h da a mov 32h,a cjne a,#13h,c4 mov 32h,#01h cpl p3.0 jmp a4 c4:mov 32h,a jmp a4 c1:mov a,39h;定時調整 cjne a,#01h,c5 mov r0,#34h jmp c10 c5:cjne a,#02h,c6 mov r0,#36h jmp c10 c6:mov r0,#38h c10:jb 20h.0,c7 mov a,@r0 add a,#01h da a cjne a,#24h,c8 mov @r0,#00h jmp a4 c8:mov @r0,a jmp a4 c7:mov a,@r0 add a,#01h da a cjne a,#13h,c9 mov @r0,#01h jmp a4 c9:mov @r0,a a4:call del jnb p2.3,a4 jmp start q4:jb p2.4,q5;調整定時,計時的分,月 call del jnb 20h.6,d00 call yueyue jmp a5 d00:jnb 20h.1,d1 mov a,31h;計時分調整 add a,#01h da a cjne a,#60h,d2 mov 31h,#00h jmp a5 d2:mov 31h,a jmp a5 d1:mov a,39h ;定時分調整 cjne a,#01h,d3 mov r0,#33h jmp d5 d3:cjne a,#02h,d4 mov r0,#35h jmp d5 d4:mov r0,#37h d5:mov a,@r0 add a,#01h da a cjne a,#60h,d6 mov @r0,#00h jmp a5 d6:mov @r0,a a5:call del jnb p2.4,a5 jmp start q5:jb p2.5,q6;調整計時的秒和定時的狀態,日 call del jnb 20h.6,e00 call ri jmp a6 e00:jnb 20h.1,e1 mov a,30h;調整計時的秒 add a,#01h da a cjne a,#60h,e2 mov 30h,#00h jmp a6 e2:mov 30h,a jmp a6 e1:mov a,39h;調整定時狀態 add a,#01h da a cjne a,#04h,e3 mov 39h,#01h jmp a6 e3:mov 39h,a a6:call del jnb p2.5,a6 jmp start *************調整定時的報警音樂,省電模式********************************* q6:jb p2.6,q7 call del jnb 20h.1,gh cpl p3.4 jmp i3 gh:mov a,39h cjne a,#01h,i1 mov a,3ah add a,#01h mov 3ah,a cjne a,#07h,i3 mov 3ah,#01h jmp i3 i1:cjne a,#02h,i2 mov a,3bh add a,#01H mov 3bh,a cjne a,#07h,i3 mov 3bh,#01h jmp i3 i2:mov a,3ch add a,#01h mov 3ch,a cjne a,#07h,i3 mov 3ch,#01h i3:call del jnb p2.6,i3 jmp start ************定時報警************************** q7:jnb 20h.2,q8 call yinyue jmp start q8:jnb 20h.3,q9 call wendu;檢測溫度 jmp start q9:jb p3.6,q10 cpl 20h.6 q11:call del jnb p3.6,q11 q10:jmp start ***********閏年判斷************************************************ nian:mov a,21h cjne a,#00h,nian0 jmp year nian0:cjne a,#04h,nian1 jmp year nian1:cjne a,#08h,nian2 jmp year nian2:cjne a,#12h,nian3 jmp year nian3:cjne a,#16h,nian4 jmp year nian4:cjne a,#20h,nian5 jmp year nian5:cjne a,#24h,nian6 jmp year nian6:cjne a,#28h,nian7 jmp year nian7:cjne a,#32h,nian8 jmp year nian8:cjne a,#36h,nian9 jmp year nian9:cjne a,#40h,nian10 jmp year nian10:cjne a,#44h,nian11 jmp year nian11:cjne a,#48h,nian12 jmp year nian12:cjne a,#52h,nian13 jmp year nian13:cjne a,#56h,nian14 jmp year nian14:cjne a,#60h,nian15 jmp year nian15:cjne a,#64h,nian16 jmp year nian16:cjne a,#68h,nian17 jmp year nian17:cjne a,#72h,nian18 jmp year nian18:cjne a,#76h,nian19 jmp year nian19:cjne a,#80h,nian20 jmp year nian20:cjne a,#84h,nian21 jmp year nian21:cjne a,#88h,nian22 jmp year nian22:cjne a,#92h,nian23 jmp year nian23:cjne a,#96h,nian24 year:setb 20h.4 jmp year1 nian24:clr 20h.4 year1:ret yue:mov a,22h;大月31天,小月30天 cjne a,#04h,yue0 jmp yue4 yue0:cjne a,#06h,yue1 jmp yue4 yue1:cjne a,#09h,yue2 jmp yue4 yue2:cjne a,#11h,yue3 yue4:clr 20h.5 jmp yue5 yue3:setb 20h.5 yue5:ret yearyear:mov a,21h;年加1 add a,#01h da a mov 21h,a ret yueyue:mov a,22h;月加1 add a,#01h da a mov 22h,a cjne a,#13h,yueyue0 mov 22h,#01h yueyuye0:ret ri:mov a,23h;日加1 add a,#01h da a mov 23h,a cjne a,#29h,ri0 mov a,22h cjne a,#02h,ri1 call nian jb 20h.4,ri1 mov 23h,#01h jmp ri1 ri0:cjne a,#31h,ri2 call yue jb 20h.5,ri1 mov 23h,#01h jmp ri1 ri2:cjne a,#32h,ri1 mov 23h,#01h ri1:ret **************計時子程序************************ jishi:mov a,30h;秒加一 add a,#01h da a mov 30h,a cjne a,#60h,f4 mov 30h,#00h setb 20h.3;允許檢測溫度 mov a,31h;分加一 add a,#01h da a mov 31h,a cjne a,#60h,f4 mov 31h,#00h mov a,32h;時加一 add a,#01h da a mov 32h,a jb 20h.0,f1 cjne a,#24h,f4 mov 32h,#00h jmp f2 f1:cjne a,#13h,f4 mov 32h,#01h cpl p3.0 jnb p3.0,f4 f2:mov a,56h; 星期加一 add a,#01h mov 56h,a cjne a,#07h,f3 mov 56h,#08h jmp f4 f3:cjne a,#09h,f4 mov 56h,#01h f4:call day;更新年月日 jb p2.7,f7;定時到否子程序段 mov a,31h cjne a,33h,f5 mov a,32h cjne a,34h,f8 setb 20h.2 mov a,3ah mov 2ch,a jmp a7 f8:mov a,31h f5:cjne a,35h,f6 mov a,32h cjne a,36h,f9 setb 20h.2 mov a,3bh mov 2ch,a jmp a7 f9:mov a,31h f6:cjne a,37h,f7 mov a,32h cjne a,38h,f7 setb 20h.2 mov a,3ch mov 2ch,a jmp a7 f7:clr 20h.2 a7:ret day:mov a,23h;日加1 add a,#01h da a mov 23h,a cjne a,#29h,rri0 mov a,22h cjne a,#02h,wan call nian jb 20h.4,wan mov 23h,#01h jmp yuey rri0:cjne a,#31h,rri2 call yue jb 20h.5,wan mov 23h,#01h jmp yuey rri2:cjne a,#32h,wan mov 23h,#01h yuey:mov a,22h;月加1 add a,#01h da a mov 22h,a cjne a,#13h,wan mov 22h,#01h mov a,21h;年加1 add a,#01h da a mov 21h,a wan:ret ************計時掃描子程序******************************** scan1:mov r0,#2fh inc @r0 cjne @r0,#0ch,g1 mov @r0,#00h g1:mov a,@r0 add a,#50h mov r1,a mov a,@r0 swap a orl a,@r1 mov p0,a ret ***********定時掃描子程序******************************** scan2:mov r0,#2eh inc @r0 cjne @r0,#06h,g2 mov @r0,#00h g2:mov a,@r0 add a,#60h mov r1,a mov a,@r0 swap a orl a,@r1 mov p0,a ret scan3:mov r0,#24h;定時掃描子程序 inc @r0 cjne @r0,#06h,gg2 mov @r0,#00h gg2:mov a,@r0 add a,#40h mov r1,a mov a,@r0 swap a orl a,@r1 mov p0,a ret **************計時顯示子程序************************** xianshi1:mov r1,#50h mov a,30h mov b,#10h div ab mov @r1,b inc r1 mov @r1,a inc r1 mov a,31h mov b,#10h div ab mov @r1,b inc r1 mov @r1,a inc r1 mov a,32h mov b,#10h div ab mov @r1,b inc r1 mov @r1,a ret ********定時顯示子程序******* xianshi2: mov a,39h mov 60h,a cjne a,#01h,h1 mov a,3ah mov 61h,a mov r1,#62h mov a,33h mov b,#10h div ab mov @r1,b inc r1 mov @r1,a inc r1 mov a,34h mov b,#10h div ab mov @r1,b inc r1 mov @r1,a jmp h3 h1:cjne a,#02h,h2 mov a,3bh mov 61h,a mov r1,#62h mov a,35h mov b,#10h div ab mov @r1,b inc r1 mov @r1,a inc r1 mov a,36h mov b,#10h div ab mov @r1,b inc r1 mov @r1,a jmp h3 h2:mov a,3ch mov 61h,a mov r1,#62h mov a,37h mov b,#10h div ab mov @r1,b inc r1 mov @r1,a inc r1 mov a,38h mov b,#10h div ab mov @r1,b inc r1 mov @r1,a h3:ret xianshi3:mov r1,#40h;計時顯示子程序 mov a,21h mov b,#10h div ab mov @r1,b inc r1 mov @r1,a inc r1 mov a,22h mov b,#10h div ab mov @r1,b inc r1 mov @r1,a inc r1 mov a,23h mov b,#10h div ab mov @r1,b inc r1 mov @r1,a ret time0:mov th0,#(65536-2000)/256 mov tl0,#low(65536-2000) push a push psw setb rs0 clr rs1 djnz 2dh,h4 mov 2dh,#250 djnz 4fh,h4 mov 4fh,#02 call jishi h4:jnb 20h.6,hh4 call xianshi3 call scan3 jmp h6 hh4:jb 20h.1,h5 call xianshi2 call scan2 jmp h6 h5:call xianshi1 call scan1 h6:pop psw pop a reti del:mov r6,#40 j1:mov r5,#248 djnz r5,$ djnz r6,j1 ret ***************音樂程序***** yinyue:push a push psw setb rs1 clr rs0 main1:mov 2bh,#00h m:mov a,2ch cjne a,#01,q mov dptr,#song1 jmp pu q:cjne a,#02,w mov dptr,#song2 jmp pu w:cjne a,#03,e mov dptr,#song3 jmp pu e:cjne a,#04,r mov dptr,#song4 jmp pu r:cjne a,#05,t mov dptr,#song5 jmp pu t:mov dptr,#song6 pu:jnb 20h.2,jj mov a,2bh movc a,@a+dptr mov r0,a jz end0 anl a,#0fh mov r7,a mov a,r0 swap a anl a,#0fh jnz sing clr tr1 jmp dd1 sing:dec a mov 2ah,a mov dptr,#table1 movc a,@a+dptr mov 29h,a mov th1,a mov a,2ah mov dptr,#table2 movc a,@a+dptr mov 28h,a mov tl1,a setb tr1 dd1:call yanshi inc 2bh inc 4eh mov a,4eh cjne a,#60,www;???? mov 4eh,#00 www:mov dptr,#table3 mov a,4eh movc a,@a+dptr mov p1,a jmp m end0:clr tr1 jmp main1 yanshi:mov r6,#02 dd2:mov r5,#125 dd3:mov r4,#248 djnz r4,$ djnz r5,dd3 djnz r6,dd2 djnz r7,yanshi ret jj:jmp mmm time1:push a push psw cpl p3.1 mov th1,29h mov tl1,28h pop psw pop a reti song1:db 42h,42h,42h,52h,64h,04h db 62h,62h,62h,72h,84h,04h db 92h,92h,82h,72h,64h,04h db 82h,82h,52h,62h,44h,04h db 42h,42h,42h,52h,64h,04h db 62h,62h,62h,72h,84h,04h db 92h,92h,82h,72h,64h,04h db 82h,82h,52h,62h,44h,04h db 00h song2:db 82h,01h,81h,94h,84h db 0b4h,0a4h,04h db 82h,01h,81h,94h,84h db 0c4h,0b4h,04h db 82h,01h,81h,0f4h,0d4h db 0b4h,0a4h,94h db 0e2h,01h,0e1h,0d4h,0b4h db 0c4h,0b4h,04h db 00h song3:db 84h,94h,88h db 64h,54h,68h db 84h,64h,54h,44h db 62h,82h,42h,62h,58h db 84h,94h,88h db 64h,54h,68h db 84h,64h,54h,44h db 52h,42h,52h,62h,48h db 00h song4:db 84h,02h,82h,64h,54h db 64h,54h,48h, db 64h,02h,52h,44h,24h db 14h,24h,18h db 24h,02h,22h,42h,24h db 44h,54h,68h db 54h,02h,52h,84h,84h db 54h,64h,48h db 00h song5:db 44h,54h,64h,44h db 44h,54h,64h,44h db 64h,74h,88h db 64h,74h,88h db 82h,92h,82h,72h,64h,44h db 82h,92h,82h,72h,64h,44h db 44h,84h,48h db 44h,14h,48h db 00h song6:db 62h,82h,82h,62h,98h db 92h,0b2h,0b2h,82h,98h db 62h,82h,82h,52h,68h db 92h,0b2h,0b2h,82h,98h db 62h,82h,82h,62h,92h,92h,94h db 92h,0b2h,0b2h,92h,84h,94h db 0b8h,0b4h,04h db 00h table1: db 251,251,251,252 db 252,253,253,253 db 253,254,254,254 db 254,254,254 table2: db 004,144,248,068 db 172,009,052,130 db 200,006,034,086 db 131,154,193 table3: db 0feh,0fdh,0fbh,0f7h db 0efh,0dfh,0bfh,7fh db 00h,0ffh,00h,0ffh db 7fh,0bfh,0dfh,0efh db 0f7h,0fh,0fdh,0feh db 00h,0ffh,00h,0ffh db 81h,0c3h,0e7h,0ffh db 0e7h,0c3h,81h,00h db 81h,42h,24h,18h,00h mmm:clr tr1 clr p1 pop psw pop a ret **************溫度程序****** wendu:CALL REST MOV A,#0CCH CALL WRITE MOV A,#4EH CALL WRITE MOV A,#00H CALL WRITE MOV A,#00H CALL WRITE MOV A,#7FH CALL WRITE CALL REST MOV A,#0CCH CALL WRITE MOV A,#44H CALL WRITE MOV R0,#20 LOOP5:MOV R1,#100 LOOP6:MOV R2,#250 DJNZ R2,$ DJNZ R1,LOOP6 DJNZ R0,LOOP5 CALL REST MOV A,#0CCH CALL WRITE MOV A,#0BEH CALL WRITE CALL READ2 MOV A,#0ECH CALL WRITE CALL HUAN clr 20h.3 ret rest:SETB P3.3 NOP CLR P3.3 MOV R0,#0ffH; DJNZ R0,$; 延時 SETB P3.3 NOP NOP NOP MOV R0,#25H LOOP0:JNB P3.3,LOOP1 DJNZ R0,LOOP0 JMP REST LOOP1:MOV R0,#06BH DJNZ R0,$ ; SETB P3.3 RET READ: MOV R2,#8 LOOP2:CLR C SETB P3.3 NOP NOP CLR P3.3 NOP NOP NOP SETB P3.3 MOV R3,#7 DJNZ R3,$ MOV C,P3.3 MOV R3,#23 DJNZ R3,$ RRC A DJNZ R2,LOOP2 RET WRITE:MOV R2,#8 CLR C LOOP3:CLR P3.3 MOV R3,#6 DJNZ R3,$ RRC A MOV P3.3,C MOV R3,#23 DJNZ R3,$ SETB P3.3 NOP DJNZ R2,LOOP3 SETB P3.3 RET READ2:MOV R0,#02 MOV R1,#42H LOOP7:CALL READ MOV @R1,A INC R1 DJNZ R0,LOOP7 RET HUAN: MOV A,4dH ANL A,#0F0H SWAP A MOV 4dH,A MOV A,4cH ANL A,#0FH SWAP A ORL A,4dH MOV 4dH,A mov r0,#00h ;占存十進制數的十位與個位數,高4位存十位數,低4位存個位數 mov r1,#00h ;占存十進制數的百位數 mov r3,#08h ;算法(((((((0*2+1)*2+1)*2+1)*2+1)*2+1)*2+1)*2+1)*2+1=255 因此需循環8次 aaa:mov a,4dh ;將要轉換的十六進制數放在a中; clr c rlc a ;將最高位放在c中 mov 4dh,a ;;將剩下的幾位存在40h中 mov a,r0 ;;乘以2并加上現在的最高 位上的數 addc a,r0 da a ;;十進制調整后,a高4位存十位數,低4位存個位數 mov r0,a mov a,r1 ;;百位數乘2并加上十進制調整后的進位 addc a,r1 da a mov r1,a djnz r3,aaa mov a,r0
mov r6,a anl a,#0fh mov 58h,a ;;將轉換后的個位數存在50h單元 mov a,r6 anl a,#0f0h swap a mov 57h,a ;;將轉換后的十位數存在51h單元 ret end 六、[功能測試及結果分析] 硬件調試時,先查看了焊接質量,檢查無誤后,用示波器測試晶振及各端口的波形情況,進行綜合硬件測試分析。 七、[參考資料] 1、李光飛、樓然苗等 《單片機課程設計實例指導》北京航空航天大學出版社,2004 2、吳金戌、沈慶陽、郭庭吉 《8051單片機實踐與應用》清華大學出版社、2001
|