标题: 秒表可以连续走到9999秒 [打印本页]
作者: 不倒翁.WZT 时间: 2016-11-29 11:06
标题: 秒表可以连续走到9999秒
秒表可以连续走到9999秒,到9999秒自动复位到0,重新计时可以按复位键或停止键。本程序经过上板实验,完全可靠。
- #include<reg51.h>
- #define GPIO_DIG P0
- #define GPIO_PLACE P1
- unsigned char code DIG_PLACE[4] = {0xfe,0xfd,0xfb,0xf7};//,0xef,0xdf,0xbf,0x7f};//位选控制 查表的方法控制
- unsigned char code DIG_CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- unsigned char DisplayData[8]; //用来存放要显示的8位数的值
- unsigned char Time; //用来存放定时时间
- unsigned int Second;
- /*********************使用数码管显示*******************/
- void DigDisplay()
- {
- unsigned char i;
- unsigned int j;
- for(i=0; i<8; i++)
- {
- GPIO_PLACE=DIG_PLACE[i]; //发送位选
- GPIO_DIG=DisplayData[i]; //发送段码
- j=10; //扫描间隔时间设定
- while(j--);
- GPIO_DIG=0x00; //消隐
- }
- }
- /*********************配置定时器************************/
- void Timer0init(void)
- {
- TMOD=0x01; //定时器0选择工作方式1
- TH0 =(65536-49550)/256; //设置初始值,定时50MS
- TL0 =(65536-49550)%256;
- EA =1; //打开总中断
- ET0 =1; //打开定时器0中断
- TR0 =1; //启动定时器0
- }
- /**********************主函数***************************/
- void main(void)
- {
- Timer0init();
- while(1)
- {
- if(Second>9999)
- {
- Second=0;
- }
- DisplayData[0]=DIG_CODE[(Second)/10000];
- DisplayData[1]=DIG_CODE[(Second)%1000/100];
- DisplayData[2]=DIG_CODE[(Second)%100/10];
- DisplayData[3]=DIG_CODE[(Second)%10];
- DigDisplay();
- }
- }
- /*******************定时器0中断函数**********************/
- void Timer0() interrupt 1
- {
- TH0=(65536-49550)/256; //设置初始值
- TL0=(65536-49550)%256;
- Time++;
- if(Time==40) //控制秒时间长短
- {
- Second++;
- Time=0;
- }
- }
复制代码
作者: wuyibin2003 时间: 2016-11-29 14:10
虽然不需要 但是还是要感谢楼主的奉献精神
作者: ljx199 时间: 2016-11-29 14:24
非常好
作者: zl2168 时间: 2016-11-29 14:43
本帖最后由 zl2168 于 2016-11-29 14:47 编辑
实例93 99.9秒秒表
先Proteus仿真一下,确认有效。
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,书中电路和程序设计有详细说明,电路与程序真实可靠可信可行,程序语句条条有注解。
若需99.99秒,硬件电路增加一位595。软件程序增加0.01s(10ms)计数器,并修改相应计数显示程序。
另外,显示也可改成I/O口直接驱动。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |