当前位置: 首页 > news >正文

51单片机红外遥控

发送部分硬件电路如下,需要调制。

 

 

 

上图为调制前和调制后的波形。

发送协议:NEC编码

 

Start

 

DATA

 

Repeat(遥控按键按下不放时的信号)

 

DATA = 遥控器地址 + 遥控地址反码 + 控制码(遥控键码)+ 控制码反码,共4个Byte.

下图为遥控键码值。

 

 

接受部分如下图,内部集成有滤波电路和解调电路,直接由OUT口输出

 

在检测并接收数据时,采用外部中断来检测下降沿,用定时器来计时判断,当中断下降沿来后,启动定时器,到下一次中断,记录时间,判断是开始信号还是重发信号,若为开始信号,则准备接受数据,下面32个下降沿就是数据信号,判断时间来确定是0还是1,读取数据,然后检查读取的数据是否正确(DATA = 遥控器地址 + 遥控地址反码 + 控制码(遥控键码)+ 控制码反码),正确后将DataFlag = 1,并回到空闲状态等待下一次的信号。

代码如下:

#include <REGX52.H>
unsigned char IR_State;
unsigned int IR_Time;
unsigned char IR_RepeatFlag;
unsigned char IR_DataFlag;
unsigned char IR_Data[4];
unsigned char IR_LData;
unsigned char IR_Address;
unsigned char IR_Command;unsigned char get_IR_DataFlag()
{if(IR_DataFlag){IR_DataFlag = 0;return 1;}return 0;
}unsigned char get_IR_RepeatFlag()
{if(IR_RepeatFlag){IR_RepeatFlag = 0;return 1;}return 0;
}unsigned char get_IR_Address()
{return IR_Address;
}unsigned char get_IR_Command()
{return IR_Command;
}void Timer0_Init(void)		
{TMOD &= 0xF0;			TMOD |= 0x01;		TL0 = 0;				TH0 = 0;			TF0 = 0;				TR0 = 0;				
}void INT0_Init()
{IT0 = 1;IE0 = 0;EA = 1;EX0 = 1;PT0 = 1;
}void IR_Init()
{Timer0_Init();INT0_Init();
}void Timer_Start()
{TR0 = 1;
}void Time_counter(unsigned int count)
{TH0 = count/256;TL0 = count%256;
}void Timer_Stop()
{TR0 = 0;
}unsigned int GetTime()
{return (TH0<<8) | TL0;
}void INT0_Routine() interrupt 0
{if(IR_State == 0){Time_counter(0);Timer_Start();IR_State = 1;}else if(IR_State == 1){IR_Time = GetTime();Time_counter(0);if(IR_Time >= 13500-1000 && IR_Time <= 13500+1000){IR_State = 2;}else if(IR_Time >= 11250-400 && IR_Time <= 11250+400){IR_RepeatFlag = 1;IR_State = 0;}else{IR_State = 1;}}else if(IR_State == 2){IR_Time = GetTime();Time_counter(0);if(IR_Time >= 1120-500 && IR_Time <= 1120+500){IR_Data[IR_LData/8] &= ~(0x01<<(IR_LData%8));IR_LData++;}else if(IR_Time >= 2250-500 && IR_Time <= 2250+500){IR_Data[IR_LData/8] |= (0x01<<(IR_LData%8));IR_LData++;}else{IR_LData = 0;IR_State = 1;}if(IR_LData>=32){IR_LData = 0;if(IR_Data[0] == ~IR_Data[1] && IR_Data[2] == ~IR_Data[3]){IR_DataFlag = 1;IR_Address = IR_Data[0];IR_Command = IR_Data[2];}Timer_Stop();IR_State = 0;}}}

 

http://www.dtcms.com/a/434819.html

相关文章:

  • Java 集合 “List + Set”面试清单(含超通俗生活案例与深度理解)
  • 云南网站建设哪个好软文广告平台
  • 《嵌入式 – GD32开发实战指南(RISC-V版本)》第8章 PWM输出实现
  • HNU 编译系统 第一次作业
  • 网站怎么做交易平台图片生成网页链接在线
  • 渗透测试中的信息收集:文档元数据
  • minikube 的 kubernetes 入门教程-kubeSphere
  • 深圳 手机网站建设彩妆做推广的网站
  • 网站跳转是什么意思郑州建站网站的公司
  • 老题新解|再求 f(x,n)
  • 【Android cmd命令的执行流程】
  • c++26新功能—constexpr在稳定排序中的应用
  • AI生成悬疑故事
  • 泰山派rk3566烧录
  • Phpstudy博客网站apache2日志分析python代码
  • asp网站程序优点做App和网站 聚马
  • 免费软件下载网站入口正能量微信开发公众平台
  • 【系统重装】Windows无法安装到这个磁盘提示选中的磁盘具有MBR分区表解决方法(亲测有效)
  • MySQL 查询与更新语句执行过程深度解析:从原理到实践​
  • Bella Beauty – Aesthetic Medical Clinic WordPress Theme: A Practical
  • 洗车店会员管理系统数据分析
  • 门户网站的意思wordpress 导航 防刷新
  • 虚幻基础:角色受击
  • unordered_set 与unordered_multiset?我们该如何选择
  • 网站建设与维护是什么可以在线观看的免费资源
  • Windows系统下的Git安装(2025年6月更新)
  • Protobuf知识总结
  • 网站的关键词在哪里设置南阳微网站建设
  • GPT‑5 都更新了些什么?
  • 晋中路桥建设集团网站tuzicms做企业手机网站如何