您的位置 首页 基础

用定时器中止规划秒表 用数码管显现

此秒表有时分秒和毫秒位,最多可以记小时,有暂停和继续计时功能,独立键盘上key1为暂停和继续键,key3为复位和开始计时键由于ms中断时间

//此秒表有时分秒和毫秒位,最多能够记小时,有暂停和持续计时功用,独立键盘上key1为暂停和持续键,key3为复位和开端计时键

//因为ms中止时刻很短,所以假如中止和显现推迟联系处理欠好,秒表走时禁绝,应留意

#include

#defineucharunsignedchar

#defineuintunsignedint

uchar code table[]={0x 3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//时分秒的个位显现后带小数点

uchar ms,s,m,h,count,count1;

sbit k1=P3^0;

sbit k3=P3^2;

voiddelay(uint z)

{

uint x,y;

for(x=z;x>0;x–)

for(y=110;y>0;y–);

}

voiddisplays(uchar temp)//数码管动态显现秒位函数

{

uchar shi,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(uchar temp)//数码管动态显现毫秒位函数

{

uchar shi,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(uchar temp)//数码管动态显现分位函数

{

uchar shi,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(uchar temp)//数码管动态显现小时位函数

{

uchar shi,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() interrupt 1//中止服务程序

{

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)

{

m=0;

h++;

}

if(h==24)

{

h=0;

}

}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/jichu/256232.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部