找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3274|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

基于51單片機匯編寫的校園作息控制系統(tǒng)程序資料

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:641762 發(fā)表于 2019-12-25 16:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機作息時間控制實現(xiàn)了對時間控制的智能化,擺脫了傳統(tǒng)由人來控制時間的長短的不便,是現(xiàn)代學(xué)校必不可少的教學(xué)設(shè)備。針對單片機課程的學(xué)習(xí)與熟練運用,本設(shè)計預(yù)計完成一套完整的校園作息時間控制系統(tǒng),鍛煉學(xué)生的獨立思考能力與學(xué)習(xí)能力,在學(xué)生本人積極實踐、查閱資料的基礎(chǔ)上完成設(shè)計。
1.2設(shè)計任務(wù)要求
能按照作息時間發(fā)出鈴聲提示信息,以蜂鳴器模擬,響鈴15秒;能按照需要調(diào)整作息時間(夏季和冬季),并能調(diào)整當(dāng)前系統(tǒng)的時間;用數(shù)碼管顯示當(dāng)前時間。

2. 系統(tǒng)硬件電路的設(shè)計
2.1 51單片機時鐘電路
時鐘電路就是一個振蕩器,給單片機提供一個節(jié)拍,單片機執(zhí)行各種操作必須在這個節(jié)拍的控制下才能進行。因此單片機沒有時鐘電路是不會正常工作的。在MCS-51單片機內(nèi)有一個高增益的反相放大器,反相放大器的輸入端為XTAL1,輸出端為XTAL2,由該放大器構(gòu)成的振蕩電路和時鐘電路一起構(gòu)成了單片機的時鐘方式。
在內(nèi)部方式時鐘電路中,必須在XTAL1和XTAL2引腳兩端跨接石英晶體振蕩器和兩個微調(diào)電容構(gòu)成振蕩電路,通常C1和C2一般取30pF,晶振的頻率取值在1.2MHz~12MHz之間。晶體振蕩器的振蕩信號從XTAL2端送入內(nèi)部時鐘電路,它將該振蕩信號二分頻, 產(chǎn)生個兩相時鐘信號P1和P2供單片機使用。時鐘信號的周期稱為狀態(tài)時間S,它是振蕩周期的2倍,P1信號在每個狀態(tài)的前半周期有效,在每個狀態(tài)的后半周期P2信號有效。CPU就是以兩時鐘P1和P2為基本節(jié)拍協(xié)調(diào)單片機各部分有效工作的。
復(fù)位信號RST高電平有效,在輸入端保持兩個機器周期的高電平后,就可以完成復(fù)位操作。此外,該引腳還有掉電保護功能,若在該端接+5V備用電源,在使用中若掉電,可保護片內(nèi)RAM中信息不丟失。
時鐘及復(fù)位電路如圖1所示。

圖1 時鐘及復(fù)位電路

2.2 74LS164寄存器
74LS164 簡述:串行輸入帶鎖存、時鐘輸入、串行輸入帶緩沖、異步清除、最高時鐘頻率可高達36Mhz。當(dāng)清除端(CLEAR)為低電平時,輸出端()均為低電平。串行數(shù)據(jù)輸入端(A,B)可控制數(shù)據(jù)。當(dāng) A、B 任意一個為低電平,則禁止新數(shù)據(jù)輸入,在時鐘端(CLOCK)脈沖上升沿作用下為低電平。當(dāng) A、B 有一個為高電平,則另一個就允許輸入數(shù)據(jù),并在CLOCK上升沿作用下決定的狀態(tài)。
74LS164真值表如表1所示。

表1  74LS164真值表

輸入
輸出
同步清除輸入端
時鐘輸入端
串行數(shù)據(jù)輸入端(A,B)
……
×
×
×
……
×
×
……
……
×
……
×
……

74LS164 邏輯符號及其引腳圖如圖2所示。

圖2 邏輯符號(左)及引腳圖(右)

2.3 總體方案設(shè)計
根據(jù)系統(tǒng)的要求,確定系統(tǒng)的總體方案如圖3所示。

圖3 系統(tǒng)總體設(shè)計方案

本系統(tǒng)設(shè)計的原理是利用單片機 AT89S51 的定時器/計數(shù)器定時和計數(shù)的原
理。通過四聯(lián)共陰極數(shù)碼顯示管接收由 74LS164 傳來的數(shù)據(jù)并將其轉(zhuǎn)換為十進制BCD 碼顯示,該設(shè)計將軟、硬件有機地結(jié)合起來,使得系統(tǒng)能夠正確地進行計時,
數(shù)碼管能夠正確地顯示時間。
按鍵模塊中的按鈕 SW1、SW2、SW3 、SW4、SW5與 AT89S51 的 P3 口相連,對單片機起到控制作用,通過按鍵控制模塊把外界響應(yīng)送到單片機最小系統(tǒng)(AT89S51)中,然后通過接口電路把要顯示的時間送到四聯(lián) LED 數(shù)碼管中,四聯(lián) LED 數(shù)碼管的字段由串入并出的移位寄存器74LS164 控制,74LS164 的串行數(shù)據(jù)輸入端由 P1.7控制,移位脈沖由 P1.6 提供,字位由 P1.0至P1.5 控制,P1.0至P1.5 對應(yīng)控制 L6至L1。SW1至SW5 用來進行時間校準(zhǔn)及控制時間點的設(shè)定。

