找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 16738|回復(fù): 13
收起左側(cè)

單片機(jī)電子實(shí)時(shí)時(shí)鐘 萬(wàn)年歷系統(tǒng) 綜合實(shí)驗(yàn)報(bào)告下載

  [復(fù)制鏈接]
ID:102668 發(fā)表于 2016-1-15 07:06 | 顯示全部樓層 |閱讀模式
0.png
0.png
這是一個(gè)非常全的設(shè)計(jì)包含程序,制作過(guò)程,Proteus仿真工程文件,感想體會(huì),還有完整的實(shí)驗(yàn)報(bào)告的論文.
以上內(nèi)容全部打包51黑下載:
單片機(jī)課程設(shè)計(jì)(電子鐘).rar (1.55 MB, 下載次數(shù): 104)


“單片機(jī)及接口技術(shù)”綜合實(shí)驗(yàn)設(shè)計(jì)要求

一、題目:電子實(shí)時(shí)時(shí)鐘/萬(wàn)年日歷系統(tǒng)
二、功能要求:
1.  基本要求:
(1) 顯示準(zhǔn)確的北京時(shí)間(時(shí)、分、秒),可用24小時(shí)制式;
(2) 隨時(shí)可以調(diào)校時(shí)間。
(3) 增加公歷日期顯示功能(年、月、日),年號(hào)只顯示最后兩位;
(4) 隨時(shí)可以調(diào)校年、月、日;
(5) 允許通過(guò)轉(zhuǎn)換功能鍵轉(zhuǎn)換顯示時(shí)間或日期。
(6) 所有按鍵需要通過(guò)串口自發(fā)自收來(lái)調(diào)校各種功能。

三、方案考慮:
1.硬件方案:
⑴ 顯示器采用6位LED數(shù)碼管(可以是共陰或共陽(yáng)),可分別顯示時(shí)間或日期;
⑵ 顯示器的驅(qū)動(dòng)采用動(dòng)態(tài)掃描電路形式,以達(dá)到簡(jiǎn)化電路的目的。但要注意所需的驅(qū)動(dòng)電流比靜態(tài)驅(qū)動(dòng)時(shí)要大,因此要增加驅(qū)動(dòng)電路?刹捎74LS244或者晶體管;
⑶ 鍵盤(pán)可采用4×3(12)鍵,也可以采用“一鍵多用方案”,以減少按鍵數(shù)目。
⑷ 整體上要考慮:結(jié)構(gòu)簡(jiǎn)單、布局美觀、操作方便、成本低廉。
2. 參考電路圖
1.png

請(qǐng)注意,上圖用的是“共陽(yáng)”LED數(shù)碼管,但實(shí)驗(yàn)室提供的LED數(shù)碼管有“共陽(yáng)”和“共陰”兩種,如果你用到的是“共陰”的,那就要作相應(yīng)的驅(qū)動(dòng)電路修改,不能照搬。



下面是試驗(yàn)報(bào)告的內(nèi)容:

                                 %E5%8D%95%E7%89%87%E6%9C%BA%E8%AF%95%E9%AA%8C%E6%8A%A5%E5%91%8A.001.jpg                         
                        
                        
電子與信息學(xué)院
                        
                        
                        
                        
                        
《單片機(jī)原理及應(yīng)用》綜合實(shí)驗(yàn)報(bào)告                                         
                                                
電子實(shí)時(shí)時(shí)鐘/萬(wàn)年日歷系統(tǒng)
                        
                        
專    業(yè) 信 息 工 程
                        
班    級(jí) 063
                        
學(xué)生姓名 黃銳  張?chǎng)?nbsp; 
                        
學(xué)    號(hào) 200630212136200630215366
                        
                        
  一、系統(tǒng)概述:
                        1.基本要求:
                        (1) 顯示準(zhǔn)確的北京時(shí)間(時(shí)、分、秒),可用24小時(shí)制式;
                        (2) 隨時(shí)可以調(diào)校時(shí)間。
                        (3) 增加公歷日期顯示功能(年、月、日),年號(hào)只顯示最后兩位;
                        (4) 隨時(shí)可以調(diào)校年、月、日;
                        (5) 允許通過(guò)轉(zhuǎn)換功能鍵轉(zhuǎn)換顯示時(shí)間或日期。
                        (6) 所有按鍵需要通過(guò)串口自發(fā)自收來(lái)調(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ì)方面:
                        
