/*******************************************************************************
** 名称:红外线解码程序
** MCU :AT89C52 12mHz
** 作者:傲雪风雨
** 日期:2007-12
** 描述:本程序是接收13.5S格式引导码,的红外线遥控发射器的程序把所读到的码显示出
** 来,接收HT6221发谢的信号。
**********************************************************************************/
#include <reg51.h>
#define uchar unsigned char //雄定义
sbit LED_1=P2^1; //LED脚
sbit LED_2=P2^2;
sbit LED_3=P2^3;
sbit LED_4=P2^4;
sbit LED_5=P2^5;
sbit LED_6=P2^6;
sbit buzzer=P3^3; //蜂鸣器
sbit IrPort=P3^7; //红外线通信口
/***----- 全局变量 ------------****/
uchar Num[16]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60,0x30,0x25,0xa7,0x26,0xa1,0xb1};
uchar ir[4]; //红外解码值
uchar abc; //用于中断计时
/***----- 函数声明 ---------***/
void incept(); //红外接收解码
void delay(uchar); //廷时
void uDelay(uchar); //红外廷时
void display(); //LED显示
void kk(); //蜂鸣器响声
/***************** 主程序 *****************************/
void main(void)
{ P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
while(1)
{ incept(); //调用接收
display(); //调用显显示
incept(); //调用接收
}
}
/***************************************************
** 函数名称: uDelay
** 功能描述: 红外廷时,约100us延时程序
** 输 入:
** 输 出:
** 全局变量: 无
** 调用模块: 无
*****************************************************/
void uDelay(uchar i) //约100us延时程序
{ for( ;i>0; i--)
{ uchar j=45;
while(--j);
}
}
/*****************************************************************
** 函数名称: delay
** 功能描述: 廷时
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
*****************************************************************/
void delay(uchar z)
{ uchar t1,y;
for(t1=z;t1>0;t1--)
for(y=110;y>0;y--);
}
/*****************************************************
** 函数名称: kk
** 功能描述:
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: delay()
******************************************************/
void kk()
{ buzzer=0;
delay(200);
buzzer=1;
}
/*********************************************************************
** 函数名称: incept
** 功能描述: 红外接收解码,引导码9mS底平、4.5mS高电平,后32位数据码
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**********************************************************************/
void incept()
{ uchar i,j,Temp;
if(IrPort==0) //查询没有啊红外接收
{
for(i=0;i<70;i++) //延时8000us循环检测是否有1电平,避免干扰信号
{ uDelay(1);
if (IrPort==1)
{ return; //退出本函数
}
}
while(IrPort==0); //等待高电平避开9毫秒低电平引导脉冲
for(i=0;i<37;i++) //廷时4.3mS如果有底电平出现则退出解码
{ uDelay(1); //在100uS内出现底电平则退出解码,也是被开2.25mS的连码到来测退出解码
if (IrPort!=1)
{ return; //退出本函数
}
}
while(IrPort==1); //等待底电平避开4.5毫秒高电平引导脉冲
for(j=0;j<4;j++) //读入码记录在ir数组中
{ Temp=0;
for(i=0;i<8;i++) //循环,每次读入8个状态为一个码
{ while(IrPort==0); //等待第一位高电平到来
uDelay(9); //用900us去度量
if(IrPort==1) //此时为高就是信号1,数值移入
{ uDelay(10); //延时一下,拖过1电平持续时间
Temp|=0x1<<i;
}
}
ir[j]=Temp; //把接到的码装入数组
}
kk(); //调用蜂鸣器响声
}
}
/************************************************
** 函数名称: display
** 功能描述: 显示函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: incept()
***********************************************/
void display()
{ P0=Num[ir[0]>>4]; //显示地址码
LED_1=0;
incept(); //调用接收
delay(1);
incept();
LED_1=1;
P0=Num[ir[0]&0x0f];
LED_2=0;
incept();
delay(1);
incept();
LED_2=1;
P0=Num[ir[1]>>4]; //显示地址反码
LED_3=0;
incept();
delay(1);
incept();
LED_3=1;
P0=Num[ir[1]&0x0f];
LED_4=0;
incept(); //调用接收
delay(1);
incept();
LED_4=1;
incept(); //调用接收
P0=Num[ir[2]>>4]; //显示数据码
LED_5=0;
incept();
delay(1);
incept();
LED_5=1;
P0=Num[ir[2]&0x0f]; //
LED_6=0;
incept();
delay(1);
incept();
LED_6=1;
}
|