2.4 具體電路設(shè)計

2.4.1 按鍵控制模塊的設(shè)計

本模塊的控制電路主要由(冬季、夏季)指示燈、蜂鳴器與接于P3口的五個開關(guān)組成。SW1控制作息時間(閉合冬季、斷開夏季);SW2調(diào)節(jié)小時,每次加1;SW3調(diào)節(jié)分鐘,每次加1;SW4為手動定時開關(guān),儲存數(shù)碼管當(dāng)前顯示的時間,下次再到這一時間時響鈴亮燈;SW5為清除手動定時開關(guān),將所有手動定時數(shù)據(jù)清除。
按鍵設(shè)計模塊的設(shè)計圖如圖4所示

圖4 功能按鍵及指示燈(左)

2.4.2  輸入電路的設(shè)計

本模塊的輸入電路主要由單片機的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è)計電路如圖5所示。

圖5 輸入電路模塊

2.4.3  LCD顯示模塊設(shè)計

本模塊主要由一個6位共陰極數(shù)碼管和一個三輸入一輸出的或非門組成。數(shù)碼管依次顯示L1至L6管腳對應(yīng)的位數(shù),L6控制第1位及秒個位(從右向左),L5控制第2位及秒十位,L4控制第3位及分個位,L3控制第4位及分十位,L2控制第5位及時個位,L1控制第6位及時分位,高電平有效;蚍情T的輸入端分別連接L2、L4、L6,輸出端連接DP,循環(huán)點亮L2、L4、L6所對應(yīng)的數(shù)碼管的園點,用以區(qū)分時、分、秒。
本模塊的電路設(shè)計如圖6所示。

圖6 LCD顯示模塊

2.5  系統(tǒng)總體電路
在此給出整個系統(tǒng)的完整的電路圖,如圖7所示。

圖7 整體電路圖

2.6  系統(tǒng)所用元器件
    本系統(tǒng)所用的元器件清單如表2所示。

表2  本系統(tǒng)所用的元器件

元器件名稱
數(shù)量
指示燈
2
按鈕開關(guān)
5
5V電源
3
移位寄存器74LS164
1
七段譯碼顯示器7SEG-MAX6-CCBLUE
2
晶振12MHz
1
電容30pF
2
電解電容10uF
1
電阻10K
1
蜂鳴器
1
導(dǎo)線
若干
或非門74LS10
1

3. 系統(tǒng)軟件設(shè)計
3.1 軟件設(shè)計思路
對于時鐘功能,需要在數(shù)碼管上顯示當(dāng)前的時間的小時、分鐘及秒,因此,可以在內(nèi)部存儲空間分別定義它們的顯示緩存空間,來存放小時、分鐘、秒的 BCD 碼,各2個字節(jié)。
由于時鐘是不能停止的,因此需要采用內(nèi)部定時器自動計時,并使用定時器中斷處理程序來定時進行時間數(shù)值的刷新。51 單片機的2個定時器都具有 16 位時器的工作模式。當(dāng)晶振為12MHz 時,16 位定時器的最大定時值為 65.536ms,要達到 1 秒鐘,采用一個定時器定時與軟件計數(shù)相結(jié)合的方法。例如使用 T0,為了達到較為準(zhǔn)確的計時,使 T0 的溢出時間為 50ms,使用一個字節(jié)作為軟件計數(shù)器 MS,計數(shù)值為 20。定時器的中斷處理程序?qū)?MS 進行減 1 操作,當(dāng)MS 為 0 時,1 秒到達,此時更新存放小時、分鐘、秒的顯示緩存區(qū)。
3.2 程序設(shè)計

3.2.1  主程序設(shè)計

本次設(shè)計程序代碼通過匯編語言編寫。首先定義各腳口和變量名稱,其次編寫各個子程序,最后編寫主程序與中斷程序?qū)崿F(xiàn)功能。
主程序開始,設(shè)置棧區(qū)為70H至7FH,運用T0工作方式1進行中斷,定義循環(huán)初始值為20,定義分秒時初始值為0(及開機顯示00:00);根據(jù)50ms中斷設(shè)置TL0與TH0的參數(shù);設(shè)置手動定時初始存儲單元為62H;輸入分鐘值,依次調(diào)用拆分子程序、顯示子程序、數(shù)據(jù)存儲子程序、讀及校時子程序、清除手動定時子程序、比較亮燈子程序,手動定時子程序;循環(huán)運行。
主程序流程圖如圖8所示。

