做pc端软件可以参考那些网站,响应式网站是什么,深圳旅游公司网站,公众号制作模板免费STC89C52RC 红外解码数码管显示 1 概述2 HX1838原理2.1 原理概述2.2 原理概述 3 HX1838代码实现3.1 工程整理3.2 工程代码3.3 演示 4 HX1838总结 1 概述
HX1838是一种常见的红外接收模块#xff0c;用于接收和解码红外遥控器发送的红外信号。 HX1838具有以下特点和功能#… 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__//#includereg52.h #includeintrins.h //汇编指令_nop_
#includestdio.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.hextern 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.hunsigned 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 (TH08)TL0; //取得脉冲宽度tx1838_cnt ;if(time168 time800) //接收到数据位为0的时间长度{}else {if(time1100 time1800) //接收到数据位为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_cnt32){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.hvoid 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; //使用模式116位定时器使用|符号可以在使用多个定时器时不受影响 TH00x00; //给定初值这里使用定时器最大值从0开始计数一直到65535溢出TL00x00;//EA1; //总中断打开 等最后一个中断打开//ET01; //定时器中断打开TR01; //定时器开关打开
}/*------------------------------------------------定时器初始化子程序
------------------------------------------------*/
void sys_timer1_init(void)
{TMOD | 0x20; //使用模式2 TH10x05; //给定初值这里使用定时器最大值从5开始计数一直到255溢出TL10x00;//EA1; //总中断打开//ET11; //定时器中断打开//TR11; //定时器开关打开
}/*------------------------------------------------定时器初始化子程序
------------------------------------------------*/
void sys_timer2_init(void)
{RCAP2H 0/256;//RCAP2L 0/256;//ET21; //打开定时器中断//EA1; //打开总中断//TR21; //打开定时器开关
}void sys_wdog_init(void)
{ //WDT_CONTR 0x35;
}void clr_wdg(void)
{//WDT_CONTR 0x35;
}/*------------------------------------------------定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{TH00x00; //重新赋值TL00x00;//sys_led_test1(); //流水灯操作
}/*------------------------------------------------定时器中断子程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3
{//sys_led_test1(); //流水灯操作} /*------------------------------------------------定时器中断子程序
------------------------------------------------*/
void Timer2_isr(void) interrupt 5//定时器2中断
{TF20;//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号数码管P00xFF;//取显示数据段码P20; //取位码
}/********************************************************
函数名称sys_ledtube_on2
函数功能显示一组数据
入口参数
出口参数
修 改
内 容
********************************************************/
static unsigned char ledtube_cnt 0;
void sys_ledtube_on2(void)
{ledtube_cnt;if(ledtube_cnt7){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号数码管P0EL[num];//取显示数据段码P20; //取位码
}//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);#endif3.3 演示
我们使用手机遥控器按键0~9进行演示在数码管上可以显示出对应的数字。 4 HX1838总结
通过HX1838模块用户可以轻松实现红外遥控信号的接收和解码功能。它的高灵敏度和宽频带支持使其适用于多种红外遥控器并能够接收来自较远距离的红外信号。内置的解码电路简化了红外信号的处理过程使用户能够更便捷地获取解码后的数字信号。HX1838模块的简单接口使其易于集成到各种电子项目中并且在家庭自动化、智能控制等领域具有广泛的应用。