求教sh79f084 红外遥控程序,软件延时问题。sh79f084我用内部16.6M的RC震荡器做系统晶振,NEC的遥控器,软件延时好像有问题,求教一下。
sbit IRIN = P3^0; //红外接收器位声明 //p3.0--红外串口接收
unsigned char DisplayData[8]; //用来存放要显示的8位数的值
unsigned char IrValue[6]; //用来存放读取到的红外值
unsigned char Time;
void IrInit();
void DelayMs(unsigned int);
void Delay1ms() ;
void Delay1ms() //@16.6MHz
{
unsigned char i, j;
i = 17;
j = 34;
do
{
while (--j);
} while (--i);
}
void DelayMs(unsigned int x) //
{
unsigned char i;
while(x--)
{
//for (i = 0; i<13; i++);
Delay1ms();
}
}
void IrInit()
{
IT0=1; //下降沿触发
EX0=1; //打开中断0允许
IE0=0;
EA=1; //打开总中断
IRIN=1; //初始化端口
}
void ReadIr() interrupt 0
{
unsigned char j,k;
unsigned int err;
Time=0;
DelayMs(70);
if(IRIN==0) //确认是否真的接收到正确的信号
{
err=1000; //1000*10us=10ms,超过说明接收到错误的信号
while((IRIN==0)&&(err>0)) //等待前面9ms的低电平过去
{
DelayMs(1);
err--;
}
if(IRIN==1) //如果正确等到9ms低电平
{
err=500;
while((IRIN==1)&&(err>0)) //等待4.5ms的起始高电平过去
{
DelayMs(1);
err--;
}
for(k=0;k<4;k++) //共有4组数据
{
for(j=0;j<8;j++) //接收一组数据
{
err=60;
while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
{
DelayMs(1);
err--;
}
err=500;
while((IRIN==1)&&(err>0))//计算高电平的时间长度。
{
DelayMs(1); //0.14ms
Time++;
err--;
if(Time>30)
{
EX0=1;
return;
}
}
IrValue[k]>>=1; //k表示第几组数据
if(Time>=8) //如果高电平出现大于565us,那么是1
{
IrValue[k]|=0x80;
}
Time=0; //用完时间要重新赋值
}
}
}
if(IrValue[2]!=~IrValue[3]) //反码取反后与原码相同则说明信号接受正确
{
return;
}
}
}
|