程序采用匯編語(yǔ)言編寫(xiě),使自己更加理解硬件語(yǔ)言以及其工作原理。
                        
“時(shí)鐘”基準(zhǔn)時(shí)間由單片機(jī)內(nèi)部的定時(shí)中斷提供用一個(gè)計(jì)數(shù)器對(duì)定時(shí)中斷的次數(shù)進(jìn)行計(jì)數(shù),可實(shí)現(xiàn)“秒”定時(shí),同理可以進(jìn)行“分”﹑“時(shí)”定時(shí),以及“日”﹑“月”﹑“年”定時(shí),并充分考慮閏年等情況下的日期的差異
                        
采用按鍵查詢功能復(fù)用,簡(jiǎn)化了程序的設(shè)計(jì)
                        
采用動(dòng)態(tài)掃描法顯示6位數(shù)碼管
                        
                        
方案考慮:
                        
1、硬件方案
                        
(1)、采用6位LED數(shù)碼管顯示日期或者時(shí)間。
                        
(2)、顯示器的驅(qū)動(dòng)可采用“靜態(tài)顯示驅(qū)動(dòng)”(如7段譯碼/鎖存/驅(qū)動(dòng)芯片CD4511);也可采用“動(dòng)態(tài)掃描驅(qū)動(dòng)”,但后者比前者所需驅(qū)動(dòng)電流要大。
                        
(3)顯示部分也可采用液晶,但液晶成本較高。
                        
(4)、鍵盤(pán)的按鍵數(shù)目較多時(shí)則采用行列式矩陣結(jié)構(gòu)為好!耙绘I多用”的構(gòu)思和設(shè)計(jì)能大為減少按鍵的數(shù)目。  
                        
(5)、整體設(shè)計(jì)上應(yīng)考慮其結(jié)構(gòu)簡(jiǎn)單﹑操作簡(jiǎn)便﹑布局美觀﹑成本低廉。
                        
2、軟件方案
                        
(1)、“時(shí)鐘”基準(zhǔn)時(shí)間由單片機(jī)內(nèi)部的定時(shí)中斷提供,定時(shí)時(shí)間應(yīng)是“秒”的整除數(shù),且長(zhǎng)短適宜。最長(zhǎng)不能超過(guò)16位定時(shí)器的最長(zhǎng)定時(shí)時(shí)間;最短不
                        
                        
                        
能少于中斷服務(wù)程序的執(zhí)行時(shí)間。通常來(lái)說(shuō)基準(zhǔn)時(shí)間越短,越有利于提高時(shí)鐘的運(yùn)行精確度。
                        
(2)、用一個(gè)計(jì)數(shù)器對(duì)定時(shí)中斷的次數(shù)進(jìn)行計(jì)數(shù),可實(shí)現(xiàn)“秒”定時(shí),同理可以進(jìn)行“分”﹑“時(shí)”定時(shí),以及“日”﹑“月”﹑“年”定時(shí)。
                        
(3)、LED 數(shù)碼管顯示器采用“動(dòng)態(tài)掃描驅(qū)動(dòng)”時(shí)要注意的是:驅(qū)動(dòng)信號(hào)的維持時(shí)間必須大于“起輝時(shí)間”(電流大起輝時(shí)間短),而驅(qū)動(dòng)信號(hào)的間歇時(shí)間必須小于“余輝時(shí)間”(電流大余輝時(shí)間長(zhǎng)),但驅(qū)動(dòng)電流大小受硬件電路能力和LED數(shù)碼管極限功耗的制約。
                        
(4)、動(dòng)態(tài)掃描顯示方式在更新顯示內(nèi)容時(shí),因LED數(shù)碼管余輝的存在可能會(huì)造成顯示字符的模糊,新內(nèi)容寫(xiě)入顯示器之前須將所有的LED數(shù)碼管熄滅。
                        
(5)、關(guān)于自動(dòng)識(shí)別“月大﹑月小”和“平年﹑潤(rùn)年”問(wèn)題的考慮
                        
                        方案比較:
                        顯示部分
                        
