简单的51单片机中断程序

为什么程序写成第一种就有中断产生,写成第二种就没有中断产生
第一种:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit D1=P1^0;
uint tt=0,sum;
uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar code table2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d};
void delayms(uchar xms);
void main()
{
TMOD=0x01;
EA=1;
ET0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
while(1)
{
for(sum=0;sum<6;sum++)
{
wela=1;
P0=table1[sum];
wela=0;
dula=1;
P0=table2[sum];
dula=0;
delayms(1000);
}
}
}
void delayms(uchar xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void T0_time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==20)
{
tt=0;
D1=~D1;
}
}
第二种:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit D1=P1^0;
uint tt=0,sum;
uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar code table2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d};
void delayms(uchar xms);
void main()
{
TMOD=0x01;
EA=1;
ET0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
while(1)
{
for(sum=0;sum<6;sum++)
{
wela=1;
P0=table1[sum];
wela=0;
dula=1;
P0=table2[sum];
dula=0;
delayms(1000);
}
if(tt==20)
{
tt=0;
D1=~D1;
}
}
void delayms(uchar xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void T0_time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
}

新手常见错误......两个程序都会产生中断

第一种在中断程序中判断tt保证了及时性,每次进入中断程序都会判断一次tt

第二种在for()语句执行完后才会判断一次tt,无法保证及时性,只有在for()循环结束时tt正好为20才能进入if(tt==20)程序

看图应该能理解清楚..大概......

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-07
中断应该是有的,有可能在执行for是中断了两次,正好跳过了tt==20这条件而等于了21,改成tt>20试试追问

改成tt>20后程序能产生中断了,您说的“执行for是中断了两次”我不是很明白,能说的详细些吗?

追答

不好意思打错字了 是“执行for时中断了两次”。如果中断时间很长好几个while循环才中断一次,那你的程序是对的,但是中断时间很短在一个while循环里响应了多次中断,它就不靠谱了

追问

已经明白了,谢谢你
能再帮忙看下这个问题吗?
http://zhidao.baidu.com/question/1237829009339013419.html?quesup2&oldq=1

相似回答