51单片机定时器中断问题,单个数码管间隔1秒一次显示0到9。

#include<reg52.h>
#define uchar unsigned char
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};/*数码管段编码*/
int tt;
void delay(int);
void main()
{
int i;
TMOD=0x01;/*设置定时器0为工作方式1*/
TH0=(65536-50000)/256;/*赋初值*/
TL0=(65536-50000)%256;
EA=1;/*开总中断*/
ET0=1;/*开T0断*/
TR0=1;/*启动T0*/
P1=0x01;/*位选数码管*/
while(1)
{
if(tt==20)/*延时20次50ms,即1秒*/
{
tt=0;
if(i==10)
{i=0;} // 依次显示数码管0到9
P0=table[i];
i++;
delay(500);
}
}
}
void delay(int z)
{
int x,y;
for(x=200;x>0;x--)
for(y=z;y>0;y--);
}
void exter0() interrupt 1
{
TH0=(65536-50000)/256;/*重装初值*/
TL0=(65536-50000)%256;
tt++;
}
为什么有“delay(500);”时数码管一直显示0,而删去 “delay(500);”则程序正常?

时间太长大哥 估计要好几秒 根据你的程序 没必要加延时 还有 如果用不到int这么大的类型 就改为unsigned char 可以节约单片机空间
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-07-24
if(tt>=20)/

另外程序这样写是不行的,费劲啊
第2个回答  2012-07-24
延时太大,等延时完成时TT>20,循环不能进行。
第3个回答  2018-12-16
定时器中断就是用来代替延时delay的 你在加个delay,怎么可能会用
第4个回答  2012-07-29
把500改成1就好了,1us为机器周期
相似回答