找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7333|回复: 7
收起左侧

基于51单片机的99-00倒计时秒表

[复制链接]
ID:372070 发表于 2018-7-15 20:52 | 显示全部楼层 |阅读模式
;有位网友写了一个倒计时秒表的程序,程序中的变量,采用了逐次加一的方法。;变量加一,怎么能够倒计时呢?;原来,程序中段码的排列次序,反过来了。;于是:;当变量是0的时候,查找出来9的段码,送去显示;;当变量是1的时候,查找出来8的段码,送去显示;;……;当变量是9的时候,查找出来1的段码,送去显示。

;更改一下七段码表的次序,竟然可以使程序由正计时,变成倒计时!;构思极为巧妙。;PROTEUS 仿真截图如下:
11.png

;程序使用汇编语言编写,原程序的结构有些凌乱,没有达到预期的效果。;做而论道稍加整理,可以正常工作了,全部程序如下。;硬件中,设置了一个按键,用以控制计时器的启动、暂停和复位。

SECOND  EQU    30H
TCOUNT  EQU    31H
KCOUNT  EQU    32H
KEY     BIT    P3.7
    ORG   00H
    SJMP  START
    ORG   0BH
    LJMP  T0_INT
;----------------------------------------
START:
    MOV  P0, #6FH     ;开始, 数码管显示"99"
    MOV  P2, #6FH

    MOV  TMOD, #01H   ;T0定时方式1
    MOV  TH0, #(65536 - 50000) / 256
    MOV  TL0, #(65536 - 50000) MOD 256
    MOV  IE, #82H

    MOV  SECOND, #0
    MOV  TCOUNT, #0
    MOV  KCOUNT, #0
;----------------------------------------
K0:
    JB   KEY, $       ;等待按键按下
    CALL DELAY        ;延时
    JB   KEY, K0      ;没有按下,就是抖动
    JNB  KEY, $       ;等待按键松开
    INC  KCOUNT       ;按键次数值加1
;----------------------
    MOV  A, KCOUNT    ;判断按键次数
K1:
    CJNE A, #1, K2
    SETB TR0          ;第1次按键, 启动定时器
    JMP  K0
;----------------------
K2:
    CJNE A, #2, START
    CLR  TR0          ;第2次按键, 关闭定时器
    JMP  K0
;----------------------------------------
T0_INT:
    MOV  TL0, #(65536 - 50000) MOD 256
    MOV  TH0, #(65536 - 50000) / 256
    INC  TCOUNT
    MOV  A, TCOUNT
;    CJNE A, #2, T0_END ;是否计0.1秒?
    CJNE A, #10, T0_END ;2, 速度太快,不便观察,暂用10
    MOV  TCOUNT, #0
    INC  SECOND
    MOV  A, SECOND
    CJNE A, #100,  DISP ;是否够10秒?
    MOV  SECOND, #0
DISP:
    MOV  DPTR, #TABLE
    MOV  A, SECOND
    MOV  B, #10
    DIV  AB
    MOVC A, @A+DPTR     ;显示时间
    MOV  P0, A
    MOV  A, B
    MOVC A, @A+DPTR
    MOV  P2, A
T0_END:
    RETI        
;----------------------------------------
TABLE:
;9~0的段码, 反序排序。使用反序,可显示倒计时
    DB   6FH, 7FH, 07H, 7DH, 6DH
    DB   66H, 4FH, 5BH, 06H, 3FH
;0~9的段码, 正序
;    DB   3FH, 06H, 5BH, 4FH, 66H
;    DB   6DH, 7DH, 07H, 7FH, 6FH
;----------------------------------------
DELAY:
    MOV  R6, #20
D1: MOV  R7, #250
    DJNZ R7, $
    DJNZ R6, D1
    RET
;----------------------------------------
    END



回复

使用道具 举报

ID:308903 发表于 2018-7-16 16:59 | 显示全部楼层
用以控制计时器的启动、暂停和复位:::::::::::: 从上面程序分析,K0 是用来计数,K1 是用来启动定时器,K2是用来关掉定时器,那前面二次还好理解,第一次按下,计数一,且打开定时,也就是倒计时开始。那么第二次按下,计数二,并且关掉定时,那倒计时定住不走。 要是,到了第三次按下,计数清零,倒计时复位99...., 也就是说,暂停之后,不是继续倒计时,而是复位了了。

嗯准确点就是  启动,停止,复位。  三个功能

不知道分析的对不对,盯了一下午,眼花头晕了

评分

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

查看全部评分

回复

使用道具 举报

ID:308903 发表于 2018-7-16 08:37 | 显示全部楼层
我喜欢汇编....谢谢楼主
回复

使用道具 举报

ID:372341 发表于 2018-7-16 10:19 | 显示全部楼层
谢谢楼主
回复

使用道具 举报

ID:308903 发表于 2018-7-18 16:56 | 显示全部楼层
PS: 程序一个个打出来仿真了下,有个注意点提醒下在看的同学们:=======
TO_INT:
。。。。。。。。。

;    CJNE A, #2, T0_END ;是否计0.1秒?
    CJNE A, #10, T0_END ;2, 速度太快,不便观察,暂用10
。。。。。。。。。
========
这里面,选  CJNE A, #2, T0_END    才是按秒倒数,所以,用的时候,把前面的冒号去掉
下面那句, CJNE A, #10, T0_END    应该是放慢5倍来倒减,即5秒减一个数

另外,不知道为啥,个人遇到的问题,望知道的同学解惑下

MOV        TH0,#(65536 - 50000) / 256
MOV        TL0,#(65536 - 50000) MOD 256


赋初值 的语句,竟然在proteus 13 的自带软件中编译不了,而在KEIL 中可以编译





说超出范围...

说超出范围...

评分

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

查看全部评分

回复

使用道具 举报

ID:308903 发表于 2018-7-19 09:33 | 显示全部楼层
今天又重新仿真了下,发现,昨天说错了...., CJNE A, #2, T0_END  是记 0.1秒  CJNE A, #10, T0_END  记1秒....额,为啥呢,难道晶振选错了? 初值付错了?
回复

使用道具 举报

ID:308903 发表于 2018-7-19 09:54 | 显示全部楼层
但是,就个位在变,十位一直不动
回复

使用道具 举报

ID:741432 发表于 2020-5-13 11:39 | 显示全部楼层
tcount是代表什么?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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