当前位置:
文档之家› 51单片机红外遥控解码好例程
51单片机红外遥控解码好例程
if(N>=8)
IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1” N=0;
} }
if(IRCOM[2]!=~IRCOM[3]) {
EX0=1; return; } if(IRCOM[0]!=0x00) { EX0=1; return; } IRCOM[4]=IRCOM[2]&0x0F; IRCOM[5]=IRCOM[2]>>4;
0xc6,0xa1,0x86,0x8e,0xbf};
void delay(uchar x) //x*0.14mS {
uchar i; while(x--) {
for(i=0;i<13;i++) {} } }
void delay1(int ms) {
uchar y; while(ms--) {
for(y=0;y<250;y++) {
P2=0x7f; delay1(1);
P0=(table[IRCOM[5]]); P2=0xbf; delay1(1);
P2=0xff; delay1(1); }
main()
{
IE=0x81;
//
EA=1;
//
EX0=1;
TCON=0x01;
//允许总中断中断,使能 INT0 外部中断 //允许总中断中断 //使能 INT0 外部中断 //触发方式为脉冲负边沿触发
if(IRCOM[2]==0x12)
//DOWN 键
{
IRCOM[2]=0x00;
BEEP=1; //继电器关闭
LED2=0;
delay(100); LED2=1; }
}
}
void IR_IN()interrupt 0 {
uchar j,k,N=0; EX0=0;
delay(15); if(IRIN==1)
{ EX0 =1;
return; }
while(!IRIN) delay(1);
//确认 IR 信号出现 //等 IR 变为高电平,跳过 9ms 的前导低电平信号。
{ 号
for(j=0;j<4;j++) //收集四组数据
for(k=0;k<8;k++)
//每组数据有 8 位
{
while(IRIN) //等 IR 变为低电平,跳过 4.5msRELAY=1;
//I/O 口初始化
P0=0xff; P2=0xff;
play();
while(1) {
if(IRCOM[2]==0x1d) {
IRCOM[2]=0x00; BEEP=0; LED1=0; delay(100); LED1=1; }
//UP 键 //继电器吸合
//红外接收器数据线 //蜂鸣器驱动线 //继电器驱动线
uchar IRCOM[]={0x00,0x00,0x00,0x00,0x10,0x10};
uchar code table[]={ 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,
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”
单片机采用外部中断 INTI 管脚和红外接收头的信号线相连,中断方式为边沿触发方式。 计算中断的间隔时间,来区分前导码、二进制的"1"、"0"码。并将 8 位操作码提取出来在数 码管上显示。 */ // 解码值在 Im[2]中,当 IrOK=1 时解码有效。 /* 51 单片机红外遥控解码程序 */ //用遥控器对准红外接收头,按下遥控器按键,在数码管前两位上就会显示对应按键的编码
//接收时间是否正确
//比较用户码
//取键码的低四位 //右移 4 次,高四位变为低四位
play(); beep(); EX0=1; }
//51 单片机红外遥控解码
/*红外遥控发射芯片采用 PPM 编码方式,当发射器按键按下后,将发射一组 108ms 的编码脉 冲。 遥控编码脉冲由前导码、8 位用户码、8 位用户码的反码、8 位操作码以及 8 位操作码的反 码组成。 通过对用户码的检验,每个遥控器只能控制一个设备动作,这样可以有效地防止多个设备之 间的干扰。 编码后面还要有编码的反码,用来检验编码接收的正确性,防止误操作,增强系统的可靠性。 暗悸胧且桓鲆?芈氲钠鹗疾糠郑 梢桓?ms 的低电平(起始码)和一个 4. 5ms 的高电平(结果 码)组成? 作为接受数据的准备脉冲。以脉宽为 0. 56ms、周期为 1. 12ms 的组合表示二进制的"0"; 以脉宽为 1. 68ms、 周期为 2. 24ms 的组合表示二进制的"1"。如果按键按下超过 108ms 仍未松开,接下来发射的 代码(连发代码) 将仅由起始码(9ms)和结束码(2. 5ms)组成
_nop_(); _nop_(); _nop_(); _nop_(); } } }
void beep()
{
uchar i;
for(i=0;i<180;i++)
{
delay(6);
BEEP=!BEEP; //BEEP 取反
}
BEEP=1;
//关闭蜂鸣器
}
void play() {
P0=(table[IRCOM[4]]);
#include <reg51.h> #include <intrins.h>
#define uchar unsigned char #define uint unsigned int
sbit IRIN = P3^2; sbit BEEP = P2^4; sbit RELAY= P3^6; sbit LED1 = P2^0; sbit LED2 = P2^1;