定时器+外部中断实现NEC红外线协议解码

一、前言

1.1 功能介绍

随着科技的进步和人们生活水平的提高,红外遥控器已经成为了日常生活中不可或缺的电子设备之一,广泛应用于电视、空调、音响等多种家电产品中。 传统的红外遥控器通常只能实现预设的有限功能,无法满足用户对设备更加智能化、个性化的控制需求。

STC90C51作为一款功能强大的8位微控制器,具备高性能、低功耗和丰富的I/O端口资源,非常适合用于实现红外遥控信号的解码和控制。本项目利用STC90C51微控制器,结合定时器和外部中断机制,实现NEC红外线协议的解码,从而实现对红外遥控器的控制功能。

NEC红外线协议是一种常见的红外遥控通信协议,具有传输速度快、编码简单、可靠性高等特点。通过解码NEC红外线协议,可以获取遥控器发送的按键信息,进而实现对设备的远程控制。在本项目中,我们将利用STC90C51的定时器功能,设置合适的定时参数,以检测红外信号的脉冲宽度和间隔。同时,利用外部中断机制,实时监测红外接收管的状态变化,捕捉红外信号的起始和结束时刻。

通过解码NEC红外线协议,我们可以获取遥控器发送的按键编码,并将其转换为对应的控制指令。在本项目中,我们将以开关控制为例,实现对目标设备的远程控制。具体而言,当遥控器发送“开”或“关”的按键编码时,STC90C51将解码该编码,并发送相应的控制指令给目标设备,以实现设备的开关控制。

本项目的开发背景不仅体现了现代家居和电子设备对远程控制技术的需求,也展示了STC90C51微控制器在嵌入式系统设计和开发中的强大功能。通过实现NEC红外线协议的解码和控制,本项目将为用户带来更加便捷、智能的远程控制体验,推动智能家居和物联网技术的发展。

image-20240612131713957

image-20240612131727095

image-20240612131746139

image-20240612131757396

1.2 NEC协议介绍

NEC协议是一种红外线通信协议,广泛应用于家电遥控器和其他红外线设备之间的通信。该协议具有简单、易于实现和广泛兼容的特点,使得不同品牌和型号的红外设备能够互相通信和控制。

NEC协议的工作原理基于38kHz的红外线载波频率,通过发送特定格式的数据包来传输信息。每个数据包由连续的脉冲和间隔组成,其中脉冲表示逻辑1,间隔表示逻辑0。数据包的结构包括同步码(Sync Header)、地址码、地址码的反码、命令码以及命令码的反码。

同步码是数据包开始的标识,通常是一个持续约9ms的高电平脉冲(Mark),用于同步接收器和发送器之间的通信。地址码和命令码是每个按键特定的标识,用于识别按下的是哪个按键。地址码和地址码的反码用于验证遥控器发送的数据是否正确,而命令码和命令码的反码则用于执行相应的操作。

在NEC协议中,数据以二进制格式进行传输,确保了信息的准确性和高效性。此外,NEC协议还定义了一个重复码,当用户长按遥控器上的某个按键时,遥控器会发送该按键的重复码,以避免连续发送相同的命令。

NEC协议是一种基于红外线通信的协议,通过发送特定格式的数据包来实现不同设备之间的通信和控制。它具有简单、易于实现和广泛兼容的特点,被广泛应用于家电遥控器等红外设备中。

二、代码实现

2.1 main.c

#include <reg51.h>
#include "delay.h"
#include "key.h"
#include "type.h"
#include "led.h"
#include "uart.h"
#include "timer.h"
#include "exti.h"
#include "infrared.h"
int main()
{UART_Init();        //初始化串口波特率为4800Infrared_Init();    //初始化红外功能while(1){if(Infrared_RX_Flag)          //接收到红外数据{Infrared_RX_Flag=0;     //清楚标志printf("user1:%d,user2:%d\r\n",(int)Infrared_RX_Buff[0],(int)((u8)(~Infrared_RX_Buff[1])));printf("key1:%d,key2:%d\r\n",(int)Infrared_RX_Buff[2],(int)((u8)(~Infrared_RX_Buff[3])));} }
}

