找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5460|回复: 3
收起左侧

51单片机倒计时秒表/可调整时钟的Keil uVision4和Proteus 7.8仿真+汇编语言

[复制链接]
ID:739917 发表于 2020-6-20 11:09 | 显示全部楼层 |阅读模式
(1)控制功能:
启动/停止:秒表和时钟选择功能的总开关允许位。没按或偶次按下,关闭时钟和秒表功能选择。单次按下,允许进行秒表和时钟功能选择。
暂停:秒表或时钟的停止信号。任何时候按下按钮停止秒表倒计时或停止时钟计时和撤销报警信号。
复位:秒表和时钟复位信号。任何时候按下按钮秒表显示或时钟显示恢复初始状态:00.00.00.0
(2)调节功能:
通过6位按钮可以对数码的六位显示进行调整。任何时候都可以分别可以通过HHHLMHMLSHSL对时的十位、时的个位、分的十位、分的个位、秒的十位和秒的个位进行调节并设定。
(3)显示功能:
8个8段数码管进行显示。显示精度为0.01秒;最后一段数码管显示工作状态,“H”代表着是时钟,“E”代表着秒表倒计时。
按时、分、秒显示,采用24h制,如示数为10.05.22.5H”,时钟显示读数为100522.5示数为0.05.14.5E”,秒表倒计时显示,读数为514.5秒。
(4)秒表/时钟选择功能:
提供两种模式,秒表倒计时和是时钟计时。
通过TIMESECONDS按钮进行选择。

③两种模式初始状态都为00.00.00,倒计时可以使用调节按钮进行设定,时钟功能可以通过调节按钮进行调整时间。
(5)报警功能:
倒计时报警功能,倒计时结束时,报警信号发出,蓝色的LED亮。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
图片1.png

