红外遥控程序
求教sh79f084 红外遥控程序,软件延时问题。sh79f084我用内部16.6M的RC震荡器做系统晶振,NEC的遥控器,软件延时好像有问题楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因
sbit IRIN = P3^0; //红外接收器位声明 //p3.0--红外串口接收
unsigned char DisplayData; //用来存放要显示的8位数的值
unsigned char IrValue; //用来存放读取到的红外值
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>>=1; //k表示第几组数据
if(Time>=8) //如果高电平出现大于565us,那么是1
{
IrValue|=0x80;
}
Time=0; //用完时间要重新赋值
}
}
}
if(IrValue!=~IrValue) //反码取反后与原码相同则说明信号接受正确
{
return;
}
}
} 有什么问题?
软件延时不准。这个怎么解决?
看不懂,中断函数里有这么多延时函数,肯定是软件架构错误。
正确的方法是定时器中断,对输入的脉冲先滤波,然后判断高低电平的时间 嗯,解码起始标志和后续的数据 软件延时只能根据你的晶振进行大约的计算,不能非常准确 嗯,想要精确延时就要用定时器 遥控解码时,对于读取某个电平,延时可以略大于该电平的时间 嗯,但不能过多,不然会影响到下一个电平的读取
其实还是不大明白,我再琢磨琢磨吧,多谢了哈先
页:
[1]