|
這是一個非常全的設(shè)計包含程序,制作過程,Proteus仿真工程文件,感想體會,還有完整的實驗報告的論文.
以上內(nèi)容全部打包51黑下載:
單片機課程設(shè)計(電子鐘).rar
(1.55 MB, 下載次數(shù): 104)
2016-1-15 07:13 上傳
點擊文件名下載附件
“單片機及接口技術(shù)”綜合實驗設(shè)計要求
一、題目:電子實時時鐘/萬年日歷系統(tǒng) 二、功能要求: 1. 基本要求: (1) 顯示準(zhǔn)確的北京時間(時、分、秒),可用24小時制式; (2) 隨時可以調(diào)校時間。 (3) 增加公歷日期顯示功能(年、月、日),年號只顯示最后兩位; (4) 隨時可以調(diào)校年、月、日; (5) 允許通過轉(zhuǎn)換功能鍵轉(zhuǎn)換顯示時間或日期。 (6) 所有按鍵需要通過串口自發(fā)自收來調(diào)校各種功能。
三、方案考慮: 1.硬件方案: ⑴ 顯示器采用6位LED數(shù)碼管(可以是共陰或共陽),可分別顯示時間或日期; ⑵ 顯示器的驅(qū)動采用動態(tài)掃描電路形式,以達到簡化電路的目的。但要注意所需的驅(qū)動電流比靜態(tài)驅(qū)動時要大,因此要增加驅(qū)動電路。可采用74LS244或者晶體管; ⑶ 鍵盤可采用4×3(12)鍵,也可以采用“一鍵多用方案”,以減少按鍵數(shù)目。 ⑷ 整體上要考慮:結(jié)構(gòu)簡單、布局美觀、操作方便、成本低廉。 2. 參考電路圖
請注意,上圖用的是“共陽”LED數(shù)碼管,但實驗室提供的LED數(shù)碼管有“共陽”和“共陰”兩種,如果你用到的是“共陰”的,那就要作相應(yīng)的驅(qū)動電路修改,不能照搬。
下面是試驗報告的內(nèi)容:
電子與信息學(xué)院
《單片機原理及應(yīng)用》綜合實驗報告 電子實時時鐘/萬年日歷系統(tǒng)
專 業(yè) 信 息 工 程 班 級 06 (3) 學(xué)生姓名 黃銳 張鑫 學(xué) 號 200630212136200630215366
一、系統(tǒng)概述: 1.基本要求:
(1) 顯示準(zhǔn)確的北京時間(時、分、秒),可用24小時制式;
(2) 隨時可以調(diào)校時間。
(3) 增加公歷日期顯示功能(年、月、日),年號只顯示最后兩位;
(4) 隨時可以調(diào)校年、月、日;
(5) 允許通過轉(zhuǎn)換功能鍵轉(zhuǎn)換顯示時間或日期。
(6) 所有按鍵需要通過串口自發(fā)自收來調(diào)校各種功能。
2.發(fā)揮部分
(1)增加秒表功能
(2)增加鬧鈴功能
(3)增加整點報時功能。
實驗功能: 本系統(tǒng)是基于單片機AT89S52制作的數(shù)字電子鐘。根據(jù)實驗要求,在完成實驗所要求的基本功能外,擴展了幾個功能。 硬件系統(tǒng)設(shè)計方面: 采用六位LED數(shù)碼管,用切換的方式顯示日期或時間和設(shè)置的鬧鐘時間; 可調(diào)整日期或時間以及鬧鐘時間; 具有設(shè)置鬧鐘的功能; 軟件系統(tǒng)設(shè)計方面: 程序采用匯編語言編寫,使自己更加理解硬件語言以及其工作原理。 “時鐘”基準(zhǔn)時間由單片機內(nèi)部的定時中斷提供用一個計數(shù)器對定時中斷的次數(shù)進行計數(shù),可實現(xiàn)“秒”定時,同理可以進行“分”﹑“時”定時,以及“日”﹑“月”﹑“年”定時,并充分考慮閏年等情況下的日期的差異 采用按鍵查詢功能復(fù)用,簡化了程序的設(shè)計 采用動態(tài)掃描法顯示6位數(shù)碼管
方案考慮: 1、硬件方案 (1)、采用6位LED數(shù)碼管顯示日期或者時間。 (2)、顯示器的驅(qū)動可采用“靜態(tài)顯示驅(qū)動”(如7段譯碼/鎖存/驅(qū)動芯片CD4511);也可采用“動態(tài)掃描驅(qū)動”,但后者比前者所需驅(qū)動電流要大。 (3)顯示部分也可采用液晶,但液晶成本較高。 (4)、鍵盤的按鍵數(shù)目較多時則采用行列式矩陣結(jié)構(gòu)為好。“一鍵多用”的構(gòu)思和設(shè)計能大為減少按鍵的數(shù)目。 (5)、整體設(shè)計上應(yīng)考慮其結(jié)構(gòu)簡單﹑操作簡便﹑布局美觀﹑成本低廉。 2、軟件方案 (1)、“時鐘”基準(zhǔn)時間由單片機內(nèi)部的定時中斷提供,定時時間應(yīng)是“秒”的整除數(shù),且長短適宜。最長不能超過16位定時器的最長定時時間;最短不
能少于中斷服務(wù)程序的執(zhí)行時間。通常來說基準(zhǔn)時間越短,越有利于提高時鐘的運行精確度。 (2)、用一個計數(shù)器對定時中斷的次數(shù)進行計數(shù),可實現(xiàn)“秒”定時,同理可以進行“分”﹑“時”定時,以及“日”﹑“月”﹑“年”定時。 (3)、LED 數(shù)碼管顯示器采用“動態(tài)掃描驅(qū)動”時要注意的是:驅(qū)動信號的維持時間必須大于“起輝時間”(電流大起輝時間短),而驅(qū)動信號的間歇時間必須小于“余輝時間”(電流大余輝時間長),但驅(qū)動電流大小受硬件電路能力和LED數(shù)碼管極限功耗的制約。 (4)、動態(tài)掃描顯示方式在更新顯示內(nèi)容時,因LED數(shù)碼管余輝的存在可能會造成顯示字符的模糊,新內(nèi)容寫入顯示器之前須將所有的LED數(shù)碼管熄滅。 (5)、關(guān)于自動識別“月大﹑月小”和“平年﹑潤年”問題的考慮
方案比較:
顯示部分:
我們采用了數(shù)碼管顯示,鑒于數(shù)碼管也能實現(xiàn)基本的功能,而且液晶成本又太昂貴,同時我們放棄了用譯碼芯片,一方面進一步降低成本,另一方面少了部分電路,減少錯誤產(chǎn)生。
焊接部分:
印制電路板的特點是布線緊湊、優(yōu)點是美觀,跳線少,線路穩(wěn)定,主要的工作量在于前期原理圖的繪制跟PCB板的布線,缺點是腐蝕容易不均勻而斷線;而手工焊萬用板優(yōu)點是可變性高,自由度高,主要工作量是原理圖的布線與跳線的構(gòu)思跟焊接,缺點是電路板焊接麻煩。
我們選擇手工焊萬用板的原因:
1 原材料提供的只是萬用板,從按照題目要求的方面考慮 2 萬用板便于功能的擴展,板上也留了很多空位為創(chuàng)新功能使用。 按鍵部分
按鍵方面,主要是采用矩陣鍵盤掃描跟按鍵查詢。矩陣鍵盤掃描法用到比較多的按鍵,使操作復(fù)雜,資源得不到充分利用。為了避免不必要的失誤,所以采用“按鍵查詢,一個功能一個按鍵”的方式,排列整齊,簡潔美觀
單片機作品實物圖:
二、元器件清單: 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口按鍵具有計秒的功能,即開始秒表/停止秒表/清楚秒表,同時還具有停止鬧鐘的功能。
(5)第9口具有復(fù)位的功能。即一按下去后恢復(fù)到初始化狀態(tài)
(6)串口自收自發(fā)功能,當(dāng)p3.0與p3.1連接起來后,按鍵有效,但當(dāng)p3.0與p3.1斷開后,按鍵無效。
系統(tǒng)使用調(diào)試說明:
| | | (50)=00H,(51H)=00H,正常顯示時間 | | (50)=01H,(51H)=00H,正常顯示日期 | | (50)=02H,(51H)=00H,正常顯示鬧鈴 | | (50)=03H,(51H)=00H,正常顯示秒表 | | (50)=00H,(51H)=00H,正常顯示時間 |
按鍵2:
數(shù)碼管顯示代碼表:
主程序流程圖:
日歷處理程序流程圖:
附程序清單:
;;;;;;;;;;;;;;;;;;; ;預(yù)定義部分;;;;;;;; ;;;;;;;;;;;;;;;;;;;
;預(yù)定義用來顯示小時、分鐘、秒鐘的存儲單元 secL equ 30h;秒的十位 secH equ 31h;秒的個位 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;定時器T0入口 ljmp time0 org 0003h;外部中斷0入口 reti; org 0013h;外部中斷1入口 reti org 001bh;定時器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 ;定時器T0,T1設(shè)置 mov TMOD,#11H;設(shè)置T0與T1為16位定時器 mov TL0,#0b0h; mov TH0,#3ch;T0初值為3cb0h定時50ms mov TL1,#0f0h; mov TH1,#0d8h;T1初值為fc18h定時10ms setb pt0; setb EA;總中斷允許 setb et0; setb TR0;開啟T0中斷開始記時 mov r4,#20;定時次數(shù),剛好1s mov 60h,#0ah;定時器1定時次數(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;
;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;整點報時;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;; 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 ;功能: 計秒程序 ;傳入?yún)?shù):無 ;傳出參數(shù):無 ;**************************************************
jimiao: push PSW; push acc; lcall dl30ms; jb p0.4,out5; jimao1:jnb p0.4,jimao1;第一次開中斷計秒 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定時1ms mov r1,#mao_bfw;指向秒計時單元 lcall add1;調(diào)用加1程序 mov a,r2;將經(jīng)過處理的數(shù)據(jù)放入a中 cjne a,#99h,outT01;當(dāng)秒到未到達60時跳出中斷 mov 5ah,#00h mov 5bh,#00h;將秒清零 mov r1,#mao_gw;指向分計時單元 lcall add1;調(diào)用加1程序 mov a,r2;將經(jīng)過處理的數(shù)據(jù)放入a中 cjne a,#60h,outT01;當(dāng)分鐘未到達60時跳出中斷 mov 5ch,#00h; mov 5dh,#00h; mov r1,#mao_bw;指向小時計時單元 lcall add1;調(diào)用加1程序 mov a,r2;將經(jīng)過處理的數(shù)據(jù)放入a中 cjne a,#60h,outT0;當(dāng)小時未到達60時跳出中斷 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 ;保護現(xiàn)場 push 02h push 01h clr ET0;關(guān)T0中斷允許 clr TR0;關(guān)T0定時中斷 mov th0,#3ch; mov a,#0b0h add a,TL0 mov TL0,a;給定時器重新裝值 setb TR0;允許計時 djnz r4,outT0;定時沒到1s就退出中斷 mov r4,#20;給r0重新賦值 mov r1,#secH;指向秒計時單元 lcall add1;調(diào)用加1程序 mov a,r2;將經(jīng)過處理的數(shù)據(jù)放入a中 cjne a,#60h,outT0;當(dāng)秒到未到達60時跳出中斷
addmin:;否則分鐘加1 mov secL,#0 mov secH,#0;將秒清零 mov r1,#minH;指向分計時單元 lcall add1;調(diào)用加1程序 mov a,r2;將經(jīng)過處理的數(shù)據(jù)放入a中 cjne a,#60h,outT0;當(dāng)分鐘未到達60時跳出中斷
addhour: ;否則小時加1 mov minL,#0 mov minH,#0;將分清零 mov r1,#hourH;指向小時計時單元 lcall add1;調(diào)用加1程序 mov a,r2;將經(jīng)過處理的數(shù)據(jù)放入a中 cjne a,#24h,outT0;當(dāng)小時未到達60時跳出中斷
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;將小時清零 mov r1,#dayH;指向天計時單元 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;指向月計時單元 lcall add1;調(diào)用加1程序 mov a,r2;將經(jīng)過處理的數(shù)據(jù)放入a中 cjne a,#12h,outri;當(dāng)月未到達12時
addyear:;年加1 mov monL,#0 mov monH,#0;將月清零 mov r1,#yearH;指向年計時單元 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進行清零
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ù)進行加1,并作十進制調(diào)整 mov r2,a;將處理后的數(shù)據(jù)移入r2中,注意r2中存的是十進制對應(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是時間顯示不等則轉(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;
;;;;;;;;;;;; ;延時程序;;; ;1ms延時;;;; ;;;;;;;;;;;; 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 鬧鐘:
實現(xiàn)鬧鐘功能主要有兩個步驟,首先是能在按鍵中把鬧鐘數(shù)值寫進寄存器,實現(xiàn)存儲功能。其次是根據(jù)在查詢按鍵服務(wù)程序中作判別,檢查當(dāng)前時間是否與鬧鈴時間相等,如果相等,則使在相應(yīng)時間時對蜂鳴器提供驅(qū)動電流即可。就實現(xiàn)了鬧鐘設(shè)置的功能。 整點報時:
整點報時是在查詢按鍵程序中調(diào)用到zhengdi子程序,檢查當(dāng)前的時間是否整點,如果是,則點亮整點指示燈,并響蜂鳴器,停留約2秒鐘,自行熄滅與關(guān)閉。
按鍵消抖:
按鍵消抖可以采用硬件消抖跟軟件消抖。我們初定了兩種方案: 1是利用數(shù)字電路的反相器或斯密特觸發(fā)器進行整形,如圖: 2是采用軟件消抖技術(shù) 應(yīng)該說用硬件消抖可以達到更好的效果,不過由于提供的材料跟自身手上的材料沒有以上元件,故采用軟件消抖。軟件的消抖主要是調(diào)整出一個切到好處的延遲檢測時間,一般為5-30ms。經(jīng)過我們的多次調(diào)試,我們最終得到不錯的去抖動效果。在程序中為DMS子程序?qū)崿F(xiàn)。軟件延時是用的最多的消抖方法,但是耗時間。在CPU耗不起時間的情況下,硬件消抖會更好 在本程序中設(shè)置了30ms的按鍵消抖。
感想體會: 本實驗花了我們四天的時間,由于該大作業(yè)是用匯編語言寫的,很多語句掌握都不是很牢固,但是經(jīng)過這么長時間的實驗,我基本掌握了部分匯編語言的用法,特別是實驗中經(jīng)常用到的按鍵查詢,跳轉(zhuǎn)語句,以及匯編的方法。 剛開始的時候,我什麼都不懂,根本不知怎樣入門,后來查找了一些系統(tǒng)資料,漸漸有了些了解,才開始寫自己的程序。雖然如此,中間還是遇到過不少困難,不如些按鍵查詢的時候,仿真不出來,不知道哪里出錯了,也不知道是不是程序有問題,后來在小組成員的幫助下,終于找到問題所在,通過不斷的琢磨,后來不僅實現(xiàn)了老師的要求的基本功能,更加了秒表,鬧鈴還有整點報時。本來還想加上紀(jì)念日和音樂鬧鈴,當(dāng)一方面時間有限,另一方面嘗試后失敗了就暫時擱下。 調(diào)試的時候,剛上去的時候,板子工作很不穩(wěn)定,雖然有時候能夠顯示到正確的東西,當(dāng)大多數(shù)時間都是顯示的雜亂無章,鑒于有時候能夠正確顯示,我們是板子焊的不好,于是重新焊過,第二個版子剛上電的時候,還是不能很正確的工作,后來,一步一步的調(diào)試,先用簡單的程序檢查板子,發(fā)現(xiàn)板子是沒有問題的,于是就確定是程序的問題,我把程序分為好幾塊,一塊一塊的調(diào)試,一段好了之后,在加上一段。最后發(fā)現(xiàn)是在一個子程序里邊用了一個錯誤的ljmp。 改正了之后就完全正確了。 經(jīng)過這次試驗,確實學(xué)到我好多好多的東西。 |
評分
-
查看全部評分
|