单片机源程序如下:
  1. /*-------------------------------------------------------------------------------------------*/
  2. /*-----------按键定义-----------*/
  3. STRT EQU P1.6        ;启动
  4. STP EQU P1.7        ;停止
  5. CLRR EQU P3.0        ;复位
  6. SELTS EQU P3.6         ;时钟
  7. SELTH EQU P3.7        ;秒表

  8. SECL EQU P1.0        ;秒个位
  9. SECH EQU P1.1        ;秒十位
  10. MINL EQU P1.2        ;分
  11. MINH EQU P1.3        ;
  12. HOURL EQU P1.4        ;时
  13. HOURH EQU P1.5        ;
  14. /*-------------------------------------------------------------------------------------------*/
  15. ORG 0000H
  16. SJMP MAIN
  17. ORG 000BH         ;T0定时器入口
  18. AJMP T0INT0        
  19. ORG 001BH         ;T1定时器入口
  20. AJMP T1INT1
  21. ORG 30H
  22. /*-------------------------------------------------------------------------------------------*/
  23. /*-----------初始化函数-----------*/
  24. MAIN:
  25.         MOV SP,#60H
  26.         MOV R4,#10        ;100ms;时钟
  27.         MOV R5,#10         ;100ms;秒表

  28.         MOV TMOD,#11H
  29.         MOV TL0,#(65535-7986)MOD 256;#9EH ;定时中断子程序。重装定时常数
  30.         MOV TH0,#(65535-7986)/256;#58H ;10ms

  31.         MOV TL1,#(65535-7986)MOD 256;#9EH ;定时中断子程序。重装定时常数
  32.         MOV TH1,#(65535-7986)/256;#58H ;10ms
  33. /*-------------------------------------------------------------------------------------------*/
  34. /*-----------调节按键检测-----------*/
  35. KSL:
  36.         LCALL DISP ;秒个调整按键
  37.         JB SECL,KSH          ;没有按下的处理,即SECL为高电平。
  38.         LCALL DISP
  39.         JNB SECL,$-3  ;消除抖动
  40.         AJMP SINCL
  41. KSH: LCALL DISP ;秒10调整按键
  42.         JB SECH,KML
  43.         LCALL DISP
  44.         JNB SECH,$-3
  45.         AJMP SINCH
  46. KML: JB MINL,KMH ;分个调整按键
  47.         LCALL DISP
  48.         JNB MINL,$-3
  49.         AJMP MINCL
  50. KMH: JB MINH,KHL ;分10调整按键
  51.         LCALL DISP
  52.         JNB MINH,$-3
  53.         AJMP MINCH
  54. KHL:
  55.         JB HOURL,KHH ;时个调整按键
  56.         LCALL DISP
  57.         JNB HOURL,$-3
  58.         AJMP HINCL
  59. KHH: JB HOURH,K1 ;时10调整按键
  60.         LCALL DISP
  61.         JNB HOURH,$-3
  62.         AJMP HINCH
  63. /*-------------------------------------------------------------------------------------------*/
  64. /*-----------调节按键处理-----------*/                        
  65. SINCL:                           /*秒的数据处理*/
  66.         INC 20H  ;秒个位的调整 +1
  67.         MOV A,20H
  68.         CJNE A,#10,SINC0L   ;
  69.         MOV 20H,#0        ;满10的处理
  70. SINC0L: AJMP KSL           ;返回KSL按键处理
  71. SINCH:
  72.         INC 21H
  73.         MOV A,21H
  74.         CJNE A,#6,SINC0H   ;60s
  75.         MOV 21H,#0
  76. SINC0H: AJMP KSH
  77. MINCL:                                 /*分的数据处理*/
  78.         INC 22H ;分调整                  
  79.         MOV A,22H
  80.         CJNE A,#10,MINC0L        ;60min
  81.         MOV 22H,#0
  82. MINC0L: AJMP KML
  83. MINCH:
  84.         INC 23H ;分调整
  85.         MOV A,23H
  86.         CJNE A,#6,MINC0H        ;60min
  87.         MOV 23H,#0
  88. MINC0H: AJMP KMH
  89. HINCL:                           /*时的数据处理*/
  90.         MOV A,25H        ;时调整                    
  91.         CJNE A,#2,LH1   ;时的十位不满2时的处理
  92.         INC 24H         ;时 >20h
  93.         MOV A,24H
  94.         CJNE A,#4,HINC0L        ;是否到达24                 
  95.         MOV 24H,#0 ;时到24后,数码管清零
  96. HINC0L: AJMP KHL
  97. LH1:               
  98.         INC 24H ;时<20h
  99.         MOV A,24H
  100.         CJNE A,#10,HINC0L  ;24h
  101.         MOV 24H,#0
  102. HINCH:
  103.         INC 25H ;时调整
  104.         MOV A,25H
  105.         CJNE A,#3,HINC0H  ;24h
  106.         MOV 25H,#0
  107. HINC0H: AJMP KHH
  108. /*-------------------------------------------------------------------------------------------*/  
  109. /*-----------控制按键扫描-----------*/
  110. K1: LCALL DISP ;开始键
  111.         JB STRT,K2 ;
  112.         LCALL DISP
  113.         JNB STRT,$-3
  114.         AJMP START
  115. K2: JB STP,K3 ;暂停键
  116.         LCALL DISP
  117.         JNB STP,STOP   ;消抖处理
  118. K3:
  119.         JB CLRR,K4        ;没有按下,转到K4
  120.         LCALL DISP
  121.         JNB CLRR,CLEAR ;清零键
  122.         AJMP KSL           
  123. K4:
  124.         JB SELTS,K5        ;没有按下,返回数码按键监测
  125.         LCALL DISP
  126.         JNB SELTS,SELTHC ;模式切换
  127. K5:
  128.         JB SELTH,TOKSL        ;没有按下,返回数码按键监测
  129.         LCALL DISP
  130.         JNB SELTH,SELTSC ;模式切换
  131.         AJMP KSL               
  132. TOKSL:
  133.         AJMP KSL
  134. /*-------------------------------------------------------------------------------------------*/
  135. /*-----------控制按键处理-----------*/
  136. START:
  137.         ;打开中断总开关
  138.         CPL EA
  139.         AJMP K1
  140. STOP:
  141.         CLR TR0 ;暂停
  142.         CLR TR1
  143.         SETB P1.6;停止报警
  144.         AJMP K2
  145. CLEAR:
  146.         CLR TR0 ;清零
  147.         CLR TR1
  148.         MOV A,#0
  149.         MOV 20H,A
  150.         MOV 21H,A
  151.         MOV 22H,A
  152.         MOV 23H,A
  153.         MOV 24H,A
  154.         MOV 25H,A

  155.         MOV 26H,A
  156.         MOV 27H,A

  157.         AJMP K3
  158. SELTHC: ;时钟模式选择
  159.         SETB TR0
  160.         SETB ET0
  161.         CLR ET1
  162.         CLR TR1
  163.         AJMP K4
  164. SELTSC:        ;秒表模式选择
  165.         SETB TR1
  166.         SETB ET1
  167.         SETB P3.1;清除报警灯
  168.         CLR ET0
  169.         CLR TR0
  170.         AJMP K5
  171. /*-------------------------------------------------------------------------------------------*/
  172. /*---------T0中断处理---------*/
  173. T0INT0:
  174.         MOV TL0,#(65535-7986)MOD 256;#9EH ;定时中断子程序。重装定时常数
  175.         MOV TH0,#(65535-7986)/256;#58H ;10ms        
  176.         DJNZ R4,T0INTR ;10msX10=0.1S,未满20次,跳出中断子程序

  177.         MOV R4,#10
  178.         MOV 26H,#76H;最后一位指定显示H

  179.         INC 27H  ;1S,秒存储单元内数+1
  180.         MOV A,27H
  181.         CJNE A,#10,T0INTR  ;未满10S,跳出中断,返回显示。;满10s,往下执行清零处理,十位+1                                                
  182.         MOV 27H,#0  ;满60S,秒单元清零

  183.         INC 20H  ;1S,秒存储单元内数+1
  184.         MOV A,20H
  185.         CJNE A,#10,T0INTR  ;未满10S,跳出中断,返回显示。;满10s,往下执行清零处理,十位+1                                                
  186.         MOV 20H,#0  ;满60S,秒单元清零
  187.                     ;秒十位+1
  188.         INC 21H ;秒10位
  189.         MOV A,21H
  190.         CJNE A,#6,T0INTR  ;6
  191.         MOV 21H,#0

  192.         INC 22H  ;分个+1
  193.         MOV A,22H
  194.         CJNE A,#10,T0INTR
  195.         MOV 22H,#0

  196.         INC 23H  ;分十+1
  197.         MOV A,23H
  198.         CJNE A,#6,T0INTR
  199.         MOV 23H,#0

  200.         MOV A,25H           
  201.         CJNE A,#2,L1   ;时的十位不满2时的处理
  202.         ;时的十位满2的处理
  203.         INC 24H
  204.         MOV A,24H
  205.         CJNE A,#4,T0INTR        ;是否到达24
  206.                          ;时到24后,数码管清零         
  207.         MOV A,#0
  208.         MOV 20H,A
  209.         MOV 21H,A
  210.         MOV 22H,A
  211.         MOV 23H,A
  212.         MOV 24H,A
  213.         MOV 25H,A
  214.         RETI
  215.         ;子程序                                
  216. L1:        INC 24H
  217.         MOV A,24H
  218.         CJNE A,#10,T0INTR
  219.         MOV 24H,#0         ;时的个位清零
  220.         INC 25H         ;时的十位+1
  221.         MOV A,28H
  222. T0INTR: RETI

  223. /*-------------------------------------------------------------------------------------------*/
  224. /*-----------T1中断处理-----------*/
  225. T1INT1:
  226.         MOV TL1,#(65535-7986)MOD 256;#9EH ;定时中断子程序。重装定时常数
  227.         MOV TH1,#(65535-7986)/256;#58H ;10ms        
  228.         DJNZ R5,T0INTR        ;不满10次,跳转
  229.         MOV R5,#10
  230.         MOV A,27H
  231.         CJNE A,#0,TLSL;判断0.01s是否为0

  232.         MOV A,20H
  233.         CJNE A,#0,TSL  ;判断秒的个位是否为0
  234.         MOV A,21H
  235.         CJNE A,#0,TSH  ;判断秒的十位是否为0
  236.         MOV A,22H
  237.         CJNE A,#0,TML  ;判断分的个位是否为0
  238.         MOV A,23H
  239.         CJNE A,#0,TMH  ;判断分的十位是否为0
  240.         MOV A,24H
  241.         CJNE A,#0,THL  ;判断时的个位是否为0
  242.         MOV A,25H
  243.         CJNE A,#0,THH  ;判断时的十位是否为0

  244.         CLR P3.1  ;计时结束的标志

  245.         RETI;返回中断处

  246. TLSL:        ;0.01s不为0,进行-1
  247.         DEC 27H
  248.         MOV 26H,#79H;最后一位指定显示E
  249.         RETI
  250. TSL:         ;秒个位不为0,进行-1
  251.         DEC 20H
  252.         MOV 26H,#79H;最后一位指定显示E
  253.         MOV 27H,#9
  254.         RETI
  255. TSH:        ;秒十位不为0,进行-1,个位为9
  256.         DEC 21H
  257.         MOV 26H,#79H;最后一位指定显示E
  258.         MOV 27H,#9
  259.         MOV 20H,#9        
  260.            RETI
  261. TML:
  262.         DEC 22H
  263.         MOV 26H,#79H;最后一位指定显示E
  264.         MOV 27H,#9
  265.         MOV 21H,#5
  266.         MOV 20H,#9
  267.         RETI
  268. TMH:
  269.         DEC 23H
  270.         MOV 26H,#79H;最后一位指定显示E
  271.         MOV 27H,#9
  272.         MOV 22H,#9
  273.         MOV 21H,#5
  274.         MOV 20H,#9
  275.         RETI
  276. THL:
  277.         DEC 24H
  278.         MOV 26H,#79H;最后一位指定显示E
  279.         MOV 27H,#9
  280.         MOV 23H,#5
  281.         MOV 22H,#9
  282.         MOV 21H,#5
  283.         MOV 20H,#9
  284.         RETI                                                        
  285. THH:        
  286.         DEC 25H
  287.         MOV 26H,#79H;最后一位指定显示E
  288.         MOV 27H,#9
  289.         MOV 24H,#9
  290.         MOV 23H,#5
  291.         MOV 22H,#9
  292.         MOV 21H,#5
  293.         MOV 20H,#9
  294.         RETI
  295. /*-------------------------------------------------------------------------------------------*/
  296. /*-----------显示处理-----------*/
  297. DISP:
  298.         MOV A,26H  
  299.         MOV P0,A         ;显示
  300.         CLR P2.0
  301.         ACALL DLY
  302.         SETB P2.0
  303.         MOV A,27H  ;0.1S
  304.         ACALL SEG7
  305.         MOV P0,A
  306.         CLR P2.1
  307.         ACALL DLY
  308.         SETB P2.1

  309.         MOV A,20H  ;秒个位
  310.         ACALL SEG7
  311.         MOV P0,A         ;显示秒个位
  312.         SETB P0.7
  313.         CLR P2.2
  314.         ACALL DLY
  315.         SETB P2.2
  316.         MOV A,21H  ;秒十位
  317.         ACALL SEG7
  318.         MOV P0,A
  319.         CLR P2.3
  320.         ACALL DLY
  321.         SETB P2.3
  322.         MOV A,22H  ;分个位
  323.         ACALL SEG7
  324.         MOV P0,A
  325.         SETB P0.7
  326.         CLR P2.4
  327.         ACALL DLY
  328.         SETB P2.4
  329.         MOV A,23H  ;分十位
  330.         ACALL SEG7
  331.         MOV P0,A
  332.         CLR P2.5
  333.         ACALL DLY
  334.         SETB P2.5
  335.         MOV A,24H  ;时个位
  336.         ACALL SEG7
  337.         MOV P0,A
  338.         SETB P0.7
  339.         CLR P2.6
  340.         ACALL DLY
  341.         SETB P2.6
  342.         MOV A,25H  ;时十位
  343.         ACALL SEG7
  344.         MOV P0,A
  345.         CLR P2.7
  346.         ACALL DLY
  347.         SETB P2.7
  348.         RET
  349. /*-------------------------------------------------------------------------------------------*/
  350. /*-----------延时部分-----------*/
  351. DLY10:  MOV R3,#30
  352. D0: ACALL DLY
  353.         DJNZ R3,D0
  354.         RET
  355. DLY: MOV R7,#2
  356. D1: MOV R6,#40
  357.         DJNZ R6,$
  358.         DJNZ R7,D1
  359.         RET
  360. /*-------------------------------------------------------------------------------------------*/
  361. /*-----------数码管段值-----------*/
  362. SEG7:
  363.         INC A
  364.         MOVC A,@A+PC
  365.         RET
  366.         DB                 03FH  ;0  共阴
  367.         DB      006H  ;1
  368.         DB      05BH  ;2
  369.         DB      04FH  ;3
  370.         DB      066H  ;4
  371.         DB      06DH  ;5
  372.         DB      07DH  ;6
  373.         DB      007H  ;7
  374.         DB      07FH  ;8
  375.         DB      06FH  ;9
  376. END