我們采用了數(shù)碼管顯示,鑒于數(shù)碼管也能實(shí)現(xiàn)基本的功能,而且液晶成本又太昂貴,同時(shí)我們放棄了用譯碼芯片,一方面進(jìn)一步降低成本,另一方面少了部分電路,減少錯(cuò)誤產(chǎn)生。
                        
                        焊接部分
                           印制電路板的特點(diǎn)是布線緊湊、優(yōu)點(diǎn)是美觀,跳線少,線路穩(wěn)定,主要的工作量在于前期原理圖的繪制跟PCB板的布線,缺點(diǎn)是腐蝕容易不均勻而斷線;而手工焊萬(wàn)用板優(yōu)點(diǎn)是可變性高,自由度高,主要工作量是原理圖的布線與跳線的構(gòu)思跟焊接,缺點(diǎn)是電路板焊接麻煩。
                        我們選擇手工焊萬(wàn)用板的原因:
                        
1 原材料提供的只是萬(wàn)用板,從按照題目要求的方面考慮
                        
2 萬(wàn)用板便于功能的擴(kuò)展,板上也留了很多空位為創(chuàng)新功能使用。
                        按鍵部分
                           按鍵方面,主要是采用矩陣鍵盤(pán)掃描跟按鍵查詢。矩陣鍵盤(pán)掃描法用到比較多的按鍵,使操作復(fù)雜,資源得不到充分利用。為了避免不必要的失誤,所以采用“按鍵查詢,一個(gè)功能一個(gè)按鍵”的方式,排列整齊,簡(jiǎn)潔美觀
                        
                                                         %E5%8D%95%E7%89%87%E6%9C%BA%E8%AF%95%E9%AA%8C%E6%8A%A5%E5%91%8A.002.jpg                         
                        
單片機(jī)作品實(shí)物圖:
                        
                        
                                 %E5%8D%95%E7%89%87%E6%9C%BA%E8%AF%95%E9%AA%8C%E6%8A%A5%E5%91%8A.003.jpg                         
                        
                        
                                 %E5%8D%95%E7%89%87%E6%9C%BA%E8%AF%95%E9%AA%8C%E6%8A%A5%E5%91%8A.004.jpg                         
                        
二、元器件清單:
                        
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
                        
萬(wàn)能電路板                            塊                            1
                        
LED七段數(shù)碼管              共陽(yáng)BS               6
                        
晶體三極管                            PNP8550 6
                        
蜂鳴器                  1
                        
                        三.按鍵使用
                        
                        (1)。P0.7口按鍵具有切換顯示模式的功能
                        (2)。P0.6口按鍵具有閃爍位移位的功能
                        (3)。P0.5 口按鍵具有對(duì)閃爍位加一的功能
                        (4)。P0.4口按鍵具有計(jì)秒的功能,即開(kāi)始秒表/停止秒表/清楚秒表,同時(shí)還具有停止鬧鐘的功能。
                        (5)第9口具有復(fù)位的功能。即一按下去后恢復(fù)到初始化狀態(tài)
                        (6)串口自收自發(fā)功能,當(dāng)p3.0與p3.1連接起來(lái)后,按鍵有效,但當(dāng)p3.0與p3.1斷開(kāi)后,按鍵無(wú)效。
                        
                        系統(tǒng)使用調(diào)試說(shuō)明:
                        
                                
按開(kāi)關(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:
                        
                                
按開(kāi)關(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ù)碼管管腳號(hào)
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
                        

                        
                        
      主程序流程圖:
2.png

日歷處理程序流程圖:

3.png

                        
                        附程序清單:
                        
;;;;;;;;;;;;;;;;;;;
                        
;預(yù)定義部分;;;;;;;;
                        
;;;;;;;;;;;;;;;;;;;
                        
                        
;預(yù)定義用來(lái)顯示小時(shí)、分鐘、秒鐘的存儲(chǔ)單元
                        
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;開(kāi)啟T0中斷開(kāi)始記時(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ù):無(wú)
                        
;傳出參數(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ù):無(wú)
                        
;傳出參數(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ù):無(wú)
                        
;傳出參數(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ù):無(wú)
                        
;傳出參數(shù):無(wú)
                        
;**************************************************
                        
                        
jimiao: push PSW;
                        
        push acc;
                        
       lcall dl30ms;
                        
       jb p0.4,out5;
                        
jimao1:jnb p0.4,jimao1;第一次開(kāi)中斷計(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ù):無(wú)
                        
;************************************************
                        
                        
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)過(guò)處理的數(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)過(guò)處理的數(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)過(guò)處理的數(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)場(chǎng)
                        
