单片机秒表复位程序如何写???

2025-03-04 15:43:33
推荐回答(3个)
回答1:

秒表就是一个计时的工具,为了保证精确度,一般显示秒后面两位,就是10ms位,在单片机定时器中,赋初值1ms,变量不停的累加上去, 累加到10的时候,秒表加1,就是10ms了,
复位就是对秒表的数据进行清零重置,这时就需要一个按键来进行人机交互功能了,这时候就要考虑有几个按键了,一般的秒表设计的时候有两个按键,一个进行启动停止,一个进行清零;
1.启动和停止,启动停止的按键,就是按一下让标志位取反一次,
bit flag =0;
if(Key ==0)
{
delay(); //延时10ms;这个程序比较常见,就不写出来了

if(key == 0)

{
flag = !flag; //消抖后检测到按键还是按下状态,就把标志位取反;

while(!Key); //等待松手
}

}
同时在定时器中断里, 根据标志位对 及时变量进行累加
if(flag)

{
t++;

if(t >= 10)

{
t = 0;

ms++;

}

}

就这样 标志位就表示的秒表启动停止的,

2 。 复位,复位顾名思义就是 返回到初始状态,就是0 ; 一般复位是在秒表停止的状态对秒表进行清零;
先在主程序里检测按键

bit clc = 0;
if(key1 == 0)
{
delay(); // 延时10ms

if(Key1 == 0)

{
clc = 1;

while(!Key1); //等待松手

}
}

然后在定时器中断里进行对变量的数值进行清零
if(!flag ) //在停止状态
{
if(clc)

{
ms = 0;

clc = 0;
}
}
到此 秒表的启动停止 和复位就完成了 ,

回答2:

归零吗?直接把累计的变量置零就可以了

希望帮到你, 

增加S4和复位标志Reset 

我没有测试,相信你会调试好的,加油!

 #include

#define uchar unsigned char

sbit dula=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
sbit S2=P3^0;
sbit S3=P3^1;
sbit S4=Px^x;

unsigned char halt,j,k,a1,a0,b1,b0,c1,c0,s,f,m,n=255,Reset=0;
unsigned int pp;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void delay(unsigned char i)
{
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}

void display(uchar shi2,uchar shi1,uchar fen2,uchar fen1,uchar miao2,uchar miao1)
{
   dula=0;
   P0=table[shi2];
   dula=1;
   dula=0;
   
   wela=0;
   P0=0xfe;
   wela=1;
   wela=0;
   delay(5);
   
   P0=table[shi1]|0x80;
   dula=1;
   dula=0;
   
   P0=0xfd;
   wela=1;
   wela=0;
   delay(5);

   P0=table[fen2];
   dula=1;
   dula=0;
   
   P0=0xfb;
   wela=1;
   wela=0;
   delay(5);
   
   P0=table[fen1]|0x80;
   dula=1;
   dula=0;
   
   P0=0xf7;
   wela=1;
   wela=0;
   delay(5);
   
   P0=table[miao2];
   dula=1;
   dula=0;
   
   P0=0xef;
   wela=1;
   wela=0;
   delay(5);
   
   P0=table[miao1];
   dula=1;
   dula=0;
   
   P0=0xdf;
   wela=1;
   wela=0;
   delay(5);
}

void keyscan()
{
if(S2==0)
delay(10);
if(S2==0)
{
halt=1;
}
if(S3==0)
halt=0;

if(S4==0)//复位按键
{
Reset=1;
}  
}

void main()
{
TMOD=0x01;
TR0=1;
TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
ET0=1;
EA=1;
while(1)
{ keyscan();
if(halt==0)
{
TR0=1;
if(pp==20)
{ pp=0;
m++;
n--;
P1=n;//闪烁灯
if(m==60)
{
m=0;
f++;
if(f==60)
{
f=0;
s++;
if(s==99)
{
s=0;
}
}
}
}
a0=s%10;
a1=s/10;
b0=f%10;
b1=f/10;
c0=m%10;
c1=m/10;
display(a1,a0,b1,b0,c1,c0);
}
else if(Reset==1)
{
Reset=0;
TR0=0;
s=0;
m=0;

a0=s%10;
a1=s/10;
b0=f%10;
b1=f/10;
c0=m%10;
c1=m/10;
display(a1,a0,b1,b0,c1,c0);
}
else
{
TR0=0;
display(a1,a0,b1,b0,c1,c0);
}

}
}

void time0() interrupt 1
{TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
pp++;
}

回答3:

#include
unsigned char msec,sec;
void delay(unsigned char i)
{
unsigned int j,k;
for(k=0;k for(j=0;j<255;j++);
}
void To_INT(void) interrupt 1
{
TH0=0x3c;
TL0=0xb0;
msec++;
if(msec==20)
{
msec=0;
sec++;
if(sec==60)
{
sec=0;
}
}
}
void main()
{
unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
TMOD=0x01;
TH0=0x3C;
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
while(1)
{
P2=0x01;
P1=led[sec%10];
delay(10);
P2=0x02;
P1=led[sec/10];
delay(10);
}
我觉得这样就行了吧,其他的程序做什么用的?