;预定义用来显示小时、分钟、秒钟的存储单元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;复位入口
ljmp main
org 000bh;定时器T0入口
ljmp time0
org 0003h;外部中断0入口
reti;
org 0013h;外部中断1入口
retiorg 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设置
mov TMOD,#11H;设置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;定时次数,刚好1s
mov 60h,#0ah;定时器1定时次数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;分若小于则转退出 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;转闹钟调整
mov a,51h;
cjne a,#01h,zhwei2;
mov r1,#secH;
lcall add1;
mov a,r3;
cjne a,#60h,ftiao2;分若小于则转退出 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;分若小于则转退出 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;;************************************************** ;函数名:
;功能: 串口发送数据函数
;传入参数: 无
;传出参数: A
;************************************************** chuan: MOV A,p0 ;读取P1口数据
MOV SBUF,A
JNB TI,$ ;等待发送完毕
CLR TI
lcall dl30ms;
wait: jnb ri,out9;
MOV A,SBUF
CLR RI
sjmp out10;
out9: lcall display;
jmp chuan;
out10: ret;
;************************************************** ;函数名:chxianshi
;功能: 显示调整函数
;传入参数: 无
;传出参数:
;************************************************** 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;
;************************************************** ;函数名:k2
;功能: 调整位移位函数
;传入参数: 无
;传出参数:
;************************************************** 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;
;************************************************** ;函数名: jimiao
;功能: 计秒程序
;传入参数: 无
;传出参数: 无
;************************************************** 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;
;;*********************************************** ;函数名 time1
;功能: t1中断函数
;传入参数: 无
;************************************************ time1:
push PSW
push acc
mov TL1,#0f0h;
mov TH1,#0d8h;T1初值为fc18h定时1ms
mov r1,#mao_bfw;指向秒计时单元
lcall add1;调用加1程序
mov a,r2;将经过处理的数据放入a中
cjne a,#99h,outT01;当秒到未到达60时跳出中断
mov 5ah,#00h
mov 5bh,#00h;将秒清零
mov r1,#mao_gw;指向分计时单元
lcall add1;调用加1程序
mov a,r2;将经过处理的数据放入a中
cjne a,#60h,outT01;当分钟未到达60时跳出中断
mov 5ch,#00h;
mov 5dh,#00h;
mov r1,#mao_bw;指向小时计时单元
lcall add1;调用加1程序
mov a,r2;将经过处理的数据放入a中
cjne a,#60h,outT0;当小时未到达60时跳出中断
mov 5eh,#00h;
mov 5fh,#00h;
outt01:
pop acc
pop psw;恢复现场
reti ;中断返回
;************************************************** ;函数名: time0
;功能: t0中断处理程序函数
;传入参数: 无;************************************************** time0:
push PSW
push acc
push b ;保护现场
push 02h
push 01h
clr ET0;关T0中断允许
clr TR0;关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;调用加1程序
mov a,r2;将经过处理的数据放入a中
cjne a,#60h,outT0;当秒到未到达60时跳出中断addmin: ;否则分钟加1
mov secL,#0
mov secH,#0;将秒清零
mov r1,#minH;指向分计时单元
lcall add1;调用加1程序
mov a,r2;将经过处理的数据放入a中
cjne a,#60h,outT0;当分钟未到达60时跳出中断addhour: ;否则小时加1
mov minL,#0
mov minH,#0;将分清零
mov r1,#hourH;指向小时计时单元
lcall add1;调用加1程序
mov a,r2;将经过处理的数据放入a中
cjne a,#24h,outT0;当小时未到达60时跳出中断
lcall rili ;调用日历子程序
outT0:
pop 01h
pop 02h
pop b
pop acc
pop psw;恢复现场
setb ET0;开放中断
reti ;中断返回
;************************************************** ;函数名: rili
;功能: 日历处理程序函数
;传入参数: 无
;传出参数:
;************************************************** rili:
addday: mov hourL,#0
mov hourH,#0;将小时清零
mov r1,#dayH;指向天计时单元
lcall add1;调用加1程序
mov a,r2;将经过处理的数据放入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,#0hmov 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;调用加1程序
mov a,r2;将经过处理的数据放入a中
cjne a,#12h,outri;当月未到达12时
addyear: ;年加1
mov monL,#0
mov monH,#0;将月清零
mov r1,#yearH;指向年计时单元
lcall add1;调用加1程序
mov a,r2;将经过处理的数据放入a中
outri:ret
;**************************************************
;函数名: add1
;功能: 加一函数
;传入参数: r1存的是地址指针
;r2存的是返回的处理数据
;**************************************************
add1:
mov a,#0;对a进行清零
dec r1;指向高四位数据地址
mov a,@r1;将高四位移入a
inc r1;指向低四位
swap a;a中高四位与低四位互换
orl a,@r1;将低四位显示数据放入a中
add a,#01h;
da a;对a中数据进行加1,并作十进制调整
mov r2,a;将处理后的数据移入r2中,注意r2中存的是十进制对应的bcd码
mov r3,a;下面是将a中然数据恢复为高位与低位
anl a,#0f0h;取高四位
swap a
dec r1;
mov @r1,a;将高四位移入低位地址中
mov a,r3;将暂存数据移回
anl a,#0fh;取其低四位
inc r1;指针指向高四位地址
mov @r1,a;将低四位移到高位地址中
ret ;子程序返回
;**************************************************
;函数名: display
;功能: 显示处理程序函数
;传入参数: 无
;传出参数:
;************************************************** display:mov a,50h;
cjne a,#00H,dat;00h是时间显示不等则转到年份显示
timdis: mov r0,#secL;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;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