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

📄 基于单片机数字时钟程序.txt

📁 基于单片机数字时钟程序   该数字钟能方便地调节时钟、时间、定时时间等
💻 TXT
📖 第 1 页 / 共 2 页
字号:
       mov dptr,#tab_nu      ;获得表头
       movc 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 
       lcall delay20ms
       jmp pro_key 
     ke3:ret 
;**************************************
;******** 定时器 T0 设置 ************** 
;定时器工作在方式1,为提高精度,总定时时间为50ms,
;定时器溢出20次为1秒,

  pro_timer:mov tmod,#01h        ;设置定时器为定时方式1
       mov th0,#0ffh        ;初始化定时初值
       mov tl0,#0a1h        ;
       setb ea           ;总中断允许
       setb et0           ;定时器0 允许
       setb tr0           ;开始定时
       ret              ;返回 
; *****************************************
; *************** 软件延时 *************
    delay:push psw          ;保存原来的寄存器内容
       clr psw.3          ;
       clr psw.4          ;设置新的寄存器组
       mov r0,#2          ;延时参数1 
       mov r1,#250         ;延时参数2
       mov r2,#2          ;延时参数3
     dl1:djnz r0,dl1         ;延时循环1
       mov r0,#250         ;
     dl2:djnz r1,dl1         ;延时循环2
       mov r0,#240         ;
       mov r1,#248         ;
     dl3:djnz r2,dl1         ;延时循环3
       nop             ;定时精度调整
       pop psw           ;恢复原来的寄存器
       ret             ;返回
;***************************************** 
;*************** 键盘延时 ***************
  delay20ms:push psw
       clr psw.3
       clr psw.4
       mov r0,#250 
       mov r1,#40
     d20:djnz r0,d20
       mov r0,#250 
       djnz r1,d20
       pop psw
       ret
;**************************************
;*********** 延时 5ms ****************
  delay5ms:push psw
       clr psw.3 
       setb psw.4
       mov r0,#250
       mov r1,#10
     d5:djnz r0,d5 
       mov r0,#250
       djnz r1,d5 
       pop psw
       ret
;************************************************************************************ 
;这是数字显示表格,其中 带小数点的数字比不带小数点的数字大16
; 比如 0 的显示代码为 0;那么 0.的显示代码为 16;如此类推 
   tab_nu:db 0c0h, 0f9h, 0a4h, 0b0h, 99h , 92h , 82h, 0f8h   ;数字0-7 不带小数点代码
       db 80h , 90h, 88h , 83h , 0c6h, 0a1h, 86h, 8eh    ;数字8-f 不带小数点代码 
       db 40h , 79h, 24h , 30h , 19h , 12h , 02h, 78h    ;数字0-7 带小数点代码
       db 00h , 10h, 08h , 03h , 46h , 21h , 06h, 0eh    ;数字8-f 带小数点代码
       end ; 
 

⌨️ 快捷键说明

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