找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1956|回复: 4
收起左侧

51单片机定时器中断做10.00s的秒表,if(b==50)段的代码位置不同结果出错

[复制链接]
回帖奖励 5 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
ID:685478 发表于 2020-1-25 16:17 | 显示全部楼层 |阅读模式
各位大神新年好,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++;
  
}


回复

使用道具 举报

ID:685478 发表于 2020-1-25 20:58 | 显示全部楼层
已经解决,因为延时的计数判断放主循环导致b的判断与定时器相加不同步
回复

使用道具 举报

ID:625746 发表于 2020-1-26 02:22 | 显示全部楼层
好神奇 ,占个沙发坐等大神。你的代码我赋值了一下 中断子程序哪里报错了
回复

使用道具 举报

ID:685478 发表于 2020-1-26 19:31 | 显示全部楼层
Dtrahon 发表于 2020-1-26 02:22
好神奇 ,占个沙发坐等大神。你的代码我赋值了一下 中断子程序哪里报错了

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

使用道具 举报

ID:625746 发表于 2020-1-27 23:20 | 显示全部楼层
Dtrahon 发表于 2020-1-26 02:22
好神奇 ,占个沙发坐等大神。你的代码我赋值了一下 中断子程序哪里报错了

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表