急求大神给答案..急急急

chenjun7418 2011-12-16 10:21:59
电子秒表设计:用四位LED数码管作显示器的电子秒表,计时精度为0.1秒,显示格式为:分一位,秒两位,十分之一秒一位,分和秒、秒和十分之一秒之间加小数点分隔。比如:5分27.3秒显示为:5.27.3。按一下按钮启动计时器每十分之一秒加一,再按一下该按钮停止计时,再按一下按钮,数字回到”0.00.0”,如此周而复始。(晶振频率为12MHz)
#include <REG51.H>
#define U8 unsigned char
U8 tab[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28};
U8 scn[]={0x7f,0xbf,0xdf,0xef};//先点亮左边一个数码管
U8 buf[4]={0,0,0,0};// 显示缓冲区,开机先显示"0000"
U8 cnt = 0; // 扫描计数
void main(void)
{ EA = 1; // 允许中断
TMOD = 0x01; // 设定时器0为模式1(16位)
ET0 = 1; // 定时器0中断允许
TH0 = 0xee; // 晶振11.0592MHz,5mS
TL0 = 0;
TR0 = 1; // 开始计数
while(1); // 死循环,等待中断
}
void timeint(void) interrupt 1 // 定时器0中断服务程序
{ char i;
TH0 = 0xee; // 设置定时器时间常数
TL0 = 0;
i = cnt & 0x03; // 求应点亮的LED号(从左到右依次为 0,1,2,3)
P0 = tab[buf[i]]; // 笔划代码送P0口
P2 = scn[i]; // 控制扫描码送P2口
if(cnt==200)
{ cnt=0; // 到1秒钟,显示的数字加一
for(i=3;i>=0;i--)
{ buf[i]++;
if(buf[i]==10) buf[i]=0;// 加到10向前进位
else break;
}
}
cnt++;
}
...全文
95 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wei1252542483 2011-12-19
  • 打赏
  • 举报
回复
你的晶振频率都不统一啊,那定时器时间常数就......我新手,不知道对不。

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