当前位置: 代码迷 >> 驱动开发 >> 没有任何计时器做了个红外线接收程序 有有关问题 帮忙看一下
  详细解决方案

没有任何计时器做了个红外线接收程序 有有关问题 帮忙看一下

热度:85   发布时间:2016-04-28 11:12:04.0
没有任何计时器做了个红外线接收程序 有问题 帮忙看一下
只用了一个外部0中断
问题我的数据码和反码总是不对
发我的部分代码上来:
void   Infr(void)   interrupt   0   using   2
{
uchar   i;
i=15;
KeyData=0;//清除数据码和反码
KeyData2=0;
//***********************************************     判断引导码
while(i&&InfData==0)//查看在7500us内有没有高电平     有就为干扰信号  
{
Delay_500us();
i--;
}

if(i!=0)   //说明在7500us内有高电平     则为干扰信号
{
Error_LED0=0;         //just   for   test   干扰码指示灯   亮
goto   Error_Infr;//Error_Infr();
}

while(InfData==0);//跳过9ms的引导低电平   //这个也起到纠正同步作用

i=5;//2500后判断电平 看这个信号是引导   还是连发信号
while(i--)
{
Delay_500us();
}
if(InfData==0)//如果电平为低   那么这个信号为连发信号
{
ReSend_Inf();     //这个连发信号函数里只有一个us的延时语句
}
while(InfData==1);//跳过引导高电平     //这个也起到纠正同步作用
//********************************************以下为接受32bit的数据码 低系统码SysNOL
for(i=0;i <8;i++)         //接收8位bit   变成为一个uchar
{
while(InfData==0);//跳过低电平
Delay_500us();  
Delay_150us();
//跳到650us后判断电平   是数据0还是1
if(InfData==0)
{
SysNOL=SysNOL&0x7f;//对最高位清0   其他位不变
}
else  
{
SysNOL=SysNOL|0x80;   //对最高位置1     其他位不变
}
if(i!=7)     //接收最后一位不用移位
{
SysNOL=SysNOL> > 1;     //移位   空出最高位     准备接收下一个高位
}
while(InfData==1);//如果SysNOL为1   则跳过其他的高电平   准备另一个位的低电平到来   如果SysNOL为0也就直接跳出来了
}
//********************************************以下为接受32bit的数据码   高系统码SysNOH
for(i=0;i <8;i++)         //接收8位bit   成为一个uchar
{
while(InfData==0);//跳过低电平
Delay_500us();
Delay_150us();
//跳到650us后判断电平   是数据0还是1  
if(InfData==0)
{
SysNOH=SysNOH&0x7f;//对最高位清0
}
else  
{
SysNOH=SysNOH|0x80;   //对最高位置1
}
if(i!=7)
{
SysNOH=SysNOH> > 1;     //移位     准备接收下一个高位
}
while(InfData==1);//跳过其他的高电平   准备另一个位的到来
}
//********************************************以下为接受32bit的数据码 数据码KeyData
for(i=0;i <8;i++)         //接收8位bit   成为一个uchar
{
while(InfData==0);//跳过低电平
Delay_500us();
Delay_150us();
//跳到650us后判断电平   是数据0还是1
if(InfData==0)
{
KeyData=KeyData&0x7f;//对最高位清0
}
else  
{
KeyData=KeyData|0x80;   //对最高位置1
}
if(i!=7)
{
KeyData=KeyData> > 1;     //移位     准备接收下一个高位
}
while(InfData==1);//跳过其他的高电平   准备另一个位的到来
}
//********************************************以下为接受32bit的数据码 数据反码KeyData2
for(i=0;i <8;i++)         //接收8位bit   成为一个uchar
{
while(InfData==0);//跳过低电平
Delay_500us();
Delay_150us();
//跳到650us后判断电平   是数据0还是1
if(InfData==0)
{
KeyData2=KeyData2&0x7f;//对最高位清0
}
else  
{
KeyData2=KeyData2|0x80;   //对最高位置1
}
if(i!=7)
{
KeyData2=KeyData2> > 1;     //移位     准备接收下一个高位
}
while(InfData==1);//跳过其他的高电平   准备另一个位的到来
}
ReInf=1;     //说明不是干扰信号     有遥控按键接收
Error_LED0=1;//说明不是干扰信号   灭Error_LED0灯
Error_Infr:
                Re_LED1=1;       //just   for   test有按键   灭掉有接收的灯   延时1s
  相关解决方案