|
没有任何计时器做了个红外线接收程序 有问题 帮忙看一下
[复制链接]
只用了一个外部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]);
}
}
}
}
|
|