2.2 INFRARED.c

#include "Infrared.h"
u8 Infrared_RX_Flag=0; //红外接收标志,收到一帧正确数据后置1
u8 Infrared_RX_Buff[4];//红外代码接收缓冲区/*
函数功能: 开始红外线解码之前的相关初始化
实验板的晶振频率是12MHZ
51单片机标准架构下一个机器周期是12个时钟周期,如果晶振频率是12MHZ,那一个机器周期的时间就是12/12微秒。
也就是说定时器的计数器+1的时间就是12/12=1us。
*/
void Infrared_Init(void)
{	Infrared_GPIO=1;//红外接收引脚默认保持高电平输出TMOD&=0xF0; //清除配置  TMOD|=0x01; //配置定时器0,工作在16位计数模式TR0=0;      //停止定时器0计数ET0=0; 	    //禁止定时器0中断IT0=1;      //开启外部中断0,下降沿触发EX0=1;      //允许外部中断0中断
}/*
函数功能: 检测高电平持续的时间
*/
u16 Infrared_GetTimeH(void)
{TH0=0; //定时器0重装值为0TL0=0; //定时器0重装值为0TR0=1; //启动定时器0开始计数while(Infrared_GPIO)//等待高电平结束{if(TH0>0x40)//防止超时   {break;}}TR0=0;//停止定时器0计数return TH0<<8|TL0;//T0计数值合成为16位整数返回
}/*
检测低电平持续的时间
*/
u16 Infrared_GetTimeL(void)
{TH0=0;//定时器0的高8位重装值TL0=0;//定时器0的低8位重装值  TR0=1;//开启定时器0while(Infrared_GPIO==0)//等待低电平结束{if(TH0>0x40)//防止超时   {break;}}TR0=0;//停止定时器0计数return TH0<<8|TL0;//T0计数值合成为16位整数返回
}/*
外部中断0中断服务函数
*/
void EXTI0_IRQHandler() interrupt 0
{u8 i, j;u16 time;u8 byte;time=Infrared_GetTimeL();   //获取出现低电平的时间if((time<7800)||(time>9300))//判断低电平时间是否符合9ms范围{                           //超过此范围则说明为误码,直接退出IE0=0;                  //清除外部中断0中断标志return;	}time=Infrared_GetTimeH();   //获取出现高电平的时间if((time<3500)||(time>4700))//高电平是否符合4.5ms范围{                           //超过此范围则说明为误码,直接退出IE0=0; 				    //清除外部中断0中断标志return;}//接收32位数据位for(i=0;i<4;i++){for(j=0;j<8;j++){time=Infrared_GetTimeL();   //获取低电平持续时间,标准的间隔时间为560us范围		    				if((time<300)||(time>700))  //判断范围是否合理{IE0=0;//清除外部中断0中断标志return;}//1和0是靠高电平持续的长短来区分的time=Infrared_GetTimeH();  //获取高电平持续时间if(time>300&&time<700)    //0的标准时间为560us{byte>>=1;}else if(time>1400&&time<1800) //1的标准时间是1680us{byte>>=1;byte|=0x80;}else //不在上面的判断范围内说明是错误码,直接退出{IE0=0;//清除外部中断0中标return;}}Infrared_RX_Buff[i]=byte;//接收完一个字节后保存到缓冲区}Infrared_RX_Flag=1;//接收完毕后设置标志IE0=0;//退出前清除外部中断0中断标志
}

2.3 INFRARED.h

#ifndef _INFRAREAD_H
#define _INFRAREAD_H
#include <reg51.h>
#include "type.h"
sbit Infrared_GPIO=P3^2;//红外接收引脚--外部中断0
void Infrared_Init();//红外线接收初始化
u16 Time_H();//检测高电平
u16 Time_L();//检测低电平
extern u8 Infrared_RX_Flag; //红外接收标志,收到一帧正确数据后置1
extern u8 Infrared_RX_Buff[4];   //红外代码接收缓冲区
#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/48232.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP客户端connect断线重连

