⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 自己写的最初版本.txt

📁 51单片机的电子钟 显示时间 年月日 闹钟 整点报时 秒表 硬件原理图 仿真结果都有
💻 TXT
字号:
;;;;;;;;;;;;;;;;;;;
;预定义部分;;;;;;;;
;;;;;;;;;;;;;;;;;;;

;预定义用来显示小时、分钟、秒钟的存储单元
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
;预定义译码器输入口A、B、C、D
coder equ P1;是p0.0、P0.1、p0.2、p0.3低四位

;预定义位选口与小数点
weiDop equ p2;p2.0~p2.5是位选,p2.6是小数点

;;;;;;;;;;;;;;;;;;;;;
;特殊入口地址的中转;;
;;;;;;;;;;;;;;;;;;;;;
org 0000h;复位入口
ljmp main
org 000bh;定时器T0入口
ljmp time0
org 0003h;外部中断0入口
reti
org  0013h;外部中断1入口
reti
org 001bh;定时器T1入口
reti
org 0023h;串行中断入口
reti

;;;;;;;;;;;;;;;;;;;;;;
;主程序入口;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;
main:
;放置初始值,H表示低地址,L表示高地址
mov secH,#0h
mov secL,#3h
mov minH,#0h
mov minL,#3h
mov hourH,#2h
mov hourL,#1h
mov yearH,#8h
mov yearL,#0h
mov monH,#1h
mov monL,#1h
mov dayH,#0h
mov dayL,#2h

;定时器T0,T1设置
mov TMOD,#11H;设置T0与T1为16位定时器
mov TL0,#0b0h;
mov TH0,#3ch;T0初值为3cb0h定时50ms
mov TL0,#0b0h;
mov TH0,#3ch;T1初值为3cb0h定时50ms
setb EA;总中断允许
setb ET0;允许T0中断
setb TR0;开启T0中断开始记时
mov r4,#20;定时次数,刚好1s
lcall display;显示

;;;;;;;;;;;;;;;;;;;;;;
;定时中断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:
addday:		;否则天数加1
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,#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;调用加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

;;;;;;;;;;;;;;;;;;;;;;;;
;加1子程序;;;;;;;;;;;;;;
;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:

mov r0,#secL;指向显示数据首址
mov r1,#05h;循环次数
mov a,#01h;位选与小数点00000001
mov weiDop,a
mov coder,@r0
loop:
lcall delay1ms
rl a;循环左移一位
mov weiDop,a;
inc r0;指针移向 后一显示数据
mov coder,@r0
lcall delay1ms

djnz r1,loop;当不够5次时,再次循环
sjmp display;循环显示
ret;
;;;;;;;;;;;;
;延时程序;;;
;1ms延时;;;;
;;;;;;;;;;;;
delay1ms:
mov R6,#14H
dl1:mov R7,#19H
dl2:djnz R7,dl2
djnz R6,dl1
ret

end; 总程序完

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -