STM32F103C8T6红外遥控解码
目录
一、红外遥控
二、输入捕获初始化
捕获两个上升沿或者下降沿得到他们之间一个周期为1US的的波计次数来得到时间
三、NEC解码
四、IC.h函数
红外按键
五、主函数
六、总结
推荐STM32学习课程:
[6-5] TIM输入捕获_哔哩哔哩_bilibili[6-5] TIM输入捕获是STM32入门教程-2022持续更新中的第17集视频,该合集共计29集,视频收藏或关注UP主,及时了解更多相关视频内容。https://www.bilibili.com/video/BV1th411z7sn?p=17&vd_source=ed36b2700bbc2bac7746c270bc391540
OLED显示屏代码:
STM32F103C8T6延时函数和OLED显示屏代码_HX091624的博客-CSDN博客
一、红外遥控
红外遥控的发射电路是采用红外发光二极管来发出经过调制的红外光波;红外接收电路由红外接收二极管、三极管或硅光电池组成,它们将红外发射器发射的红外光转换为相应的电信号,再送后置放大器。以下代码是NEC解码。
接线方式:
二、输入捕获初始化
捕获两个上升沿或者下降沿得到他们之间一个周期为1US的的波计次数来得到时间
#include "stm32f10x.h" uint16_t IR_Time;
uint8_t IR_State=1;
uint8_t IR_Data[4];
uint8_t IR_pData;
uint8_t IR_DataFlag;
uint8_t IR_RepeatFlag;
uint8_t IR_Address;
uint8_t IR_Command;//初始化
void IC_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//内部时钟TIM_InternalClockConfig(TIM1);//时基单元 TIM1->高级定时器 1USTIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1; //ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1; //PSCTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);//输入捕获TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //通道1TIM_ICInitStructure.TIM_ICFilter = 0xF;TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; //下降沿捕获TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;TIM_ICInit(TIM1, &TIM_ICInitStructure);//主从触发模式 捕获后CNT计数器自动清零TIM_SelectInputTrigger(TIM1, TIM_TS_TI1FP1);TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Reset);//NVICNVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn; //TIM1中断NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能NVIC_Init(&NVIC_InitStructure); //允许CC1IE捕获中断TIM_ITConfig(TIM1,TIM_IT_CC1,ENABLE); TIM_Cmd(TIM1, ENABLE);
}//返回时间
uint32_t IC_GetFreq(void)
{return (TIM_GetCapture1(TIM1) + 1);
}
三、NEC解码
//以下代码使用了输入捕获来获取两个下降沿之间的时间,使用一个周期为1US的波形作为基准
//通过下降沿捕获得到两个下降沿之间的基准波形的次数,从而得到时间
//再结合NEC解码,即可写出解码过程
//输入捕获中断
void TIM1_CC_IRQHandler(void)
{if(TIM_GetITStatus(TIM1,TIM_IT_CC1) == SET){if(IR_State==1) //状态1,等待Start信号或Repeat信号{IR_Time = IC_GetFreq();//如果计时为13.5ms,则接收到了Start信号(判定值在12MHz晶振下为13500,在11.0592MHz晶振下为12442)if(IR_Time>13500-500 && IR_Time<13500+500){IR_State=2; //置状态为2}//如果计时为11.25ms,则接收到了Repeat信号(判定值在12MHz晶振下为11250,在11.0592MHz晶振下为10368)else if(IR_Time>11250-500 && IR_Time<11250+500){IR_RepeatFlag=1; //置收到连发帧标志位为1IR_State=1; //置状态为0}else //接收出错{IR_State=1; //置状态为1}}else if(IR_State==2) //状态2,接收数据{IR_Time = IC_GetFreq();//如果计时为1120us,则接收到了数据0(判定值在12MHz晶振下为1120,在11.0592MHz晶振下为1032)if(IR_Time>1120-500 && IR_Time<1120+500){IR_Data[IR_pData/8]&=~(0x01<<(IR_pData%8)); //数据对应位清0IR_pData++; //数据位置指针自增}//如果计时为2250us,则接收到了数据1(判定值在12MHz晶振下为2250,在11.0592MHz晶振下为2074)else if(IR_Time>2240-500 && IR_Time<2240+500){IR_Data[IR_pData/8]|=(0x01<<(IR_pData%8)); //数据对应位置1IR_pData++; //数据位置指针自增}else //接收出错{IR_pData=0; //数据位置指针清0IR_State=1; //置状态为1}if(IR_pData>=32) //如果接收到了32位数据{IR_pData=0; //数据位置指针清0//验证数据是否接收正确 再转存if((IR_Data[0] & IR_Data[1])==0 && (IR_Data[2] & IR_Data[3])==0){IR_Address=IR_Data[0]; //转存数据IR_Command=IR_Data[2];IR_DataFlag=1; //置收到连发帧标志位为1}IR_State=1; //置状态为0}}}TIM_ClearITPendingBit(TIM1,TIM_IT_CC1);
}// 红外遥控获取收到数据帧标志位
uint8_t IR_GetDataFlag(void)
{if(IR_DataFlag){IR_DataFlag=0;return 1;}return 0;
}// 红外遥控获取收到连发帧标志位
uint8_t IR_GetRepeatFlag(void)
{if(IR_RepeatFlag){IR_RepeatFlag=0;return 1;}return 0;
}// 红外遥控获取收到的地址数据
uint8_t IR_GetAddress(void)
{return IR_Address;
}// 红外遥控获取收到的命令数据
uint8_t IR_GetCommand(void)
{return IR_Command;
}
四、IC.h函数
红外按键
#ifndef __IC_H
#define __IC_H//红外按键键码
#define IR_POWER 0x45
#define IR_MODE 0x46
#define IR_MUTE 0x47
#define IR_START_STOP 0x44
#define IR_PREVIOUS 0x40
#define IR_NEXT 0x43
#define IR_EQ 0x07
#define IR_VOL_MINUS 0x15
#define IR_VOL_ADD 0x09
#define IR_0 0x16
#define IR_RPT 0x19
#define IR_USD 0x0D
#define IR_1 0x0C
#define IR_2 0x18
#define IR_3 0x5E
#define IR_4 0x08
#define IR_5 0x1C
#define IR_6 0x5A
#define IR_7 0x42
#define IR_8 0x52
#define IR_9 0x4Avoid IC_Init(void);
uint32_t IC_GetFreq(void);
uint8_t IR_GetDataFlag(void);
uint8_t IR_GetRepeatFlag(void);
uint8_t IR_GetAddress(void);
uint8_t IR_GetCommand(void);#endif
五、主函数
#include "stm32f10x.h"
#include "IC.h"uint8_t Num;
uint8_t Address;
uint8_t Command;int main(void)
{OLED_Init();IC_Init();//OLED显示屏OLED_ShowString(1,1,"ADDR CMD NUM");OLED_ShowString(2,1,"00 00 000");while(1){if(IR_GetDataFlag() || IR_GetRepeatFlag()) //如果收到数据帧或者收到连发帧{Address=IR_GetAddress(); //获取遥控器地址码Command=IR_GetCommand(); //获取遥控器命令码OLED_ShowHexNum(2,1,Address,2); //显示遥控器地址码OLED_ShowHexNum(2,7,Command,2); //显示遥控器命令码if(Command==IR_VOL_MINUS) //如果遥控器VOL-按键按下{Num--; //Num自减}if(Command==IR_VOL_ADD) //如果遥控器VOL+按键按下{Num++; //Num自增} OLED_ShowNum(2,12,Num,3); //显示Num}}
}
六、总结
参考资料:
舵机控制:https://blog.csdn.net/qq_38824401/article/details/119778153
希望大家多多留言,有任何问题都可评论区留言,需要源代码的评论区留下QQ邮箱
STM32F103C8T6红外遥控解码相关推荐
- 基于FPGA的红外遥控解码与PC串口通信
基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...
- 万能遥控程序c语言,51单片机万能红外遥控解码程序
51hei单片机论坛里流传的遥控解码程序现在都弱爆了根本解不了现在的遥控自己写个万能红外遥控解码 本程序中需要用的头文件下载:http://www.51hei.com/mcu/2564.html // ...
- 基于51单片机+红外遥控解码+LCD1602显示
红外遥控解码(NEC) 基本介绍 什么是红外线? 红外线系统的组成 发射管和接收管 红外遥控发射(载波频率) 重要介绍 NEC协议 数据格式(必看) 位定义(必看) 编写程序思路(2种) 方式一 方式 ...
- HT6221红外遥控解码设计
项目名称 HT6221红外遥控解码设计 具体要求 接收红外按键的数据在ISSP上观察 设计说明 下图为红外遥控器及按键图.红外接收头有三个引脚,电源.地和信号输出. HT6221芯片的红外遥控发送数据 ...
- arduino 的红外遥控解码
测试发现 遥控器的角度不一样 或者有反射 导致解析的码也不一样 程序 /** IRrecvDemo-LED* =====================功能说明================ ...
- MS8006单片机开发IR红外遥控解码原理与程序实现(NEC)
目录 一.红外遥控概述 二.红外编码规则 三.硬件实现 四.软件部分 1.软件实现原理 2.红外解码程序说明 3.高低位逆转算法说明 4.key_switch遥控按键指令识别函数说明 五.总结 一.红 ...
- HS9148红外遥控解码
TC9148.HS9148.SC9148.BL9148解码 1.红外简介 红外遥控系统一般由红外发射装置和红外接收设备两大部分组成. 红外发射装置又可由键盘电路. 红外编码芯片组成. 红外接收设备可由 ...
- c语言红外解码程序,[转载]红外遥控和C语言51红外遥控解码程序设计实例
什么是红外线?人的眼睛能看到的可见光按波长从长到短排列,依次为红.橙.黄.绿.青.蓝.紫.其中红光的波长范围为0.62-0.76μm:比红光波长还长的光叫红外线.红外遥控在生产和生活中应用越来越广泛, ...
- 学习型红外遥控器设计(3) 红外遥控解码学习
学习型红外遥控器设计(0) 摘要 (1) 绪论 (2) 方案设计 (3) 遥控解码 (4) 编码还原 (5) 硬件实现 (6) 总结展望 如方案设计所述,制作红外接收解码装置,该装 ...
- 实战篇:基于HT6221的红外遥控解码实现
本次主要实现红外遥控解码模块的实现,红外模块发送端采用的是HT6221的编码芯片,而在接收端由于红外对管,生成的正好是与发送端电平相反的信号.要实现解码模块程序编写,需先知道协议的过程以及编码的格式, ...
最新文章
- AJPFX关于单例设计模式
- 互联网1分钟 | 0920
- Python3 解释执行字符串类型的代码
- 职业化之可以固化的六个工作模式
- React的生命周期
- socket抓包_64、抓包分析tcp与udp
- SpringBoot+SpringCloud —— 使用Feign消费服务
- slitax 制定iso
- 正则匹配图片地址 php,php正则匹配图片地址
- KL 散度(从动力系统到推荐系统)
- SpringAOP底层API之代理对象执行流程
- 什么是磁力链接如何愉快的使用磁力链接
- QTreeView导航菜单效果
- 增加虚拟android内存,SD卡变RAM 增加虚拟内存方法
- 从零开始学WEB前端——网页的骨架——HTML理论讲解
- python之多进程和多协成爬虫
- 分布式能源的不确定性——风速测试(Matlab代码实现)
- 暑假的计划【写在这里,监督自己】
- 解决WPS高分辨率下因字体缩放导致字体发虚的问题
- 安全狗入选信通院“业务安全推进计划”名单