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模块的简单接口使其易于集成到各种电子项目中,并且在家庭自动化、智能控制等领域具有广泛的应用。
相关文章:

51单片机嵌入式开发:12、STC89C52RC 红外解码数码管显示
STC89C52RC 红外解码数码管显示 1 概述2 HX1838原理2.1 原理概述2.2 原理概述 3 HX1838代码实现3.1 工程整理3.2 工程代码3.3 演示 4 HX1838总结 1 概述 HX1838是一种常见的红外接收模块,用于接收和解码红外遥控器发送的红外信号。 HX1838具有以下特点和功能&#…...

数据结构--二叉树详解
一,概念 1,结点的度:一个结点含有子树的个数称为该结点的度 2, 树的度:一棵树中,所有结点度的最大值称为树的度; 3,叶子结点或终端结点:度为0的结点称为叶结点&#x…...

最短路径 | 743. 网络延迟时间之 Dijkstra 算法和 Floyd 算法
目录 1 基于 Dijkstra 算法1.1 代码说明1.2 完整代码 2 基于 Floyd 算法2.1 代码说明2.2 完整代码 前言:我在做「399. 除法求值」时,看到了基于 Floyd 算法的解决方案,突然想起来自己还没有做过最短路径相关的题。因此找来了「743. 网络…...

LLM模型与实践之基于 MindSpore 实现 BERT 对话情绪识别
安装环境 # 该案例在 mindnlp 0.3.1 版本完成适配,如果发现案例跑不通,可以指定mindnlp版本,执行!pip install mindnlp0.3.1 !pip install mindnlp 模型简介 BERT是一种由Google于2018年发布的新型语言模型,它是基于Transforme…...

