51红外遥控

news/2025/2/22 3:53:32/

1.   红外遥控是利用红外光进行通信的设备,红光LED将调质好的信号发出,由专用的红外接收头进行解调输出;通信方式是单方面的---不能进行交互通信;红外LED波长940nm---不可见(遥控器);850nm(有微弱的红光-----夜间摄像头的红光);通信协议:NEC标准;

2. 

 51单片机外部中断:下降沿触发---低电平触发;

红外线遥控

main.c

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "IR.h"unsigned char Num;
unsigned char Address;
unsigned char Command;void main()
{LCD_Init();LCD_ShowString(1,1,"ADDR  CMD  NUM");LCD_ShowString(2,1,"00    00   000");IR_Init();while(1){if(IR_GetDataFlag() || IR_GetRepeatFlag())	//如果收到数据帧或者收到连发帧{Address=IR_GetAddress();		//获取遥控器地址码Command=IR_GetCommand();		//获取遥控器命令码LCD_ShowHexNum(2,1,Address,2);	//显示遥控器地址码LCD_ShowHexNum(2,7,Command,2);	//显示遥控器命令码if(Command==IR_VOL_MINUS)		//如果遥控器VOL-按键按下{Num--;						//Num自减}if(Command==IR_VOL_ADD)			//如果遥控器VOL+按键按下{Num++;						//Num自增}LCD_ShowNum(2,12,Num,3);		//显示Num}}
}

Int0.c

#include <REGX52.H>void Int0_Init(void)
{IT0=1;IE0=0;EX0=1;EA=1;PX0=1;
}/*
void Int0_Routine(void)  interrupt 0
{}
*/

Int0.h

#ifndef _INT0__H_
#define _INT0__H_void Int0_Init(void);#endif

Tmer.c

#include <REGX52.H>/*** @brief  定时器0初始化* @param  无* @retval 无*/
void Tmer_Init(void)
{TMOD &= 0xF0;		//设置定时器模式TMOD |= 0x01;		//设置定时器模式TL0 = 0;		//设置定时初值TH0 = 0;		//设置定时初值TF0 = 0;		//清除TF0标志TR0 = 0;		//定时器0不计时
}/*** @brief  定时器0设置计数器值* @param  Value,要设置的计数器值,范围:0~65535* @retval 无*/
void Tmer_SetCounter(unsigned int Value)
{TH0=Value/256;TL0=Value%256;
}/*** @brief  定时器0获取计数器值* @param  无* @retval 计数器值,范围:0~65535*/
unsigned int Tmer_GetCounter(void)
{return (TH0<<8)|TL0;
}/*** @brief  定时器0启动停止控制* @param  Flag 启动停止标志,1为启动,0为停止* @retval 无*/
void Tmer_Run(unsigned char Flag)
{TR0=Flag;
}

Tmer.h

#ifndef __TMER_H__
#define __TMER_H__void Tmer_Init(void);
void Tmer_SetCounter(unsigned int Value);
unsigned int Tmer_GetCounter(void);
void Tmer_Run(unsigned char Flag);#endif

IR.c(红外线协议---特别注意)

#include <REGX52.H>
#include "Tmer.h"
#include "Int0.h"unsigned int IR_Time;
unsigned char IR_State;unsigned char IR_Data[4];
unsigned char IR_pData;unsigned char IR_DataFlag;
unsigned char IR_RepeatFlag;
unsigned char IR_Address;
unsigned char IR_Command;/*** @brief  红外遥控初始化* @param  无* @retval 无*/
void IR_Init(void)
{Tmer_Init();Int0_Init();
}/*** @brief  红外遥控获取收到数据帧标志位* @param  无* @retval 是否收到数据帧,1为收到,0为未收到*/
unsigned char IR_GetDataFlag(void)
{if(IR_DataFlag){IR_DataFlag=0;return 1;}return 0;
}/*** @brief  红外遥控获取收到连发帧标志位* @param  无* @retval 是否收到连发帧,1为收到,0为未收到*/
unsigned char IR_GetRepeatFlag(void)
{if(IR_RepeatFlag){IR_RepeatFlag=0;return 1;}return 0;
}/*** @brief  红外遥控获取收到的地址数据* @param  无* @retval 收到的地址数据*/
unsigned char IR_GetAddress(void)
{return IR_Address;
}/*** @brief  红外遥控获取收到的命令数据* @param  无* @retval 收到的命令数据*/
unsigned char IR_GetCommand(void)
{return IR_Command;
}//外部中断0中断函数,下降沿触发执行
void Int0_Routine(void) interrupt 0
{if(IR_State==0)				//状态0,空闲状态{Tmer_SetCounter(0);	//定时计数器清0Tmer_Run(1);			//定时器启动IR_State=1;				//置状态为1}else if(IR_State==1)		//状态1,等待Start信号或Repeat信号{IR_Time=Tmer_GetCounter();	//获取上一次中断到此次中断的时间Tmer_SetCounter(0);	//定时计数器清0//如果计时为13.5ms,则接收到了Start信号(判定值在12MHz晶振下为13500,在11.0592MHz晶振下为12442)if(IR_Time>13500-500 && IR_Time<13500+500){IR_State=2;			//置状态为2}//如果计时为11.25ms,则接收到了Repeat信号(判定值在12MHz晶振下为11250,在11.0592MHz晶振下为10368)else if(IR_Time>11250-500 && IR_Time<11250+500){IR_RepeatFlag=1;	//置收到连发帧标志位为1Tmer_Run(0);		//定时器停止IR_State=0;			//置状态为0}else					//接收出错{IR_State=1;			//置状态为1}}else if(IR_State==2)		//状态2,接收数据{IR_Time=Tmer_GetCounter();	//获取上一次中断到此次中断的时间Tmer_SetCounter(0);	//定时计数器清0//如果计时为1120us,则接收到了数据0(判定值在12MHz晶振下为1120,在11.0592MHz晶振下为1032)if(IR_Time>1120-500 && IR_Time<1120+500){IR_Data[IR_pData/8]&=~(0x01<<(IR_pData%8));	//数据对应位清0IR_pData++;			//数据位置指针自增}//如果计时为2250us,则接收到了数据1(判定值在12MHz晶振下为2250,在11.0592MHz晶振下为2074)else if(IR_Time>2250-500 && IR_Time<2250+500){IR_Data[IR_pData/8]|=(0x01<<(IR_pData%8));	//数据对应位置1IR_pData++;			//数据位置指针自增}else					//接收出错{IR_pData=0;			//数据位置指针清0IR_State=1;			//置状态为1}if(IR_pData>=32)		//如果接收到了32位数据{IR_pData=0;			//数据位置指针清0if((IR_Data[0]==~IR_Data[1]) && (IR_Data[2]==~IR_Data[3]))	//数据验证{IR_Address=IR_Data[0];	//转存数据IR_Command=IR_Data[2];IR_DataFlag=1;	//置收到连发帧标志位为1}Tmer_Run(0);		//定时器停止IR_State=0;			//置状态为0}}
}

IR.h

#ifndef _IR__H_
#define _IR__H_#define IP_POWER 					0x45
#define IR_MODE  					0x46
#define IR_MUTE  					0x47
#define IR_START_STOP  		0x44
#define IR_PREVIOUS  			0x40
#define IR_NEXT 					0x43
#define IR_EQ  						0x07
#define IR_VOL_MINUS  		0x15
#define IR_VOL_ADD  			0x09
#define IR_0  						0x16
#define IR_RPT  					0x19
#define IR_USD  					0x0D
#define IR_1  						0x0C
#define IR_2  						0x18
#define IR_3 							0x5E
#define IR_4  						0x08
#define IR_5  						0x1C
#define IR_6  						0x5A
#define IR_7  						0x42
#define IR_8							0x52
#define IR_9  						0x4Avoid IR_Init(void);
unsigned char IR_GetDataFlag(void);
unsigned char IR_GetRepeatFlag(void);
unsigned char IR_GetAddress(void);
unsigned char IR_GetCommand(void);#endif	


http://www.ppmy.cn/news/208560.html

相关文章

Ardunio-电视红外遥控,控制LeArm机械臂

一.简介 1.Ardunio&#xff1a;一款源自意大利的开放源代码硬件项目平台 2.LeArm&#xff1a;是幻尔科技旗下的一块产品&#xff0c;机身由六个舵机组成&#xff0c;的可编程机械臂 3.目的&#xff1a;实现电视遥控器控制机械臂移动和抓取 二.硬件 1.整体展示 2.控制设备 …

FPGA之红外遥控

文章目录 一、红外遥控简介1.红外遥控系统2.硬件介绍3.红外遥控编码协议4.重复码5.FPGA接收 二、程序设计1.实现功能2.红外接收模块3.led灯控制模块4.数码管控制模块①二进制转8421BCD模块②数码管控制模块 5.顶层代码6.RTL视图 三、仿真测试模块1.仿真测试模块代码2.仿真波形图…

学习型红外遥控器设计(3) 红外遥控解码学习

学习型红外遥控器设计(0) 摘要 (1) 绪论 (2) 方案设计 (3) 遥控解码 (4) 编码还原 (5) 硬件实现 (6) 总结展望 如方案设计所述,制作红外接收解码装置,该装置至少具有面向用户和设计者的两种检测方法,能够完成采用RC-5编码协议遥控器(SAA3010)的红外接收和解码,要求基…

红外遥控模块学习

红外遥控原理 红外接收头的主要参数如下 工作电压&#xff1a;4.8&#xff5e;5.3V 工作 电流&#xff1a;1.7&#xff5e;2.7mA 接收频 率&#xff1a;38kHz 峰值波长&#xff1a; 980nm 静态输出&#xff1a;高电平 输出低电平&#xff1a;≤0.4V 输出高电平&#xff1a;接近…

Arduino基础入门之九 红外遥控

一 硬件 这套元件是红外接收头&#xff08;左&#xff09;和红外遥控器&#xff08;右&#xff09;&#xff0c;遥控器按一下&#xff0c;红外接收头接收到并让UNO执行相应的操作。卖家给的资料里面依然是不给力地没有标清楚接收头三个引脚具体接法&#xff0c;我只能反复试&am…

红外遥控功能的实现

喜欢请关注微信公众号:嵌入式从0到1 公众号内容面向在校大学生、电子爱好者、嵌入式工程师; 涉及电子制作、模块使用、单片机技术、物联网相关知识分享; 软硬件全栈工程师,玩模块,学硬件,带你从0走到1 文章目录 涉及知识点一体化红外接收头VS1838B简介应用场景编码标准…

STM32F103C8T6红外遥控解码

目录 一、红外遥控 二、输入捕获初始化 捕获两个上升沿或者下降沿得到他们之间一个周期为1US的的波计次数来得到时间 三、NEC解码 四、IC.h函数 红外按键 五、主函数 六、总结 推荐STM32学习课程&#xff1a; [6-5] TIM输入捕获_哔哩哔哩_bilibili[6-5] TIM输入捕获是S…

Arduino简单实例之七_红外遥控接收

1) 说明&#xff1a; 红外接收模块适用于红外线遥控和红外线数据传输。对于不同的遥控器&#xff0c;区别只是接到的数字不同。 注意要买三脚的红外接收头&#xff0c;而不是直接购买红外对管。当然也可以买电子积木的红外接收模块&#xff0c;它还多了一块小板和小灯&a…