reti ;中斷返回
                        
                        
                        
;**************************************************
                        
;函數(shù)名:       time0
                        
;功能:t0中斷處理程序函數(shù)
                        
;傳入?yún)?shù):無(wú)
                        
;**************************************************
                        
                        
time0:
                        
push  PSW
                        
push acc
                        
push b   ;保護(hù)現(xiàn)場(chǎng)
                        
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í)沒(méi)到1s就退出中斷
                        
mov r4,#20;給r0重新賦值
                        
mov r1,#secH;指向秒計(jì)時(shí)單元
                        
lcall add1;調(diào)用加1程序
                        
mov a,r2;將經(jīng)過(guò)處理的數(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)過(guò)處理的數(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)過(guò)處理的數(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)場(chǎng)
                        
setb ET0;開(kāi)放中斷
                        
reti ;中斷返回
                        
                        
;**************************************************
                        
;函數(shù)名:       rili
                        
;功能:        日歷處理程序函數(shù)
                        
;傳入?yún)?shù):無(wú)
                        
;傳出參數(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)過(guò)處理的數(shù)據(jù)放入a中
                        
                        
day31:      
                        
cjne a,#32h,day30;看是不是31號(hào)
                        
ajmp addmon;是的話,加月
                        
                        
day30:
                        
mov r5,a
                        
cjne a,#31h,day29;看是不是30號(hào);是的話,處理
                        
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號(hào)
                        
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號(hào),不是的話跳出
                        
mov a,#0h
                        
mov a,monL
                        
swap a
                        
orl a,monH
                        
cjne a,#02h,outri;看月份是不是2月;是2月,則判斷是不是潤(rùn)年
                        
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)過(guò)處理的數(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)過(guò)處理的數(shù)據(jù)放入a中
                        
outri:
                        
ret
                        
                        
                        
;**************************************************
                        
;函數(shù)名:       add1
                        
;功能:加一函數(shù)
                        
;傳入?yún)?shù):r1存的是地址指針
                        
                ;r2存的是返回的處理數(shù)據(jù)
                        
;**************************************************
                        
                        
add1:
                        
mov a,#0;對(duì)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;對(duì)a中數(shù)據(jù)進(jìn)行加1,并作十進(jìn)制調(diào)整
                        
mov r2,a;將處理后的數(shù)據(jù)移入r2中,注意r2中存的是十進(jìn)制對(duì)應(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ù):無(wú)
                        
;傳出參數(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
                        鬧鐘:
                        
實(shí)現(xiàn)鬧鐘功能主要有兩個(gè)步驟,首先是能在按鍵中把鬧鐘數(shù)值寫(xiě)進(jìn)寄存器,實(shí)現(xiàn)存儲(chǔ)功能。其次是根據(jù)在查詢按鍵服務(wù)程序中作判別,檢查當(dāng)前時(shí)間是否與鬧鈴時(shí)間相等,如果相等,則使在相應(yīng)時(shí)間時(shí)對(duì)蜂鳴器提供驅(qū)動(dòng)電流即可。就實(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)行整形,如圖:
                        
                                 %E5%8D%95%E7%89%87%E6%9C%BA%E8%AF%95%E9%AA%8C%E6%8A%A5%E5%91%8A.245.jpg                                  %E5%8D%95%E7%89%87%E6%9C%BA%E8%AF%95%E9%AA%8C%E6%8A%A5%E5%91%8A.246.jpg                         
                        
2是采用軟件消抖技術(shù)
                        
應(yīng)該說(shuō)用硬件消抖可以達(dá)到更好的效果,不過(guò)由于提供的材料跟自身手上的材料沒(méi)有以上元件,故采用軟件消抖。軟件的消抖主要是調(diào)整出一個(gè)切到好處的延遲檢測(cè)時(shí)間,一般為5-30ms。經(jīng)過(guò)我們的多次調(diào)試,我們最終得到不錯(cuò)的去抖動(dòng)效果。在程序中為DMS子程序?qū)崿F(xiàn)。軟件延時(shí)是用的最多的消抖方法,但是耗時(shí)間。在CPU耗不起時(shí)間的情況下,硬件消抖會(huì)更好
                        
