• 基于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];
    }
    
     /* 文件结束 ---------------------------------------------- */
     
    
  • 相关阅读:
    第六篇:python高级之网络编程
    第五篇:python高级之面向对象高级
    sublime插件开发教程
    Metatable In Lua 浅尝辄止
    cocos2dx-lua绑定之代码编辑器
    sublime入门文章
    Sublime Text快捷键
    lua中文教程【高级知识】
    lua基本语法
    Lua 不是 C++
  • 原文地址:https://www.cnblogs.com/velscode/p/10127748.html
Copyright © 2020-2023  润新知