圖8 主程序流程圖

3.2.2  拆分子程序設(shè)計

拆分子程序開始,取秒個位,指向秒個位顯示緩沖單元;取秒十位,指向秒十位顯示緩沖單元;取分個位,指向分個位顯示緩沖單元;取分十位,指向分十位顯示緩沖單元;取時個位,指向時個位顯示緩沖單元;取時十位,指向時十位顯示緩沖單元;最后將秒、分鐘、小時數(shù)據(jù)依次存入6AH至6FH單元中。
拆分子程序流程圖如圖9所示。

圖9 拆分子程序流程圖

3.2.3  顯示子程序設(shè)計

顯示子程序開始,送顯示緩沖首地址(R0)及字位碼(R2),送字形表首地址,關(guān)顯示器,查字形表取待顯示字,傳送分個位字形到74LS164,R0加1并顯示區(qū)下一位,點亮對應(yīng)碼的顯示管,修改字位碼,修改字位碼送到A,判斷ACC.6是否為1(是:轉(zhuǎn)到查字形表操作;否:結(jié)束該程序)。
顯示子程序流程圖如圖10所示。

圖10 顯示子程序流程圖

3.2.4  數(shù)據(jù)存儲子程序設(shè)計

數(shù)據(jù)存儲子程序開始,因為西農(nóng)上午作息時間夏季與冬季相同,所以直接將上午的十個時間值分別存入20H到3DH;然后判斷SW1是否閉合,若閉合將冬季作息時間值存入到3EH到61H,若斷開將夏季作息時間值存入到3EH到61H,結(jié)束子程序。
數(shù)據(jù)存儲子程序流程圖如圖11所示。

圖11 數(shù)據(jù)存儲子程序流程圖

3.2.5  讀及校時子程序設(shè)計

本子程序設(shè)計對分鐘和小時進行校時。在設(shè)計中用按鈕SW3控制分;用按鈕SW2控制時。按一下按鈕,數(shù)值加1;若按鈕閉合,則一直加1。分鐘每60循環(huán),小時每24循環(huán)。本子程序流程圖如圖12所示。

圖12 讀及校時子程序流程圖

3.2.6  比較子程序設(shè)計

本子程序設(shè)計主要運用了判斷選擇結(jié)構(gòu),定位初始數(shù)據(jù)時間存儲單元20H,將當(dāng)前時間依次與它們比較。先比較小時,若相等再比較分鐘,若分鐘相等,接著判斷SW1是否閉合,若閉合冬季指示燈亮,否則夏季指示燈亮,最后使蜂鳴器響;
若小時不相等,跳轉(zhuǎn)到下個數(shù)據(jù)存儲單元,判斷該存儲單元是否為空(若為空,結(jié)束比較;不為空,繼續(xù)執(zhí)行),判斷當(dāng)前數(shù)據(jù)的地址是否大于6FH,若大于,結(jié)束比較;若小于,繼續(xù)進行比較。
若分鐘不相等,跳轉(zhuǎn)到下個數(shù)據(jù)存儲單元,判斷該存儲單元是否為空(若為空,結(jié)束比較;不為空,繼續(xù)執(zhí)行),判斷當(dāng)前數(shù)據(jù)的地址是否大于6FH,若大于,結(jié)束比較;若小于,繼續(xù)進行比較。本子程序流程圖如圖13所示。

圖13 比較亮燈子程序流程圖


3.2.7  手動定時子程序設(shè)計

本設(shè)計手動定時值為當(dāng)前時間,按下按鈕SW4,存下當(dāng)前時間并報警,當(dāng)下一次達到該時間時,會再度報警。因為內(nèi)存單元的局限性,手動定時最多可存儲3個時間,當(dāng)存儲第4個時間時,則會覆蓋第1個時間。程序代碼如下:
MANUAL:JB SW4,ZZ  ;判斷開關(guān)是否閉合
MOV R1, B               
CJNE  R1, #69H, $+3              ;判斷存儲單元小于69H
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

3.2.8  清除手動定時子程序設(shè)計

本子程序目的是清除手動定時的數(shù)據(jù),當(dāng)按下按鈕SW5時,將清除之前存儲的所有手動定時數(shù)據(jù)。程序代碼如下:
Clear: JB SW5,XX  ;判斷按鈕SW5是否閉合
MOV  R1, #62H   ;定位手動定時數(shù)據(jù)初始單元地址
CLRP1: CLR A
MOV @R1, A     ;清除
INC R1
CJNE  R1, #6AH, CLRP1
XX: RET

