基于89C51/52单片机的红外线遥控驱动

说明

编码格式:NEC

IR.h

/************************************************************
 *            @Project    课程设计 —— 旋转LED
 *            @File     IR.h - 红外线遥控驱动头文件
 *            @Author       1500830205 黄玉婷
 *            @Teacher           黎莲花
 ************************************************************
 */
 #ifndef _IR_H_
 #define _IR_H_
 
 /* 键值定义 ---------------------------------------------- */
 #define KEY_POWER 	0x45
 #define KEY_MENU  	0x47
 #define KEY_TEST  	0x44
 #define KEY_RETURN 0x43
 #define KEY_CANCEL 0x0D
 #define KEY_LAST	0x07
 #define KEY_NEXT	0x09
 #define KEY_OK  	0x15
 
 #define KEY_U	0X40
 #define KEY_D  0x19
 #define KEY_0 	0x16
 #define KEY_1 	0x0C
 #define KEY_2  0x18
 #define KEY_3  0x5E
 #define KEY_4  0x08
 #define KEY_5 	0x1C
 #define KEY_6 	0x5A
 #define KEY_7 	0x42
 #define KEY_8 	0x52
 #define KEY_9 	0x4A
 
 /* 变量定义 ---------------------------------------------- */
 
 sbit IRIN = P3^3;	//红外线输入管脚,同时也是单片机外部中断1
 
 /* 函数声明 ---------------------------------------------- */
 
 void IR_Init();					   //初始化红外接收
 unsigned char IR_Get_KeyValue( void ); //获取键值
 
	 
 #endif /* _IR_H_ */
 /* 文件结束 ---------------------------------------------- */
 

IR.c

/************************************************************
 *            @Project    课程设计 —— 旋转LED
 *            @File     IR.c - 红外线遥控驱动实现
 *            @Author       1500830205 黄玉婷
 *            @Teacher           黎莲花
 ************************************************************
 */

 /* 头文件 ------------------------------------------------- */
 #include <reg52.h>
 #include "IR.h"

 /* 变量定义 ----------------------------------------------- */
 unsigned char Time;
 unsigned char IrValue[6];	  //用来存放读取到的红外值
 
 /* 函数声明 ----------------------------------------------- */
 void Delay140us(unsigned int );	
									 
/*******************************************************************************
* 函数           : Delay140us()
* 函数功能		 : 延时
* 输入           : x
* 输出         	 : 无
*******************************************************************************/

void Delay140us(unsigned int x)   //0.14ms误差 0us
{
	unsigned char i;
	while(x--)
	{
		for (i = 0; i<12; i++)
		{}
	}
}
/**********************************************************
 * 函数名称 : IR_Init()
 * 功    能 : 初始化红外线接收
 * 备    注 : 初始化外部中断1
 **********************************************************/
void IR_Init()
{
	IT1=1;   //下降沿触发
	EX1=1;   //打开中断0允许
	EA=1;	 //打开总中断
	IRIN=1;  //初始化端口
}

/**********************************************************
 * 函数名称 : ReadIr()
 * 功    能 : 接受红外线信号并进行解码
 * 备    注 : 外部中断1中断函数
 ***********************************************************/
void ReadIr() interrupt 2
{
	unsigned char j,k;
	unsigned int err;
	Time=0;					 
	Delay140us(60);

	if(IRIN==0)		//确认是否真的接收到正确的信号
	{	 
		err=1000;				//1000*10us=10ms,超过说明接收到错误的信号
		/*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
		侯,程序死在这里*/	
		while((IRIN==0)&&(err>0))	//等待前面9ms的低电平过去  		
		{			
			Delay140us(1);
			err--;
		} 
		if(IRIN==1)			//如果正确等到9ms低电平
		{
			err=500;
			while((IRIN==1)&&(err>0))		 //等待4.5ms的起始高电平过去
			{
				Delay140us(1);
				err--;
			}
			for(k=0;k<4;k++)		//共有4组数据
			{				
				for(j=0;j<8;j++)	//接收一组数据
				{

					err=60;		
					while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
					{
						Delay140us(1);
						err--;
					}
					err=500;
					while((IRIN==1)&&(err>0))	 //计算高电平的时间长度。
					{
						Delay140us(1);//0.14ms
						Time++;
						err--;
						if(Time>30)
						{
							EX1=1;
							return;
						}
					}
					IrValue[k]>>=1;	 //k表示第几组数据
					if(Time>=8)			//如果高电平出现大于565us,那么是1
					{
						IrValue[k]|=0x80;
					}
					Time=0;		//用完时间要重新赋值							
				}
			}
		}
		if(IrValue[2]!=~IrValue[3])
		{
			return;
		}
	}	
}

/**********************************************************
 * 函数名称 : IR_Get_KeyValue
 * 功    能 : 取得红外线信号中命令码
 * 输    出 : 命令码(键值)
***********************************************************/
unsigned char IR_Get_KeyValue( void )
{
	return IrValue[2];
}

 /* 文件结束 ---------------------------------------------- */
 
posted @ 2018-12-16 19:50  Velscode  阅读(444)  评论(0编辑  收藏