首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

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

2012-02-24 
没有任何计时器做了个红外线接收程序 有问题 帮忙看一下只用了一个外部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


Delay_1s();
}

void   main()
{
//初始化外部0中断
EA=0;
IT0=0;
IE0=0;
EX0=1;     //外部中断允许
EA=1;
while(1)
{
if(ReInf==1)
{
ReInf=0;         //处理了按键后就对其复位
Re_LED1=0;     //处理了按键后就对其复位
if((KeyData2=~KeyData2)==KeyData)     //查看数据码和反码时候对了
{
//查看在LCD显示数据码   这个绝对没问题的  
Write_Date(1,1,1,&ID[(KeyData&0xf0)> > 4]);
Write_Date(1,2,1,&ID[KeyData&0x0f]);
}
else               //just   for   test   如果数据码和反码错了   就输出一个信息
{
Write_Date(1,9,1,&ID[13]);
}
}
}
}

[解决办法]
你那中断太牛了!!

呵呵

热点排行