4. 系統(tǒng)調(diào)試與仿真4.1  作息時間切換功能的調(diào)試
當(dāng)按下按鈕SW1時,切換為冬季作息時間;當(dāng)按鈕彈開時,切換為夏季作息時間。仿真過程中比較順利,沒有出現(xiàn)問題。仿真結(jié)果如圖14、15所示。

圖14 冬季作息時間亮燈

圖15 夏季作息時間亮燈

4.2  調(diào)時調(diào)分功能的調(diào)試
按一下SW2、SW3分別對小時、分鐘進行調(diào)時,若按鈕不彈開,則一直處于調(diào)時狀態(tài)。在本功能的仿真調(diào)試過程中,發(fā)現(xiàn)按鈕有一些抖動,及按一下按鈕跳動2個或2個以上的數(shù)字,后改動相關(guān)參數(shù)增加延時時間,基本解決抖動問題。
將分鐘、小時調(diào)節(jié)時間加1,仿真結(jié)果如圖16所示。

圖16 調(diào)時(左:調(diào)時前,右:調(diào)時后)

4.3  手動定時功能的調(diào)試
按一下SW4進行手動定時,將數(shù)碼管當(dāng)前顯示的時間保存(當(dāng)前秒的數(shù)據(jù)不進行保存),同時進行報警并在下一次到達該時間時再次報警(報警定時不分冬季夏季)。在仿真過程中,發(fā)現(xiàn)00:00:00~00:59:00無法進行手動定時,分析問題后,認(rèn)為在比較模塊的判斷結(jié)構(gòu)上有一些問題,只進行了時判斷,沒有進行分判斷,從而導(dǎo)致在該段時間無法定時。但更改程序后,仍無法在該段時間進行手動定時,需要繼續(xù)進行調(diào)試改進。
增設(shè)01:00手動定時,仿真如圖17所示。

圖17 手動定時

4.4  清除手動定時功能的調(diào)試
按下按鍵SW5清除之前設(shè)置的所有手動定時數(shù)據(jù)。在該功能調(diào)試過程中沒有出現(xiàn)問題。
清除01:00手動定時,仿真如圖18所示。

圖18 清除手動定時(左:定時燈亮,右:清除定時燈滅)

4.5  蜂鳴器定時報警15s功能的調(diào)試
在到達程序設(shè)定時間或手動設(shè)置時間時,指示燈亮并且蜂鳴器開始報警,報警時長15s。仿真如圖19所示。

圖19 定時報警15s(左:開始報警,右:結(jié)束報警)


5. 總結(jié)5.1 本系統(tǒng)的優(yōu)缺點
本系統(tǒng)優(yōu)點:本設(shè)計可以方便快捷的按照作息時間進行響鈴報警提示,可以調(diào)節(jié)當(dāng)前系統(tǒng)時間,可以手動增加或刪除定時時間,操作簡單容易推廣。
本系統(tǒng)不足:在手動定時方面有一些問題,無法在00:00:00~0:59:00進行手動定時;定時精度尚要進行調(diào)整;可以在程序代碼和仿真電路上進一步優(yōu)化。

本設(shè)計的第一步是確定電路的整體框架,包括調(diào)節(jié)時間模塊、數(shù)據(jù)存儲模塊、手動定時模塊、清除模塊等,然后是開始各個子程序的編寫與逐步調(diào)試。在這一過程中我遇到了許多問題,比如轉(zhuǎn)移指令的使用,堆棧的創(chuàng)建。我積極的詢問老師、查閱書籍,最后解決了問題。
本設(shè)計的第二部是仿真電路的設(shè)計,首先確定各個模塊所需的元器件,然后分布空間進行總的電路圖的搭建。在這一過程中,老師也提出了有針對性的建議,比如我一開始設(shè)計了8個指示燈進行報警提示,但由于指示燈亮滅較為無序,改為只有冬季與夏季兩個指示燈;然后進行按鈕功能的明確化與簡潔化,使操作者能比較容易的使用該套系統(tǒng)。

