专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

51单片机时钟汇编程序

作者:黄大垣   来源:本站原创   点击数:  更新时间:2013年11月28日   【字体:

终于到了……感动ing...自己也可以DIY一个电子时钟了。

电路板和原件要另外找,南宁市的电子元件稀少得真难找啊,弄好后焊接,看来要找个好点的焊台,这样焊接电路时比较方便。

电路如下:

;简单的89C2051时钟程序
;显示方式为.12:34之12小时制
;P1口输出段数据,P3口输出位数据
;P1.7为秒点,P3.7为PM输出
;P3.4校时,P3.5校分
;晶振12MHz


       flash equ 31h
       sec equ 32h      ;定义秒存储位置
       min equ 33h      ;定义分存储位置
       hour equ 34h
       hourk bit p3.4   ;调时按钮
       mink bit p3.5    ;调分按钮
       pm bit p3.7      ;PM输出端
       org 0000h
       ajmp start
       org 000bh
       ajmp int_t0
       org 0100h
start: mov a,#00h       ;清0
       mov 30h,a
       mov flash,a
       mov sec,a        ;秒清0
       mov min,#00      ;分清0
       mov hour,#12
       mov sp,#60h      ;重设堆栈指针
       setb pm          ;PM清0
       mov p1,#0ffh
       mov p3,#0ffh
       mov tmod,#01h    ;设定定时器0工作于方式1
       mov tl0,#0b0h    ;设定定时初始值50ms
       mov th0,#3ch
       setb ea          ;启动定时
       setb et0
       setb tr0
key:   lcall disp       ;按键处理子程序
       jb hourk,mmm
hhh:   lcall disp
       jnb hourk,hhh
       inc hour         ;时加1
       mov a,hour
       cjne a,#12,ppp
       cpl pm           ;PM取反
ppp:   cjne a,#13,key
       mov hour,#01h    ;12小时到,清零.
mmm:   jb mink,key
nnn:   lcall disp
       jnb mink,nnn
       inc min
       mov a,min
       cjne a,#60,key
       mov min,#00h     ;一小时时间到
       ajmp key
int_t0:push acc         ;保护现场
       mov tl0,#0b0h    ;赋定时初值
       mov th0,#3ch
       inc 30h          ;20H地址加1
       mov a,30h
       cjne a,#10,reti1
       mov 30h,#00h     ;半秒钟时间到
       inc flash        ;半秒加1
       mov a,flash
       cjne a,#2,reti1
       mov flash,#00h
       inc sec          ;秒加1
       mov a,sec
       cjne a,#60,reti1
       mov sec,#00h     ;一分钟时间到
       inc min          ;分加1
       mov a,min
       cjne a,#60,reti1
       mov min,#00h     ;一小时时间到
       inc hour         ;时加1
       mov a,hour
       cjne a,#12,cont
       cpl pm           ;PM取反
cont:  cjne a,#13,reti1
       mov hour,#01h    ;12小时到,清零.
reti1: pop acc          ;恢复现场
       reti             ;中断返回
disp:  mov a,#10
       mov b,a
       mov a,hour
       div ab     
       cjne a,#01,zero
       jmp normal
zero:  mov a,#10        ;消隐无效零
normal:mov dptr,#tab
       movc a,@a+dptr
       mov p1,a
       clr p3.0
       lcall dely
       setb p3.0
       mov a,b
       mov dptr,#tab
       movc a,@a+dptr
       mov p1,a
       clr p3.1
       lcall dely
       setb p3.1
       mov a,#10
       mov b,a
       mov a,min
       div ab
       mov dptr,#tab
       movc a,@a+dptr
       mov p1,a
       clr p3.3
       lcall dely
       setb p3.3
       mov a,b
       mov dptr,#tab
       movc a,@a+dptr
       mov p1,a
       clr p3.2
       lcall dely
       setb p3.2
       mov a,flash
       cjne a,#00,light
       setb p1.7
       lcall dely
       jmp over
light: clr p1.7
       lcall dely
over:  ret              ;子程序返回
tab:   db 88h,0afh,91h,0a1h,0a6h,0e0h,0c0h,0adh,80h,0a0h,0ffh;共阳段码表0123456789不亮
dely:  mov r6,#10
d1:    mov r7,#20
d2:    djnz r7,d2
       djnz r6,d1
       ret

       end

关闭窗口

相关文章