预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10
亲,该文档总共11页,到这已经超出免费预览范围,如果喜欢就直接下载吧~
如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
用定时器中断设计秒表用数码管显示
用定时器中断设计秒表用数码管显示
//此秒表有时分秒和毫秒位,最多可以记小时,有暂停和继续计时功能,独立键盘上key1为暂停和继续键,key3为复位和开始计时键
//由于ms中断时间很短,所以如果中断和显示延迟关系处理不好,秒表走时不准,应注意
#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
ucharcodetable1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//时分秒的个位显示后带小数点
ucharms,s,m,h,count,count1;
sbitk1=P3^0;
sbitk3=P3^2;
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddisplays(uchartemp)//数码管动态显示秒位函数
{
ucharshi,ge,i;
i=0;
shi=temp/10;
ge=temp;
P0=0xef;
P1=table[shi];
delay(1);//必须要有延迟,动态扫描,为了不影响整个秒表八位数的扫描速率提高显示效果,延迟又不要太高,ms比较合适
P0=0xdf;
P1=table1[ge];
i=0;
delay(1);
}
voiddisplayms(uchartemp)//数码管动态显示毫秒位函数
{
ucharshi,ge,i;
i=0;
shi=temp/10;
ge=temp;
P0=0xbf;
P1=table[shi];
delay(1);
P0=0x7f;
P1=table[ge];
i=0;
delay(1);
}
voiddisplaym(uchartemp)//数码管动态显示分位函数
{
ucharshi,ge,i;
i=0;
shi=temp/10;
ge=temp;
P0=0xfb;
P1=table[shi];
delay(1);
P0=0xf7;
P1=table1[ge];
i=0;
delay(1);
}
voiddisplayh(uchartemp)//数码管动态显示小时位函数
{
ucharshi,ge,i;
i=0;
shi=temp/10;
ge=temp;
P0=0xfe;
P1=table[shi];
delay(1);
P0=0xfd;
P1=table1[ge];
i=0;
delay(1);
}
voidkeyscan()//键盘扫描函数
{
if(k1==0)
{
delay(5);
if(k1==0)//检测k1确实被按下防抖动
{
count++;
while(!k1);//检测松手
delay(1);//检测确实松手
while(!k1);
if(count==1)
TR0=0;//暂停定时器
if(count==2)
{
TR0=1;//定时器继续计时
count=0;
}
}
}
if(k3==0)
{
delay(5);
if(k3==0)
{
count1++;
while(!k3);
delay(1);
while(!k3);
if(count1==1)//复位秒表
{
TR0=0;
ms=0;
s=0;
m=0;
h=0;
}
if(count1==2)//重新开始计时
{
TR0=1;
count1=0;
}
}
}
}
voidmain()
{
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-10000)/256;//设定定时器初值
TL0=(65536-10000)%6;//12M晶振时ms数为
while(1)
{
keyscan();
displays(s);//数码管动态扫描秒位显示
displayms(ms);//数码管动态扫描毫秒位显示
displaym(m);//数码管动态扫描秒分显示
displayh(h);//数码管动态扫描秒小时显示
}
}
voidtimer0()interrupt1//中断服务程序
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%6;
ms++;
if(ms==100)//定时器中断次为s
{//把这部分放在中断中,能减少程序执行时间对中断时间的影响
ms=0;
s++;
if(s==60)
{
s=0;
m++;
}
if(m==60