如果需要了解红外遥控的原理请点击 -> 红外遥控原理
为方便使用,我的范例代码是只提供 .h .c ,使用这种方式也方便进行代码替换,使你得主代码区域不会太过于复杂。我只会简单在最后写一个使用的范例,我不会将整个功能的代码放上来,因为你的作品功能只有自己知道,我如果整个实现都写出来,只会误导到你。
=========================Infrared.h =========================
#ifndef __IR_H__ #define __IR_H__ #include<reg52.h> #include<intrins.h> sbit IRIN = P3^2; //红外接收器数据口INT0 extern unsigned char IRCOM[7]; //初始化红外遥控接收 void IR_Init(void); #endif
========================= Infrared.c =========================
#include "Infrared.h" unsigned char IRCOM[7]; void delay(unsigned char x) //x*0.14MS { unsigned char i; while(x--) { for (i = 0; i<13; i++) {} } } void IR_Init(void) { IRIN=1; //I/O口初始化 IE=0x81; //允许总中断中断,使能 INT0 外部中断 TCON=0x01; //触发方式为脉冲负边沿触发 } void IR_IN() interrupt 0 { unsigned char j,k,N=0; EX0 = 0; delay(15); if (IRIN==1) { EX0 =1; return; } //确认IR信号出现 while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。 delay(1); for (j=0;j<4;j++) //收集四组数据 { for (k=0;k<8;k++) //每组数据有8位 { while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。 {delay(1);} while (!IRIN) //等 IR 变为高电平 delay(1); while (IRIN) //计算IR高电平时长 { delay(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; } } if(IRCOM[2]!=~IRCOM[3]) { EX0=1; read_temp_flag = 0; return; } //IRCOM[5]和IRCOM[6]只是将操作码拆成高四位和低四位,可以不予理会 IRCOM[5]=IRCOM[2] & 0x0F; //取键码的低四位 IRCOM[6]=IRCOM[2] >> 4; //右移4次,高四位变为低四位 EX0 = 1; }
========================= main.c =========================
#include "Infrared.h" void main() { lcd1602_display(IRCOM[2]);//此处我只是象征性的使用,IRCOM[2]代表的就是接收到的操作码 //另外,在使用这个作为按键的时候,记得在使用的时候需要将IRCOM[2]内的数值进行清零,否则你会发现系统为什么一直重复按下这个键 }