文章目录 TCP客户端connect断线重连1、为什么要断线重连2、实现代码 TCP客户端connect断线重连 1、为什么要断线重连 客户端会面临服务器崩溃的情况&#xff0c;我们可以试着写一个客户端重连的代码&#xff0c;模拟并理解一些客户端行为&#xff0c;比如游戏客户端等. 考虑到…

实战篇(十二):如何使用 Processing 创建一个多功能的简易吃豆人游戏

如何使用 Processing 创建一个多功能的简易吃豆人游戏 文章目录 如何使用 Processing 创建一个多功能的==简易==吃豆人游戏引言准备工作第一步:设置基本框架第二步:创建 Pacman 类第三步:创建 Obstacle 类第四步:添加分数系统第五步:运行游戏完整代码结论参考资料引言 吃…

STL常用算法——常用查找算法

自定义类型都要用仿函数判断 1.find() class Person { public:Person(string name,int age){this->m_Name name;this->m_Age age;}bool operator(const Person &p)//重载operator{if (this->m_Name p.m_Name && this->m_Age p.m_Age){return true;…

NVIDIA 全面转向开源 GPU 内核模块

NVIDIA 全面转向开源 GPU 内核模块 文章目录 NVIDIA 全面转向开源 GPU 内核模块支持的 GPU安装程序更改使用带有 CUDA 元包的包管理器 使用运行文件使用安装帮助脚本包管理器详细信息dnf&#xff1a;Red Hat Enterprise Linux、Fedora、Kylin、Amazon Linux 或 Rocky Linuxzypp…

网络安全等级保护:什么是网络安全等级保护?(非常详细)零基础入门到精通,收藏这一篇就够了

关键词&#xff1a; 网络安全等级保护 等级保护 网络 信息系统 旧话重提&#xff0c;一直以来&#xff0c;我们不断强调“等级保护”制度是我国的网络安全领域的基本制度、基本策略和基本方法&#xff0c;是促进信息化健康发展&#xff0c;维护国家安全、社会秩序和公共利益的…

数字图像处理中的常用特殊矩阵及MATLAB应用

一、前言 Matlab的名称来源于“矩阵实验室&#xff08;Matrix Laboratory&#xff09;”&#xff0c;其对矩阵的操作具有先天性的优势&#xff08;特别是相对于C语言的数组来说&#xff09;。在数字图像处理中&#xff0c;为了提高编程效率&#xff0c;我们可以使用多种方式来创…

Mysql数据库和Sql语句

数据库管理&#xff1a; sql语句&#xff1a;数据库用来增删改查的语句&#xff08;重要&#xff09; 备份&#xff1a;数据库的数据进行备份 主从复制、读写分离、高可用&#xff08;重要&#xff09; Mysql数据库和Sql语句 一、Mysql数据库 1、数据库&#xff1a;组织、…

Java基础(四) 内部类详解

Java 内部类详解 一. 内部类概述 内部类是嵌套在类内部进行定义的类&#xff0c;其外部的类则被称为外部类&#xff1b;按照内部类的定义位置&#xff0c;内部类可进一步划分为成员内部类、静态内部类、局部内部类和匿名内部类四种类型。内部类的出现实际上是进一步丰富了类的…

Modbus转BACnet/IP网关的技术实现与应用

引言 随着智能建筑和工业自动化的快速发展&#xff0c;不同通信协议之间的数据交换也变得日益重要。Modbus和BACnet/IP是两种广泛应用于自动化领域的通信协议&#xff0c;Modbus以其简单性和灵活性被广泛用于工业自动化&#xff0c;而BACnet/IP则在楼宇自动化系统中占据主导地…

Android APP 音视频(03)CameraX预览与MediaCodec编码

说明&#xff1a; 此CameraX预览和编码实操主要针对Android12.0系统。通过CameraX预览获取yuv格式数据&#xff0c;将yuv格式数据通过mediacodec编码输出H264码流&#xff08;使用ffmpeg播放&#xff09;&#xff0c;存储到sd卡上。 1 CameraX 和 MediaCodec简介 1.1 CameraX…

“微软蓝屏”事件,给IT行业带来的宝贵经验和教训

“微软蓝屏”事件是指2024年7月19日发生的一次全球性技术故障&#xff0c;主要涉及微软视窗&#xff08;Windows&#xff09;操作系统及其相关应用和服务。 以下是对该事件的详细解析&#xff1a; 一、事件概述 发生时间&#xff1a;2024年7月19日事件影响&#xff1a;全球多个…

【科学文献计量】中国知网(CNKI) 文献素材库生成软件详细使用说明

CNKI 文献素材库生成软件制作 1 背景2 使用步骤2.1 文献检索2.2 文献导出2.3 软件生成1 背景 在进行中文文献的综述时,往往是要借助中国知网(CNKI)文献检索平台,写作插入文献时会用Endnote软件进行辅助。因此就有需求:对于CNKI检索的结果直接导出到本地,第一是方便快速阅…

基于STM32的农业大棚温湿度采集控制系统的设计

目录 1、设计要求 2、系统功能 3、演示视频和实物 4、系统设计框图 5、软件设计流程图 6、原理图 7、主程序 8、总结 &#x1f91e;大家好&#xff0c;这里是5132单片机毕设设计项目分享&#xff0c;今天给大家分享的是智能教室。 设备的详细功能见网盘中的文章《8、基…

“机器说人话”-AI 时代的物联网

万物互联的物联网愿景已经提了许多年了&#xff0c;但是实际效果并不理想&#xff0c;除了某些厂商自己的产品生态中的产品实现了互联之外&#xff0c;就连手机控制空调&#xff0c;电视机和调光灯都没有实现。感觉小米做的好一点&#xff0c;而华为的鸿蒙的全场景&#xff0c;…

C#+layui+echarts实现动态生成折线图

概要 C#layuiecharts实现动态生成折线图 整体架构流程 后端是c#语言编写的业务流程,前端是layui和echarts 技术细节 1.先看echarts折线图需要什么样子的数据,在想后端怎么处理 2.后端代码 List<ValveTempData> list new List<ValveTempData>(); string …

Docker容器逃逸漏洞-CVE-2024-21626

Snyk 在 Docker 引擎以及其他容器化技术(例如 Kubernetes)使用的 runc <=1.1.11 的所有版本中发现了一个漏洞。利用此问题可能会导致容器逃逸到底层主机操作系统,无论是通过执行恶意映像还是使用恶意 Dockerfile 或上游映像构建映像(即使用时FROM) CVE-2024-21626原理…

生成式人工智能之路,从马尔可夫链到生成对抗网络

人工智能&#xff08;Artificial intelligence&#xff0c;AI&#xff09;技术在过去几年中取得了显著进展&#xff0c;其中生成式AI&#xff08;Generative AI&#xff09;因其强大的内容生成能力而备受关注。生成式AI可以创建新的文本、图像、音频、视频、代码以及其他形式的…

SSRF学习笔记

1.NAT学习 Nat&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;是 一种网络通信技术主要用于将私有网络中的内部IP地址转换成公共网络中的公共IP地址&#xff0c;以实现局域网内部设备访问互联网的功能。具体来说&#xff0c;Nat有以下几个主要…

Matlab画不同指标的对比图

目录 一、指标名字可修改 二、模型名字可修改 三、输入数据可修改 软件用的是Matlab R2024a。 clear,clc,close all figure1figure(1); % set(figure1,Position,[300,100,800,600],Color,[1 1 1]) axes1 axes(Parent,figure1);%% Initialize data points 一、指标名字可修…

MongoDB 学习笔记

一、简介 1、MongoDB 是什么 MongoDB 是一个基于分布式文件存储的数据库&#xff0c;官方地址 https://www.mongodb.com/ 2、数据看是什么 数据库&#xff08;DataBase&#xff09;是按照数据结构来组织、存储和管理数据的应用程序。 3、数据库的作用 主要作用是 管理数据…