51单片机嵌入式开发:12、STC89C52RC 红外解码数码管显示

STC89C52RC 红外解码数码管显示

  • 1 概述
  • 2 HX1838原理
    • 2.1 原理概述
    • 2.2 原理概述
  • 3 HX1838代码实现
    • 3.1 工程整理
    • 3.2 工程代码
    • 3.3 演示
  • 4 HX1838总结


在这里插入图片描述

1 概述

HX1838是一种常见的红外接收模块,用于接收和解码红外遥控器发送的红外信号。
HX1838具有以下特点和功能:
灵敏度高:HX1838采用高灵敏度的红外接收头,能够接收到较远距离的红外信号。
宽频带:HX1838支持38kHz的红外调制频率,适用于常见的红外遥控器。
内置解码电路:HX1838模块内部集成了红外信号解码电路,能够将接收到的红外信号解码为数字信号,方便后续处理。
简单接口:HX1838模块通常通过3个引脚进行连接,包括供电正极(VCC)、地(GND)和输出信号(OUT),接口简单、易于使用。
应用广泛:HX1838模块常用于各种红外遥控应用,如家电控制、智能家居、遥控车辆等。
使用HX1838模块时,通常需要将其与微控制器或其他数字电路连接,以接收和处理解码后的红外信号。根据具体的应用需求,可以使用相应的编程语言和库来处理和应用接收到的红外信号。

在这里插入图片描述

2 HX1838原理

2.1 原理概述

HX1838模块的工作原理如下:
接收红外信号:当红外遥控器发送信号时,HX1838模块中的红外光电二极管会接收到红外光信号。红外光电二极管是一种特殊的二极管,具有对红外光敏感的特性。
转换为电信号:接收到的红外光信号会被红外光电二极管转换为相应的电信号。这个电信号的特征是频率为38kHz的调制波形,即红外遥控器发送信号时会对红外光进行38kHz的调制。
解码电路处理:HX1838模块内部集成了解码电路,用于将接收到的调制信号进行解码。解码电路会对接收到的信号进行滤波、整形和解码处理,将红外信号转换为数字信号。
输出解码数据:解码后的数字信号将以特定的格式输出,通常是通过模块上的输出引脚(如OUT引脚)输出。输出的数字信号可以表示红外遥控器发送的按键码或其他相关信息。
红外遥控器采用了NEC编码规则:

2.2 原理概述

红外信号NEC 载波频率为 38Khz引导码:9ms 高电平 + 4.5ms 低电平1 码 :0.56 ms 高电平 + 0.56 ms 低电平0 码 : 0.56ms 高电平 + 1.68 ms 低电平结束码 :0.56ms 高电平
数据帧格式:引导码 + 地址 + 地址反码 + 键值 + 键值反码 + 结束码
重复帧格式:9ms 高电平 + 2.25ms低电平 + 结束位 + 结束码
高位在前,即首先收到的是高位的数据

2.3 HX1838解码时序
NEC协议的格式,首先来看NEC协议的典型脉冲链:主要分为:
引导码----用户码(区分不同遥控器)----用户码反码----键码(键值)----键码反码

在这里插入图片描述

具体形式:

在这里插入图片描述

注意:由于在HX1838芯片解码时,输出管脚接受到的编码是红外线的编码的反码。

在这里插入图片描述

而具体的引导码形式和逻辑位的形式如下图所示:

在这里插入图片描述

按照上图,进行代码编写!

3 HX1838代码实现

3.1 工程整理

因为工程中需要使用定时器计时解码波形信号时间长短,所以我们添加定时器的c/h文件,同时工程需要用数码管显示接受到的按键数值,所以,添加ledtube的c/h文件,工程框架如下。

在这里插入图片描述

3.2 工程代码

//main.c文件

