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

汇编电子钟的设计

作者:余号敏   来源:本站原创   点击数:  更新时间:2010年08月25日   【字体:

写在前面: ­

    前天晚上断网之后闲来无事忽然心血来潮想起和谁说过以我现在的水平做个时钟没有什么问题,就准备将它实现了。借用老师的学习板子,一直搞到凌晨2点做出了一个24小时的计数器显示,因为没有学过按键的使用方法,昨天实验课下课后问了老师,她给出了查询方式。昨晚搞了下,可以置数,但是不能实现0~60范围加,只能0~99加。今天上午在老师的指导下,终于可以了,总算没有食言啊。呵呵,下面贴出程序了。

 先来个效果图:


        mini_second     equ     30h      ;设置0.05秒、秒、分、时的地址 ­

        second  equ     31h ­

        minute  equ     32h ­

        clock   equ     33h ­

        k1      equ     p3.2             ;设置按键地址,为外部中断口int0和int1 ­

        k2      equ     p3.3 ­

­

        org     0000h ­

        ljmp    start ­

        org     000bh ­

        ljmp    t0_x                      ;使用中断计时 ­

        org     0050h ­

start:  mov     mini_second,#00h          ;清零 ­

        mov     second,#00h ­

        mov     minute,#00h ­

        mov     clock,#00h ­

        mov     tmod,#01h                 ;置工作方式1,开定时器 ­

        mov     th0,#3ch ­

        mov     tl0,#0b0h ­

        setb    ea ­

        setb    et0 ­

        setb    tr0 ­

start1: lcall   show_led                 ;主程序跳转程序显示 ­

        lcall   key_d                    ;置数程序 ­

        ljmp    start1                   ;一直循环显示 ­

t0_x: ­

        push    acc                      ;保护现场 ­

        push    psw ­

        mov     th0,#3ch                 ;置初值,这个不是很准确, ­

        mov     tl0,#0b4h                ;估计一分钟慢个2~3秒 ­

        inc     mini_second ­

        mov     a,mini_second ­

        cjne    a,#20,ret0                ;20次为1秒,没有20次均跳出中断重新跳 ­

        mov     mini_second, #00h         ­

        mov     a,second ­

        add     a,#01h ­

        da      a ­

        mov     second,a ­

        cjne    a,#60h,ret0               ;1秒后出循环,每秒后秒清零,跳到分计时加1 ­

        mov     second,#00h ­

        mov     a,minute ­

        add     a,#01h                    ;分同秒 ­

        da      a ­

        mov     minute,a ­

        cjne    a,#60h,ret0 ­

        mov     minute,#00h ­

        mov     a,clock ­

        add     a,#01h ­

        da      a ­

        mov     clock,a ­

        cjne    a,#24h,ret0 ­

        mov     clock,#00h ­

ret0:   pop     psw                       ;结束保护,跳出 ­

        pop     acc ­

        reti ­

        nop ­

        nop ­

        nop ­

;======================================显示子程序 ­

show_led: ­

           mov        a,second             ;个位秒显示 ­

           anl        a,#0fh ­

           mov        40h,a ­

           clr        p1.5                 ;片选数码管 ­

           clr        p1.6 ­

           setb       p1.7 ­

           mov        a,40h ­

           lcall      led_x ­

           lcall      delay ­

           mov        a,second          ;十位秒显示 ­

           anl        a,#0f0h ­

           swap       a ­

           mov        41h,a ­

           setb       p1.5 ­

           clr        p1.6 ­

           setb       p1.7 ­

           mov        a,41h ­

           lcall      led_x ­

           lcall      delay ­

­

           mov        a,minute            ;个位分显示 ­

           anl        a,#0fh ­

           mov        42h,a ­

           setb       p1.5 ­

           setb       p1.6 ­

           setb       p1.7 ­

           mov        a,42h ­

           lcall      led_x ­

           lcall      delay ­

           mov        a,minute             ;十位分显示 ­

           anl        a,#0f0h ­

           swap       a ­

           mov        43h,a ­

           clr        p1.5 ­

           clr        p1.6 ­

           clr        p1.7 ­

           mov        a,43h ­

           lcall      led_x           ­

           lcall      delay ­

­

           mov        a,clock                  ;个位时显示 ­

           anl        a,#0fh ­

           mov        44h,a ­

           clr        p1.5 ­

           setb       p1.6 ­

           clr        p1.7 ­

           mov        a,44h ­

           lcall      led_x ­

           lcall      delay ­

           mov        a,clock                  ;十位时显示 ­

           anl        a,#0f0h ­

           swap       a ­

           mov        45h,a ­

           setb       p1.5 ­

           setb       p1.6 ­

           clr        p1.7 ­

           mov        a,45h ­

           lcall      led_x ­

           lcall      delay ­

           ret ­

­

led_x:     mov        dptr,#led_data           ­

           movc        a,@a+dptr ­

           mov         p0,a ­

           ret ­

;====================================延迟子程序 ­

delay:     mov        r7,#10 ­

de1:       mov        r6,#100             ;延时1ms多一点,因为晶振为11.0592MHZ ­

           djnz       r6,$ ­

           djnz       r7,de1 ­

           ret ­

;===================================数码管的段选码 ­

led_data:       db      0c0h,0f9h,0a4h,0b0h,099h,92h,82h,0f8h,80h,90h ­

;=====================================置数子程序 ­

key_d:  jnb     k1,key1 ­

        jnb     k2,key2 ­

        ret ­

key1:   mov     a,minute                ;查询方式 ————>          分位置数 ­

        clr     c                       ;清零进位,防止干扰da和cjne指令的操作 ­

        inc     a                       ;累加器自加一  ,此为加法置数 ­

        da      a                       ;十进制处理 ­

        cjne    a, #60h, k_01           ;判断是否为60,为60清零,跳出     ­

        mov     a,#00h ­

k_01:   mov     minute,a ­

        jnb     k1,$ ­

        ret ­

­

key2:  mov     a,clock                  ;时位 置数同上 ­

       clr     c ­

       inc     a ­

       da      a ­

       cjne    a, #24h,k_11 ­

       mov     a,#00h ­

k_11:  mov     clock,a ­

       jnb     k2,$ ­

       ret ­

  本程序如有雷同,纯属不可能 ­
    完整版的程序请从这里下载:http://www.51hei.com/ziliao/file/dzzd.rar 

   我的不够成熟或称之为幼稚的汇编编程,郑文老师的独特学习板子(显示数码管是p0口,片选竟然是用p1口3个I/O口接138,——!这个独特焊接方式让我程序写得这么长),郑子含老师对我置数程序的修改,才出来的程序,虽然不是什么成功,至少是一个开始,我会继续疯下去的。这个时钟的弊端挺多的,比如置数的时候,会有闪屏现象,程序我会再改进的。 ­

­

­

后记:对于院系电子设计竞赛我的失败我得向我的组员道歉,虽然我知道那些所谓成功的几组也比我们好不到哪里去(看过答辩了),但是我会继续我们的课题,加油吧 ­

­

编译工具:wave6000 ­

烧制工具:stc-isp(话说国产的stc公司要统一全球51市场,呵呵) ­、RS232串口

­

请大家多多指教,谢谢^ ^­

关闭窗口

相关文章