找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1265|回复: 0
打印 上一主题 下一主题
收起左侧

基于DY-mini80单片机学习板的数码管时钟电路的设计资料

[复制链接]
跳转到指定楼层
楼主
ID:372760 发表于 2018-7-18 12:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.时钟电路硬件设计:
图1  89S51电路图
图 2   8位共阴极数码管与锁存器的连接
图3  独立键盘与矩阵键盘[1]

              本实验用到前6个数码管(P2.2~P2.0取000~101)和第一个按钮开关(P3.0)。P0口输出数码管数据,锁存器直通[2]。

2.系统主要程序设计:
              (1).主程序
              本设计中的计时采用定时器T0中断完成,其余状态循环调用显示子程序,当P3.0开关按下时,转入调时功能程序。系统主程序流程图如图4所示:
              (2).显示子程序
              数码管显示的数据存放在内存单元70H~75H中,其中70H~71H存放的秒数据,72H~73H存放的分数据,74H~75H存放的时数据,每一地址单元内均为十进制BCD码。由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应段码数据存放在ROM表中。显示时,先取出70H~75H某一地址中的数据,然后查得对应的显示用段码从P0口输出。P2口将对应的数码管选中,就能显示该地址单元的数据值。
              (3).定时器T0中断服务程序
              定时器T0用于时间计时。定时溢出中断周期设为50ms,中断累计20次(即1s)时对秒计数单元进行加1操作。时间计数单元地址分别在70H~71H(s)、76H~77H(min)、78H~79H(h),7AH单元中存放“熄灭符”数据(#0AH)。在计数单元中采用十进制BCD码计数,满60进位。T0中断服务程序流程图见图5所示。
              (4).T1中断服务程序
              T1中断服务程序用于指示调整单元数字的亮闪。在时间调整状态下,每过0.3s,将对应单元的数据换成“熄灭符”数据(#0AH)。这样,在调整时间时,对应调整单元的显示数据就会间隔闪亮。
              (5).调时功能程序
              调时功能程序的设计方法是:按下按键,若按下时间小于1s,进入省电状态(数码管不亮,时钟不停),否则进入调分状态,等待操作,此时定时器停止走动。当再次按下按钮时,若按下时间小于0.5s,则时间加1min;若按下时间大于0.5s,则进入小时调整状态。在小时调整状态下,当按键按下的时间大于0.5s时退出调整状态,时钟继续走动。
图4  主程序流程图
图5  T0中断服务程序
4.实验总结:
                            1.实验中使用的是12MHz晶振;
                            2.数码管使用动态扫描显示;
                            3.操作都要先等待按键释放后才做相应;
                            4.按键按下时间长短判断:在两次监测键是否按下语句中间夹一条延时语句(类似于按键消抖动)。
                            5.按键释放等待时应一直调用显示子程序,防止键按下时无时钟显示。
                            6.适当设置标志位对程序的设计很重要。例如:本例中设置了20H做标志位,其中00H、01H、02H(即20H.0、20H.1、20H.2)分别做调分标志、调时标志、闪烁标志;只要监测标志位既能方便对应出不同响应。
                            7.本例中ADD1子程序(即BCD码加1子程序)。其入口参数是R0,它作为指针指向待加1的两位BCD码的高位;出口参数为R3,存放着加1后的BCD码值。
3.数码管时钟电路源程序代码
  1.               ORG 0000H        ;程序执行开始地址
  2.               LJMP      START  ;跳到标号START执行
  3.               ORG 0003H        ;外中断0中断程序入口
  4.               RETI             ;外中断0中断返回
  5.               ORG 000BH        ;定时器T0中断程序入口
  6.               LJMP      INTT0  ;跳至INTTO执行
  7.               ORG 0013H        ;外中断1中断程序入口
  8.               RETI             ;外中断1中断返回
  9.               ORG 001BH        ;定时器T1中断程序入口
  10.               LJMP      INTT1              ;跳至INTT1执行
  11.               ORG 0023H        ;串行中断程序入口地址
  12.               RETI             ;串行中断程序返回
  13. ;*******************************************************
  14. START:               MOV   SP,#30H
  15.         MOV   PSW,#00H
  16.               MOV   R0,#70H                    ;清70H-7AH共11个内存单元
  17.               MOV   R7,#0BH                    ;
  18. CLEAR:  MOV   @R0,#00H                    ;
  19.               INC   R0                            ;
  20.               DJNZ  R7,CLEAR                 ;
  21.               MOV   20H,#00H                            ;标志位
  22.               MOV   7AH,#0AH                            ;放入"熄灭符"数据
  23.               MOV   TMOD,#11H                    ;设T0、T1为16位定时器
  24.               MOV   TL0,#0B0H                 ;50MS定时初值(T0计时用)
  25.               MOV   TH0,#3CH                 ;50MS定时初值
  26.         MOV   TL1,#0B0H                 ;50MS定时初值(T1闪烁定时用)
  27.         MOV   TH1,#3CH                  ;50MS定时初值            
  28.               SETB  EA                           ;总中断开放
  29.               SETB  ET0                          ;允许T0中断
  30.               SETB  TR0                          ;开启T0定时器
  31.               MOV   R4,#14H                      ;1秒定时用初值(50MS×20)
  32. START1: LCALL DISPLAY                      ;调用显示子程序
  33.               JNB   P3.0,SETMM1              ;P3.0口为0时转时间调整程序
  34.               SJMP  START1                      ;
  35. SETMM1: LJMP  SETMM                   ;转到时间调整程序SETMM
  36. ;*********************************************************
  37. INTT0:               PUSH  ACC           ;累加器入栈保护
  38.               PUSH  PSW           ;状态字入栈保护
  39.               CLR   ET0           ;关T0中断允许
  40.               CLR   TR0           ;关闭定时器T0
  41.               MOV   A,#0B7H       ;中断响应时间同步修正
  42.               ADD   A,TL0         ;低8位初值修正
  43.               MOV   TL0,A         ;重装初值(低8位修正值)
  44.               MOV   A,#3CH        ;高8位初值修正
  45.               ADDC  A,TH0         ;
  46.               MOV   TH0,A         ;重装初值(高8位修正值)
  47.               SETB  TR0           ;开启定时器T0,后面再开放中断允许
  48.               DJNZ  R4, OUTT0         ;20次中断未到中断退出
  49. ADDSS:  MOV   R4,#14H           ;20次中断到(1秒)重赋初值
  50.               MOV   R0,#71H           ;指向秒计时单元(71H-72H)
  51.               ACALL ADD1              ;调用加1程序(加1秒操作)
  52.               MOV   A,R3              ;秒数据放入A(R3为2位十进制数组合)
  53.               CLR   C                 ;清进位标志
  54.               CJNE  A,#60H,ADDMM      ;
  55. ADDMM:  JC    OUTT0             ;小于60秒时中断退出
  56.               ACALL CLR0              ;大于或等于60秒时对秒计时单元清0
  57.               MOV   R0,#77H           ;指向分计时单元(76H-77H)
  58.               ACALL ADD1              ;分计时单元加1分钟
  59.               MOV   A,R3              ;分数据放入A
  60.               CLR   C                 ;清进位标志
  61.               CJNE  A,#60H,ADDHH      ;
  62. ADDHH:               JC    OUTT0             ;小于60分时中断退出
  63.               ACALL CLR0              ;大于或等于60分时分计时单元清0
  64.               MOV   R0,#79H           ;指向小时计时单元(78H-79H)
  65.               ACALL ADD1              ;小时计时单元加1小时
  66.               MOV   A,R3              ;时数据放入A
  67.               CLR   C                 ;清进位标志
  68.               CJNE  A,#24H,HOUR       ;
  69. HOUR:               JC    OUTT0             ;小于24小时中断退出
  70.               ACALL CLR0              ;大于或等于24小时小时计时单元清0
  71. OUTT0:               MOV   72H,76H           ;中断退出时将分、时计时单元数据移
  72.         MOV   73H,77H           ;入对应显示单元
  73.         MOV   74H,78H           ;
  74.         MOV   75H,79H           ;
  75.               POP   PSW               ;恢复状态字(出栈)
  76.               POP   ACC               ;恢复累加器
  77.               SETB  ET0               ;开放T0中断
  78.               RETI                    ;中断返回
  79. ;*******************************************************
  80. INTT1:                PUSH    ACC                ;中断现场保护
  81.                       PUSH    PSW                ;
  82.                       MOV     TL1,   #0B0H       ;装定时器T1定时初值
  83.                       MOV     TH1,   #3CH                               ;
  84.                       DJNZ    R2,INTT1OUT                               ;0.3秒未到退出中断(50MS中断6次)
  85.                       MOV     R2,#06H                                   ;重装0.3秒定时用初值
  86.                       CPL     02H                                       ;0.3秒定时到对闪烁标志取反
  87.                                    JB      02H,FLASH1                                ;02H位为1时显示单元"熄灭"
  88.                       MOV     72H,76H       ;02H位为0时正常显示
  89.                 MOV     73H,77H       ;
  90.                 MOV     74H,78H       ;
  91.                 MOV     75H,79H       ;
  92. INTT1OUT:       POP     PSW                       ;恢复现场
  93.                 POP     ACC           ;
  94.                 RETI                  ;中断退出
  95. FLASH1:         JB      01H,FLASH2    ;01H位为1时,转小时熄灭控制
  96.                 MOV     72H,7AH       ;01H位为0时,"熄灭符"数据放入分
  97.                 MOV     73H,7AH       ;显示单元(72H-73H),将不显示分数据
  98.                 MOV     74H,78H       ;
  99.                 MOV     75H,79H       ;
  100.                 AJMP    INTT1OUT      ;转中断退出
  101. FLASH2:         MOV     72H,76H       ;01H位为1时,"熄灭符"数据放入小时
  102.                 MOV     73H,77H       ;显示单元(74H-75H),小时数据将不显示
  103.                 MOV     74H,7AH       ;
  104.                 MOV     75H,7AH       ;
  105.                 AJMP    INTT1OUT      ;转中断退出
  106. ;**************************************************
  107. DISPLAY:MOV              R1,#75H                            ;指向显示数据首址
  108.               MOV              R5,#00H                            ;扫描控制字初值
  109. PLAY:               MOV              A,@R1
  110.               MOV              DPTR,#TAB
  111.               MOVC              A,@A+DPTR
  112.               MOV              P0,A                            ;先放段码入P0
  113.               MOV              A,R5                            ;扫描字放入A
  114.               MOV              P2,A                            ;扫描字放入扫描控制端口
  115.               LCALL              DL1MS                            ;1MS子程序另编
  116.               MOV              A,R1
  117.               CLR              C
  118.               SUBB              A,#01H
  119.               MOV              R1,A
  120.               INC              R5
  121.               CJNE              R5,#06,PLAY
  122.               MOV              P0,#00H                            ;P0段码输出口复位
  123.               MOV              P2,#0FFH              ;一次显示结束P2扫描控制口复位
  124.               RET
  125. TAB:               DB 3FH,6H,5BH,4FH,66H,6DH,7DH,7H,7FH,6FH,00H
  126. ;*****************************************************
  127. ADD1:               MOV                 A,@R0       ;取当前计时单元数据到A
  128.               DEC                 R0          ;指向前一地址
  129.               SWAP                A           ;A中数据高四位与低四位交换
  130.               ORL               A,@R0       ;前一地址中数据放入A中低四位
  131.               ADD              A,#01H      ;A加1操作
  132.               DA               A           ;十进制调整
  133.               MOV                 R3,A        ;移入R3寄存器
  134.               ANL               A,#0FH      ;高四位变0
  135.               MOV               @R0,A       ;放回前一地址单元
  136.               MOV              A,R3        ;取回R3中暂存数据
  137.               INC              R0          ;指向当前地址单元
  138.               SWAP              A           ;A中数据高四位与低四位交换
  139.               ANL               A,#0FH      ;高四位变0
  140.               MOV              @R0,A       ;数据放入当削地址单元中
  141.               RET                  ;子程序返回
  142. ;**************************************************
  143.               CLR0:                             CLR A           ;清累加器
  144.               MOV                             @R0,A                     ;清当前地址单元
  145.               DEC                             R0                        ;指向前一地址
  146.               MOV                             @R0,A                     ;前一地址单元清0
  147.               RET                                    ;子程序返回
  148. ;**************************************************
  149.            SETMM:  CLR                ET0            ;关定时器T0中断
  150.                    CLR                TR0            ;关闭定时器T0
  151.                    LCALL                DL1S           ;调用1秒延时程序
  152.                    JB                              P3.0,CLOSEDIS  ;键按下时间小于1秒,关闭显示(省电)
  153.                    MOV                R2,#06H        ;进入调时状态,赋闪烁定时初值
  154.                    SETB               ET1            ;允许T1中断
  155.                    SETB               TR1            ;开启定时器T1
  156.             SET2:  JNB                             P3.0,SET1      ;P3.0口为0(键未释放),等待
  157.                    SETB                00H            ;键释放,分调整闪烁标志置1
  158.             SET4:  JB                              P3.0,SET3      ;等待键按下
  159.                    LCALL                 DL05S          ;有键按下,延时0.5秒
  160.                    JNB                  P3.0,SETHH     ;按下时间大于0.5秒转调小时状态
  161.                    MOV                             R0,#77H        ;按下时间小于0.5秒加1分钟操作
  162.                    LCALL               ADD1           ;调用加1子程序
  163.                    MOV                             A,R3           ;取调整单元数据
  164.                    CLR                             C              ;清进位标志
  165.                    CJNE               A,#60H,HHH     ;调整单元数据与60比较
  166.               HHH: JC                             SET4           ;调整单元数据小于60转SET4循环
  167.                    LCALL               CLR0           ;调整单元数据大于或等于60时清0
  168.                    CLR                             C              ;清进位标志
  169.                    AJMP                SET4           ;跳转到SET4循环
  170.         CLOSEDIS:  SETB               ET0           ;省电(LED不显示)状态。开T0中断
  171.                    SETB               TR0           ;开启T0定时器(开时钟)
  172.         CLOSE:     JB                 P3.0,CLOSE    ;无按键按下,等待。
  173.                    LCALL              DISPLAY       ;有键按下,调显示子程序延时削抖
  174.                    JB                  P3.0,CLOSE     ;是干扰返回CLOSE等待
  175.         WAITH:     JNB                 P3.0,WAITH     ;等待键释放
  176.                    LJMP                START1         ;返回主程序(LED数据显示亮)
  177.            SETHH:  CLR                00H           ;分闪烁标志清除(进入调小时状态)
  178.           SETHH1:  JNB                             P3.0,SET5      ;等待键释放
  179.                    SETB         01H            ;小时调整标志置1
  180.             SET6:  JB                              P3.0,SET7      ;等待按键按下
  181.                    LCALL                 DL05S          ;有键按下延时0.5秒
  182.                    JNB                  P3.0,SETOUT    ;按下时间大于0.5秒退出时间调整
  183.                    MOV                            R0,#79H       ;按下时间小于0.5秒加1小时操作
  184.                    LCALL               ADD1            ;调加1子程序
  185.                    MOV                            A,R3            ;
  186.                    CLR                             C                ;
  187.                    CJNE               A,#24H,HOUU      ;计时单元数据与24比较
  188.             HOUU:  JC                             SET6             ;小于24转SET6循环
  189.                    LCALL               CLR0             ;大于或等于24时清0操作
  190.                    AJMP                SET6             ;跳转到SET6循环
  191.            SETOUT: JNB                 P3.0,SETOUT1     ;调时退出程序。等待键释放
  192.                    LCALL               DISPLAY          ;延时削抖
  193.                    JNB                 P3.0,SETOUT      ;是抖动,返回SETOUT再等待
  194.                    CLR                 01H              ;清调小时标志
  195.                    CLR                 00H              ;清调分标志
  196.                    CLR                 02H              ;清闪烁标志
  197.                    CLR                 TR1              ;关闭定时器T1
  198.                    CLR                 ET1              ;关定时器T1中断
  199.                    SETB                TR0              ;开启定时器T0
  200.                    SETB                ET0              ;开定时器T0中断(计时开始)
  201.                    LJMP               START1           ;跳回主程序
  202.             SET1:  LCALL    DISPLAY          ;键释放等待时调用显示程序(调分)
  203.                    AJMP     SET2             ;防止键按下时无时钟显示
  204.             SET3:  LCALL    DISPLAY          ;等待调分按键时时钟显示用
  205.                    AJMP     SET4
  206.             SET5:  LCALL    DISPLAY          ;键释放等待时调用显示程序(调小时)
  207.                    AJMP     SETHH1           ;防止键按下时无时钟显示
  208.             SET7:  LCALL    DISPLAY          ;等待调小时按键时时钟显示用
  209.                    AJMP     SET6
  210.          SETOUT1:  LCALL    DISPLAY          ;退出时钟调整时键释放等待
  211.                     AJMP    SETOUT           ;防止键按下时无时钟显示
  212. ;*******************************************
  213. DL1MS:              MOV              R6,#14H
  214. DL1:              MOV              R7,#19H
  215. DL2:              DJNZ              R7,DL2
  216.               DJNZ              R6,DL1
  217.               RET            
  218. ;
  219. DL1S:   LCALL      DL05S
  220.         LCALL      DL05S
  221.         RET
  222. DL05S:  MOV        R3,#2CH      ;5.76毫秒*44=0.253秒
  223. DL05S1: LCALL      DISPLAY
  224.         DJNZ       R3,DL05S1
  225.         RET
  226. ;*******************************************
  227.               END
复制代码

完整的Word格式文档51黑下载地址:
基于DY-mini80单片机学习板_数码管时钟电路的设计.doc (208.5 KB, 下载次数: 4)




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表