找回密码
 立即注册

QQ登录

只需一步,快速开始

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

帮我做一个秒表的程序!

[复制链接]
跳转到指定楼层
楼主
1、AT89C51 单片机
2、独立式按键 (用到key0和key1 两个按键)
3、7段六位共阴极数码管(7seg-mpx6-cc)

秒表程序要求(C语言)
1、显示时间为 00.00~99.99s,每0.01s自动加1.
2、上电时 显示 00.00。
3、设置功能键 K1,当按下该功能键,依次实现秒表的 启动→暂停→复位→启动→·······
4、设置功能键 K2,在复位状态下按下该键,能循环显示最近三次的计时值。(比如 K1暂停的值是00.20,按下K2则显示00.20,延时1s后,显示00.19,再延时1s后,显示00.18)

要一个C语言程序(最好有解释)和一个protues仿真图,原理图。

评分

参与人数 1黑币 +4 收起 理由
1274257385 + 4 赞一个!

查看全部评分

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

使用道具 举报

沙发
ID:124702 发表于 2016-6-2 15:57 | 只看该作者
哥们,这个太简单,你自己花点时间写下啊,不要太懒,学习也是种乐趣,祝你成功
回复

使用道具 举报

板凳
ID:123241 发表于 2016-6-2 16:49 | 只看该作者
张三丰 发表于 2016-6-2 15:57
哥们,这个太简单,你自己花点时间写下啊,不要太懒,学习也是种乐趣,祝你成功

我写了,但是k2功能实现不了,不知道怎么弄。还有仿真图不会,没学过
回复

使用道具 举报

地板
ID:111634 发表于 2016-6-2 17:32 | 只看该作者
本帖最后由 zl2168 于 2016-6-2 17:37 编辑

实例93    99.9秒秒表

Proteus仿真一下,盼挑刺、盼质疑、盼比较。


实例95 99.9秒秒表.rar (38.86 KB, 下载次数: 91)





回复

使用道具 举报

5#
ID:111634 发表于 2016-6-2 17:40 | 只看该作者
以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版
回复

使用道具 举报

6#
ID:111634 发表于 2016-6-2 17:46 | 只看该作者
本帖最后由 zl2168 于 2016-6-2 17:48 编辑

⒈ 99.9秒秒表电路设计






设计99.9秒秒表电路如8-15所示,该电路与上例相似,删除3位显示、2个校正按键和4个秒闪烁发光二极管,就组成了99.9秒秒表电路。
80C51 RXD与控制秒十位输出显示的74HC595 DS端连接,595串行输出端QS与下一595串行输入端DS端连接,595并行输出端Q0Q7与数码管笔段agDp端连接,依次输出3秒数据;小数点固定在第2位,通过电阻接地;TXD3595 CLK端连接,串行输出时钟脉冲,控制595串行移位;P1.73595 RCK端连接,控制输出触发595片内缓冲寄存器中数据进入输出寄存器的正脉冲;K0连接,按下K0,触发中断,控制秒表快速响应,立即计时
回复

使用道具 举报

7#
ID:111634 发表于 2016-6-2 17:50 | 只看该作者
本帖最后由 zl2168 于 2016-6-2 17:57 编辑

99.9秒秒表程序设计



fosc=6MHz,按8-15电路,要求一键三用:按第一次,秒表运行计时,最大计时99.9s,超过复0按第二次,秒表停运行,但保持最后显示秒数。按第三次,秒表清0


T0定时器方式2定时500ms,计数200,即为0.1s,作为秒表最小计时单位。


T0初值=28 -500ms/2ms=256–250=6。因此,TH0 =TL0 = 06H





99.9秒秒表程序1.jpg (307.81 KB, 下载次数: 98)

99.9秒秒表程序1.jpg
回复

使用道具 举报

8#
ID:111634 发表于 2016-6-2 18:07 | 只看该作者
若需99.99秒,硬件电路增加一位595。软件程序增加0.01s(10ms)计数器,并修改相应计数显示程序。
回复

使用道具 举报

9#
ID:111634 发表于 2016-6-3 12:42 | 只看该作者
请问慌张:“.....................”是什么意思?
回复

使用道具 举报

10#
ID:123289 发表于 2016-6-3 22:37 | 只看该作者
1,数码管 一个段的电流在3-20mA,通常取10mA,8个段全亮时,共同极上有80mA.
2,AT89C51的引脚的IO低电平时可以吸收24mA,而高电平却不能提供超过4mA的电流(更精确请查手册)
3,所以建议:采用共阳的LED,这个可以直接驱动!用P1.0-P1.7接LED的A,B,C,D,E,F,G,H(第1、3、4的H【小数点】段不用,第2个用)的8个段,并串接8个电阻(每脚一个)。
4,多个LED可以用扫描显示的方式进行显示,即每个时刻只显示一个LED,其它的LED不显示,快速的切换各个LED(通过对阳极的供电与否),由于人眼有视觉残留,所以看不出来是逐个显示的。所以将每个LED的A与A,B与B……G与G并在一齐。第二个LED的H单独占用一个IO口。
5、共阳极必须分别驱动,又因为最大驱动电流是80mA,所以需要加三极管放大电流,这里可以用NPN的三极管:如5551,9013等等。采用射极跟随器的接法:三极管的B接IO口,如P3.x(P3.0-P3.3共4个);E接LED的阳极,C可以直接接电源5V.
4个LED用4个端口,4个三极管。
注意:P0口是OC输出,无驱动能力,不能直接用。如果必须用P0口,需要加上拉电阻。
6、电阻的计算:设LED的红色,其管压降为1.4V(绿色为1.7V,建议查手册),IO口低电平电压取0.3V,小计压损为1.4+0.3=1.7V。共阳的扩流三极管基极压降0.7V,IO输出高电平取4.5V。这样加在电阻上的电压为:
4.5-0.7-1.7=2.1V。所以R=2.1V/10mA=210欧(串在P1口上的8个电阻)。如果LED的段的合成的(多个串)请自行修正。
回复