复制代码

全部资料51hei下载地址:
秒表 时钟.zip (121.36 KB, 下载次数: 163)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:739917 发表于 2020-6-20 11:11 | 显示全部楼层
(1)控制功能: ①启动/停止:秒表和时钟选择功能的总开关允许位。没按或偶次按下,关闭时钟和秒表功能选择。单次按下,允许进行秒表和时钟功能选择。 ②暂停:秒表或时钟的停止信号。任何时候按下按钮停止秒表倒计时或停止时钟计时和撤销报警信号。 ③复位:秒表和时钟复位信号。任何时候按下按钮秒表显示或时钟显示恢复初始状态:00.00.00.0 。 (2)调节功能: 通过6位按钮可以对数码的六位显示进行调整。任何时候都可以分别可以通过HH、HL、MH、ML、SH、SL对时的十位、时的个位、分的十位、分的个位、秒的十位和秒的个位进行调节并设定。 (3)显示功能: 同8个8段数码管进行显示。显示精度为0.01秒;最后一段数码管显示工作状态,“H”代表着是时钟,“E”代表着秒表倒计时。 按时、分、秒显示,采用24h制,如示数为“10.05.22.5H”,时钟显示读数为10时05分22.5秒。示数为“0.05.14.5E”,秒表倒计时显示,读数为5分14.5秒。 (4)秒表/时钟选择功能: ①提供两种模式,秒表倒计时和是时钟计时。 ②通过TIME和SECONDS按钮进行选择。 ③两种模式初始状态都为00.00.00,倒计时可以使用调节按钮进行设定,时钟功能可以通过调节按钮进行调整时间。 (5)报警功能: 倒计时报警功能,倒计时结束时,报警信号发出,蓝色的LED亮。
回复

