一、系統(tǒng)概述:
1.基本要求:
(1) 顯示準(zhǔn)確的北京時(shí)間(時(shí)、分、秒),可用24小時(shí)制式;
(2) 隨時(shí)可以調(diào)校時(shí)間。
(3) 增加公歷日期顯示功能(年、月、日),年號只顯示最后兩位;
(4) 隨時(shí)可以調(diào)校年、月、日;
(5) 允許通過轉(zhuǎn)換功能鍵轉(zhuǎn)換顯示時(shí)間或日期。
(6) 所有按鍵需要通過串口自發(fā)自收來調(diào)校各種功能。
2.發(fā)揮部分
(1)增加秒表功能
(2)增加鬧鈴功能
(3)增加整點(diǎn)報(bào)時(shí)功能。
實(shí)驗(yàn)功能:
本系統(tǒng)是基于單片機(jī)AT89S52制作的數(shù)字電子鐘。根據(jù)實(shí)驗(yàn)要求,在完成實(shí)驗(yàn)所要求的基本功能外,擴(kuò)展了幾個(gè)功能。
硬件系統(tǒng)設(shè)計(jì)方面:
采用六位LED數(shù)碼管,用切換的方式顯示日期或時(shí)間和設(shè)置的鬧鐘時(shí)間;
可調(diào)整日期或時(shí)間以及鬧鐘時(shí)間;
具有設(shè)置鬧鐘的功能;
軟件系統(tǒng)設(shè)計(jì)方面:
程序采用匯編語言編寫,使自己更加理解硬件語言以及其工作原理。
“時(shí)鐘”基準(zhǔn)時(shí)間由單片機(jī)內(nèi)部的定時(shí)中斷提供用一個(gè)計(jì)數(shù)器對定時(shí)中斷的次數(shù)進(jìn)行計(jì)數(shù),可實(shí)現(xiàn)“秒”定時(shí),同理可以進(jìn)行“分”﹑“時(shí)”定時(shí),以及“日”﹑“月”﹑“年”定時(shí),并充分考慮閏年等情況下的日期的差異
采用按鍵查詢功能復(fù)用,簡化了程序的設(shè)計(jì)
采用動態(tài)掃描法顯示6位數(shù)碼管
方案考慮:
1、硬件方案
(1)、采用6位LED數(shù)碼管顯示日期或者時(shí)間。
(2)、顯示器的驅(qū)動可采用“靜態(tài)顯示驅(qū)動”(如7段譯碼/鎖存/驅(qū)動芯片CD4511);也可采用“動態(tài)掃描驅(qū)動”,但后者比前者所需驅(qū)動電流要大。
(3)顯示部分也可采用液晶,但液晶成本較高。
(4)、鍵盤的按鍵數(shù)目較多時(shí)則采用行列式矩陣結(jié)構(gòu)為好。“一鍵多用”的構(gòu)思和設(shè)計(jì)能大為減少按鍵的數(shù)目。
(5)、整體設(shè)計(jì)上應(yīng)考慮其結(jié)構(gòu)簡單﹑操作簡便﹑布局美觀﹑成本低廉。
2、軟件方案
(1)、“時(shí)鐘”基準(zhǔn)時(shí)間由單片機(jī)內(nèi)部的定時(shí)中斷提供,定時(shí)時(shí)間應(yīng)是“秒”的整除數(shù),且長短適宜。最長不能超過16位定時(shí)器的最長定時(shí)時(shí)間;最短不
能少于中斷服務(wù)程序的執(zhí)行時(shí)間。通常來說基準(zhǔn)時(shí)間越短,越有利于提高時(shí)鐘的運(yùn)行精確度。
(2)、用一個(gè)計(jì)數(shù)器對定時(shí)中斷的次數(shù)進(jìn)行計(jì)數(shù),可實(shí)現(xiàn)“秒”定時(shí),同理可以進(jìn)行“分”﹑“時(shí)”定時(shí),以及“日”﹑“月”﹑“年”定時(shí)。
(3)、LED 數(shù)碼管顯示器采用“動態(tài)掃描驅(qū)動”時(shí)要注意的是:驅(qū)動信號的維持時(shí)間必須大于“起輝時(shí)間”(電流大起輝時(shí)間短),而驅(qū)動信號的間歇時(shí)間必須小于“余輝時(shí)間”(電流大余輝時(shí)間長),但驅(qū)動電流大小受硬件電路能力和LED數(shù)碼管極限功耗的制約。
(4)、動態(tài)掃描顯示方式在更新顯示內(nèi)容時(shí),因LED數(shù)碼管余輝的存在可能會造成顯示字符的模糊,新內(nèi)容寫入顯示器之前須將所有的LED數(shù)碼管熄滅。
(5)、關(guān)于自動識別“月大﹑月小”和“平年﹑潤年”問題的考慮
方案比較:
顯示部分:
我們采用了數(shù)碼管顯示,鑒于數(shù)碼管也能實(shí)現(xiàn)基本的功能,而且液晶成本又太昂貴,同時(shí)我們放棄了用譯碼芯片,一方面進(jìn)一步降低成本,另一方面少了部分電路,減少錯誤產(chǎn)生。
焊接部分:
印制電路板的特點(diǎn)是布線緊湊、優(yōu)點(diǎn)是美觀,跳線少,線路穩(wěn)定,主要的工作量在于前期原理圖的繪制跟PCB板的布線,缺點(diǎn)是腐蝕容易不均勻而斷線;而手工焊萬用板優(yōu)點(diǎn)是可變性高,自由度高,主要工作量是原理圖的布線與跳線的構(gòu)思跟焊接,缺點(diǎn)是電路板焊接麻煩。
我們選擇手工焊萬用板的原因:
1 原材料提供的只是萬用板,從按照題目要求的方面考慮
2 萬用板便于功能的擴(kuò)展,板上也留了很多空位為創(chuàng)新功能使用。
按鍵部分
按鍵方面,主要是采用矩陣鍵盤掃描跟按鍵查詢。矩陣鍵盤掃描法用到比較多的按鍵,使操作復(fù)雜,資源得不到充分利用。為了避免不必要的失誤,所以采用“按鍵查詢,一個(gè)功能一個(gè)按鍵”的方式,排列整齊,簡潔美觀

