在做红外遥控小车时,由于不知道手上的红外遥控的编码,资料上只给了相关发送协议,并没有准确的给出编码值,这使得我的小车没有了方向,于是我就想出了这个方法,在红外接收程序中插入串口程序,利用上位机软件输出其16进制码。最后发现市面上主流的红外遥控器都遵循一种收发协议,好了不多说分享源程序和所能测出的遥控器图片。我分别测试了:
单片机配套遥控板(20个按键16进制编码亲测出且试验了其准确率),风扇遥控器,空调遥控器,最不可思议的是电信的网络电视遥控器也能测出其编码值(按键太多这里就不给出了)。源程序如下:
//头文件:
#include "reg52.h"
//IO引脚定义:
***it hwx=P3^3; //红外接收数据引脚,
/********数据定义*************************************************************/
unsigned char ly_lhj[4]; //保存NEC的四个字节数据
unsigned char ly_ct=0; //计数时间量
bit ly_flag=0; //成功接收标志
void delay100us(void)
{
unsigned char i=15;
while(i--);
ly_ct++;
}
/***********初始化函数********************************************************/
void init(void)
{
EA=1; //首先开启总中断
EX1=1; //开启外部中断1,红外接收数据引脚
IT1=1; //设置成下降沿触发方式
TMOD=0X20; //设置定时器1为模式2,做为波特率发生器
TL1=0xF3; //2400波特率的初值,板子使用12M晶振,初值=256-12000000/32/12/2400
TH1=0xF3;
TR1=1; //启动波特率发生
SCON=0x50; //设置串口方式2
}
/***********主函数开始********************************************************/
void main(void)
{
unsigned char i;
init();
while(1){
if(ly_flag){ //接收成功处理按键功能
ly_flag=0;
for(i=0;i<=3;i++) //将4字节的红外码发到串口上
{
SBUF=ly_lhj[i]; //将接收到的数据发送出去
while(!
ti); //等待发送完成
TI=0;
}
}
}
}
/***********外中断1入口函数,P33引脚,红外线接收IC数据脚**************************/
void hongwai(void) interrupt 2
{
unsigned char i,ia;
/**************开始判断是否为NEC波形引导码的前(低电平)9MS和后(高电平)4.5MS******************************/
ly_ct=0; //计数时间清0
while(!hwx)delay100us(); //调用0.1MS延时计数,ly_ct每调用一次加1
if(ly_ct<80||ly_ct>100) //NEC引导码前9MS,ly_ct约等于90,给个误差值,用80-100之间来判断
return;
ly_ct=0;
while(hwx)delay100us();
if(ly_ct>50) //NEC引导码引导码的后4.5MS,ly_ct约45
return;
if(ly_ct<40)
return;
/***********开始接收四个字节内容**************************************/
for(i=0;i<4;i++){
for(ia=0;ia<8;ia++){
while(!hwx); //低电平开始,不处理只等待高电平接收
ly_ct=0;
while(hwx)delay100us(); //高电平开始,
//高电平结束,判断数据1或0向变量移入
ly_lhj[i]>>=1; //数据由高位移入低位
if(ly_ct>10) //时间量TH1高于10,即高于1MS判断为1
ly_lhj[i]|=0x80;
}
}
ly_flag=1; //接收成功
TF1=0;
}