使用道具 举报

ID:796082 发表于 2020-7-2 21:54 | 显示全部楼层
楼主你好,请问设初值这里,7986是怎么来的?求解?
MOV TL0,#(65535-7986)MOD 256;#9EH ;定时中断子程序。重装定时常数
MOV TH0,#(65535-7986)/256;#58H ;10ms
回复

使用道具 举报

ID:739917 发表于 2020-7-7 22:47 | 显示全部楼层
本帖最后由 3031361628 于 2020-7-7 22:50 编辑
礼貌问好 发表于 2020-7-2 21:54
楼主你好,请问设初值这里,7986是怎么来的?求解?
MOV TL0,#(65535-7986)MOD 256;#9EH ;定时中断子程序 ...

这里如果要按晶振12MHZ理论精确计算 (一个机器周期的耗时为1us的话),实际程序应格是:
MOV TL0,#(65535-10000)MOD 256  ; 余数为计数初值的低字节
MOV TH0,#(65535-10000)/256  ;商为计数初值的高字节
可是实际上程序运行多少会有一点误差,就需要不断地对定时器初始值调试,直到调到自己合适的。
*************这部分可以自行修改初始值******************
MOV TL0,#(65535-7986)MOD 256;#9EH ;定时中断子程序。重装定时常数
MOV TH0,#(65535-7986)/256;#58H ;10ms
*****************************************************
而上面提供的电路的晶振是11.0592MHZ的,程序写的也比较冗余了一点,多少也会有一点误差。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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