單片機源程序如下:
  1. ;作息時間控制系統(tǒng)
  2. OUT BIT P3.7
  3. F1 BIT 1BH                            ;T1的位置
  4. SDATA BIT P1.7  ;定義74LS164串行移位數(shù)據(jù)端
  5. SCLK BIT P1.6  ;定義74LS164串行移位時鐘端
  6. DIS EQU P1 ;定義字形口
  7. CWINTER EQU P0.7 ;冬季燈輸出
  8. CSUMMER              EQU P0.6 ;夏季燈輸出
  9. SW1 EQU P3.2    ;控制切換季節(jié)
  10. SW2 EQU P3.3              ;控制調(diào)時
  11. SW3 EQU P3.4              ;控制調(diào)分
  12. SW4 EQU P3.1
  13. SW5 EQU P3.5
  14. MS EQU 10H ;定義50ms計數(shù)器
  15. Secs  EQU 11H ;定義秒計數(shù)器
  16. Minute EQU 12H ;定義分鐘計數(shù)器
  17. Hour  EQU 13H ;定義時計數(shù)器
  18. ;---------------------------------
  19. ORG 0000H
  20. LJMP  Main                              ;長轉(zhuǎn)移指令
  21. ;---------------------------------------------------------------------
  22. ORG 000BH
  23. LJMP  T0INT                           
  24. ;---------------------------------------------------------------------
  25. Main: MOV SP, #70H ;將棧區(qū)設(shè)置在70H,7FH
  26. MOV IE, #10000010B  ;允許T0中斷
  27. MOV TMOD, #01H ;T0定時方式1
  28. MOV MS, #20  ;50ms單元初值?使20×50ms=1s
  29. MOV Secs, #0
  30. MOV Minute, #0
  31. MOV Hour, #0 ;開機顯示00:00:00
  32. CLR F0
  33. CLR F1
  34. MOV R7, #80
  35. MOV TL0, #00H ; 50ms定時參數(shù)
  36. MOV TH0, #4CH  ;此參數(shù)小于實際參數(shù),為仿真調(diào)試所調(diào)整獲得
  37. SETB  TR0 ;啟動定時器
  38. MOV B, #62H
  39. LOOP: MOV R1, #Secs
  40. LCALL Split ;調(diào)用拆分子程序NOP                實際就是分鐘小時數(shù)據(jù)輸入
  41. LCALL DISP  ;調(diào)用顯示子程序NOP                實際就是分鐘小時數(shù)據(jù)顯示
  42. LCALL STORE  ;存儲的數(shù)據(jù)
  43. LCALL Verify              ;讀,校時
  44. NOP
  45. LCALL MANUAL  ;手動定時
  46. NOP
  47. LCALL Clear   ;清除手動定時
  48. NOP
  49. MOV A, Secs
  50. CJNE   A, #5, $+3 ;定時精度控制在5秒以內(nèi)
  51. JNC LOOP
  52. LCALL Compare                            ;比較,響鈴亮燈
  53. SJMP  LOOP
  54. ;----------------------------------------------------------------------------------------
  55. T0INT: MOV TL0, #00H
  56. MOV TH0, #4CH
  57. PUSH  ACC
  58. DJNZ  MS, T0Exit
  59. MOV MS, #20
  60. MOV A, Secs
  61. ADD A,#1
  62. DA A
  63. MOV Secs, A
  64. CJNE  A, #60H, $+3  ;
  65. JC T0Exit ;若秒小于60,則直接返回
  66. MOV Secs, #0 ;若秒大于或等于60,則回零
  67. MOV A, Minute
  68. ADD A, #1
  69. DA A ;對分進行十進制調(diào)整,以便送顯示器顯示
  70. MOV Minute, A
  71. CJNE  A, #60H, $+3 ;60后一定要加H?表示該數(shù)為BCD碼
  72. JC T0Exit ;若分小于60,則直接返回
  73. MOV Minute, #0 ;若分大于或等于60,則回零
  74. MOV A, Hour
  75. ADD A, #1
  76. DA A
  77. MOV Hour, A
  78. CJNE  A, #24H, $+3
  79. JC T0Exit
  80. MOV Hour, #0
  81. T0Exit:  POP ACC
  82. RETI
  83. ;---------------------------------------------------------------------

  84. Compare: MOV R0, #20H ;定位數(shù)據(jù)存儲區(qū),見下方store
  85. NextTime: LCALL DISP
  86. MOV A, @R0
  87. CJNE  A, Hour, CLP1
  88. INC R0
  89. MOV A, @R0
  90. CJNE  A, Minute, CLP2
  91. INC R0
  92. SWITCH:JB SW1,SWITCH1  ;判斷按鍵1,如果閉合,順序執(zhí)行;斷開,跳轉(zhuǎn)
  93. CPL CWINTER
  94. JNB SW1,SWITCH2
  95. SWITCH1:CPL CSUMMER
  96. SWITCH2:lcall SONGER
  97. INC R0
  98. RET
  99. ;---------------------------------------------------------------------
  100. CLP1: INC R0 ;指向分
  101. INC R0                            ;              指向秒
  102. INC R0
  103. MOV A, @R0
  104. JNZ CLP3              ;A=0,順序執(zhí)行;A不等于0,跳轉(zhuǎn)
  105. INC R0                   ;指向下個報警計時點的分鐘位
  106. MOV A, @R0
  107. JNZ CLP3              ;當(dāng)分鐘也為0時才終止程序
  108. RET
  109. ;---------------------------------------------------------------------
  110. CLP2:INC R0
  111. INC R0
  112. MOV A, @R0
  113. JNZ CLP3              ;A=0,順序執(zhí)行;A不等于0,跳轉(zhuǎn)
  114. INC R0                   ;指向下個報警計時點的分鐘位
  115. MOV A, @R0
  116. JNZ CLP3      ;當(dāng)分鐘也為0時才終止程序   
  117. RET
  118. ;---------------------------------------------------------------------
  119. CLP3: CJNE R0, #69H, $+3 ;因為時間數(shù)據(jù)存在6AH~6FH,所以不能大于69H
  120. JC NextTime
  121. RET
  122. ;---------------------------------------------------------------------
  123. SONGER:                                                                                    ;聲音報警 ,控制時間結(jié)束后停止
  124. PUSH PSW                                                           
  125. PUSH ACC
  126. PUSH 05H
  127. PUSH 06H
  128. SONGER1:
  129. MOV R1,#Secs
  130. LCALL Split
  131. LCALL DISP
  132. CPL OUT
  133. DJNZ R6,SONGER1
  134. MOV R6,#7
  135. DJNZ R5,SONGER1                            ;跳轉(zhuǎn)過一次后
  136. MOV R5,#10
  137. LCALL DISP
  138. MOV A,#Secs
  139. CJNE A,#5,$+3
  140. JC SONGER1                               ;A=0,跳轉(zhuǎn);A不等于0,順序執(zhí)行
  141. MOV P0,#0FFH
  142. POP 06H
  143. POP 05H
  144. POP ACC
  145. POP PSW
  146. RET

  147. Verify:  JB SW3, VLP3 ;判斷是否需要校"分"
  148. CLR EA
  149. CLR TR0 ;校時期間,暫時關(guān)閉定時器
  150. VLP1: MOV A, Minute ;SW3閉合時,則對分鐘加1
  151. ADD A, #1
  152. DA A
  153. MOV Minute, A
  154. CJNE  A, #60H, VLP2                 ;比較,不等于跳轉(zhuǎn),大于CY=0;小于CY=1
  155. MOV Minute, #0
  156. VLP2: MOV R6, #150
  157. MOV R1, #Secs
  158. LCALL Split
  159. LCALL DISP
  160. DJNZ  R6, $-3                            ;一定程度上保護按鍵的穩(wěn)定性
  161. JNB SW3, VLP1 ;若SW3未釋放,則繼續(xù)對分鐘加1
  162. MOV Secs, #0 ;校時期間,將秒清零
  163. SETB  EA
  164. SETB  TR0 ;恢復(fù)計數(shù)
  165. RET
  166. ;---------------------------------------------------------------------

  167. VLP3: JB SW2, VExit ;判斷是否需要校"時"
  168. CLR EA
  169. CLR TR0 ;校時期間,暫時關(guān)閉定時器
  170. VLP4: MOV A, Hour  ;SW2閉合時,則對小時加1
  171. ADD A, #1
  172. DA A
  173. MOV Hour, A
  174. CJNE  A, #24H, VLP5
  175. MOV Hour, #0
  176. VLP5: MOV R6, #150
  177. MOV R1, #Secs
  178. LCALL Split
  179. LCALL DISP
  180. DJNZ  R6, $-3
  181. JNB SW2, VLP4 ;若SW2未釋放,則繼續(xù)對小時加1
  182. MOV Secs, #0 ;校時期間,將秒清零
  183. SETB  EA
  184. SETB  TR0 ;恢復(fù)計數(shù)
  185. VExit: RET
  186. ;---------------------------------------------------------------------
  187. STORE:
  188. MOV R1, #20H                ;存儲報警時間(分為冬夏兩種)
  189. MOV @R1, #06H
  190. INC R1
  191. MOV @R1, #00H
  192. INC R1
  193. INC R1
  194. MOV @R1, #07H
  195. INC R1
  196. MOV @R1, #50H
  197. INC R1
  198. INC R1
  199. MOV @R1, #08H
  200. INC R1
  201. MOV @R1, #00H
  202. INC R1
  203. INC R1
  204. MOV @R1, #08H
  205. INC R1
  206. MOV @R1, #50H
  207. INC R1
  208. INC R1
  209. MOV @R1, #09H
  210. INC R1
  211. MOV @R1, #00H
  212. INC R1
  213. INC R1
  214. MOV @R1, #09H
  215. INC R1
  216. MOV @R1, #50H
  217. INC R1
  218. INC R1
  219. MOV @R1, #10H
  220. INC R1
  221. MOV @R1, #10H
  222. INC R1
  223. INC R1
  224. MOV @R1, #11H
  225. INC R1
  226. MOV @R1, #00H
  227. INC R1
  228. INC R1
  229. MOV @R1, #11H
  230. INC R1
  231. MOV @R1, #10H
  232. INC R1
  233. INC R1
  234. MOV @R1, #12H
  235. INC R1
  236. MOV @R1, #00H
  237. INC R1
  238. INC R1
  239. ;--------------------------------------------------------
  240. PANDUAN:JNB SW1,PANDUAN1
  241. MOV @R1, #14H
  242. INC R1
  243. MOV @R1, #20H
  244. INC R1
  245. INC R1
  246. MOV @R1, #14H
  247. INC R1
  248. MOV @R1, #30H
  249. INC R1
  250. INC R1
  251. MOV @R1, #15H
  252. INC R1
  253. MOV @R1, #20H
  254. INC R1
  255. INC R1
  256. MOV @R1, #15H
  257. INC R1
  258. MOV @R1, #30H
  259. INC R1
  260. INC R1
  261. MOV @R1, #16H
  262. INC R1
  263. MOV @R1, #20H
  264. INC R1
  265. INC R1
  266. MOV @R1, #16H
  267. INC R1
  268. MOV @R1, #30H
  269. INC R1
  270. INC R1
  271. MOV @R1, #17H
  272. INC R1
  273. MOV @R1, #20H
  274. INC R1
  275. INC R1
  276. MOV @R1, #17H
  277. INC R1
  278. MOV @R1, #30H
  279. INC R1
  280. INC R1
  281. MOV @R1, #18H
  282. INC R1
  283. MOV @R1, #20H
  284. INC R1
  285. INC R1
  286. MOV @R1, #19H
  287. INC R1
  288. MOV @R1, #30H
  289. INC R1
  290. INC R1
  291. MOV @R1, #21H
  292. INC R1
  293. MOV @R1, #30H
  294. INC R1
  295. INC R1
  296. MOV @R1, #23H
  297. INC R1
  298. MOV @R1, #30H
  299. INC R1
  300. INC R1
  301. JB SW1,PANDUAN2
  302. ;--------------------------------------------------------
  303. PANDUAN1:MOV @R1, #13H
  304. INC R1
  305. MOV @R1, #50H
  306. INC R1
  307. INC R1
  308. MOV @R1, #14H
  309. INC R1
  310. MOV @R1, #00H
  311. INC R1
  312. INC R1
  313. MOV @R1, #14H
  314. INC R1
  315. MOV @R1, #50H
  316. INC R1
  317. INC R1
  318. MOV @R1, #15H
  319. INC R1
  320. MOV @R1, #00H
  321. INC R1
  322. INC R1
  323. MOV @R1, #15H
  324. INC R1
  325. MOV @R1, #50H
  326. INC R1
  327. INC R1
  328. MOV @R1, #16H
  329. INC R1
  330. MOV @R1, #00H
  331. INC R1
  332. INC R1
  333. MOV @R1, #16H
  334. INC R1
  335. MOV @R1, #50H
  336. INC R1
  337. INC R1
  338. MOV @R1, #17H
  339. INC R1
  340. MOV @R1, #00H
  341. INC R1
  342. INC R1
  343. MOV @R1, #17H
  344. INC R1
  345. MOV @R1, #50H
  346. INC R1
  347. INC R1
  348. MOV @R1, #19H
  349. INC R1
  350. MOV @R1, #30H
  351. INC R1
  352. INC R1
  353. MOV @R1, #21H
  354. INC R1
  355. MOV @R1, #30H
  356. INC R1
  357. INC R1
  358. MOV @R1, #23H
  359. INC R1
  360. MOV @R1, #00H
  361. INC R1
  362. INC R1
  363. PANDUAN2:
  364. RET
  365. ;---------------------------------------------------------------------
  366. ;手動定時,定時值為當(dāng)前時間
  367. MANUAL:JB SW4,ZZ
  368. MOV R1, B               
  369. CJNE  R1, #69H, $+3                           
  370. JC ZY
  371. MOV R1, #62H
  372. MOV B, R1
  373. ZY: MOV @R1,Hour
  374. INC R1
  375. MOV @R1, Minute
  376. INC R1
  377. MOV @R1, Secs
  378. INC R1
  379. MOV B, R1
  380. ZZ:RET
  381. ;---------------------------------------------------------------------
  382. ;清除手動定時數(shù)據(jù)
  383. Clear:JB SW5,XX
  384. MOV  R1, #62H
  385. CLRP1: CLR A
  386. MOV @R1, A
  387. INC R1
  388. CJNE  R1, #6AH, CLRP1
  389. XX:RET
  390. ;---------------------------------------------------------------------
  391. ;拆分子程序
  392. Split: MOV R0, #6AH ;秒個位顯示緩沖單元
  393. MOV A, @R1                                             ;A=((R1))
  394. ANL A, #0FH  ;取秒個位              ‘與’指令,去相交值
  395. MOV @R0, A                               ;(R0)=(A)
  396. INC R0 ;指向秒十位顯示緩沖單元              R0+1
  397. MOV A, @R1
  398. SWAP  A                 ;將A的高低字節(jié)交換
  399. ANL A, #0FH  ;取秒十位
  400. MOV @R0, A
  401. INC R0 ;指向分個位顯示緩沖單元
  402. INC R1                            ;R1加1后為12H,指向分按鍵
  403. MOV A, @R1
  404. ANL A, #0FH  ;取分個位
  405. MOV @R0, A
  406. INC R0 ;指向分十位顯示緩沖單元
  407. MOV A, @R1
  408. SWAP  A
  409. ANL A, #0FH  ;取分十位
  410. MOV @R0, A
  411. INC R0 ;指向時個位顯示緩沖單元
  412. INC R1                            ;R1加1后為13H,指向時按鍵
  413. MOV A, @R1
  414. ANL A, #0FH  ;取時個位
  415. MOV @R0, A
  416. INC R0 ;指向時十位顯示緩沖單元
  417. MOV A, @R1
  418. SWAP  A
  419. ANL A, #0FH  ;取時十位
  420. MOV @R0, A
  421. RET                                                                                    ;R0從6AH到6FH,依次存秒、分鐘,小時數(shù)據(jù)。
  422. ;---------------------------------------------------------------------
  423. DISP: PUSH  00H                            ;堆棧操作,將棧頂指針SP的內(nèi)容加1,然后將直接尋址單元中的數(shù)據(jù)傳到sp所指單元;即將00H中的內(nèi)容放入71H單元中 sp=(sp+1),(SP)=(direct)
  424. MOV R0, #6AH ;顯示緩沖區(qū)首地址
  425. MOV R2, #11111110B  ;對應(yīng)個位的字位碼
  426. MOV DPTR, #WordTab  ;將TAB表首地址賦給指針
  427. JNB F0, DISP0                ;(F0)=0,(PC)=(PC)+3,跳轉(zhuǎn);否則,還要加3,順序執(zhí)行

  428. DJNZ  R7, DISP1                              ;減1不為0,轉(zhuǎn)移;否則,順序執(zhí)行
  429. CPL F1
  430. MOV R7, #60                                          ;這四行主要為了確保關(guān)顯示器操作,沒什么用
  431. SJMP  DISP1              ;短轉(zhuǎn)移

  432. DISP0: CLR F1
  433. DISP1: ORL DIS, #00111111B ;關(guān)顯示器 ORL并操作
  434. MOV R3, #20
  435. DJNZ  R3, $ ;延時40μ s,意思為R3不為0時反復(fù)執(zhí)行該指令,$為當(dāng)下執(zhí)行指令的地址
  436. MOV A, @R0 ;取待顯示數(shù)字
  437. MOVC  A, @A+DPTR ;查字形
  438. WordOut: MOV R3, #8 ;傳送字形碼到74LS164
  439. NEXTB: RLC A ;取待發(fā)送,進位循環(huán)左移
  440. MOV SDATA, C ;送數(shù)據(jù)到數(shù)據(jù)口,C就是CY
  441. SETB SCLK  ;產(chǎn)生時鐘設(shè)置為1
  442. CLR SCLK
  443. DJNZ R3, NEXTB ;繼續(xù)送下一位
  444. INC R0
  445. JB F1, HIDE                            ;為1跳轉(zhuǎn)
  446. MOV A, R2 ;取字位碼
  447. ANL DIS, A
  448. HIDE: MOV R3, #5 ;延時1ms
  449. MOV R4, #100
  450. DJNZ  R4, $
  451. DJNZ  R3, $-4
  452. MOV A, R2 ;修改字位碼
  453. RL A                              ;左移
  454. MOV R2, A
  455. JB ACC.6, DISP1  ;循環(huán)次,依次顯示秒、分鐘、小時
  456. DExit: POP 00H
  457. RET
  458. ;-------------------------------------------------------------------
  459. WordTab: DB 3FH, 06H, 5BH, 4FH  ;"0","1","2","3"   共陰極
  460. DB 66H, 6DH, 7DH, 07H  ;"4","5","6","7"
  461. DB 7FH, 6FH, 77H, 7CH ;"8","9","A","B"
  462. DB 39H, 5EH, 79H, 71H ;"C","D","E","F"
  463. DB 40H, 38H ;"-", "L"
  464. ;-------------------------------------------------------------------
  465. END
復(fù)制代碼

以上的Word格式文檔51黑下載地址:
文檔.doc (667.36 KB, 下載次數(shù): 11)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:865960 發(fā)表于 2020-12-23 00:18 | 只看該作者
有電路圖和程序嘛
回復(fù)

使用道具 舉報

板凳
ID:328014 發(fā)表于 2020-12-23 00:23 | 只看該作者

電路圖和程序都在網(wǎng)頁上,需要自己畫,可惜樓主沒有提供工程文件
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表