?? 基于單片機數(shù)字時鐘程序.txt
字號:
// 基于單片機數(shù)字時鐘程序
該數(shù)字鐘可實現(xiàn)精度誤差≤ 1S/天的變精度時鐘,并能方便地調(diào)節(jié)時鐘、時間、定時時間等,秩序結(jié)構(gòu)清晰,一看即懂,還可以配編附加一些功能如計數(shù)器功能等(擴展鍵盤)。
led1 bit p1.0 ;LED定義
led2 bit p1.1
led3 bit p1.2
led4 bit p1.3
led5 bit p1.4
led6 bit p1.5
led7 bit p1.6
led8 bit p1.7
s1 bit p0.0 ;數(shù)碼管位數(shù)定義
s2 bit p0.1
s3 bit p0.2
s4 bit p0.3
s5 bit p0.4
s6 bit p0.5
s7 bit p0.6
s8 bit p0.7
led_data equ p2 ;數(shù)碼管定義
key1 bit p3.5 ;按鍵定義
key2 bit p3.6
key3 bit p3.7
key equ 56h
time_h equ 57h ;定時初值高位
time_l equ 58h ;低位
t_h equ 60h ;時分秒對應(yīng)的地址
t_s equ 61h
t_m equ 62h
time equ 63h ;時鐘計數(shù)單元
timer_h equ 64h ;定時時單元
timer_m equ 65h ;定時分單元
timset bit 00h ;設(shè)置時間標(biāo)志
disstart equ 70h ;顯示單元首地址
int_data equ 45h ;中斷數(shù)據(jù)地址
count_data equ 44h ;計數(shù)單元地址
timer_data equ 43h ;定時地址
; ************** 以上為預(yù)定義部分
; ************** 以下程序開始
org 00h ;程序開始地址
jmp main ;跳轉(zhuǎn)到代碼開始處
org 1bh ;定時器 T1 中斷服務(wù)程序入口
jmp tim1
org 030h ;主程序開始的地址 30H
main:mov sp,#30h ;首先定義堆棧
lcall rest ;初始化
lcall pro_set ;設(shè)置定時器開始工作
lpp:lcall time_set ;接受用戶設(shè)置時間
lcall timer ;時鐘處理
lcall time_pro ;時間格式處理,碼型變化等
lcall time_display ;顯示
jmp lpp
; ************* 初始化程序 ***************************
rest:mov a,#00h ;累加器清零
mov b,#00h
mov p0,#0 ;數(shù)碼管禁止顯示
mov t_h,#0 ;時單元
mov t_m,#0 ;分單元
mov t_s,#0 ;秒單元
mov time,#00h ;計數(shù)溢出次數(shù),溢出20次為一秒
clr timset ;定時設(shè)置標(biāo)志位,0->增加 1 ->減少
mov timer_h,#12 ;定時器時單元,設(shè)置定時為 12:00
mov timer_m,#00h ;定時器分單元
mov p2,#255 ;禁止顯示數(shù)碼管
clr beep ;禁止蜂鳴器
ret ;返回
; *************** 定時器 T1 中斷服務(wù)程序 ****
tim1:clr tr1 ;首先停止定時操作
mov th1,time_h ;
mov tl1,time_l
inc time ;自增
mov a,time ;取得溢出次數(shù)
cjne a,#20,retend ;如果滿20此表示到 1 秒
cpl p1.0 ;取反p1.0,p1.1指示秒鐘
cpl p1.1
mov time,#00h ;重新開始等待1秒
inc t_s ;秒單元加1
retend:setb tr1 ;定時開始
reti ;中斷返回
; ***************** 設(shè)置定時器初始化,定時時間為 50ms ****
pro_set:mov dptr,#0000h ;數(shù)據(jù)指針清零
mov tmod,#10h ;設(shè)置定時器1工作在方式1
mov time_h,#3ch ;計算定時50ms需要的初值
mov th1,time_h ;保存高位
mov time_l,#0c1h ;低位
mov tl1,time_l ;保存低位
setb ea ;總的中斷允許
setb et1 ;定時器1允許
setb tr1 ;定時器1開始運行
ret ;返回
; ****************** timer 程序主要完成數(shù)據(jù)的處理 **********
timer:mov a,t_s ;取得秒單元數(shù)據(jù)
cjne a,#60,tend ;秒不到60返回
mov t_s,#00h ;清除秒單元
inc t_m ;為分單元加1
mov a,t_m ;取得分單元數(shù)據(jù)
cjne a,#60,tend ;分不等于60返回
mov t_m,#00h ;分單元清零
setb beep ;整點短鳴提示
lcall delay ;鳴叫延時
clr beep ;停止蜂鳴器
inc t_h ;同時為時單元加1
mov a,t_h ;取得時單元數(shù)據(jù)
cjne a,#24,timetest ;如果不等于24,查看定時
mov t_h,#00h ;時單元清零
jmp tend ;返回
timetest:cjne a,timer_h,tend ;不等于定時的時單元,返回
mov a,t_m ;取得定時的分單元
cjne a,timer_m,tend ;當(dāng)前分不等于定時的分單元,返回
setb beep ;定時到,蜂鳴提示
lcall delay
clr beep
lcall delay
setb beep
lcall delay
clr beep ;連續(xù)發(fā)出短音提示
tend:ret ;返回
; ************ time_display 程序主要為顯示時間值用 *************
time_display: mov r0,#disstart ;取得顯示單元首地址
mov r1,#01h ;從第一個數(shù)碼管開始
mov r2,#06h ;共6個數(shù)碼管
dislp:mov led_data,@r0 ;獲得當(dāng)前單元數(shù)據(jù)
inc r0 ;指向下一個單元
mov p0,r1 ;數(shù)碼顯示
mov a,r1 ;為下一個數(shù)準(zhǔn)備
rl a ;下一個單元
mov r1,a ;保存
lcall delay5ms ;為了保證數(shù)碼管亮度,
;但要防止閃爍,延時5ms
djnz r2,dislp ;重復(fù)顯示,直到全部數(shù)據(jù)刷新過
ret ;返回
; ******* time_pro 時間處理,主要為 bcd碼轉(zhuǎn)換,查表 ***********
time_pro:lcall bcd ;BCD碼轉(zhuǎn)換
mov r0,#disstart ;獲得顯示單元首地址
mov r2,#06h ;需要轉(zhuǎn)換的個數(shù)
prlp:mov a,@r0 ;取得當(dāng)前需要轉(zhuǎn)換的數(shù)據(jù)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -