红外遥控程序请教
时间:10-02
整理:3721RD
点击:
我是用的普中科技的51学习板,但是看不懂他写的红外遥控程序,希望大神们能帮忙翻译一下他的程序。谢谢各位了(特别是外部中断里的那一些程序)
#include <reg51.h>
sbit IRIN = P3^2; //红外接收器数据线
void IRdelay(char x); //x*0.14MS
void beep();
unsigned char IRCOM[7];
extern unsigned char Y0;
extern void display(unsigned char Key_Val);
/*******************************************************************/
void IRInit()
{
IE |= 0x81; //允许总中断中断,使能 INT0 外部中断
TCON |= 0x01; //触发方式为脉冲负边沿触发
IRIN=1; //I/O口初始化
}
/**********************************************************/
void IR_IN(void) interrupt 0
{
unsigned char j,k,N=0;
EX0 = 0;
IRdelay(5);
if (IRIN==1)
{ EX0 =1;
return;
}
//确认IR信号出现
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{IRdelay(1);}
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{IRdelay(1);}
while (!IRIN) //等 IR 变为高电平
{IRdelay(1);}
while (IRIN) //计算IR高电平时长
{
IRdelay(1);
N++;
if (N>=30)
{ EX0=1;
return;} //0.14ms计数过长自动离开。
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3])
{ EX0=1;
return;
}
EX0 = 1;
}
/**********************************************************/
void IRdelay(unsigned char x) //x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
#include <reg51.h>
sbit IRIN = P3^2; //红外接收器数据线
void IRdelay(char x); //x*0.14MS
void beep();
unsigned char IRCOM[7];
extern unsigned char Y0;
extern void display(unsigned char Key_Val);
/*******************************************************************/
void IRInit()
{
IE |= 0x81; //允许总中断中断,使能 INT0 外部中断
TCON |= 0x01; //触发方式为脉冲负边沿触发
IRIN=1; //I/O口初始化
}
/**********************************************************/
void IR_IN(void) interrupt 0
{
unsigned char j,k,N=0;
EX0 = 0;
IRdelay(5);
if (IRIN==1)
{ EX0 =1;
return;
}
//确认IR信号出现
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{IRdelay(1);}
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{IRdelay(1);}
while (!IRIN) //等 IR 变为高电平
{IRdelay(1);}
while (IRIN) //计算IR高电平时长
{
IRdelay(1);
N++;
if (N>=30)
{ EX0=1;
return;} //0.14ms计数过长自动离开。
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3])
{ EX0=1;
return;
}
EX0 = 1;
}
/**********************************************************/
void IRdelay(unsigned char x) //x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
这很简单啊,建议先去看看C语法,就明白了
哪里看不懂呢?
c学过一段时间了 就是不知道这个程序中断里的思路啊··
就是外部中断0里面的那一段 看的雨里雾里的 能不能详细解读一下啊··谢谢
你这个应该是6222的编码格式(具体格式请查阅相关技术手册),程序中9+4.5ms是引导码,后面跟16位用户码+16位数据码,IR口电平变换进中断,依次接收9ms+4.5ms+32位编码,其中两个for循环嵌套是接收32位编码的,数据码通过高电平的时间长度判断接收到的是“0”或者“1”,数据码高8位与低8为互为反码,所以32位码收完要判断IRCOM[2]!=~IRCOM[3],,这个程序红外接收过程是使用查询死等的方式,收码的时候系统就干不了其它的事儿了,不建议使用的
纠正一点,这应该是NEC编码格式,6222只是用这种编码格式的一款专用芯片,如HT6222/CMS6222
