|
單片機(jī)作息時(shí)間控制實(shí)現(xiàn)了對(duì)時(shí)間控制的智能化,擺脫了傳統(tǒng)由人來(lái)控制時(shí)間的長(zhǎng)短的不便,是現(xiàn)代學(xué)校必不可少的教學(xué)設(shè)備。針對(duì)單片機(jī)課程的學(xué)習(xí)與熟練運(yùn)用,本設(shè)計(jì)預(yù)計(jì)完成一套完整的校園作息時(shí)間控制系統(tǒng),鍛煉學(xué)生的獨(dú)立思考能力與學(xué)習(xí)能力,在學(xué)生本人積極實(shí)踐、查閱資料的基礎(chǔ)上完成設(shè)計(jì)。 1.2設(shè)計(jì)任務(wù)要求能按照作息時(shí)間發(fā)出鈴聲提示信息,以蜂鳴器模擬,響鈴15秒;能按照需要調(diào)整作息時(shí)間(夏季和冬季),并能調(diào)整當(dāng)前系統(tǒng)的時(shí)間;用數(shù)碼管顯示當(dāng)前時(shí)間。
2. 系統(tǒng)硬件電路的設(shè)計(jì)
2.1 51單片機(jī)時(shí)鐘電路時(shí)鐘電路就是一個(gè)振蕩器,給單片機(jī)提供一個(gè)節(jié)拍,單片機(jī)執(zhí)行各種操作必須在這個(gè)節(jié)拍的控制下才能進(jìn)行。因此單片機(jī)沒(méi)有時(shí)鐘電路是不會(huì)正常工作的。在MCS-51單片機(jī)內(nèi)有一個(gè)高增益的反相放大器,反相放大器的輸入端為XTAL1,輸出端為XTAL2,由該放大器構(gòu)成的振蕩電路和時(shí)鐘電路一起構(gòu)成了單片機(jī)的時(shí)鐘方式。 在內(nèi)部方式時(shí)鐘電路中,必須在XTAL1和XTAL2引腳兩端跨接石英晶體振蕩器和兩個(gè)微調(diào)電容構(gòu)成振蕩電路,通常C1和C2一般取30pF,晶振的頻率取值在1.2MHz~12MHz之間。晶體振蕩器的振蕩信號(hào)從XTAL2端送入內(nèi)部時(shí)鐘電路,它將該振蕩信號(hào)二分頻, 產(chǎn)生個(gè)兩相時(shí)鐘信號(hào)P1和P2供單片機(jī)使用。時(shí)鐘信號(hào)的周期稱(chēng)為狀態(tài)時(shí)間S,它是振蕩周期的2倍,P1信號(hào)在每個(gè)狀態(tài)的前半周期有效,在每個(gè)狀態(tài)的后半周期P2信號(hào)有效。CPU就是以?xún)蓵r(shí)鐘P1和P2為基本節(jié)拍協(xié)調(diào)單片機(jī)各部分有效工作的。 復(fù)位信號(hào)RST高電平有效,在輸入端保持兩個(gè)機(jī)器周期的高電平后,就可以完成復(fù)位操作。此外,該引腳還有掉電保護(hù)功能,若在該端接+5V備用電源,在使用中若  掉電,可保護(hù)片內(nèi)RAM中信息不丟失。 時(shí)鐘及復(fù)位電路如圖1所示。
圖1 時(shí)鐘及復(fù)位電路 2.2 74LS164寄存器74LS164 簡(jiǎn)述:串行輸入帶鎖存、時(shí)鐘輸入、串行輸入帶緩沖、異步清除、最高時(shí)鐘頻率可高達(dá)36Mhz。當(dāng)清除端(CLEAR)為低電平時(shí),輸出端(  )均為低電平。串行數(shù)據(jù)輸入端(A,B)可控制數(shù)據(jù)。當(dāng) A、B 任意一個(gè)為低電平,則禁止新數(shù)據(jù)輸入,在時(shí)鐘端(CLOCK)脈沖上升沿作用下  為低電平。當(dāng) A、B 有一個(gè)為高電平,則另一個(gè)就允許輸入數(shù)據(jù),并在CLOCK上升沿作用下決定  的狀態(tài)。 74LS164真值表如表1所示。 表1 74LS164真值表
74LS164 邏輯符號(hào)及其引腳圖如圖2所示。 
圖2 邏輯符號(hào)(左)及引腳圖(右) 2.3 總體方案設(shè)計(jì)根據(jù)系統(tǒng)的要求,確定系統(tǒng)的總體方案如圖3所示。 圖3 系統(tǒng)總體設(shè)計(jì)方案 本系統(tǒng)設(shè)計(jì)的原理是利用單片機(jī) AT89S51 的定時(shí)器/計(jì)數(shù)器定時(shí)和計(jì)數(shù)的原 理。通過(guò)四聯(lián)共陰極數(shù)碼顯示管接收由 74LS164 傳來(lái)的數(shù)據(jù)并將其轉(zhuǎn)換為十進(jìn)制BCD 碼顯示,該設(shè)計(jì)將軟、硬件有機(jī)地結(jié)合起來(lái),使得系統(tǒng)能夠正確地進(jìn)行計(jì)時(shí), 數(shù)碼管能夠正確地顯示時(shí)間。 按鍵模塊中的按鈕 SW1、SW2、SW3 、SW4、SW5與 AT89S51 的 P3 口相連,對(duì)單片機(jī)起到控制作用,通過(guò)按鍵控制模塊把外界響應(yīng)送到單片機(jī)最小系統(tǒng)(AT89S51)中,然后通過(guò)接口電路把要顯示的時(shí)間送到四聯(lián) LED 數(shù)碼管中,四聯(lián) LED 數(shù)碼管的字段由串入并出的移位寄存器74LS164 控制,74LS164 的串行數(shù)據(jù)輸入端由 P1.7控制,移位脈沖由 P1.6 提供,字位由 P1.0至P1.5 控制,P1.0至P1.5 對(duì)應(yīng)控制 L6至L1。SW1至SW5 用來(lái)進(jìn)行時(shí)間校準(zhǔn)及控制時(shí)間點(diǎn)的設(shè)定。 2.4 具體電路設(shè)計(jì) 2.4.1 按鍵控制模塊的設(shè)計(jì) 本模塊的控制電路主要由(冬季、夏季)指示燈、蜂鳴器與接于P3口的五個(gè)開(kāi)關(guān)組成。SW1控制作息時(shí)間(閉合冬季、斷開(kāi)夏季);SW2調(diào)節(jié)小時(shí),每次加1;SW3調(diào)節(jié)分鐘,每次加1;SW4為手動(dòng)定時(shí)開(kāi)關(guān),儲(chǔ)存數(shù)碼管當(dāng)前顯示的時(shí)間,下次再到這一時(shí)間時(shí)響鈴亮燈;SW5為清除手動(dòng)定時(shí)開(kāi)關(guān),將所有手動(dòng)定時(shí)數(shù)據(jù)清除。 按鍵設(shè)計(jì)模塊的設(shè)計(jì)圖如圖4所示 圖4 功能按鍵及指示燈(左) 2.4.2 輸入電路的設(shè)計(jì) 本模塊的輸入電路主要由單片機(jī)的P1管腳及74LS164移位寄存器的輸出管口組成。P1.1、P1.2、P1.3、P1.4、P1.5、P1.6分別接數(shù)碼管的L6、L5、L4、L3、L2、L1管腳,寄存器的3至12管腳分別接數(shù)碼管的A至G管腳。P1.7管腳接寄存器的1、2管腳,作為串行數(shù)據(jù)輸入端;P1.6管腳接寄存器的8管腳,作為移位脈沖。 本模塊的設(shè)計(jì)電路如圖5所示。 圖5 輸入電路模塊 2.4.3 LCD顯示模塊設(shè)計(jì) 本模塊主要由一個(gè)6位共陰極數(shù)碼管和一個(gè)三輸入一輸出的或非門(mén)組成。數(shù)碼管依次顯示L1至L6管腳對(duì)應(yīng)的位數(shù),L6控制第1位及秒個(gè)位(從右向左),L5控制第2位及秒十位,L4控制第3位及分個(gè)位,L3控制第4位及分十位,L2控制第5位及時(shí)個(gè)位,L1控制第6位及時(shí)分位,高電平有效。或非門(mén)的輸入端分別連接L2、L4、L6,輸出端連接DP,循環(huán)點(diǎn)亮L2、L4、L6所對(duì)應(yīng)的數(shù)碼管的園點(diǎn),用以區(qū)分時(shí)、分、秒。 本模塊的電路設(shè)計(jì)如圖6所示。 圖6 LCD顯示模塊 2.5 系統(tǒng)總體電路在此給出整個(gè)系統(tǒng)的完整的電路圖,如圖7所示。 
圖7 整體電路圖 2.6 系統(tǒng)所用元器件 本系統(tǒng)所用的元器件清單如表2所示。 表2 本系統(tǒng)所用的元器件
3. 系統(tǒng)軟件設(shè)計(jì)
3.1 軟件設(shè)計(jì)思路對(duì)于時(shí)鐘功能,需要在數(shù)碼管上顯示當(dāng)前的時(shí)間的小時(shí)、分鐘及秒,因此,可以在內(nèi)部存儲(chǔ)空間分別定義它們的顯示緩存空間,來(lái)存放小時(shí)、分鐘、秒的 BCD 碼,各2個(gè)字節(jié)。 由于時(shí)鐘是不能停止的,因此需要采用內(nèi)部定時(shí)器自動(dòng)計(jì)時(shí),并使用定時(shí)器中斷處理程序來(lái)定時(shí)進(jìn)行時(shí)間數(shù)值的刷新。51 單片機(jī)的2個(gè)定時(shí)器都具有 16 位時(shí)器的工作模式。當(dāng)晶振為12MHz 時(shí),16 位定時(shí)器的最大定時(shí)值為 65.536ms,要達(dá)到 1 秒鐘,采用一個(gè)定時(shí)器定時(shí)與軟件計(jì)數(shù)相結(jié)合的方法。例如使用 T0,為了達(dá)到較為準(zhǔn)確的計(jì)時(shí),使 T0 的溢出時(shí)間為 50ms,使用一個(gè)字節(jié)作為軟件計(jì)數(shù)器 MS,計(jì)數(shù)值為 20。定時(shí)器的中斷處理程序?qū)?MS 進(jìn)行減 1 操作,當(dāng)MS 為 0 時(shí),1 秒到達(dá),此時(shí)更新存放小時(shí)、分鐘、秒的顯示緩存區(qū)。 3.2 程序設(shè)計(jì)3.2.1 主程序設(shè)計(jì) 本次設(shè)計(jì)程序代碼通過(guò)匯編語(yǔ)言編寫(xiě)。首先定義各腳口和變量名稱(chēng),其次編寫(xiě)各個(gè)子程序,最后編寫(xiě)主程序與中斷程序?qū)崿F(xiàn)功能。 主程序開(kāi)始,設(shè)置棧區(qū)為70H至7FH,運(yùn)用T0工作方式1進(jìn)行中斷,定義循環(huán)初始值為20,定義分秒時(shí)初始值為0(及開(kāi)機(jī)顯示00:00);根據(jù)50ms中斷設(shè)置TL0與TH0的參數(shù);設(shè)置手動(dòng)定時(shí)初始存儲(chǔ)單元為62H;輸入分鐘值,依次調(diào)用拆分子程序、顯示子程序、數(shù)據(jù)存儲(chǔ)子程序、讀及校時(shí)子程序、清除手動(dòng)定時(shí)子程序、比較亮燈子程序,手動(dòng)定時(shí)子程序;循環(huán)運(yùn)行。 主程序流程圖如圖8所示。 圖8 主程序流程圖 3.2.2 拆分子程序設(shè)計(jì) 拆分子程序開(kāi)始,取秒個(gè)位,指向秒個(gè)位顯示緩沖單元;取秒十位,指向秒十位顯示緩沖單元;取分個(gè)位,指向分個(gè)位顯示緩沖單元;取分十位,指向分十位顯示緩沖單元;取時(shí)個(gè)位,指向時(shí)個(gè)位顯示緩沖單元;取時(shí)十位,指向時(shí)十位顯示緩沖單元;最后將秒、分鐘、小時(shí)數(shù)據(jù)依次存入6AH至6FH單元中。 拆分子程序流程圖如圖9所示。
圖9 拆分子程序流程圖 3.2.3 顯示子程序設(shè)計(jì) 顯示子程序開(kāi)始,送顯示緩沖首地址(R0)及字位碼(R2),送字形表首地址,關(guān)顯示器,查字形表取待顯示字,傳送分個(gè)位字形到74LS164,R0加1并顯示區(qū)下一位,點(diǎn)亮對(duì)應(yīng)碼的顯示管,修改字位碼,修改字位碼送到A,判斷ACC.6是否為1(是:轉(zhuǎn)到查字形表操作;否:結(jié)束該程序)。 顯示子程序流程圖如圖10所示。
圖10 顯示子程序流程圖 3.2.4 數(shù)據(jù)存儲(chǔ)子程序設(shè)計(jì) 數(shù)據(jù)存儲(chǔ)子程序開(kāi)始,因?yàn)槲鬓r(nóng)上午作息時(shí)間夏季與冬季相同,所以直接將上午的十個(gè)時(shí)間值分別存入20H到3DH;然后判斷SW1是否閉合,若閉合將冬季作息時(shí)間值存入到3EH到61H,若斷開(kāi)將夏季作息時(shí)間值存入到3EH到61H,結(jié)束子程序。 數(shù)據(jù)存儲(chǔ)子程序流程圖如圖11所示。 圖11 數(shù)據(jù)存儲(chǔ)子程序流程圖 3.2.5 讀及校時(shí)子程序設(shè)計(jì) 本子程序設(shè)計(jì)對(duì)分鐘和小時(shí)進(jìn)行校時(shí)。在設(shè)計(jì)中用按鈕SW3控制分;用按鈕SW2控制時(shí)。按一下按鈕,數(shù)值加1;若按鈕閉合,則一直加1。分鐘每60循環(huán),小時(shí)每24循環(huán)。本子程序流程圖如圖12所示。 圖12 讀及校時(shí)子程序流程圖 3.2.6 比較子程序設(shè)計(jì) 本子程序設(shè)計(jì)主要運(yùn)用了判斷選擇結(jié)構(gòu),定位初始數(shù)據(jù)時(shí)間存儲(chǔ)單元20H,將當(dāng)前時(shí)間依次與它們比較。先比較小時(shí),若相等再比較分鐘,若分鐘相等,接著判斷SW1是否閉合,若閉合冬季指示燈亮,否則夏季指示燈亮,最后使蜂鳴器響; 若小時(shí)不相等,跳轉(zhuǎn)到下個(gè)數(shù)據(jù)存儲(chǔ)單元,判斷該存儲(chǔ)單元是否為空(若為空,結(jié)束比較;不為空,繼續(xù)執(zhí)行),判斷當(dāng)前數(shù)據(jù)的地址是否大于6FH,若大于,結(jié)束比較;若小于,繼續(xù)進(jìn)行比較。 若分鐘不相等,跳轉(zhuǎn)到下個(gè)數(shù)據(jù)存儲(chǔ)單元,判斷該存儲(chǔ)單元是否為空(若為空,結(jié)束比較;不為空,繼續(xù)執(zhí)行),判斷當(dāng)前數(shù)據(jù)的地址是否大于6FH,若大于,結(jié)束比較;若小于,繼續(xù)進(jìn)行比較。本子程序流程圖如圖13所示。 圖13 比較亮燈子程序流程圖
3.2.7 手動(dòng)定時(shí)子程序設(shè)計(jì) 本設(shè)計(jì)手動(dòng)定時(shí)值為當(dāng)前時(shí)間,按下按鈕SW4,存下當(dāng)前時(shí)間并報(bào)警,當(dāng)下一次達(dá)到該時(shí)間時(shí),會(huì)再度報(bào)警。因?yàn)閮?nèi)存單元的局限性,手動(dòng)定時(shí)最多可存儲(chǔ)3個(gè)時(shí)間,當(dāng)存儲(chǔ)第4個(gè)時(shí)間時(shí),則會(huì)覆蓋第1個(gè)時(shí)間。程序代碼如下: MANUAL:JB SW4,ZZ ;判斷開(kāi)關(guān)是否閉合 MOV R1, B CJNE R1, #69H, $+3 ;判斷存儲(chǔ)單元小于69H JC ZY MOV R1, #62H ;手動(dòng)存儲(chǔ)單元首地址 MOV B, R1 ZY: MOV @R1,Hour ;存小時(shí) INC R1 MOV @R1, Minute ;存分鐘 INC R1 MOV @R1, Secs ;存秒 INC R1 MOV B, R1 ZZ: RET 3.2.8 清除手動(dòng)定時(shí)子程序設(shè)計(jì) 本子程序目的是清除手動(dòng)定時(shí)的數(shù)據(jù),當(dāng)按下按鈕SW5時(shí),將清除之前存儲(chǔ)的所有手動(dòng)定時(shí)數(shù)據(jù)。程序代碼如下: Clear: JB SW5,XX ;判斷按鈕SW5是否閉合 MOV R1, #62H ;定位手動(dòng)定時(shí)數(shù)據(jù)初始單元地址 CLRP1: CLR A MOV @R1, A ;清除 INC R1 CJNE R1, #6AH, CLRP1 XX: RET
4. 系統(tǒng)調(diào)試與仿真4.1 作息時(shí)間切換功能的調(diào)試當(dāng)按下按鈕SW1時(shí),切換為冬季作息時(shí)間;當(dāng)按鈕彈開(kāi)時(shí),切換為夏季作息時(shí)間。仿真過(guò)程中比較順利,沒(méi)有出現(xiàn)問(wèn)題。仿真結(jié)果如圖14、15所示。 圖14 冬季作息時(shí)間亮燈 圖15 夏季作息時(shí)間亮燈 4.2 調(diào)時(shí)調(diào)分功能的調(diào)試按一下SW2、SW3分別對(duì)小時(shí)、分鐘進(jìn)行調(diào)時(shí),若按鈕不彈開(kāi),則一直處于調(diào)時(shí)狀態(tài)。在本功能的仿真調(diào)試過(guò)程中,發(fā)現(xiàn)按鈕有一些抖動(dòng),及按一下按鈕跳動(dòng)2個(gè)或2個(gè)以上的數(shù)字,后改動(dòng)相關(guān)參數(shù)增加延時(shí)時(shí)間,基本解決抖動(dòng)問(wèn)題。 將分鐘、小時(shí)調(diào)節(jié)時(shí)間加1,仿真結(jié)果如圖16所示。 圖16 調(diào)時(shí)(左:調(diào)時(shí)前,右:調(diào)時(shí)后) 4.3 手動(dòng)定時(shí)功能的調(diào)試按一下SW4進(jìn)行手動(dòng)定時(shí),將數(shù)碼管當(dāng)前顯示的時(shí)間保存(當(dāng)前秒的數(shù)據(jù)不進(jìn)行保存),同時(shí)進(jìn)行報(bào)警并在下一次到達(dá)該時(shí)間時(shí)再次報(bào)警(報(bào)警定時(shí)不分冬季夏季)。在仿真過(guò)程中,發(fā)現(xiàn)00:00:00~00:59:00無(wú)法進(jìn)行手動(dòng)定時(shí),分析問(wèn)題后,認(rèn)為在比較模塊的判斷結(jié)構(gòu)上有一些問(wèn)題,只進(jìn)行了時(shí)判斷,沒(méi)有進(jìn)行分判斷,從而導(dǎo)致在該段時(shí)間無(wú)法定時(shí)。但更改程序后,仍無(wú)法在該段時(shí)間進(jìn)行手動(dòng)定時(shí),需要繼續(xù)進(jìn)行調(diào)試改進(jìn)。 增設(shè)01:00手動(dòng)定時(shí),仿真如圖17所示。 圖17 手動(dòng)定時(shí) 4.4 清除手動(dòng)定時(shí)功能的調(diào)試按下按鍵SW5清除之前設(shè)置的所有手動(dòng)定時(shí)數(shù)據(jù)。在該功能調(diào)試過(guò)程中沒(méi)有出現(xiàn)問(wèn)題。 清除01:00手動(dòng)定時(shí),仿真如圖18所示。 圖18 清除手動(dòng)定時(shí)(左:定時(shí)燈亮,右:清除定時(shí)燈滅) 4.5 蜂鳴器定時(shí)報(bào)警15s功能的調(diào)試在到達(dá)程序設(shè)定時(shí)間或手動(dòng)設(shè)置時(shí)間時(shí),指示燈亮并且蜂鳴器開(kāi)始報(bào)警,報(bào)警時(shí)長(zhǎng)15s。仿真如圖19所示。 圖19 定時(shí)報(bào)警15s(左:開(kāi)始報(bào)警,右:結(jié)束報(bào)警)
5. 總結(jié)5.1 本系統(tǒng)的優(yōu)缺點(diǎn)本系統(tǒng)優(yōu)點(diǎn):本設(shè)計(jì)可以方便快捷的按照作息時(shí)間進(jìn)行響鈴報(bào)警提示,可以調(diào)節(jié)當(dāng)前系統(tǒng)時(shí)間,可以手動(dòng)增加或刪除定時(shí)時(shí)間,操作簡(jiǎn)單容易推廣。 本系統(tǒng)不足:在手動(dòng)定時(shí)方面有一些問(wèn)題,無(wú)法在00:00:00~0:59:00進(jìn)行手動(dòng)定時(shí);定時(shí)精度尚要進(jìn)行調(diào)整;可以在程序代碼和仿真電路上進(jìn)一步優(yōu)化。
本設(shè)計(jì)的第一步是確定電路的整體框架,包括調(diào)節(jié)時(shí)間模塊、數(shù)據(jù)存儲(chǔ)模塊、手動(dòng)定時(shí)模塊、清除模塊等,然后是開(kāi)始各個(gè)子程序的編寫(xiě)與逐步調(diào)試。在這一過(guò)程中我遇到了許多問(wèn)題,比如轉(zhuǎn)移指令的使用,堆棧的創(chuàng)建。我積極的詢(xún)問(wèn)老師、查閱書(shū)籍,最后解決了問(wèn)題。
本設(shè)計(jì)的第二部是仿真電路的設(shè)計(jì),首先確定各個(gè)模塊所需的元器件,然后分布空間進(jìn)行總的電路圖的搭建。在這一過(guò)程中,老師也提出了有針對(duì)性的建議,比如我一開(kāi)始設(shè)計(jì)了8個(gè)指示燈進(jìn)行報(bào)警提示,但由于指示燈亮滅較為無(wú)序,改為只有冬季與夏季兩個(gè)指示燈;然后進(jìn)行按鈕功能的明確化與簡(jiǎn)潔化,使操作者能比較容易的使用該套系統(tǒng)。
單片機(jī)源程序如下:
- ;作息時(shí)間控制系統(tǒng)
- OUT BIT P3.7
- F1 BIT 1BH ;T1的位置
- SDATA BIT P1.7 ;定義74LS164串行移位數(shù)據(jù)端
- SCLK BIT P1.6 ;定義74LS164串行移位時(shí)鐘端
- DIS EQU P1 ;定義字形口
- CWINTER EQU P0.7 ;冬季燈輸出
- CSUMMER EQU P0.6 ;夏季燈輸出
- SW1 EQU P3.2 ;控制切換季節(jié)
- SW2 EQU P3.3 ;控制調(diào)時(shí)
- SW3 EQU P3.4 ;控制調(diào)分
- SW4 EQU P3.1
- SW5 EQU P3.5
- MS EQU 10H ;定義50ms計(jì)數(shù)器
- Secs EQU 11H ;定義秒計(jì)數(shù)器
- Minute EQU 12H ;定義分鐘計(jì)數(shù)器
- Hour EQU 13H ;定義時(shí)計(jì)數(shù)器
- ;---------------------------------
- ORG 0000H
- LJMP Main ;長(zhǎng)轉(zhuǎn)移指令
- ;---------------------------------------------------------------------
- ORG 000BH
- LJMP T0INT
- ;---------------------------------------------------------------------
- Main: MOV SP, #70H ;將棧區(qū)設(shè)置在70H,7FH
- MOV IE, #10000010B ;允許T0中斷
- MOV TMOD, #01H ;T0定時(shí)方式1
- MOV MS, #20 ;50ms單元初值?使20×50ms=1s
- MOV Secs, #0
- MOV Minute, #0
- MOV Hour, #0 ;開(kāi)機(jī)顯示00:00:00
- CLR F0
- CLR F1
- MOV R7, #80
- MOV TL0, #00H ; 50ms定時(shí)參數(shù)
- MOV TH0, #4CH ;此參數(shù)小于實(shí)際參數(shù),為仿真調(diào)試所調(diào)整獲得
- SETB TR0 ;啟動(dòng)定時(shí)器
- MOV B, #62H
- LOOP: MOV R1, #Secs
- LCALL Split ;調(diào)用拆分子程序NOP 實(shí)際就是分鐘小時(shí)數(shù)據(jù)輸入
- LCALL DISP ;調(diào)用顯示子程序NOP 實(shí)際就是分鐘小時(shí)數(shù)據(jù)顯示
- LCALL STORE ;存儲(chǔ)的數(shù)據(jù)
- LCALL Verify ;讀,校時(shí)
- NOP
- LCALL MANUAL ;手動(dòng)定時(shí)
- NOP
- LCALL Clear ;清除手動(dòng)定時(shí)
- NOP
- MOV A, Secs
- CJNE A, #5, $+3 ;定時(shí)精度控制在5秒以?xún)?nèi)
- JNC LOOP
- LCALL Compare ;比較,響鈴亮燈
- SJMP LOOP
- ;----------------------------------------------------------------------------------------
- T0INT: MOV TL0, #00H
- MOV TH0, #4CH
- PUSH ACC
- DJNZ MS, T0Exit
- MOV MS, #20
- MOV A, Secs
- ADD A,#1
- DA A
- MOV Secs, A
- CJNE A, #60H, $+3 ;
- JC T0Exit ;若秒小于60,則直接返回
- MOV Secs, #0 ;若秒大于或等于60,則回零
- MOV A, Minute
- ADD A, #1
- DA A ;對(duì)分進(jìn)行十進(jìn)制調(diào)整,以便送顯示器顯示
- MOV Minute, A
- CJNE A, #60H, $+3 ;60后一定要加H?表示該數(shù)為BCD碼
- JC T0Exit ;若分小于60,則直接返回
- MOV Minute, #0 ;若分大于或等于60,則回零
- MOV A, Hour
- ADD A, #1
- DA A
- MOV Hour, A
- CJNE A, #24H, $+3
- JC T0Exit
- MOV Hour, #0
- T0Exit: POP ACC
- RETI
- ;---------------------------------------------------------------------
-
- Compare: MOV R0, #20H ;定位數(shù)據(jù)存儲(chǔ)區(qū),見(jiàn)下方store
- NextTime: LCALL DISP
- MOV A, @R0
- CJNE A, Hour, CLP1
- INC R0
- MOV A, @R0
- CJNE A, Minute, CLP2
- INC R0
- SWITCH:JB SW1,SWITCH1 ;判斷按鍵1,如果閉合,順序執(zhí)行;斷開(kāi),跳轉(zhuǎn)
- CPL CWINTER
- JNB SW1,SWITCH2
- SWITCH1:CPL CSUMMER
- SWITCH2:lcall SONGER
- INC R0
- RET
- ;---------------------------------------------------------------------
- CLP1: INC R0 ;指向分
- INC R0 ; 指向秒
- INC R0
- MOV A, @R0
- JNZ CLP3 ;A=0,順序執(zhí)行;A不等于0,跳轉(zhuǎn)
- INC R0 ;指向下個(gè)報(bào)警計(jì)時(shí)點(diǎn)的分鐘位
- MOV A, @R0
- JNZ CLP3 ;當(dāng)分鐘也為0時(shí)才終止程序
- RET
- ;---------------------------------------------------------------------
- CLP2:INC R0
- INC R0
- MOV A, @R0
- JNZ CLP3 ;A=0,順序執(zhí)行;A不等于0,跳轉(zhuǎn)
- INC R0 ;指向下個(gè)報(bào)警計(jì)時(shí)點(diǎn)的分鐘位
- MOV A, @R0
- JNZ CLP3 ;當(dāng)分鐘也為0時(shí)才終止程序
- RET
- ;---------------------------------------------------------------------
- CLP3: CJNE R0, #69H, $+3 ;因?yàn)闀r(shí)間數(shù)據(jù)存在6AH~6FH,所以不能大于69H
- JC NextTime
- RET
- ;---------------------------------------------------------------------
- SONGER: ;聲音報(bào)警 ,控制時(shí)間結(jié)束后停止
- PUSH PSW
- PUSH ACC
- PUSH 05H
- PUSH 06H
- SONGER1:
- MOV R1,#Secs
- LCALL Split
- LCALL DISP
- CPL OUT
- DJNZ R6,SONGER1
- MOV R6,#7
- DJNZ R5,SONGER1 ;跳轉(zhuǎn)過(guò)一次后
- MOV R5,#10
- LCALL DISP
- MOV A,#Secs
- CJNE A,#5,$+3
- JC SONGER1 ;A=0,跳轉(zhuǎn);A不等于0,順序執(zhí)行
- MOV P0,#0FFH
- POP 06H
- POP 05H
- POP ACC
- POP PSW
- RET
-
- Verify: JB SW3, VLP3 ;判斷是否需要校"分"
- CLR EA
- CLR TR0 ;校時(shí)期間,暫時(shí)關(guān)閉定時(shí)器
- VLP1: MOV A, Minute ;SW3閉合時(shí),則對(duì)分鐘加1
- ADD A, #1
- DA A
- MOV Minute, A
- CJNE A, #60H, VLP2 ;比較,不等于跳轉(zhuǎn),大于CY=0;小于CY=1
- MOV Minute, #0
- VLP2: MOV R6, #150
- MOV R1, #Secs
- LCALL Split
- LCALL DISP
- DJNZ R6, $-3 ;一定程度上保護(hù)按鍵的穩(wěn)定性
- JNB SW3, VLP1 ;若SW3未釋放,則繼續(xù)對(duì)分鐘加1
- MOV Secs, #0 ;校時(shí)期間,將秒清零
- SETB EA
- SETB TR0 ;恢復(fù)計(jì)數(shù)
- RET
- ;---------------------------------------------------------------------
-
- VLP3: JB SW2, VExit ;判斷是否需要校"時(shí)"
- CLR EA
- CLR TR0 ;校時(shí)期間,暫時(shí)關(guān)閉定時(shí)器
- VLP4: MOV A, Hour ;SW2閉合時(shí),則對(duì)小時(shí)加1
- ADD A, #1
- DA A
- MOV Hour, A
- CJNE A, #24H, VLP5
- MOV Hour, #0
- VLP5: MOV R6, #150
- MOV R1, #Secs
- LCALL Split
- LCALL DISP
- DJNZ R6, $-3
- JNB SW2, VLP4 ;若SW2未釋放,則繼續(xù)對(duì)小時(shí)加1
- MOV Secs, #0 ;校時(shí)期間,將秒清零
- SETB EA
- SETB TR0 ;恢復(fù)計(jì)數(shù)
- VExit: RET
- ;---------------------------------------------------------------------
- STORE:
- MOV R1, #20H ;存儲(chǔ)報(bào)警時(shí)間(分為冬夏兩種)
- MOV @R1, #06H
- INC R1
- MOV @R1, #00H
- INC R1
- INC R1
- MOV @R1, #07H
- INC R1
- MOV @R1, #50H
- INC R1
- INC R1
- MOV @R1, #08H
- INC R1
- MOV @R1, #00H
- INC R1
- INC R1
- MOV @R1, #08H
- INC R1
- MOV @R1, #50H
- INC R1
- INC R1
- MOV @R1, #09H
- INC R1
- MOV @R1, #00H
- INC R1
- INC R1
- MOV @R1, #09H
- INC R1
- MOV @R1, #50H
- INC R1
- INC R1
- MOV @R1, #10H
- INC R1
- MOV @R1, #10H
- INC R1
- INC R1
- MOV @R1, #11H
- INC R1
- MOV @R1, #00H
- INC R1
- INC R1
- MOV @R1, #11H
- INC R1
- MOV @R1, #10H
- INC R1
- INC R1
- MOV @R1, #12H
- INC R1
- MOV @R1, #00H
- INC R1
- INC R1
- ;--------------------------------------------------------
- PANDUAN:JNB SW1,PANDUAN1
- MOV @R1, #14H
- INC R1
- MOV @R1, #20H
- INC R1
- INC R1
- MOV @R1, #14H
- INC R1
- MOV @R1, #30H
- INC R1
- INC R1
- MOV @R1, #15H
- INC R1
- MOV @R1, #20H
- INC R1
- INC R1
- MOV @R1, #15H
- INC R1
- MOV @R1, #30H
- INC R1
- INC R1
- MOV @R1, #16H
- INC R1
- MOV @R1, #20H
- INC R1
- INC R1
- MOV @R1, #16H
- INC R1
- MOV @R1, #30H
- INC R1
- INC R1
- MOV @R1, #17H
- INC R1
- MOV @R1, #20H
- INC R1
- INC R1
- MOV @R1, #17H
- INC R1
- MOV @R1, #30H
- INC R1
- INC R1
- MOV @R1, #18H
- INC R1
- MOV @R1, #20H
- INC R1
- INC R1
- MOV @R1, #19H
- INC R1
- MOV @R1, #30H
- INC R1
- INC R1
- MOV @R1, #21H
- INC R1
- MOV @R1, #30H
- INC R1
- INC R1
- MOV @R1, #23H
- INC R1
- MOV @R1, #30H
- INC R1
- INC R1
- JB SW1,PANDUAN2
- ;--------------------------------------------------------
- PANDUAN1:MOV @R1, #13H
- INC R1
- MOV @R1, #50H
- INC R1
- INC R1
- MOV @R1, #14H
- INC R1
- MOV @R1, #00H
- INC R1
- INC R1
- MOV @R1, #14H
- INC R1
- MOV @R1, #50H
- INC R1
- INC R1
- MOV @R1, #15H
- INC R1
- MOV @R1, #00H
- INC R1
- INC R1
- MOV @R1, #15H
- INC R1
- MOV @R1, #50H
- INC R1
- INC R1
- MOV @R1, #16H
- INC R1
- MOV @R1, #00H
- INC R1
- INC R1
- MOV @R1, #16H
- INC R1
- MOV @R1, #50H
- INC R1
- INC R1
- MOV @R1, #17H
- INC R1
- MOV @R1, #00H
- INC R1
- INC R1
- MOV @R1, #17H
- INC R1
- MOV @R1, #50H
- INC R1
- INC R1
- MOV @R1, #19H
- INC R1
- MOV @R1, #30H
- INC R1
- INC R1
- MOV @R1, #21H
- INC R1
- MOV @R1, #30H
- INC R1
- INC R1
- MOV @R1, #23H
- INC R1
- MOV @R1, #00H
- INC R1
- INC R1
- PANDUAN2:
- RET
- ;---------------------------------------------------------------------
- ;手動(dòng)定時(shí),定時(shí)值為當(dāng)前時(shí)間
- MANUAL:JB SW4,ZZ
- MOV R1, B
- CJNE R1, #69H, $+3
- JC ZY
- MOV R1, #62H
- MOV B, R1
- ZY: MOV @R1,Hour
- INC R1
- MOV @R1, Minute
- INC R1
- MOV @R1, Secs
- INC R1
- MOV B, R1
- ZZ:RET
- ;---------------------------------------------------------------------
- ;清除手動(dòng)定時(shí)數(shù)據(jù)
- Clear:JB SW5,XX
- MOV R1, #62H
- CLRP1: CLR A
- MOV @R1, A
- INC R1
- CJNE R1, #6AH, CLRP1
- XX:RET
- ;---------------------------------------------------------------------
- ;拆分子程序
- Split: MOV R0, #6AH ;秒個(gè)位顯示緩沖單元
- MOV A, @R1 ;A=((R1))
- ANL A, #0FH ;取秒個(gè)位 ‘與’指令,去相交值
- MOV @R0, A ;(R0)=(A)
- INC R0 ;指向秒十位顯示緩沖單元 R0+1
- MOV A, @R1
- SWAP A ;將A的高低字節(jié)交換
- ANL A, #0FH ;取秒十位
- MOV @R0, A
- INC R0 ;指向分個(gè)位顯示緩沖單元
- INC R1 ;R1加1后為12H,指向分按鍵
- MOV A, @R1
- ANL A, #0FH ;取分個(gè)位
- MOV @R0, A
- INC R0 ;指向分十位顯示緩沖單元
- MOV A, @R1
- SWAP A
- ANL A, #0FH ;取分十位
- MOV @R0, A
- INC R0 ;指向時(shí)個(gè)位顯示緩沖單元
- INC R1 ;R1加1后為13H,指向時(shí)按鍵
- MOV A, @R1
- ANL A, #0FH ;取時(shí)個(gè)位
- MOV @R0, A
- INC R0 ;指向時(shí)十位顯示緩沖單元
- MOV A, @R1
- SWAP A
- ANL A, #0FH ;取時(shí)十位
- MOV @R0, A
- RET ;R0從6AH到6FH,依次存秒、分鐘,小時(shí)數(shù)據(jù)。
- ;---------------------------------------------------------------------
- DISP: PUSH 00H ;堆棧操作,將棧頂指針SP的內(nèi)容加1,然后將直接尋址單元中的數(shù)據(jù)傳到sp所指單元;即將00H中的內(nèi)容放入71H單元中 sp=(sp+1),(SP)=(direct)
- MOV R0, #6AH ;顯示緩沖區(qū)首地址
- MOV R2, #11111110B ;對(duì)應(yīng)個(gè)位的字位碼
- MOV DPTR, #WordTab ;將TAB表首地址賦給指針
- JNB F0, DISP0 ;(F0)=0,(PC)=(PC)+3,跳轉(zhuǎn);否則,還要加3,順序執(zhí)行
-
- DJNZ R7, DISP1 ;減1不為0,轉(zhuǎn)移;否則,順序執(zhí)行
- CPL F1
- MOV R7, #60 ;這四行主要為了確保關(guān)顯示器操作,沒(méi)什么用
- SJMP DISP1 ;短轉(zhuǎn)移
-
- DISP0: CLR F1
- DISP1: ORL DIS, #00111111B ;關(guān)顯示器 ORL并操作
- MOV R3, #20
- DJNZ R3, $ ;延時(shí)40μ s,意思為R3不為0時(shí)反復(fù)執(zhí)行該指令,$為當(dāng)下執(zhí)行指令的地址
- MOV A, @R0 ;取待顯示數(shù)字
- MOVC A, @A+DPTR ;查字形
- WordOut: MOV R3, #8 ;傳送字形碼到74LS164
- NEXTB: RLC A ;取待發(fā)送,進(jìn)位循環(huán)左移
- MOV SDATA, C ;送數(shù)據(jù)到數(shù)據(jù)口,C就是CY
- SETB SCLK ;產(chǎn)生時(shí)鐘設(shè)置為1
- CLR SCLK
- DJNZ R3, NEXTB ;繼續(xù)送下一位
- INC R0
- JB F1, HIDE ;為1跳轉(zhuǎn)
- MOV A, R2 ;取字位碼
- ANL DIS, A
- HIDE: MOV R3, #5 ;延時(shí)1ms
- MOV R4, #100
- DJNZ R4, $
- DJNZ R3, $-4
- MOV A, R2 ;修改字位碼
- RL A ;左移
- MOV R2, A
- JB ACC.6, DISP1 ;循環(huán)次,依次顯示秒、分鐘、小時(shí)
- DExit: POP 00H
- RET
- ;-------------------------------------------------------------------
- WordTab: DB 3FH, 06H, 5BH, 4FH ;"0","1","2","3" 共陰極
- DB 66H, 6DH, 7DH, 07H ;"4","5","6","7"
- DB 7FH, 6FH, 77H, 7CH ;"8","9","A","B"
- DB 39H, 5EH, 79H, 71H ;"C","D","E","F"
- DB 40H, 38H ;"-", "L"
- ;-------------------------------------------------------------------
- END
復(fù)制代碼
以上的Word格式文檔51黑下載地址:
文檔.doc
(667.36 KB, 下載次數(shù): 11)
2019-12-25 22:29 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|