#include "includes.h"/******************************************************************/
/*                    微秒延时函数  //10us                         */
/******************************************************************/
void delay_us(unsigned int us)//delay us
{while(us--){}
}/******************************************************************/
/*                    微秒延时函数                                */
/******************************************************************/
void delay_ms(unsigned int Ms)//delay us
{while(Ms--){delay_us(100);}
}/*------------------------------------------------延时子程序
------------------------------------------------*/
void delay(unsigned int cnt) 
{while(--cnt);
}/*------------------------------------------------主函数
------------------------------------------------*/
void main (void)
{sys_timer_init();delay(10);delay_ms(10);sys_ledtube_on2();sys_ledtube_on1();while (1){
//		sys_keynum_ledon(9);sys_tx1838_test();}
}

//includes.h文件

#ifndef __INCLUDES_H__
#define __INCLUDES_H__//#include<reg52.h> #include<intrins.h> //汇编指令_nop_
#include<stdio.h> 	//标准输入输出//_nop_(); 产生一条NOP指令
//作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。
//NOP指令为单周期指令,可由晶振频率算出延时时间。//8051 为每个机器周期 12 时钟
//对于12M晶振,延时1uS。
//11.0592M晶振,延时1.0851uS。//对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "STC89C5xRC_RDP.h"//应用层头文件
//#include "c51_gpio.h"
#include "c51_ledtube.h"
//#include "c51_key.h"
#include "c51_timer.h"
//#include "c51_exit.h"
//#include "c51_lcd1602.h"
//#include "c51_iic.h"
#include "c51_tx1838.h"extern void delay(unsigned int cnt);
extern void delay_us(unsigned int us);//delay us;
extern void delay_ms(unsigned int Ms);//delay Ms;#endif

//c51_tx1838.c文件

#include "includes.h"unsigned char tx1838_cnt = 0;
unsigned char tx1838_id = 0;
unsigned char tx1838_data = 0;void sys_tx1838_test(void)
{unsigned int time = 0;while(!NEC);		//等待低电平结束TH0 = 0;TL0 = 0;while(NEC);			//等待数据位计时time =(TH0<<8)+TL0; //取得脉冲宽度tx1838_cnt ++ ;if(time>168 && time<800) //接收到数据位为0的时间长度{}else {if(time>1100 && time<1800) //接收到数据位为1的时间长度{if(tx1838_cnt > 8){tx1838_id |= (1<<(tx1838_cnt-9));//取识别遥控器类型}if(tx1838_cnt > 24)//取出最后一字节 {tx1838_data |= (1<<(tx1838_cnt-25));}}else //重新解码 //接收到引导码或者结束码,或者接收到的是重复码,本章节不进行演示{tx1838_cnt = 0;		//接收位数量清0tx1838_id = 0;tx1838_data = 0;}}if(tx1838_cnt==32){switch(tx1838_data)//判断数码值{case 255:sys_keynum_ledon(0);break;//0 显示相应的按键值case 254:sys_keynum_ledon(1);break;//1case 253:sys_keynum_ledon(2);break;//2case 252:sys_keynum_ledon(3);break;//3case 251:sys_keynum_ledon(4);break;//4case 250:sys_keynum_ledon(5);break;//5case 249:sys_keynum_ledon(6);break;//6case 248:sys_keynum_ledon(7);break;//7case 247:sys_keynum_ledon(8);break;//8case 246:sys_keynum_ledon(0);break;//9 显示相应的按键值}}}

//c51_tx1838.h文件

#ifndef __C51_TX1838_H__
#define __C51_TX1838_H__#define  NEC 	P32 //红外线接收头  extern unsigned char tx1838_cnt;
extern unsigned char tx1838_id;
extern unsigned char tx1838_data;extern void sys_tx1838_test(void);#endif

//c51_timer.c文件

#include "includes.h"void sys_timer_init(void)
{sys_timer0_init();sys_timer1_init();sys_timer2_init();sys_wdog_init();clr_wdg();
}/*------------------------------------------------定时器初始化子程序
------------------------------------------------*/
void sys_timer0_init(void)
{TMOD |= 0x01;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响		     TH0=0x00;	      //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出TL0=0x00;//EA=1;            //总中断打开 等最后一个中断打开//ET0=1;           //定时器中断打开TR0=1;           //定时器开关打开
}/*------------------------------------------------定时器初始化子程序
------------------------------------------------*/
void sys_timer1_init(void)
{TMOD |= 0x20;	  //使用模式2,	     TH1=0x05;	      //给定初值,这里使用定时器最大值从5开始计数一直到255溢出TL1=0x00;//EA=1;            //总中断打开//ET1=1;           //定时器中断打开//TR1=1;           //定时器开关打开
}/*------------------------------------------------定时器初始化子程序
------------------------------------------------*/
void sys_timer2_init(void)
{RCAP2H = 0/256;//RCAP2L = 0/256;//ET2=1;                     //打开定时器中断//EA=1;                      //打开总中断//TR2=1;                     //打开定时器开关
}void sys_wdog_init(void)
{ //WDT_CONTR = 0x35;
}void clr_wdg(void)
{//WDT_CONTR = 0x35;
}/*------------------------------------------------定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{TH0=0x00;		  //重新赋值TL0=0x00;//sys_led_test1(); //流水灯操作
}/*------------------------------------------------定时器中断子程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3
{//sys_led_test1(); //流水灯操作}	/*------------------------------------------------定时器中断子程序
------------------------------------------------*/
void Timer2_isr(void) interrupt 5//定时器2中断
{TF2=0;//sys_led_test1(); //流水灯操作
}

//c51_timer.h文件

#ifndef __C51_TIMER_H__
#define __C51_TIMER_H__extern void sys_timer_init(void);
extern void sys_timer0_init(void);
extern void Timer0_isr(void);
extern void sys_timer1_init(void);
extern void Timer1_isr(void);
extern void sys_timer2_init(void);
extern void Timer2_isr(void);extern void sys_wdog_init(void);
extern void clr_wdg(void);#endif

//c51_ledtube.c文件

#include "includes.h"// 显示段码值01234567,可对应原理图查看显示不同图形对应的引脚高点电平配置状态
unsigned char const EL[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,\0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F/********************************************************
函数名称:sys_ledtube_on1
函数功能:点亮一个数码管全为亮起来
入口参数:
出口参数:
修    改:
内    容:
********************************************************/
void sys_ledtube_on1(void)
{//根据原理图,将P0口全部输出高电平,P2选择0号数码管P0=0xFF;//取显示数据,段码P2=0;  	//取位码
}/********************************************************
函数名称:sys_ledtube_on2
函数功能:显示一组数据
入口参数:
出口参数:
修    改:
内    容:
********************************************************/
static unsigned char ledtube_cnt = 0;
void sys_ledtube_on2(void)
{ledtube_cnt++;if(ledtube_cnt>7){ledtube_cnt = 0;}P0 = 0x00;				//防止切换数码管瞬间有虚影出现P2 = 0x00;P0 = EL[ledtube_cnt];	//取显示数据,段码P2 = ledtube_cnt;  		//取位码//根据人眼适应虚影缓冲时间为50ms左右//我们调整delay在500以下可以看到明显的看起来是一串数据一起显示delay(100); 			
}/********************************************************
函数名称:sys_keynum_ledon
函数功能:显示按键数值
入口参数:按键数值
出口参数:
修    改:
内    容:
********************************************************/
void sys_keynum_ledon(unsigned char num)
{//根据原理图,将P0口全部输出高电平,P2选择0号数码管P0=EL[num];//取显示数据,段码P2=0;  	//取位码
}

//c51_ledtube.h文件

#ifndef __C51_LEDTUBE_H__
#define __C51_LEDTUBE_H__extern unsigned char const EL[];extern void sys_ledtube_on1(void);
extern void sys_ledtube_on2(void);extern void sys_keynum_ledon(unsigned char num);#endif

3.3 演示

我们使用手机遥控器按键0~9进行演示,在数码管上可以显示出对应的数字。

在这里插入图片描述
在这里插入图片描述

4 HX1838总结

通过HX1838模块,用户可以轻松实现红外遥控信号的接收和解码功能。它的高灵敏度和宽频带支持使其适用于多种红外遥控器,并能够接收来自较远距离的红外信号。内置的解码电路简化了红外信号的处理过程,使用户能够更便捷地获取解码后的数字信号。HX1838模块的简单接口使其易于集成到各种电子项目中,并且在家庭自动化、智能控制等领域具有广泛的应用。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

二、BIO、NIO、直接内存与零拷贝

一、网络通信编程基础 1、Socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层&#xff0c;是一组接口&#xff0c;由操作系统提供&#xff1b; Socket将复杂的TCP/IP协议处理和通信缓存管理都隐藏在接口后面&#xff0c;对用户来说就是使用简单的接口进行网络应用编程…

HarmonyOS根据官网写案列~ArkTs从简单地页面开始

Entry Component struct Index {State message: string 快速入门;build() {Column() {Text(this.message).fontSize(24).fontWeight(700).width(100%).textAlign(TextAlign.Start).padding({ left: 16 }).fontFamily(HarmonyHeiTi-Bold).lineHeight(33)Scroll() {Column() {Ba…

使用Docker 实现 MySQL 循环复制(三)

系列文章 使用Docker 实现 MySQL 循环复制&#xff08;一&#xff09; 使用Docker 实现 MySQL 循环复制&#xff08;二&#xff09; 目录 系列文章1. 在主机上安装MySQL客户端2. 配置循环复制拓扑2.1 进入容器2.2 创建复制用户并授予复制权限2.3 复位二进制日志2.4 配置环形复…

信息安全工程师题

物理隔离技术要求两台物理机物理上并不直连&#xff0c;只能进行间接的信息交换。所以防火墙不能实现网络的物理隔离Web应用防火墙可以防止SQL注入、xss攻击、恶意文件上传、远程命令执行、文件包含、恶意扫描拦截等&#xff1b;可以发现并拦截恶意的Web代码&#xff1b;可防止…

详解MLOps,从Jupyter开发到生产部署

大家好&#xff0c;Jupyter notebook 是机器学习的便捷工具&#xff0c;但在应用部署方面存在局限。为了提升其可扩展性和稳定性&#xff0c;需结合DevOps和MLOps技术。通过自动化的持续集成和持续交付流程&#xff0c;可将AI应用高效部署至HuggingFace平台。 本文将介绍MLOps…

色彩与故乡的对话 —— 钱华个人油画展正式开展

色彩与故乡的对话 —— 钱华个人油画展正式开展 2024年7月17日 &#xff0c;在宁波这座历史与现代交织的城市里&#xff0c;艺术与文化的碰撞再次绽放出耀眼的光芒。由宁波海曙区美术家协会主办&#xff0c;宁波市海纳广场开发经营有限公司协办的“色彩与故乡的对话——钱华个人…

HDLC(高级数据链路控制协议)的定义、数据结构、状态检测、基本配置、特点及限制

一、HDLC的定义 HDLC是一种面向比特的对用同步串行数字链路封装协议。 面向比特:对于任何比特流,HDLC都可以实现透明的传输; 同步串行:应用于同步串行线路; 应用于接口:在同步模式下的Serial接口和pos接口; 只支持点到点链路,通过keepalive报文来检测链路状态。 …

pnpm build打包时占内溢出

这两天在打包H5网页的时候失败&#xff0c;总是提示下方错误 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory 严重错误&#xff1a;堆限制附近标记压缩无效分配失败 - JavaScript 堆内存不足 尝试了多种方法&…

使用Docker 实现 MySQL 循环复制(二)

系列文章 使用Docker 实现 MySQL 循环复制&#xff08;一&#xff09; 目录 系列文章1. 创建三个 mysql 容器1.1 准备三个 mysql 容器的挂载卷1.2 为三个mysql实例创建配置文件1.3 修改各目录的权限以满足 mysql 容器的要求1.4 创建 docker-compose.yaml 文件1.5 创建容器 1. …

记录一下在Hyper-v中动态磁盘在Ubuntu中不完全用到的问题(扩展根目录)

在之前给hyper虚拟机的Ubuntu分配磁盘有20G&#xff1b; 后来在Ubuntu中查看磁盘发现有一个分区没用到&#xff1a; 贴的图片是完成扩展后的 之前这里是10G&#xff0c;然后有个dev/sda4的分区&#xff0c;也是10G&#xff0c;Type是Microsoft Basic Data&#xff1b; …

实现了一个心理测试的小程序,微信小程序学习使用问题总结

1. 如何在跳转页面中传递参数 &#xff0c;在 onLoad 方法中通过 options 接收 2. radio 如何获取选中的值&#xff1f; bindchange 方法 参数e, e.detail.value 。 如果想要获取其他属性&#xff0c;使用data-xx 指定&#xff0c;然后 e.target.dataset.xx 获取。 3. 不刷…

项目实用linux 操作详解-轻松玩转linux

我之前写过完整的linux系统详解介绍&#xff1a; LInux操作详解一&#xff1a;vmware安装linux系统以及网络配置 LInux操作详解二&#xff1a;linux的目录结构 LInux操作详解三&#xff1a;linux实际操作及远程登录 LInux操作详解四&#xff1a;linux的vi和vim编辑器 LInux操作…

剧本杀小程序搭建,为商家带来新的收益方向

近几年&#xff0c;剧本杀游戏成为了游戏市场的一匹黑马&#xff0c;受到了不少年轻玩家的欢迎。随着信息技术的快速发展&#xff0c;传统的剧本杀门店已经无法满足游戏玩家日益增长的需求&#xff0c;因此&#xff0c;剧本杀市场开始向线上模式发展&#xff0c;实现行业数字化…

灵雀云AML:赋能金融AI,构建数智时代核心竞争力

在人工智能&#xff08;AI&#xff09;技术的迅猛发展中&#xff0c;金融行业正迈入变革的新时代。AI不仅在优化投资决策、信用评估、实时监控和欺诈识别方面展现出强大功能&#xff0c;还极大地提升了客户体验、降低了运营成本&#xff0c;并推动了产品创新。面对智能时代的挑…

唯众特色软件开发实训室解决方案

特色软件开发实训室解决方案旨在构建一个全方位、高度灵活且效率卓越的实训生态系统&#xff0c;它不仅仅是一个学习空间&#xff0c;更是一个让学生能够身临其境&#xff0c;在模拟真实工作环境中锤炼技能的实战场。通过精心设计的实训项目与案例&#xff0c;学生能够在实践中…

在Ubuntu上安装redis

Ubuntu上安装redis 一、通过下载redis的压缩包安装二、通过apt包管理器安装Redis三、修改redis的配置文件四、控制redis启动 Redis是一种开源的内存数据存储&#xff0c;可以用作数据库、缓存和消息代理等。本文将会介绍两种不同的安装方式&#xff0c;包括通过压缩包安装以及通…

日志之ELK使用讲解

文章目录 1 ELK1.1 ELK 简介1.1.1 Logstash1.1.2 Elasticsearch1.1.3 Kibana 1.2 ELK 实现方案1.3 ELK 平台搭建1.3.1 安装 Logstash1.3.2 安装 Elasticsearch1.3.3 安装 Kibana 1.4 在 SpringBoot 中使用 ELK1.4.1 修改并部署 Spring Boot 项目1.4.2 配置 Shipper 角色 Logsta…

国内从事双臂机器人的团队

一、背景 随着人形机器人的发展&#xff0c;双臂协同操作得到了越来越多研究人员的关注。我自己也是做双臂机器人方向的&#xff0c;虽然通过看论文或刷知乎了解到国内有许多团队在做双臂机器人方向&#xff0c;但还没有系统的整理过&#xff0c;因此趁这次机会&#xff0c;好…

【C++进阶学习】第七弹——AVL树——树形结构存储数据的经典模块

二叉搜索树&#xff1a;【C进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫-CSDN博客 目录 一、AVL树的概念 二、AVL树的原理与实现 AVL树的节点 AVL树的插入 AVL树的旋转 AVL树的打印 AVL树的检查 三、实现AVL树的完整代码 四、总结 前言&#xff1a…

前端轻松拿捏!最简全栈登录认证和权限设计!

本项目代码已开源&#xff0c;具体见&#xff1a; 前端工程&#xff1a;vue3-ts-blog-frontend 后端工程&#xff1a;express-blog-backend 数据库初始化脚本&#xff1a;关注公众号程序员白彬&#xff0c;回复关键字“博客数据库脚本”&#xff0c;即可获取。 前端走向全栈&am…