我的程序写完之后发现,能接收到第一个数,但第二个开始就不行了,我找了好多天问题所在,最后还是找不出来,请各位指导,程序如下:
void TimerInit(void)
{
TMCON = 0x00; //bit1: 0为FOSC/12,1为FOSC
TMOD = 0x21; //设置定时0,工作方式1
TR0 = 0; //关定时器0
EA = 1;
ET0 = 0; //禁止定时器0中断
INT0F = 0x04; //INT0下降沿触发
INT0R =0x00; // 禁止上升沿触发
EINT0 = 1;
}
}
INT16U GetHighTime() //取高电平时间
{
TH0 = 0; //清零计数初值
TL0 = 0;
TR0 = 1; //启动计时
while(DATA)
{
if(TH0 >= 0x1b) //时间超过7ms,强制退出循环
break;
}
TR0 = 0; //停止计时
return (TH0*256+TL0);
}
INT16U GetLowTime() //取高电平时间
{
TH0 = 0; //清零计数初值
TL0 = 0;
TR0 = 1; //启动计时
while(!DATA)
{
if(TH0 >= 0x1b) //时间超过7ms,强制退出循环
break;
}
TR0 = 0; //停止计时
return (TH0*256+TL0);
}
void INT0() interrupt 0 //中断函数,接收数据
{
CHAR i,j,abit;
INT16U time;
EINT0 = 0; //关外部中断0
//判定引导码
time = GetLowTime();
if((time < 4500)||(time > 6500)) //超出4.5~6.5ms的范围退出中断
{
EINT0 = 1; //开启外部中断
return;
}
time = GetHighTime();
if((time < 4500)||(time > 6500)) //超出4.5~6.5ms的范围退出中断
{
EINT0 = 1; //开启外部中断
return;
}
//开始接收数据
for(i = 0;i < 5;i++) //接收5个字节
{
for(j = 0;j < 8;j++) //接收8个位
{
time = GetLowTime();
if((time < 250)||(time > 500)) //超出250us~500us退出中断
{
EINT0 = 1; //开启外部中断
return;
}
time = GetHighTime();
if((time > 250)&&(time < 500)) //在250us~500us为位0
{
abit |= (0 << j); //低位在前,数据右移
}
else if((time > 900)&&(time < 1500)) //在900us~1500us为位1
{
abit |= (0x01 << j);
}
else
{
EINT0 = 1; //开启外部中断
return;
}
}
NewByte[i] = abit; //接收完一字节后保存数据
}
dataflag = 1; //接收完毕数据处理标志
EINT0 = 1; //开启外部中断
}
|