单例模式学习cpp
现在我们要求定义一个表示总统的类型。presented可以从该类型继承出French present和American present的等类型。这些派生类型都只能产生一个实例 为了设计一个表示总统的类型,并从该类型派生出只能产生一个实例的具体总统(如法国总统和美国总统&#x…...

第5讲:Sysmac Studio中的硬件拓扑
Sysmac Studio软件概述 一、创建项目 在打开的软件中选择新建工程 然后在工程属性中输入工程名称,作者,类型选择“标准工程”即可。 在选择设备处,类型选择“控制器”。 在版本处,可以在NJ控制器的硬件右侧标签处找到这样一个版本号。 我们今天用到的是1.40,所以在软…...

使用GoAccess进行Web日志可视化
运行网站的挑战之一是了解您的 Web 服务器正在做什么。虽然各种监控应用程序可以在您的服务器以高负载或页面响应缓慢运行时提醒您,但要完全了解正在发生的事情,唯一的方法是查看 Web 日志。阅读日志数据页面并了解正在发生的事情可能需要花费大量时间。…...

GD 32 流水灯
前言: 通过后面的学习掌握了一些逻辑架构的知识,通过复习的方式将学到的裸机任务架构的知识运用起来,同时巩固前面学到的知识,GPIO的配置等。 开发板上LED引脚使用示意图 注:此次LED灯的点亮凡是是高电平点亮ÿ…...

数据结构之栈详解
1. 栈的概念以及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈…...

算法:BFS解决 FloodFill 算法
目录 FloodFill 算法 题目一:图像渲染 题目二:岛屿数量 题目三:岛屿的最大面积 题目四:被围绕的区域 FloodFill 算法 在递归搜索回溯中已经说到过 FloodFill 算法了,但是那里是用 dfs 解决的,这里会使…...

Python 中文双引号 “”
Python 中文双引号 “” 1. SyntaxError: invalid character in identifier2. CorrectionReferences 1. SyntaxError: invalid character in identifier print(Albert Einstein once said, “A person who never made a mistake never tried anything new.”) print(Albert Ei…...

以太网(Ethernet)
目录 1. What is Internet?1.1. What is Ethernet?2. TCP/IP3. Physical Layer(PHY)4. Data Link Layer4.1. MAC Sublayer5. Network Layer5.1. IP5.2. ARP6. Transport Layer6.1. UDP6.2. TCP7. Application LayerFPGA实现以太网(一)——以太网简介 网络与路由交换 菜鸟FP…...

Scrcpy adb server version (41) doesn‘t match this client (39); killing...
通过Snap 在Ubuntu上安装 scrcpy之后,启动会导致无法同时 scrcpy和adb logcat 过滤日志 目前最新的安装的platforms-tools下面的adb 版本最新都是 adb 41版本 解决办法: 在这里链接里面 下载 adb 1.0.39 版本,替换 /home/host/Android/Sdk/…...

微服务实战系列之玩转Docker(四)
前言 幸福,就是继续追寻已经拥有的东西。 ——圣奥古斯丁 什么算已经拥有的?比如爱你的人在等你,比如每日热腾腾的三餐,比如身边可爱的同事,又比如此刻的你,看见了这篇博文(😁&#…...

微信小程序-自定义组件生命周期
一.created 组件实例创建完毕调用。定义在lifetimes对象里。 不能在方法里面更改data对象里面的值,但是可以定义属性值。 lifetimes:{//不能给data设置值created(){this.testaaconsole.log("created") }}二. attached 模板解析完成挂载到页面。 可以更…...

2024年7月23日(samba DNS)
回顾 1、关闭防火墙,关闭selinux systemctl stop firewalld systemctl disable firewalld setenforce 0 2、修改静态IP地址 vim /etc/sysconfig/network-scripts/ifcfg-ens33 #修改uuid的目的是为了保证网络的唯一性 3、重启网络服务 systemctl restart netwo…...

Hyperledger顶级项目特点和介绍
Hyperledger的顶级项目 Hyperledger是Linux基金会主持的开源区块链项目,其目的是推动跨行业的区块链技术的开发和应用。以下是Hyperledger的顶级项目: 1. Hyperledger Fabric 描述:Hyperledger Fabric是一个可扩展的企业级区块链平台&…...

操作系统——笔记(1)
操作系统是管理计算机硬件资源,控制其他程序运行并为用户提供交互操作界面的系统软件的集合,控制和管理着整个计算机系统的硬件和软件资源,是最基本的系统软件。 常见的操作系统:ios、windows、Linux。 计算机系统的结构层次&am…...

isEmpty() 和 isBlank()的区别
isEmpty() 和 isBlank()的区别 平时自己开发的时候没有注意到这个地方,直到实习的时候代码审查的时候发现其用法上两者的不同. isEmpty() public static boolean isEmpty(String str) {return str null || str.length() 0; }isBlank() public static boolean isBlank(Strin…...

scrapy生成爬虫数据为excel
scrapy生成爬虫数据为excel 使用openpyxl(推荐)安装openpyxl库建一个新的Item Pipeline类在settings.py中启用ExcelPipeline说明 使用scrapy-xlsx首先,安装scrapy-xlsx:然后在Scrapy爬虫中使用管道:说明 要使用Scrapy生…...

vscode debug C++无法输入问题
研究了半天vscode debug c无法输入的问题,原来vscode的文档里面已经记录了。issue都是2020年提的了,还没解决。。。 不过人家也确实给了一个解法:用外部的terminal。 不过怎么看都还不是很方便,所以还是推荐直接使用CodeLLDB插件来…...

MODBUS tcp学习总结
MODBUS TCP协议实例数据帧详细分析_modbus 帧结构-CSDN博客...

【第一天】计算机网络 TCP/IP模型和OSI模型,从输入URL到页面显示发生了什么
TCP/IP模型和OSI模型 这两个模型属于计算机网络的体系结构。 OSI模型是七层模型,从上到下包括: 应用层,表示层,会话层,传输层,网络层,数据链路层,物理层 TCP/IP模型是四层模型&…...

发现FionaAI:免费体验最新的GPT-4o Mini模型!
你现在可以在FionaAI上免费体验OpenAI刚刚发布的GPT-4o Mini模型!作为您在Google Chrome中的ChatGPT驱动助手,FionaAI可以随时随地与您对话,帮助您轻松创作和处理文本。 为什么选择GPT-4o Mini? 最新技术:GPT-4o Mini是…...

Linux Gui 窗口对话和窗口操作
zenity 可以实现窗口对话 eg: zenity --error --width 300 --text "Permission denied. Cannot write to the file." ChosenDate$(zenity --calendar --text "Choose a date" --title "How-To Geek Rota" --day 1 --month 9 --year 2019); …...

人工智能驾驶技术:引领未来道路
随着科技的不断进步,人工智能驾驶技术正以惊人的速度改变着我们的交通方式和生活方式。这项技术不仅令人兴奋,还引发了许多关于安全性、道德和法律等方面的深思。本文将探讨人工智能自动驾驶技术的发展现状、应用前景以及对社会的影响。 技术背景与发展…...

管理的核心是管人,管人的核心就是这3条,看懂的是高手
管理的核心是管人,管人的核心就是这3条,看懂的是高手 一:管欲 每个人都有欲望,无可厚非。管理者的任务就是利用欲望,管理欲望,通过欲望来达到管人的目的。 最需要管理的就是以下两种: 1、金…...

代码解读:Diffusion Models中的长宽桶技术(Aspect Ratio Bucketing)
Diffusion Models专栏文章汇总:入门与实战 前言:自从SDXL提出了长宽桶技术之后,彻底解决了不同长宽比的图像输入问题,现在已经成为训练扩散模型必选的方案。这篇博客从代码详细解读如何在模型训练的时候运用长宽桶技术(Aspect Rat…...

Linux下如何使用GitLab进行团队协作
在Linux系统中,使用GitLab进行团队协作是非常常见的做法。GitLab是一个基于Git的代码托管和项目管理平台,可以帮助团队成员共享、追踪和管理代码的开发过程。本文将介绍如何在Linux系统中安装和配置GitLab,以及一些常用的团队协作功能。 安装…...

无法连接到internet怎么办?已连接但无internet访问,其实并不难
有时我们会遇到无法连接到Internet的问题,由多种原因引起,包括硬件故障、软件设置问题、网络供应商故障等。本文将介绍无法连接到Internet时可以采取的步骤。 简述 当你无法连接到Internet时,可以按照以下步骤进行检查和解决: 1…...