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

📄 源程序.asm

📁 51单片机的电子钟 显示时间 年月日 闹钟 整点报时 秒表 硬件原理图 仿真结果都有
💻 ASM
📖 第 1 页 / 共 2 页
字号:
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,#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


;**************************************************
;函数名:       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;
        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

⌨️ 快捷键说明

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