您当前的位置:五五电子网电子知识单片机-工控设备51单片机AT89C51数字电子钟(已测试通过) 正文
AT89C51数字电子钟(已测试通过)

AT89C51数字电子钟(已测试通过)

点击数:7910 次   录入时间:03-04 11:39:27   整理:http://www.55dianzi.com   51单片机
        MOV  r1,#01h        ;从第一个数码管开始
        MOV  r2,#06h        ;共6个数码管
    dislp: MOV  led_data,@r0      ;获得当前单元数据
       inc r0           ;指向下一个单元 
        MOV  p0,r1          ;数码显示
        MOV  a,r1          ;为下一个数准备
       rl a            ;下一个单元 
        MOV  r1,a          ;保存 
       lcall delay5ms       ;为了保证数码管亮度, 
                     ;但要防止闪烁,延时5ms
       djnz r2,dislp       ;重复显示,直到全部数据刷新过 
       ret             ;返回 

; ******* time_pro 时间处理,主要为 bcd码转换,查表 *********** 
  time_pro:lcall bcd          ;BCD码转换
        MOV  r0,#disstart      ;获得显示单元首地址
        MOV  r2,#06h         ;需要转换的个数
    prlp: MOV  a,@r0          ;取得当前需要转换的数据
        MOV  dptr,#tab_nu      ;获得表头
        MOV c a,@a+dptr       ;获得转换后的数据
        MOV  @r0,a          ;存回去
       inc r0            ;指向下一个
       djnz r2,prlp         ;重复转换,直到6个全部完成
       ret             ;返回

; **************** 码型变换 ****************************************
     bcd: MOV  r0,#disstart      ;获得首地址
        MOV  a,t_s          ;获得待转化的低位
        MOV  b,#10          ;转化进制,如果要进行十进制转换 改为 10 
       div ab            ;计算 A/B    
        MOV  @r0,b          ;第一位转换完毕,保存低位转化后的数据 
       inc r0            ;自增
        MOV  @r0,a          ;保存高位
       inc r0           ;取第二个数据地址
        MOV  a,t_m          ;获得第二个需要转换的数据
        MOV  b,#10          ;十六进制
       div ab            ;计算
        MOV  @r0,b          ;存低位 
       inc r0
        MOV  @r0,a          ;存高位
       inc r0            ;第三位
        MOV  a,t_h          ;获得数据
        MOV  b,#10          ;十六进制 
       div ab           ;计算
        MOV  @r0,b          ;存低位
       inc r0 
        MOV  @r0,a          ;存高位 
       ret             ;完毕,返回
;***************************************************************************************
;******** time_set 设置时间 ******************************************************* 
; *                                        *
; *    检测用户按键,1-> 设置时单元 2-> 设置分单元,3->设置增减方式      *
; *    如果需要增加 时,先将方式设置为 增加(默认为减),即,按下 KEY3一下,  *
; *    然后按 KEY1 ,如果要减少时单元,需要再次按下KEY3,然后按KEY1;      *
; *    分的设置也是如此。                           *
;*************************************************************************************** 
  time_set: MOV  p0,#00h         ;禁止数码管显示
        MOV  p2,#255         ;防止按键时闪烁
       lcall pro_key        ;查找用户按键情况 
        MOV  a,key          ;查找键值
       jz tsend          ;如果等于0,表示没用按键,直接返回
       cjne a,#1,tset1       ;是否等于1?没有到下一个处理程序
        MOV  key,#00h        ;等于1,表示设置时 请零,否则会引起重复设置
       jb timset,tset10      ;时间设置标志位,1 ->减少,0->增加
        MOV  a,t_h          ;标志位 0 ,增加,取得时单元 
       cjne a,#23,ts1       ;如果时单元不等于23,转移到增加操作
       jmp tsend          ;等于23 直接返回
     ts1:inc t_h           ;时单元增加1 
       jmp tsend          ;返回 
   tset10:  MOV  a,t_h          ;这里处理为减少的情况
       jz tsend           ;如果时单元为0,直接返回
       dec t_h           ;否则,数据减1 
       jmp tsend          ;返回,以下关于分的设置一样 
    tset1:cjne a,#2,tset2       ;如果按键不是 2 则 转移到下一个处理
        MOV  key,#00h        ;是2,表示设置 分
       jb timset,tset20      ;其余同上 
        MOV  a,t_m 
       cjne a,#59,
       ts2 jmp tsend
     ts2:inc t_m
       jmp tsend
   tset20: MOV  a,t_m
       jz tsend 
       dec t_m 
       jmp tsend
    tset2:cjne a,#3,tsend       ;等于 3 表示设置标志
        MOV  key,#00h        ;清零
       cpl timset         ;标志取反
    tsend:ret             ;返回
;********* 按键处理 读取键盘 *************************
;参见有关键盘查询的说明,和前面的有关程序
   pro_key:              ;键盘查询子程序 
       setb key1           ;首先输出高电平,检测低电平的到来 
       setb key2          ;不同电路,可能检测方式不一样 
       setb key3
       jb key1,ke1        ;如果用户没有按第一个键,到第下个处理部分,
        MOV  key,#1         ;表示用户按了第一个键 
       lcall delay20ms       ;软件延时,防止干扰
       jmp pro_key         ;重新查询,直到用户释放按键
     ke1:jb key2,ke2        ;处理第二个按键,如果没有到下一个处理部分
        MOV  key,#2         ;以下和第一个处理单元相似。
       lcall delay20ms
       jmp pro_key
     ke2:jb key3,ke3
        MOV  key,#3 

上一页  [1] [2] [3]  下一页


本文关键字:电子钟  51单片机单片机-工控设备 - 51单片机