在本程序中設(shè)置了30ms的按鍵消抖。
                        
                        
感想體會(huì):
                        
   本實(shí)驗(yàn)花了我們四天的時(shí)間,由于該大作業(yè)是用匯編語(yǔ)言寫(xiě)的,很多語(yǔ)句掌握都不是很牢固,但是經(jīng)過(guò)這么長(zhǎng)時(shí)間的實(shí)驗(yàn),我基本掌握了部分匯編語(yǔ)言的用法,特別是實(shí)驗(yàn)中經(jīng)常用到的按鍵查詢,跳轉(zhuǎn)語(yǔ)句,以及匯編的方法。
                        
剛開(kāi)始的時(shí)候,我什麼都不懂,根本不知怎樣入門(mén),后來(lái)查找了一些系統(tǒng)資料,漸漸有了些了解,才開(kāi)始寫(xiě)自己的程序。雖然如此,中間還是遇到過(guò)不少困難,不如些按鍵查詢的時(shí)候,仿真不出來(lái),不知道哪里出錯(cuò)了,也不知道是不是程序有問(wèn)題,后來(lái)在小組成員的幫助下,終于找到問(wèn)題所在,通過(guò)不斷的琢磨,后來(lái)不僅實(shí)現(xiàn)了老師的要求的基本功能,更加了秒表,鬧鈴還有整點(diǎn)報(bào)時(shí)。本來(lái)還想加上紀(jì)念日和音樂(lè)鬧鈴,當(dāng)一方面時(shí)間有限,另一方面嘗試后失敗了就暫時(shí)擱下。
                        
  調(diào)試的時(shí)候,剛上去的時(shí)候,板子工作很不穩(wěn)定,雖然有時(shí)候能夠顯示到正確的東西,當(dāng)大多數(shù)時(shí)間都是顯示的雜亂無(wú)章,鑒于有時(shí)候能夠正確顯示,我們是板子焊的不好,于是重新焊過(guò),第二個(gè)版子剛上電的時(shí)候,還是不能很正確的工作,后來(lái),一步一步的調(diào)試,先用簡(jiǎn)單的程序檢查板子,發(fā)現(xiàn)板子是沒(méi)有問(wèn)題的,于是就確定是程序的問(wèn)題,我把程序分為好幾塊,一塊一塊的調(diào)試,一段好了之后,在加上一段。最后發(fā)現(xiàn)是在一個(gè)子程序里邊用了一個(gè)錯(cuò)誤的ljmp。 改正了之后就完全正確了。
                        
    經(jīng)過(guò)這次試驗(yàn),確實(shí)學(xué)到我好多好多的東西。

評(píng)分

參與人數(shù) 1黑幣 +3 收起 理由
薛一鳴 + 3 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:160007 發(fā)表于 2017-1-4 21:38 | 顯示全部樓層
實(shí)驗(yàn)報(bào)告是不完整的呢??
回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2017-6-3 20:57 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

ID:209720 發(fā)表于 2017-6-19 23:16 | 顯示全部樓層
51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

ID:213526 發(fā)表于 2017-6-21 22:02 | 顯示全部樓層

51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

ID:230899 發(fā)表于 2017-9-4 15:43 | 顯示全部樓層
樓主棒棒噠
回復(fù)

使用道具 舉報(bào)

ID:200661 發(fā)表于 2017-9-4 16:47 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

ID:223127 發(fā)表于 2017-11-1 18:49 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

ID:430183 發(fā)表于 2018-11-21 20:14 | 顯示全部樓層
您好!如果要實(shí)現(xiàn)仿真可以通過(guò)怎樣改動(dòng)實(shí)現(xiàn)?
回復(fù)

使用道具 舉報(bào)

ID:466054 發(fā)表于 2019-1-10 18:41 | 顯示全部樓層
51黑有你更精彩
回復(fù)

使用道具 舉報(bào)

ID:505337 發(fā)表于 2019-4-7 23:04 來(lái)自手機(jī) | 顯示全部樓層
完整的嗎
回復(fù)

使用道具 舉報(bào)

ID:156485 發(fā)表于 2020-6-22 22:49 | 顯示全部樓層
很好的資料
回復(fù)

使用道具 舉報(bào)

ID:787517 發(fā)表于 2020-6-24 08:27 | 顯示全部樓層
51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

ID:787517 發(fā)表于 2020-6-24 08:27 | 顯示全部樓層
51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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