標(biāo)題: 單片機(jī)定時(shí)鬧鐘 [打印本頁(yè)]
作者: 1041589370 時(shí)間: 2017-11-27 19:12
標(biāo)題: 單片機(jī)定時(shí)鬧鐘
單片機(jī)定時(shí)鬧鐘
一、[電路概述]該時(shí)鐘電路主要以單片機(jī)AT89S52為核心而設(shè)計(jì)的,通過(guò)單片機(jī)對(duì)信息的分析與處理控制外圍設(shè)備。電路整體設(shè)計(jì)思想是想把它做成一個(gè)實(shí)用的器件,所以在題目要求的前提下,我們又加入了星期程序,溫度程序,年、月、日程序以及時(shí)間的12—24轉(zhuǎn)換程序。
[關(guān)鍵字]:?jiǎn)纹瑱C(jī) 數(shù)碼顯示 溫度傳感器 光識(shí)電路
二、[題目分析與方案論證]按照系統(tǒng)設(shè)計(jì)功能的要求,初步確定設(shè)計(jì)系統(tǒng)由復(fù)位模塊、時(shí)鐘模塊、溫度模塊、音樂(lè)模塊、光識(shí)模塊及顯示模塊共五個(gè)模塊組成,后來(lái)在時(shí)鐘模塊的基礎(chǔ)上又加載了日歷、星期的模塊
從單片機(jī)AT89S52入手,通過(guò)使用AT89S52的內(nèi)部的可編程定時(shí)器/計(jì)數(shù)器,結(jié)合對(duì)外接晶振的調(diào)節(jié)來(lái)確定一個(gè)合適的振蕩周期,從而確定出內(nèi)部的機(jī)器周期。再通過(guò)對(duì)內(nèi)部中斷程序的設(shè)置來(lái)設(shè)計(jì)出時(shí)鐘程序,即設(shè)計(jì)出了電子時(shí)鐘的核心。
根據(jù)題目的要求,我們?cè)O(shè)計(jì)了以下方案:
[方案一]設(shè)計(jì)中加載了年、月、日的設(shè)計(jì),剛開(kāi)始時(shí)打算用18個(gè)共陽(yáng)數(shù)碼管,考慮到數(shù)碼管太多是畢會(huì)給硬件電路帶來(lái)麻煩,經(jīng)過(guò)考慮后,決定把年、月、日與時(shí)間設(shè)置到一組數(shù)碼管上來(lái),即六個(gè)數(shù)碼管即能顯示時(shí)間又能顯示年、月、日,這樣一來(lái)就方便了硬件電路;
[方案二]主控芯片使用51系列AT89S52單片機(jī)設(shè)計(jì)時(shí)溫度模塊設(shè)計(jì)溫度元件用AD590,利用AD590以及接口電路把溫度轉(zhuǎn)換成模擬電壓,經(jīng)由ADC0804轉(zhuǎn)換成數(shù)字信號(hào),然后經(jīng)AT89S52處理顯示溫度。但由于AD590價(jià)錢比較貴,且只能轉(zhuǎn)換成模擬電壓,這樣一來(lái)硬件就要增加更多的器件且又不經(jīng)濟(jì),經(jīng)查找發(fā)現(xiàn)18B20溫度傳感器價(jià)錢便宜且可以直接把溫度轉(zhuǎn)換成數(shù)字量測(cè)溫范圍為-55—125度,最大分辨率可達(dá)0.0625度,采用3線制與單片機(jī)相連,減少了外部的硬件電路,具有低成本和易使用的特點(diǎn),所以我們選擇了18B20溫度傳感器。
附18B20溫度傳感器工作原理:DS18B20溫度傳感器是美國(guó)DALLAS半導(dǎo)體公司最新推出的一種改進(jìn)型智能溫度傳感器,與傳統(tǒng)的熱敏電阻等測(cè)溫元件相比,它能直接讀出被測(cè)溫度,并可根據(jù)實(shí)際要求通過(guò)簡(jiǎn)單的編程實(shí)現(xiàn)9—12位的數(shù)字值讀數(shù)方式。溫度傳感器DS18B20采集溫度信號(hào)送該給單片機(jī)處理,存儲(chǔ)器通過(guò)單片機(jī)對(duì)某些時(shí)間點(diǎn)的數(shù)據(jù)進(jìn)行存儲(chǔ);,DS18B20的性能特點(diǎn)如下:
1、獨(dú)特的單線接口僅需要一個(gè)引腳進(jìn)行通信;
2、多個(gè)DS18B20可以并聯(lián)在唯一的三線上,實(shí)現(xiàn)多點(diǎn)組網(wǎng)功能;
3、無(wú)須外部器件;
4、可通過(guò)數(shù)據(jù)線供電,電壓范圍為3.0---5.5V;
5、零待機(jī)功耗;
6、溫度以9或12位數(shù)字量讀出;
7、用戶可定義的非易失性溫度報(bào)警設(shè)置;
8、報(bào)警搜索命令識(shí)別并標(biāo)志超過(guò)程序限定溫度(溫度報(bào)警條件)的器件;
9、負(fù)電壓特性,電源極性接反是,溫度計(jì)不會(huì)因發(fā)熱而燒毀,但不能正常工作。
三、[系統(tǒng)總體結(jié)構(gòu)框圖]
[按鍵功能]
a鍵:P2.1口12---24轉(zhuǎn)換
b鍵:P2.3口調(diào)整定時(shí)、計(jì)時(shí)的時(shí)、調(diào)整年
c鍵:P2.5口調(diào)整計(jì)時(shí)的秒和定時(shí)狀態(tài)及日
d鍵:P2.7口判斷定時(shí)到否
e鍵:P2.0口調(diào)整星期
f鍵:P2.2口定時(shí)、計(jì)時(shí)轉(zhuǎn)換
g鍵:P2.4口調(diào)整定時(shí)、計(jì)時(shí)的秒和判斷定時(shí)狀態(tài)、調(diào)整日
h鍵:P2.6口調(diào)整定時(shí)的報(bào)警音樂(lè)、省電模式
i鍵:復(fù)位鍵
j鍵:P3.6口年、月、日的顯示
四、[主要電路原理與設(shè)計(jì)]
(1)系統(tǒng)硬件電路的設(shè)計(jì):
電路是由控制部分和顯示部分兩大部分組成。利用單片機(jī)程序進(jìn)行控制,單片機(jī)以晶體振蕩器的振蕩周期(或外部引入的時(shí)鐘周期)為最小的時(shí)序單位,片內(nèi)的各種微操作都以此周期為時(shí)序基準(zhǔn)。振蕩頻率二分頻后形成狀態(tài)周期或稱s周期,所以,1個(gè)狀態(tài)周期包含有2個(gè)振蕩周期。振蕩頻率foscl2分頻后形成機(jī)器周期MC。所以,1個(gè)機(jī)器周期包含有6個(gè)狀態(tài)周期或12個(gè)振蕩周期。1個(gè)到4個(gè)機(jī)器周期確定一條指令的執(zhí)行時(shí)間,這個(gè)時(shí)間就是指令周期。AT89S52單片機(jī)指令系統(tǒng)中,各條指令的執(zhí)行時(shí)間都在1個(gè)到4個(gè)機(jī)器周期之間。
,并通過(guò)數(shù)碼管進(jìn)行顯示單片機(jī)普遍采用鎖相環(huán)技術(shù),使單片機(jī)的時(shí)鐘頻率可由程序控制。鎖相環(huán)允許用戶在片外使用頻率較低的晶振,可以很大地減小板級(jí)噪聲;而且,由于時(shí)鐘頻率可由程序控制,系統(tǒng)時(shí)鐘可以在一個(gè)很寬的范圍內(nèi)調(diào)整,總線頻率往往能升得很高。但是,使用鎖相環(huán)也會(huì)帶來(lái)額外的功率消耗。單就時(shí)鐘方案來(lái)講,使用外部晶振且不使用鎖相環(huán)是功率消耗最小的一種。AT89S52單片機(jī)的時(shí)鐘信號(hào)通常用兩種電路形式得到:內(nèi)部振蕩方式和外部振蕩方式。
在引腳XTAL1和XTAL2外接晶體振蕩器(簡(jiǎn)稱晶振)或陶瓷諧振器,就構(gòu)成了內(nèi)部振蕩方式。由于單片機(jī)內(nèi)部有一個(gè)高增益反相放大器,當(dāng)外接晶振后,就構(gòu)成了自激振蕩器并產(chǎn)生振蕩時(shí)鐘脈沖。內(nèi)部振蕩方式的外部電路如下圖所示。
圖中,電容器C01,C02起穩(wěn)定振蕩頻率、快速起振的作用,其電容值一般在5-30pF。晶振頻率的典型值為12MH2,采用6MHz的情況也比較多。內(nèi)部振蕩方式所得的時(shí)鐘情號(hào)比較穩(wěn)定,實(shí)用電路中使用較多。
外部振蕩方式是把外部已有的時(shí)鐘信號(hào)引入單片機(jī)內(nèi)。這種方式適宜用來(lái)使單片機(jī)的時(shí)鐘與外部信號(hào)保持同步。外部振蕩方式的外部電路如下圖所示。如圖所示:
各模塊分析:
顯示模塊——電路先通過(guò)電源電路送出+5V電壓,單片機(jī)AT89S52通過(guò)74LS47和CD4515(4—16譯碼器)驅(qū)動(dòng)數(shù)碼管顯示數(shù)值, 顯示部分采用普通共陽(yáng)極數(shù)碼管顯示,采用動(dòng)態(tài)掃描,以減少硬件電路。考慮到一次掃描12位數(shù)碼管顯示時(shí)會(huì)出現(xiàn)閃爍情況,設(shè)計(jì)時(shí)分兩排顯示,一排顯示時(shí)間和年月日,一排顯示星期和溫度, 共陽(yáng)極數(shù)碼管中8個(gè)發(fā)光二極管的陽(yáng)極(二極管正端)連在一起。通常,公共陽(yáng)極接高電平(一般接電源),其它管腳接段驅(qū)動(dòng)電路輸出端。當(dāng)某段驅(qū)動(dòng)電路的輸入端為低電平時(shí),該端所連接的字段導(dǎo)通并點(diǎn)亮。根據(jù)發(fā)光字段的不同組合可顯示出各種數(shù)字或字符。此時(shí),要求段驅(qū)動(dòng)電路能吸收額定的段導(dǎo)通電流,還需根據(jù)外接電源及額定段導(dǎo)通電流來(lái)確定相應(yīng)的限流電阻。采用動(dòng)態(tài)顯示方式,比較節(jié)省I/O口,硬件電路也較靜態(tài)顯示簡(jiǎn)單,但其亮度不如靜態(tài)顯示方式,而且在顯示位數(shù)較多時(shí),CPU要依次掃描,占用CPU較多時(shí)間。
為了提供共陽(yáng)LED數(shù)碼管的驅(qū)動(dòng)電壓,用三極管9012作電源驅(qū)動(dòng)輸出。采用12MHz晶振,有利于提高秒計(jì)時(shí)的精確性。三極管采用9012。數(shù)碼管采用紅色的共陽(yáng)型LED數(shù)碼管,亮度高些,因?yàn)槭菕呙璧娘@示方式,所以各個(gè)數(shù)碼管的abcdefg各腳采用了總線并聯(lián),改動(dòng)510歐姆的電阻可以改變顯示亮度;
file:///C:/Users/admin/AppData/Local/Temp/msohtmlclip1/01/clip_image007.gif
時(shí)鐘模塊——利用芯片內(nèi)部的振蕩器,然后在引腳XTAL1和引腳 XTAL2兩端接晶體諧振器,就構(gòu)成了穩(wěn)定的自激振蕩器,其發(fā)出的脈沖直接送入內(nèi)部的時(shí)鐘電路,如圖外接晶振時(shí),C1和C2的值通常選擇30pF; C1、C2對(duì)頻率有微調(diào)作用,晶體諧振器的頻率12MHz。為了減少寄生電容,更好地保證振蕩器穩(wěn)定、可靠地工作,振蕩器和電容應(yīng)盡可能安裝得與單片機(jī)芯片靠近。設(shè)置了12—24兩種顯示狀態(tài),調(diào)整計(jì)時(shí)的按鍵、設(shè)置定時(shí)的按鍵且定時(shí)設(shè)置了3次定時(shí)、還另加載了星期、年、月、日的調(diào)整及閏年的自動(dòng)調(diào)整;
溫度模塊——主要由18B20通過(guò)單片機(jī)AT89S52中的溫度程序不斷的檢測(cè)溫度來(lái)顯示溫度溫度傳感器DS18B20采集溫度信號(hào)送該給單片機(jī)處理,存儲(chǔ)器通過(guò)單片機(jī)對(duì)某些時(shí)間點(diǎn)的數(shù)據(jù)進(jìn)行存儲(chǔ);
音樂(lè)模塊——通過(guò)LM386N-1給揚(yáng)聲器信號(hào)來(lái)發(fā)出音樂(lè),這個(gè)模塊主要是為時(shí)鐘定時(shí)到時(shí)發(fā)出音樂(lè)鬧鈴,而在軟件部分設(shè)置了可以一次設(shè)置3次定時(shí),每次定時(shí)到時(shí),音樂(lè)程序中編了6種音樂(lè),它可以自動(dòng)選擇6種音樂(lè)中的任一音樂(lè)響1分鐘,如果中間不想讓鬧鈴響可以按一按鍵,鬧鈴就立刻停止
file:///C:/Users/admin/AppData/Local/Temp/msohtmlclip1/01/clip_image008.gif;
復(fù)位模塊——單片機(jī)復(fù)位電路是使CPU和系統(tǒng)中的其他功能部件都處在一個(gè)確定的初始狀態(tài),并從該狀態(tài)開(kāi)始工作,例如復(fù)位后PC=0000H,使單片機(jī)從第一個(gè)單元取指令。無(wú)論是在單片機(jī)剛接上電源時(shí),還是斷電后或者發(fā)生故障后都要復(fù)位;單片機(jī)的復(fù)位操作使單片機(jī)進(jìn)入初始化狀態(tài),其中包括使程序計(jì)數(shù)器PC=0000H,這表明程序從0000H地址單元開(kāi)始執(zhí)行。單片機(jī)冷啟動(dòng)后,片內(nèi)RAM為隨機(jī)值,運(yùn)行中的復(fù)位操作不改變片內(nèi)RAM區(qū)中的內(nèi)容,21個(gè)特殊功能寄存器復(fù)位后的狀態(tài)為確定值,見(jiàn)下表。
值得指出的是,記住一些特殊功能寄存器復(fù)位后的主要狀態(tài),對(duì)于了解單片機(jī)的初態(tài),減少應(yīng)用程序中的韌始化部分是十分必要的。
說(shuō)明:表中符號(hào)*為隨機(jī)狀態(tài);
A=00H,表明累加器已被清零;
| 特殊功能寄存器 | 初始狀態(tài) | 特殊功能寄存器 | 初始狀態(tài) |
| 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,表明堆棧指針指向片內(nèi)RAM 07H字節(jié)單元,根據(jù)堆棧操作的先加后壓法則,第一個(gè)被壓入的內(nèi)容寫(xiě)入到08H單元中;
Po-P3=FFH,表明已向各端口線寫(xiě)入1,此時(shí),各端口既可用于輸入又可用于輸出;
IP=×××00000B,表明各個(gè)中斷源處于低優(yōu)先級(jí);
IE=0××00000B,表明各個(gè)中斷均被關(guān)斷;
系統(tǒng)復(fù)位是任何微機(jī)系統(tǒng)執(zhí)行的第一步,使整個(gè)控制芯片回到默認(rèn)的硬件狀態(tài)下。51單片機(jī)的復(fù)位是由RESET引腳來(lái)控制的,此引腳與高電平相接超過(guò)24個(gè)振蕩周期后,51單片機(jī)即進(jìn)入芯片內(nèi)部復(fù)位狀態(tài),而且一直在此狀態(tài)下等待,直到RESET引腳轉(zhuǎn)為低電平后,才檢查EA引腳是高電平或低電平,若為高電平則執(zhí)行芯片內(nèi)部的程序代碼,若為低電平便會(huì)執(zhí)行外部程序。
光識(shí)模塊——同樣也是為定時(shí)服務(wù)的,只要定時(shí)到,組成心字的18只發(fā)光二極管就會(huì)按程序先做左移位,再全亮全滅3次,然后再右移,再全亮全滅3次如此循環(huán)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
安全省電模式——電源電路上裝了保險(xiǎn)管只要電流大于額定電流保險(xiǎn)就斷來(lái)保護(hù)電路,省電模式:不看時(shí)顯示不亮,看時(shí),按下一鍵顯示就亮,盡量達(dá)到人性化。
五、[軟件系統(tǒng)設(shè)計(jì)]
計(jì)時(shí)程序是實(shí)現(xiàn)電子時(shí)鐘的核心內(nèi)容,本程序用中斷time0來(lái)控制,計(jì)時(shí)顯示的單元從50h開(kāi)始,50h=秒的個(gè)位,51h=秒的十位,52h=分的個(gè)位,53h=分的十位,54h=時(shí)的個(gè)位,55h=時(shí)的十位
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;兩個(gè)中斷250次為1秒
定時(shí)報(bào)警程序
作用是判斷時(shí)間是否與設(shè)置的鬧鐘時(shí)間相等,如相等則開(kāi)啟鬧鐘。
單片機(jī)內(nèi)定時(shí)振鈴開(kāi)關(guān)使用軟件開(kāi)關(guān),即用標(biāo)志寄存器,且程序設(shè)置了3次定時(shí),可見(jiàn)要使電子時(shí)鐘定時(shí)打鈴,必須同時(shí)具備兩個(gè)條件,第一:定時(shí)振鈴開(kāi);第二:當(dāng)前定時(shí)項(xiàng)數(shù)不為0項(xiàng)。 因?yàn)橐闺娮訒r(shí)鐘定時(shí)打鈴,必須同時(shí)具備上述的兩個(gè)條件,所以在單片機(jī)執(zhí)行查詢定時(shí)各項(xiàng)的程序之前,主程序會(huì)首先查詢這兩個(gè)條件是否同時(shí)滿足,如果滿足的話,則進(jìn)行一輪查詢,所謂一輪查詢定時(shí),即將當(dāng)前時(shí)間與定時(shí)各項(xiàng)一一比較,看是否相符,如果查到某項(xiàng)相符,則調(diào)用音樂(lè)程序。每查完一項(xiàng),寄存器中的值會(huì)自動(dòng)減1(即為定時(shí)時(shí)間的項(xiàng)數(shù))。當(dāng)定時(shí)時(shí)間的項(xiàng)數(shù)值自動(dòng)減為0時(shí),則表示這一輪查詢定時(shí)時(shí)間完畢,只要條件允許(定時(shí)音樂(lè)開(kāi)且定時(shí)項(xiàng)數(shù)不為0),有可以進(jìn)行一輪新的查詢定時(shí)時(shí)間。
定時(shí)1:33h=分,34h=時(shí),定時(shí)2:35h=分,36h=時(shí),定時(shí)3:37h=分,38h=時(shí),定時(shí)狀態(tài)=39h;定時(shí)顯示的單元從60h開(kāi)始,60h=定時(shí)狀態(tài),61h=此時(shí);定時(shí)狀態(tài)的音樂(lè)種類,62h=分的個(gè)位,63h=分的十位;64h=時(shí)的個(gè)位,65h=時(shí)的十位
溫度程序:
57h=溫度的十位,58h=溫度的個(gè)位,
wendu:CALL REST;調(diào)復(fù)位
MOV A,#0CCH
CALL WRITE調(diào)寫(xiě)程序
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;調(diào)讀程序
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;計(jì)時(shí)顯示的單元從50h開(kāi)始,50h=秒的個(gè)位,51h=秒的十位,52h=
jmp main;分的個(gè)位,53h=分的十位,54h=時(shí)的個(gè)位,55h=時(shí)的十位,56h=
org 000bh;星期,57h=溫度的十位,58h=溫度的個(gè)位,30h=秒,31h=分,32h=時(shí),定時(shí)1:33h=分,34h=時(shí),
jmp time0;定時(shí)2:35h=分,36h=時(shí),定時(shí)3:37h=分,38h=時(shí),定時(shí)狀態(tài)=39h
org 001bh
jmp time1
************主程序******************************** main:mov r0,#00;等待
djnz r0,$
movsp,#6ah ;定時(shí)顯示的單元從60h開(kāi)始,60h=定時(shí)狀態(tài),61h=此時(shí)
mov tmod,#00010001b ;定時(shí)狀態(tài)的音樂(lè)種類,62h=分的個(gè)位,63h= 分的十位
mov ie,#10001010b ;64h=時(shí)的個(gè)位,65h=時(shí) 的十位
mov ip,#00000010b
mov th0,#(65536-2000)/256
mov tl0,#low(65536-2000)
mov 4fh,#02;兩個(gè)中斷250次為1秒
mov 4eh,#00;光報(bào)警
mov 2dh,#250;中斷250次為0.5秒
mov 2fh,#00h;設(shè)置計(jì)時(shí)顯示數(shù)碼管的編號(hào)
mov 2eh,#00h;設(shè)置定時(shí)顯示數(shù)碼管的編號(hào)
mov 24h,#00h;設(shè)置年月日顯示數(shù)碼管的編號(hào)
mov 30h,#00h;設(shè)置時(shí)間的初值
mov 31h,#00h
mov 32h,#12h
mov 56h,#01h;
設(shè)置星期初值
mov 33h,#00h;
設(shè)置定時(shí)初值
mov 34h,#01h
mov 35h,#00h
mov 36h,#02h
mov 37h,#00h
mov 38h,#03h
mov 39h,#01h;
設(shè)置定時(shí)狀態(tài)初始值
mov 3ah,#01h;設(shè)置定時(shí)狀態(tài)1時(shí)音樂(lè)的初始值
mov 3bh,#02h;設(shè)置定時(shí)狀態(tài)2時(shí)音樂(lè)的初始值
mov 3ch,#03h;設(shè)置定時(shí)狀態(tài)3時(shí)音樂(lè)的初始值
mov 21h,#00h;設(shè)置年初值,00表示2000年
mov 22h,#01h;設(shè)置月初值
mov 23h,#01h;設(shè)置日初值
setb 20h.0;12,24標(biāo)志位,1表示12小時(shí)制,0表示24小時(shí)制
setb 20h.1;定時(shí),計(jì)時(shí)標(biāo)志位,1表示計(jì)時(shí),0表示定時(shí)
clr 20h.2;定時(shí)到否標(biāo)志位,1表示到,0表示不到
setb 20h.3;是否允許檢測(cè)溫度標(biāo)志位,1表示允許
clr 20h.4;
年標(biāo)志位,1表示閏年
setb 20h.5;
1表示31天,0表示30天
clr 20h.6;1表示顯示年月日
setb p3.0;上下午標(biāo)志位,1表示上午,0表示下午
clr p1
setb tr0
*************星期設(shè)置程序*************************************
start:jb p2.0,q1;調(diào)整星期
call del;消除抖動(dòng)
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
*************設(shè)置12--24小時(shí)轉(zhuǎn)換程序********************************
q1:jb p2.1,q2;
12,24小時(shí)制轉(zhuǎn)換
call del; 消除抖動(dòng)
jnb 20h.0,b1
jnb p3.0,b2;將12小時(shí)制轉(zhuǎn)換為24小時(shí)制
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小時(shí)制轉(zhuǎn)換為12小時(shí)制
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
*************定時(shí)計(jì)時(shí)調(diào)整程序*************************************
q2:jb p2.2,q3;定時(shí),計(jì)時(shí)轉(zhuǎn)換
call del;
cpl 20h.1
a3:call del
jnb p2.2,a3
jmp start
q3:jb p2.3,q4;調(diào)整定時(shí),計(jì)時(shí)的時(shí),年
call del;消除抖動(dòng)
jnb 20h.6,c00
call yearyear
jmp a4
c00:jnb 20h.1,c1
jb 20h.0,c2;計(jì)時(shí)調(diào)整
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;定時(shí)調(diào)整
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;調(diào)整定時(shí),計(jì)時(shí)的分,月
call del
jnb 20h.6,d00
call yueyue
jmp a5
d00:jnb 20h.1,d1
mov a,31h;計(jì)時(shí)分調(diào)整
add a,#01h
da a
cjne a,#60h,d2
mov 31h,#00h
jmp a5
d2:mov 31h,a
jmp a5
d1:mov a,39h ;定時(shí)分調(diào)整
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;調(diào)整計(jì)時(shí)的秒和定時(shí)的狀態(tài),日
call del
jnb 20h.6,e00
call ri
jmp a6
e00:jnb 20h.1,e1
mov a,30h;調(diào)整計(jì)時(shí)的秒
add a,#01h
da a
cjne a,#60h,e2
mov 30h,#00h
jmp a6
e2:mov 30h,a
jmp a6
e1:mov a,39h;調(diào)整定時(shí)狀態(tài)
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
*************調(diào)整定時(shí)的報(bào)警音樂(lè),省電模式*********************************
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
************定時(shí)報(bào)警**************************
q7:jnb 20h.2,q8
call yinyue
jmp start
q8:jnb 20h.3,q9
call wendu;檢測(cè)溫度
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
**************計(jì)時(shí)子程序************************
jishi:mov a,30h;秒加一
add a,#01h
da a
mov 30h,a
cjne a,#60h,f4
mov 30h,#00h
setb 20h.3;允許檢測(cè)溫度
mov a,31h;分加一
add a,#01h
da a
mov 31h,a
cjne a,#60h,f4
mov 31h,#00h
mov a,32h;時(shí)加一
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;定時(shí)到否子程序段
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
************計(jì)時(shí)掃描子程序********************************
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
***********定時(shí)掃描子程序********************************
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;定時(shí)掃描子程序
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
**************計(jì)時(shí)顯示子程序**************************
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
********定時(shí)顯示子程序*******
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;計(jì)時(shí)顯示子程序
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
***************音樂(lè)程序*****
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,$; 延時(shí)
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 ;占存十進(jìn)制數(shù)的十位與個(gè)位數(shù),高4位存十位數(shù),低4位存?zhèn)位數(shù)
mov r1,#00h ;占存十進(jìn)制數(shù)的百位數(shù)
mov r3,#08h ;算法(((((((0*2+1)*2+1)*2+1)*2+1)*2+1)*2+1)*2+1)*2+1=255 因此需循環(huán)8次
aaa:mov a,4dh ;將要轉(zhuǎn)換的十六進(jìn)制數(shù)放在a中;
clr c
rlc a ;將最高位放在c中
mov 4dh,a ;;將剩下的幾位存在40h中 mov a,r0 ;;乘以2并加上現(xiàn)在的最高 位上的數(shù)
addc a,r0
da a ;;十進(jìn)制調(diào)整后,a高4位存十位數(shù),低4位存?zhèn)位數(shù)
mov r0,a
mov a,r1 ;;百位數(shù)乘2并加上十進(jìn)制調(diào)整后的進(jìn)位
addc a,r1
da a
mov r1,a
djnz r3,aaa
mov a,r0
mov r6,a
anl a,#0fh
mov 58h,a ;;將轉(zhuǎn)換后的個(gè)位數(shù)存在50h單元
mov a,r6
anl a,#0f0h
swap a
mov 57h,a ;;將轉(zhuǎn)換后的十位數(shù)存在51h單元
ret
end
六、[功能測(cè)試及結(jié)果分析]
硬件調(diào)試時(shí),先查看了焊接質(zhì)量,檢查無(wú)誤后,用示波器測(cè)試晶振及各端口的波形情況,進(jìn)行綜合硬件測(cè)試分析。
七、[參考資料]
1、李光飛、樓然苗等 《單片機(jī)課程設(shè)計(jì)實(shí)例指導(dǎo)》北京航空航天大學(xué)出版社,2004
2、吳金戌、沈慶陽(yáng)、郭庭吉 《8051單片機(jī)實(shí)踐與應(yīng)用》清華大學(xué)出版社、2001
| 歡迎光臨 (http://www.denmoz.com/bbs/) |
Powered by Discuz! X3.1 |