使用道具 举报

11#
ID:123289 发表于 2016-6-3 22:45 | 只看该作者
显示软件部分:
1、取4个RAM单元(编号X0至X3)对应存放4个LED的显示内容(这里是0亮1灭,共阳LED)。
2、取一个单元做计数器K,从0至3循环计数,分别对应显示4个LED。
3、做一个时间中断(如5ms中断一次),每次将K+1,同时做如下动作:(注:当K=4时清K=0。)
4、当K=0时让第1个LED的阳极为1;其余LED的阳极为0,并将X0中的数据送入P1口,即显示第0个LED。以此类推:当K=3时让第4个LED的阳极为1;其余LED的阳极为0,并将X3中的数据送入P1口,即显示第4个LED。注意:一定要先关所有的阳极,再开某一个阳极,否则会有切换闪动。
如此每次中断间隔5ms会切换一个LED显示,人眼是看不出来的。
5、再取2个RAM单元(编号S、m)对应存秒、毫秒时间,再做一个10毫秒标记T(=0或1),每次中断将T求反(0与1互变),当T=1时,将m+1,m=100时:将m清0,S+1,当S=100时将S清0。当T=0时,不做时间处理(S,m不变)。由于是5ms中断一个,所以每次T=1时是0.01秒。如果中断改为10ms则可以不要T,但显示会有闪烁感!经验:4位LED扫描,小于6ms就有闪烁感。
S,m最好用十进制,即每次ADD A,#1;时再做DAA调整,然后再将A送入S或m,当时间有变动时,需将S高四位,低四位,m的高四位,低四位进行LED译码,分别送入X0-X3。
6、译码方法:做一个表(从某个单元起放10个LED的显示码,分别显示:0,1,2......9的LED段码),例如:取S高四位,=几,就取表中的第几个数送入X0。
回复

使用道具 举报

12#
ID:123289 发表于 2016-6-3 23:22 | 只看该作者
启动→暂停→复位→启动→·······
有三个状态循环,所以要增加的个计数器J,J=0,1,2。
起始J=0。【完成上电时 显示 00.00】
每按一次K1,J+1。(这时有防弹动问题,由于0.01秒的计时【4位LED】,编程有技巧,这里不述。)
当J=3时清J=0。
当J=2时禁止对S、m计时;【完成暂停】
当J=1时允许对S、m计时;【完成启动】
当J=0时禁止对S、m计时并清S=0、m=0。【完成复位】
回复

使用道具 举报

13#
ID:123289 发表于 2016-6-3 23:42 | 只看该作者
能循环显示最近三次的计时值
需要有三个记录时间的地方:增开6个单元:
S1、m1(存最近一次的时间记录),
S2、m2(存再上一次的时间记录),
S3、m3(存再再上一次的时间记录)。
每次J=2时【暂停】时:
将S2、m2存入S3、m3;
将S1、m1存入S2、m2;
将S、m存入S1、m1;
回复

使用道具 举报

14#
ID:123289 发表于 2016-6-3 23:54 | 只看该作者
在复位状态下按下K2:
这里需要增设一个一秒计时器P,P=0-199。
当J=0时【复位状态】时,每中断一次(5ms中断一次),P+1,当P+1=200时,即1秒到,清P=0,并做下列事件:
将S1、m1存入S、m;
将S2、m2存入S1、m1;
将S3、m3存入S2、m2;
将S、m存入S3、m3;
因为中断程序一直是在扫描显示S、m的,所以每秒切换显示被实现。
回复

使用道具 举报

15#
ID:123289 发表于 2016-6-3 23:59 | 只看该作者
如果中断时间改为10ms则T可以不要,但LED显示会有闪烁感。
经验:4位LED在扫描时间小于6ms时,会有闪烁感,因人而异。
回复

使用道具 举报

16#
ID:123289 发表于 2016-6-4 00:04 | 只看该作者
硬件上:LED数码管不加电阻直接驱动,是不安全的,LED是非线性二极管特性,会产生大电流。
轻则发热,重则由于电流增大,影响系统或烧坏IC或LED。
回复

使用道具 举报

17#
ID:123289 发表于 2016-6-4 00:12 | 只看该作者
楼上参考图:
会多用4颗驱动IC(每个LED一个),不经济,也占线路板面积。
如果各段再增加限流电阻的话,会再多用3*7个电阻。

回复

使用道具 举报

18#
ID:160673 发表于 2017-1-7 22:58 | 只看该作者
zl2168 发表于 2016-6-2 17:32
实例93    99.9秒秒表

先Proteus仿真一下,盼挑刺、盼质疑、盼比较。

请问一下c程序有吗
回复

使用道具 举报

19#
ID:85726 发表于 2017-1-8 10:39 | 只看该作者
大神们的资料够多的了!至于K2循环显示最近三次的计时值这一块,程序里可以这样编写:K1实现三个功能,也就是要设定一个变量,比如keynum,启动=1,暂停=2.复位=3,那么keynum=2可以每次暂停的时候把计时值赋给一个数组!等到你K2按下时再调用数组的值即可!(个人理解)
回复

使用道具 举报

20#
ID:111634 发表于 2017-1-8 13:29 | 只看该作者
贤者 发表于 2017-1-7 22:58
请问一下c程序有吗

仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。
回复

使用道具 举报

21#
ID:782295 发表于 2020-6-17 22:22 | 只看该作者
哥,我想问一下你这本书的电子版在哪找的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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