單片機(jī)作品實(shí)物圖:


二、元器件清單:
IC
89S52
1
IC座
40腳
3
晶體振蕩器
12MHz
1
微型按鈕
4腳
5
LED發(fā)光二極管
紅色
1
電阻
4.7K
2
電阻
1k
6
電阻
3K
6
電阻
330
7
排阻 1k 1
電解電容
10UF
1
萬能電路板
塊
1
LED七段數(shù)碼管
共陽BS
6
晶體三極管
PNP8550
6
蜂鳴器 1
三.按鍵使用
(1)。P0.7口按鍵具有切換顯示模式的功能
(2)。P0.6口按鍵具有閃爍位移位的功能
(3)。P0.5 口按鍵具有對閃爍位加一的功能
(4)。P0.4口按鍵具有計(jì)秒的功能,即開始秒表/停止秒表/清楚秒表,同時(shí)還具有停止鬧鐘的功能。
(5)第9口具有復(fù)位的功能。即一按下去后恢復(fù)到初始化狀態(tài)
(6)串口自收自發(fā)功能,當(dāng)p3.0與p3.1連接起來后,按鍵有效,但當(dāng)p3.0與p3.1斷開后,按鍵無效。
系統(tǒng)使用調(diào)試說明:
按開關(guān)key1次數(shù) | 系統(tǒng)狀態(tài) |
0 | (50)=00H,(51H)=00H,正常顯示時(shí)間 |
1 | (50)=01H,(51H)=00H,正常顯示日期 |
2 | (50)=02H,(51H)=00H,正常顯示鬧鈴 |
3 | (50)=03H,(51H)=00H,正常顯示秒表 |
4 | (50)=00H,(51H)=00H,正常顯示時(shí)間 |
按鍵2:
按開關(guān)key2次數(shù) | 系統(tǒng)狀態(tài) |
0 | (50)=00H,(51H)=00H,不閃爍 |
1 | (50)=00H,(51H)=01H,低兩位閃爍 |
2 | (50)=00H,(51H)=02H,中兩位閃爍 |
3 | (50)=00H,(51H)=03H,高兩位閃爍 |
4 | (50)=00H,(51H)=00H,不閃爍 |
數(shù)碼管顯示代碼表:
數(shù)碼管管腳號 | Dp | g | f | e | d | c | b | a | 數(shù)碼管顯示值 | 編碼數(shù)值 |
P1端口 | P1.7 | P1.6 | P1.5 | P1.4 | P1.3 | P1.2 | P1.1 | P1.0 |
端口電平 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | C0H |
1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0F9H |
1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 2 | 0A4H |
1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 3 | 0B0H |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 99H |
1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 5 | 92H |
1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 6 | 82H |
1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 7 | 0F8H |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 8 | 80H |
1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 9 | 90H |
主程序流程圖:

