标题: 51单片机定时器中断做10.00s的秒表,if(b==50)段的代码位置不同结果出错 [打印本页]

作者: 王可乐_    时间: 2020-1-25 16:17
标题: 51单片机定时器中断做10.00s的秒表,if(b==50)段的代码位置不同结果出错
各位大神新年好,TH0,TL0初始化是一定要放在while(1)里面吗?我在网上查一般是放while外面的,我写的也是放外面,但是出错了,如果放while(1)里面就是正确的,请问为什么?调试的时候发现TH0.TL0好像不会重置一样,就是if (b==50)下面的那段,如果放在中断函数里就是正确的,放主函数里是错的,假如把TH0.TL0初值改大了,比如1000,就是对的,请问一下是为什么?是因为什么错过了检测b==50的时间吗?

单片机源程序如下:
#include<reg52.h>
char code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90};
int bai,shi,ge,b=0,temp=0;
sbit S1=P3^5;
void main()
{
TMOD=0x01;
TH0=(65536-200)/256;
TL0=(65536-200)%256;
EA=1;
ET0=1;
TR0=1;

while(1)
{
  

    bai=temp/100;
   shi=temp/10%10;
   ge=temp%10;
   
   P2=0xfe;
   P0=table[bai]&0x7f;
   P0=0xff;
   P2=0xfd;
   P0=table[shi];
   P0=0xff;
   P2=0xfb;
   P0=table[ge];
   P0=0xff;
   
   if(b==50)
{

temp++;
b=0;
}
if(temp==999)
  temp=0;
  
   }

   
}
void Timer0() interrupt 1
{
TH0=(65536-200)/256;
TL0=(65536-200)%256;
b++;
  
}



作者: 王可乐_    时间: 2020-1-25 20:58
已经解决,因为延时的计数判断放主循环导致b的判断与定时器相加不同步
作者: Dtrahon    时间: 2020-1-26 02:22
好神奇 ,占个沙发坐等大神。你的代码我赋值了一下 中断子程序哪里报错了
作者: 王可乐_    时间: 2020-1-26 19:31
Dtrahon 发表于 2020-1-26 02:22
好神奇 ,占个沙发坐等大神。你的代码我赋值了一下 中断子程序哪里报错了

你好,请问你赋值多少?报的错误是什么?我这里是0 error 0 waring噢,我的错误是因为判断b==50的前面有很多语句,耽误了判断,因为main函数和定时器分开并且同时运行,然后我赋初值是0.2ms,b=50的时候还没执行到判断语句,当执行到判断语句了b又加一了,所以初值改成1000的话,就有充足的时间完成判断

作者: Dtrahon    时间: 2020-1-27 23:20
Dtrahon 发表于 2020-1-26 02:22
好神奇 ,占个沙发坐等大神。你的代码我赋值了一下 中断子程序哪里报错了

哈哈,这个的确很容易错,把==改成>应该就能解决了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1