當(dāng)有不同按鍵,進(jìn)入不同的服務(wù)子程序,同時(shí)在查詢的時(shí)候判斷是不是整點(diǎn),有沒有到達(dá)鬧鈴設(shè)置的時(shí)間
進(jìn)入服務(wù)子程序采用的是查詢的模式。
顯示模式調(diào)整流程圖:

顯示標(biāo)志位位50h
閃爍位移位:其中設(shè)定閃爍標(biāo)志位為51H.當(dāng)它變化時(shí)標(biāo)志著不同的閃爍位

閃爍位加一子程序:對當(dāng)前閃爍的位進(jìn)行加一

file:///D:/Personal/Temp/ksohtml/wps_clip_image-8871.png其中
同理對于分,時(shí),日,月,年,都要判斷是否到達(dá)最大數(shù),是則分,時(shí),清0,日,月,年置一,
秒表子程序

鬧鈴功能子程序:

整點(diǎn)報(bào)時(shí)子程序流程圖:

TO中斷子程序:

日歷子程序




- 附程序清單:
- ;;;;;;;;;;;;;;;;;;;
- ;預(yù)定義部分;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;
- ;預(yù)定義用來顯示小時(shí)、分鐘、秒鐘的存儲單元
- secL equ 30h;秒的十位
- secH equ 31h;秒的個(gè)位
- minL equ 32h;
- minH equ 33h;
- hourL equ 34h;
- hourH equ 35h;
- dayL equ 36h
- dayH equ 37h
- monL equ 38h
- monH equ 39h
- yearL equ 3ah
- yearH equ 3bh
- als_l equ 40h;
- als_h equ 41h;
- alm_l equ 42h;
- alm_h equ 43h;
- alh_l equ 44h;
- alh_h equ 45h;
- xsbz equ 50h;
- shanshou equ 51h;
- mao_sfw equ 5ah;秒的十分位
- mao_bfw equ 5bh;秒的百分位
- mao_sw equ 5ch;秒的十位
- mao_gw equ 5dh; 秒的各位
- mao_qw equ 5eh;qianwei
- mao_bw equ 5fh;baiwei
- org 0000h;復(fù)位入口
- ljmp main
- org 000bh;定時(shí)器T0入口
- ljmp time0
- org 0003h;外部中斷0入口
- reti;
- org 0013h;外部中斷1入口
- reti
- org 001bh;定時(shí)器T1入口
- ljmp time1;
- org 0023h;串行中斷入口
- reti
- ;;;;;;;;;;;;;;;;;;;;;;
- ;主程序入口;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;
- main:
- ;放置初始值,H表示低地址,L表示高地址
- mov secH,#0h
- mov secL,#5h
- mov minH,#9h
- mov minL,#5h
- mov hourH,#2h
- mov hourL,#1h
- mov yearH,#8h
- mov yearL,#0h
- mov monH,#1h
- mov monL,#1h
- mov dayH,#0h
- mov dayL,#2h
- mov als_l,#3h;
- mov als_h,#1h;
- mov alm_l,#3h;
- mov alm_h,#0h;
- mov alh_l,#1h;
- mov alh_h,#2h;
- mov mao_sfw ,#00h;秒的十分位
- mov mao_bfw ,#00h;秒的百分位
- mov mao_sw,#00h ;秒的十位
- mov mao_gw,#00h ; 秒的各位
- mov mao_qw,#00h;
- mov mao_bw,#00h;
- mov 50h,#00h;
- mov 51h,#00h;
- clr p3.2;
- MOV SCON,#90H;串行口工作于方式2
- ;定時(shí)器T0,T1設(shè)置
- mov TMOD,#11H;設(shè)置T0與T1為16位定時(shí)器
- mov TL0,#0b0h;
- mov TH0,#3ch;T0初值為3cb0h定時(shí)50ms
- mov TL1,#0f0h;
- mov TH1,#0d8h;T1初值為fc18h定時(shí)10ms
- setb pt0;
- setb EA;總中斷允許
- setb et0;
- setb TR0;開啟T0中斷開始記時(shí)
- mov r4,#20;定時(shí)次數(shù),剛好1s
- mov 60h,#0ah;定時(shí)器1定時(shí)次數(shù)10次
- start:
- lcall display;
- jnb P0.7,k0;
- jnb p0.6,k1;
- jnb p0.5,k3;
- jnb p0.4,k4;
- lcall naoling1;
- lcall zhengdi
- jmp start;
- k0: lcall chxianshi;
- k1: lcall k2
- k4: ljmp jimiao;
- ;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;閃爍位加一
- ;;;;;;;;;;;;;;;;;;;;;;;;;
- k3: lcall dl30ms;
- jb p0.5,outout;
- set12: jnb p0.5,set12;
- lcall chuan;
- mov a,50h;
- cjne a,#01h,sjiantz;
- mov a,51h;
- cjne a,#01h,zhwei;
- mov r1,#dayH;
- lcall add1;
- mov a,r3;
- cjne a,#32h,ftiao;分若小于則轉(zhuǎn)退出
- mov dayH,#01h;否則清0
- mov dayL,#00h;
- ftiao: ljmp outout;
- zhwei: cjne a,#02h,gwei;
- mov r1,#monH;
- lcall add1;
- mov a,r3;
- cjne a,#13h,outout;
- mov monH,#01h;
- mov monL,#00h;
- ljmp outout;
- gwei: cjne a,#03h,outout;
- mov r1,#yearH;
- lcall add1;
- mov a,r3;
- cjne a,#99h,outout;
- mov yearH,#00h;
- mov yearL,#00h;
- ljmp outout;
- outout: ljmp start; 跳出
- sjiantz:cjne a,#00h,naozhtz;轉(zhuǎn)鬧鐘調(diào)整
- mov a,51h;
- cjne a,#01h,zhwei2;
- mov r1,#secH;
- lcall add1;
- mov a,r3;
- cjne a,#60h,ftiao2;分若小于則轉(zhuǎn)退出
- mov secH,#00h;否則清0
- mov secL,#00h;
- ftiao2: ljmp outout;
- zhwei2: cjne a,#02h,gwei2;
- mov r1,#minH;
- lcall add1;
- mov a,r3;
- cjne a,#60h,outout;
- mov minH,#00h;
- mov minL,#00h;
- ljmp outout;
- gwei2: cjne a,#03h,outout;
- mov r1,#hourH;
- lcall add1;
- mov a,r3;
- cjne a,#24h,outout;
- mov hourH,#00h;
- mov hourL,#00h;
- ljmp outout;
- naozhtz:mov a,51h;
- cjne a,#01h,zhwei3;
- mov r1,#als_h;
- lcall add1;
- mov a,r3;
- cjne a,#60h,ftiao3;分若小于則轉(zhuǎn)退出
- mov als_h,#00h;否則清0
- mov als_l,#00h;
- ftiao3: ljmp outout;
- zhwei3: cjne a,#02h,gwei3;
- mov r1,#alm_h;
- lcall add1;
- mov a,r3;
- cjne a,#60h,outout;
- mov alm_h,#00h;
- mov alm_l,#00h;
- ljmp outout;
- gwei3: cjne a,#03h,outout;
- mov r1,#alh_h;
- lcall add1;
- mov a,r3;
- cjne a,#24h,outout;
- mov alh_h,#00h;
- mov alh_l,#00h;
- ljmp outout;
- ;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;naoling
- ;;;;;;;;;;;;;;;;;;;;;;;;;
- naoling1:push acc;
- setb p0.1
- mov a,31h;
- cjne a,41h,out6;
- mov a,30h;
- cjne a,40h,out6;
- mov a,33h;
- cjne a,43h,out6;
- mov a,32h;
- cjne a,42h,out6;
- mov a,35h;
- cjne a,45h,out6;
- mov a,34h;
- cjne a,44h,out6;
- nao: clr P0.1
- lcall display
- jnb P0.4,stopnao
- sjmp nao
- stopnao: lcall dl30ms
- mov P0,#0ffH
- out6: pop acc;
- lcall display;
- ret;
- ;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;整點(diǎn)報(bào)時(shí);;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;
- zhengdi: push acc;
- mov a,31h;
- cjne a,#00h,out7;
- mov a,30h;
- cjne a,#00h,out7;
- mov a,33h;
- cjne a,#00h,out7;
- mov a,32h;
- cjne a,#00h,out7;
- mov a,#0ah;
- clr p0.1;
- clr p0.3
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- lcall display;
- setb p0.1;
- setb p0.3
- out7: pop acc;
- lcall display;
- ret;
- ;**************************************************
- ;函數(shù)名:
- ;功能: 串口發(fā)送數(shù)據(jù)函數(shù)
- ;傳入?yún)?shù): 無
- ;傳出參數(shù): A
- ;**************************************************
- chuan: MOV A,p0 ;讀取P1口數(shù)據(jù)
- MOV SBUF,A
- JNB TI,$ ;等待發(fā)送完畢
- CLR TI
- lcall dl30ms;
- wait: jnb ri,out9;
- MOV A,SBUF
- CLR RI
- sjmp out10;
- out9: lcall display;
- jmp chuan;
- out10: ret;
-
- ;**************************************************
- ;函數(shù)名:chxianshi
- ;功能: 顯示調(diào)整函數(shù)
- ;傳入?yún)?shù): 無
- ;傳出參數(shù):
- ;**************************************************
- chxianshi: lcall dl30ms;
- jb P0.7,set2;
- set1: jnb p0.7,set1;
- lcall chuan;
- mov a,50h;
- cjne a,#00h,nianfen
- mov a,#01h;
- mov 50h,a;;
- sjmp set2;
- nianfen: cjne a,#01h,naoling;
- mov a,#02h;
- mov 50h,a;
- sjmp set2;
- naoling: cjne a,#02h,maobiao;
- mov a,#03h;
- mov 50h,a;
- sjmp set2;
- maobiao: mov a,#00h;
- mov 50h,a;
- set2: lcall display;
- out: ret;
-
-
- ;**************************************************
- ;函數(shù)名:k2
- ;功能: 調(diào)整位移位函數(shù)
- ;傳入?yún)?shù): 無
- ;傳出參數(shù):
- ;**************************************************
- k2: lcall dl30ms;
- jb P0.6,set11;判斷是否有鍵按下
- set10: jnb p0.6,set10;
- lcall chuan;
- mov a,51h;
- cjne a,#00h,zliang
- mov a,#01h;
- mov 51h,a;;
- sjmp set11;
- zliang: cjne a,#01h,gliang;
- mov a,#02h;
- mov 51h,a;
- sjmp set11;
- gliang: cjne a,#02h,bliang;
- mov a,#03h;
- mov 51h,a;
- sjmp set11;
- bliang: cjne a,#03h,set11
- mov a,#00h;
- mov 51h,a;
- set11: lcall display;
- ret;
- ;**************************************************
- ;函數(shù)名: jimiao
- ;功能: 計(jì)秒程序
- ;傳入?yún)?shù): 無
- ;傳出參數(shù): 無
- ;**************************************************
- jimiao: push PSW;
- push acc;
- lcall dl30ms;
- jb p0.4,out5;
- jimao1:jnb p0.4,jimao1;第一次開中斷計(jì)秒
- mov a,50h;
- cjne a,#03h,out5;
- setb et1;
- setb tr1;
- jimao2:call display;第二次停止
- jb p0.4,jimao2;
- lcall display;
- jb p0.4,out5;
- jimao3:jnb p0.4,jimao3;
- clr tr1;
- clr et1;
- jimao4:call display;第三次清0
- jb p0.4,jimao4;
- lcall display;
- jb p0.4,out5;
- jimao5:jnb p0.4,jimao5;
- mov mao_sfw ,#00h;秒的十分位
- mov mao_bfw ,#00h;秒的百分位
- mov mao_sw,#00h ;秒的十位
- mov mao_gw,#00h ; 秒的各位
- mov mao_qw,#00h;
- mov mao_bw,#00h;
- out5: pop acc;
- pop PSW;
- ljmp start;
- ;;***********************************************
- ;函數(shù)名 time1
- ;功能: t1中斷函數(shù)
- ;傳入?yún)?shù): 無
- ;************************************************
- time1:
- push PSW
- push acc
- mov TL1,#0f0h;
- mov TH1,#0d8h;T1初值為fc18h定時(shí)1ms
- mov r1,#mao_bfw;指向秒計(jì)時(shí)單元
- lcall add1;調(diào)用加1程序
- mov a,r2;將經(jīng)過處理的數(shù)據(jù)放入a中
- cjne a,#99h,outT01;當(dāng)秒到未到達(dá)60時(shí)跳出中斷
- mov 5ah,#00h
- mov 5bh,#00h;將秒清零
- mov r1,#mao_gw;指向分計(jì)時(shí)單元
- lcall add1;調(diào)用加1程序
- mov a,r2;將經(jīng)過處理的數(shù)據(jù)放入a中
- cjne a,#60h,outT01;當(dāng)分鐘未到達(dá)60時(shí)跳出中斷
- mov 5ch,#00h;
- mov 5dh,#00h;
- mov r1,#mao_bw;指向小時(shí)計(jì)時(shí)單元
- lcall add1;調(diào)用加1程序
- mov a,r2;將經(jīng)過處理的數(shù)據(jù)放入a中
- cjne a,#60h,outT0;當(dāng)小時(shí)未到達(dá)60時(shí)跳出中斷
- mov 5eh,#00h;
- mov 5fh,#00h;
- outt01:
- pop acc
- pop psw;恢復(fù)現(xiàn)場
- reti ;中斷返回
- ;**************************************************
- ;函數(shù)名: time0
- ;功能: t0中斷處理程序函數(shù)
- ;傳入?yún)?shù): 無
- ;**************************************************
- time0:
- push PSW
- push acc
- push b ;保護(hù)現(xiàn)場
- push 02h
- push 01h
- clr ET0;關(guān)T0中斷允許
- clr TR0;關(guān)T0定時(shí)中斷
- mov th0,#3ch;
- mov a,#0b0h
- add a,TL0
- mov TL0,a;給定時(shí)器重新裝值
- setb TR0;允許計(jì)時(shí)
- djnz r4,outT0;定時(shí)沒到1s就退出中斷
- mov r4,#20;給r0重新賦值
- mov r1,#secH;指向秒計(jì)時(shí)單元
- lcall add1;調(diào)用加1程序
- mov a,r2;將經(jīng)過處理的數(shù)據(jù)放入a中
- cjne a,#60h,outT0;當(dāng)秒到未到達(dá)60時(shí)跳出中斷
- addmin: ;否則分鐘加1
- mov secL,#0
- mov secH,#0;將秒清零
- mov r1,#minH;指向分計(jì)時(shí)單元
- lcall add1;調(diào)用加1程序
- mov a,r2;將經(jīng)過處理的數(shù)據(jù)放入a中
- cjne a,#60h,outT0;當(dāng)分鐘未到達(dá)60時(shí)跳出中斷
- addhour: ;否則小時(shí)加1
- mov minL,#0
- mov minH,#0;將分清零
- mov r1,#hourH;指向小時(shí)計(jì)時(shí)單元
- lcall add1;調(diào)用加1程序
- mov a,r2;將經(jīng)過處理的數(shù)據(jù)放入a中
- cjne a,#24h,outT0;當(dāng)小時(shí)未到達(dá)60時(shí)跳出中斷
- lcall rili ;調(diào)用日歷子程序
- outT0:
- pop 01h
- pop 02h
- pop b
- pop acc
- pop psw;恢復(fù)現(xiàn)場
- setb ET0;開放中斷
- reti ;中斷返回
- ;**************************************************
- ;函數(shù)名: rili
- ;功能: 日歷處理程序函數(shù)
- ;傳入?yún)?shù): 無
- ;傳出參數(shù):
- ;**************************************************
- rili:
- addday: mov hourL,#0
- mov hourH,#0;將小時(shí)清零
- mov r1,#dayH;指向天計(jì)時(shí)單元
- lcall add1;調(diào)用加1程序
- mov a,r2;將經(jīng)過處理的數(shù)據(jù)放入a中
- day31:
- cjne a,#32h,day30;看是不是31號
- ajmp addmon;是的話,加月
- day30:
- mov r5,a
- cjne a,#31h,day29;看是不是30號;是的話,處理
- mov a,#0h
- mov a,monL
- swap a
- orl a,monh;將月份放入a中
- cjne a,#04h,outri;判斷是不是4,6,9,11中的某一月
- cjne a,#06h,outri
- cjne a,#09h,outri
- cjne a,#11h,outri;不是的話跳出
- ajmp addmon;是的話,加月
- day29:
- mov a,r5
- cjne a,#30h,day28;看是不是29號
- mov a,#0h
- mov a,monL
- swap a
- orl a,monH
- cjne a,#02h,outri;是的話,看月份是不是2月
- ajmp addmon
- day28:
- mov a,r5
- cjne a,#29h,outri;看是不是28號,不是的話跳出
- mov a,#0h
- mov a,monL
- swap a
- orl a,monH
- cjne a,#02h,outri;看月份是不是2月;是2月,則判斷是不是潤年
- mov a,#0h
- mov a,yearL
- swap a
- orl a,yearH
- da a
- mov b,#04h
- div ab
- mov r5,b
- cjne r5,#0h,outri
- ajmp addmon
- addmon: ;月加1
- mov dayL,#0
- mov dayH,#0;將天清零
- mov r1,#monH;指向月計(jì)時(shí)單元
- lcall add1;調(diào)用加1程序
- mov a,r2;將經(jīng)過處理的數(shù)據(jù)放入a中
- cjne a,#12h,outri;當(dāng)月未到達(dá)12時(shí)
- addyear: ;年加1
- mov monL,#0
- mov monH,#0;將月清零
- mov r1,#yearH;指向年計(jì)時(shí)單元
- lcall add1;調(diào)用加1程序
- mov a,r2;將經(jīng)過處理的數(shù)據(jù)放入a中
- outri:
- ret
- ;**************************************************
- ;函數(shù)名: add1
- ;功能: 加一函數(shù)
- ;傳入?yún)?shù): r1存的是地址指針
- ;r2存的是返回的處理數(shù)據(jù)
- ;**************************************************
- add1:
- mov a,#0;對a進(jìn)行清零
- dec r1;指向高四位數(shù)據(jù)地址
- mov a,@r1;將高四位移入a
- inc r1;指向低四位
- swap a;a中高四位與低四位互換
- orl a,@r1;將低四位顯示數(shù)據(jù)放入a中
- add a,#01h;
- da a;對a中數(shù)據(jù)進(jìn)行加1,并作十進(jìn)制調(diào)整
- mov r2,a;將處理后的數(shù)據(jù)移入r2中,注意r2中存的是十進(jìn)制對應(yīng)的bcd碼
- mov r3,a;下面是將a中然數(shù)據(jù)恢復(fù)為高位與低位
- anl a,#0f0h;取高四位
- swap a
- dec r1;
- mov @r1,a;將高四位移入低位地址中
- mov a,r3;將暫存數(shù)據(jù)移回
- anl a,#0fh;取其低四位
- inc r1;指針指向高四位地址
- mov @r1,a;將低四位移到高位地址中
- ret ;子程序返回
- ;**************************************************
- ;函數(shù)名: display
- ;功能: 顯示處理程序函數(shù)
- ;傳入?yún)?shù): 無
- ;傳出參數(shù):
- ;**************************************************
- display:mov a,50h;
- cjne a,#00H,dat;00h是時(shí)間顯示不等則轉(zhuǎn)到年份顯示
- timdis: mov r0,#secL;
- sjmp aa
- dat: cjne a,#01h,ala;若為01h則顯示年份,否則顯示鬧鐘
- mov r0,#dayL;
- sjmp aa;
- ala: cjne a,#02h,mbiao
- mov r0,#als_l;
- sjmp aa;
- mbiao: mov r0,#mao_sfw;
- nop;
- aa: mov p2,#0ffh;
- mov a,@r0
- mov dptr,#TAB
- movc a,@a+dptr;
- mov p1,a;
- mov a,51h;
- cjne a,#01h,aa01;
- mov a,r4;
- rrc a;
- jnc aa02;
- aa01: mov p2,#0feh;
- aa02: lcall dl5ms;
- lcall dl5ms;
- mov p2,#0FFh;
- inc r0;
- mov a,@r0
- mov dptr,#TAB
- movc a,@a+dptr;
- mov p1,a;
- mov a,51h;
- cjne a,#01h,bb01;
- mov a,r4;
- rrc a;
- jnc bb02;
- bb01: mov p2,#0fdh;
- bb02: lcall dl5ms;
- lcall dl5ms;
- mov p2,#0ffh;
- inc r0;
- mov a,@r0
- mov dptr,#TAB
- movc a,@a+dptr;
- mov p1,a;
- mov a,51h;
- cjne a,#02h,cc01;
- mov a,r4
- rrc a;
- jnc cc02
- cc01: mov p2,#0fbh;
- cc02: lcall dl5ms;
- lcall dl5ms;
- mov p2,#0ffh;
- inc r0;
- mov a,@r0
- mov dptr,#TAB
- movc a,@a+dptr;
- mov p1,a;
- mov a,51h;
- cjne a,#02h,dd01;
- mov a,r4
- rrc a;
- jnc dd02
- dd01: mov p2,#0f7h;
- dd02: lcall dl5ms;
- lcall dl5ms;
- mov p2,#0ffh;
- inc r0;
- mov a,@r0
- mov dptr,#TAB
- movc a,@a+dptr;
- mov p1,a;
- mov a,51h;
- cjne a,#03h,ee01;
- mov a,r4
- rrc a;
- jnc ee02
- ee01: mov p2,#0efh;
- ee02: lcall dl5ms;
- lcall dl5ms;
- mov p2,#0ffh;
- inc r0;
- mov a,@r0
- mov dptr,#TAB
- movc a,@a+dptr;
- mov p1,a;
- mov a,51h;
- cjne a,#03h,ff01;
- mov a,r4
- rrc a;
- jnc ff02
- ff01: mov p2,#0dfh;
- ff02: lcall dl5ms;
- lcall dl5ms;
- ret;
-
- ;;;;;;;;;;;;
- ;延時(shí)程序;;;
- ;1ms延時(shí);;;;
- ;;;;;;;;;;;;
- delay1ms:
- mov R6,#14H
- dl1:mov R7,#19H
- dl2:djnz R7,dl2
- djnz R6,dl1
- ret
- dl5ms: mov 55h,#03h;
- d2: mov 56h,#0fh;
- d1: djnz 56h,d1;
- djnz 55h,d2;
- ret;
- dl30ms: lcall dl5ms;
- lcall dl5ms;
- lcall dl5ms;
- lcall dl5ms;
- lcall dl5ms;
- lcall dl5ms;
- ret;
- dl20ms: lcall dl5ms;
- lcall dl5ms;
- lcall dl5ms;
- lcall dl5ms;
- ret;
-
- TAB:DB 0C0H,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h;
- end<!--EndFragment-->
復(fù)制代碼鬧鐘:
實(shí)現(xiàn)鬧鐘功能主要有兩個(gè)步驟,首先是能在按鍵中把鬧鐘數(shù)值寫進(jìn)寄存器,實(shí)現(xiàn)存儲功能。其次是根據(jù)在查詢按鍵服務(wù)程序中作判別,檢查當(dāng)前時(shí)間是否與鬧鈴時(shí)間相等,如果相等,則使在相應(yīng)時(shí)間時(shí)對蜂鳴器提供驅(qū)動電流即可。就實(shí)現(xiàn)了鬧鐘設(shè)置的功能。
整點(diǎn)報(bào)時(shí):
整點(diǎn)報(bào)時(shí)是在查詢按鍵程序中調(diào)用到zhengdi子程序,檢查當(dāng)前的時(shí)間是否整點(diǎn),如果是,則點(diǎn)亮整點(diǎn)指示燈,并響蜂鳴器,停留約2秒鐘,自行熄滅與關(guān)閉。
按鍵消抖:
按鍵消抖可以采用硬件消抖跟軟件消抖。我們初定了兩種方案:
1是利用數(shù)字電路的反相器或斯密特觸發(fā)器進(jìn)行整形,如圖:

2是采用軟件消抖技術(shù)
應(yīng)該說用硬件消抖可以達(dá)到更好的效果,不過由于提供的材料跟自身手上的材料沒有以上元件,故采用軟件消抖。軟件的消抖主要是調(diào)整出一個(gè)切到好處的延遲檢測時(shí)間,一般為5-30ms。經(jīng)過我們的多次調(diào)試,我們最終得到不錯的去抖動效果。在程序中為DMS子程序?qū)崿F(xiàn)。軟件延時(shí)是用的最多的消抖方法,但是耗時(shí)間。在CPU耗不起時(shí)間的情況下,硬件消抖會更好
在本程序中設(shè)置了30ms的按鍵消抖。
感想體會:
本實(shí)驗(yàn)花了我們四天的時(shí)間,由于該大作業(yè)是用匯編語言寫的,很多語句掌握都不是很牢固,但是經(jīng)過這么長時(shí)間的實(shí)驗(yàn),我基本掌握了部分匯編語言的用法,特別是實(shí)驗(yàn)中經(jīng)常用到的按鍵查詢,跳轉(zhuǎn)語句,以及匯編的方法。
剛開始的時(shí)候,我什麼都不懂,根本不知怎樣入門,后來查找了一些系統(tǒng)資料,漸漸有了些了解,才開始寫自己的程序。雖然如此,中間還是遇到過不少困難,不如些按鍵查詢的時(shí)候,仿真不出來,不知道哪里出錯了,也不知道是不是程序有問題,后來在小組成員的幫助下,終于找到問題所在,通過不斷的琢磨,后來不僅實(shí)現(xiàn)了老師的要求的基本功能,更加了秒表,鬧鈴還有整點(diǎn)報(bào)時(shí)。本來還想加上紀(jì)念日和音樂鬧鈴,當(dāng)一方面時(shí)間有限,另一方面嘗試后失敗了就暫時(shí)擱下。
調(diào)試的時(shí)候,剛上去的時(shí)候,板子工作很不穩(wěn)定,雖然有時(shí)候能夠顯示到正確的東西,當(dāng)大多數(shù)時(shí)間都是顯示的雜亂無章,鑒于有時(shí)候能夠正確顯示,我們是板子焊的不好,于是重新焊過,第二個(gè)版子剛上電的時(shí)候,還是不能很正確的工作,后來,一步一步的調(diào)試,先用簡單的程序檢查板子,發(fā)現(xiàn)板子是沒有問題的,于是就確定是程序的問題,我把程序分為好幾塊,一塊一塊的調(diào)試,一段好了之后,在加上一段。最后發(fā)現(xiàn)是在一個(gè)子程序里邊用了一個(gè)錯誤的ljmp。 改正了之后就完全正確了。
經(jīng)過這次試驗(yàn),確實(shí)學(xué)到我好多好多的東西。