红外遥控原理
一、优点:抗干扰能力强、成本低、功耗低、易实现;
二、编码方式:NEC Protocol 的PWM(脉冲宽度调制)和Philips RC-5 Protocol 的PPM(脉冲位置调制);

红外接收头仅有GND/VCC/sigout三个引脚,单总线

三、NEC协议特征如下:
1、8位地址和8位指令长度;
2、地址和命令2次传输(确保可靠性),地址、地址反、命令、命令反,一共32位
3、 PWM脉冲宽度调制,以发射红外载波的占空比代表“0”和“1”;接收端通过MCU定时器输入捕获高电平持续时长;
4、载波频率为38Khz;
5、位时间为1.125ms或2.25ms(高电平持续时间来区分);

四、NEC码的位定义:
一个脉冲对应560us的连续载波。
一个逻辑1传输需要2.25ms(560us脉冲+1680us低电平),一个逻辑0的传输需要1.125ms(560us脉冲+560us低电平)。
而遥控接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到的信号为:逻辑1应该是560us低+1680us高,逻辑0应该是560us低+560us高。

地址码为00000000,指令码为00010101


五、程序设计思路

每个定时器计数值为1us,捕获数值300-800之间,即高电平300us-800us,根据接收端的位定义,数据0高电平560us,所以为数据0,可以看出接收端是根据高电平来进行检测。
六、定时器配置如下。

//红外遥控初始化
//设置IO以及TIM1_CH1的输入捕获
//TIM1挂载APB2上
void Remote_Init(void)
{  TIM_IC_InitTypeDef TIM1_CH1Config;  TIM1_Handler.Instance=TIM1;                          //通用定时器1TIM1_Handler.Init.Prescaler=215;                     //预分频器,1M的计数频率,1us加1.TIM1_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;    //向上计数器TIM1_Handler.Init.Period=10000;                      //自动装载值TIM1_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//clk_int与数字滤波器间分频,此处不分频HAL_TIM_IC_Init(&TIM1_Handler);//初始化TIM1输入捕获参数TIM1_CH1Config.ICPolarity=TIM_ICPOLARITY_RISING;    //上升沿捕获TIM1_CH1Config.ICSelection=TIM_ICSELECTION_DIRECTTI;//映射到TI1上TIM1_CH1Config.ICPrescaler=TIM_ICPSC_DIV1;          //配置输入分频,不分频,检测到1个边沿执行一次捕获,与滤波不冲突TIM1_CH1Config.ICFilter=0x03;                       //IC1F=0003 8个定时器时钟周期滤波HAL_TIM_IC_ConfigChannel(&TIM1_Handler,&TIM1_CH1Config,TIM_CHANNEL_1);//配置TIM1通道1HAL_TIM_IC_Start_IT(&TIM1_Handler,TIM_CHANNEL_1);   //开始捕获TIM1的通道1__HAL_TIM_ENABLE_IT(&TIM1_Handler,TIM_IT_UPDATE);   //使能更新中断

}

//定时器1底层驱动,时钟使能,引脚配置
//此函数会被HAL_TIM_IC_Init()调用
//htim:定时器1句柄
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_TIM1_CLK_ENABLE();            //使能TIM1时钟__HAL_RCC_GPIOA_CLK_ENABLE();          //开启GPIOA时钟GPIO_Initure.Pin=GPIO_PIN_8;            //PA8GPIO_Initure.Mode=GPIO_MODE_AF_PP;      //复用推挽输出GPIO_Initure.Pull=GPIO_PULLUP;          //上拉GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速GPIO_Initure.Alternate=GPIO_AF1_TIM1;   //PA8复用为TIM1通道1HAL_GPIO_Init(GPIOA,&GPIO_Initure);HAL_NVIC_SetPriority(TIM1_CC_IRQn,1,3); //设置中断优先级,抢占优先级1,子优先级3HAL_NVIC_EnableIRQ(TIM1_CC_IRQn);       //开启ITM1中断HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn,1,2); //设置中断优先级,抢占优先级1,子优先级2HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);       //开启ITM1中断
}

中断处理函数及回调函数

//遥控器接收状态
//[7]:收到了引导码标志
//[6]:得到了一个按键的所有信息
//[5]:保留
//[4]:标记上升沿是否已经被捕获
//[3:0]:溢出计时器
u8  RmtSta=0;
u16 Dval;       //下降沿时计数器的值
u32 RmtRec=0;  //红外接收到的数据
u8  RmtCnt=0;  //按键按下的次数    //定时器1更新(溢出)中断
void TIM1_UP_TIM10_IRQHandler(void)
{HAL_TIM_IRQHandler(&TIM1_Handler);//定时器共用处理函数
} //定时器1输入捕获中断服务程序
void TIM1_CC_IRQHandler(void)
{   HAL_TIM_IRQHandler(&TIM1_Handler);//定时器共用处理函数
}//定时器更新(溢出)中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM1){if(RmtSta&0x80)//上次有数据被接收到了{ RmtSta&=~0X10;                     //取消上升沿已经被捕获标记if((RmtSta&0X0F)==0X00)RmtSta|=1<<6;//标记已经完成一次按键的键值信息采集if((RmtSta&0X0F)<14)RmtSta++;else{RmtSta&=~(1<<7);//清空引导标识RmtSta&=0XF0;  //清空计数器 }                               }   }
}//定时器输入捕获中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//捕获中断发生时执行
{if(htim->Instance==TIM1)
{if(RDATA)//上升沿捕获{TIM_RESET_CAPTUREPOLARITY(&TIM1_Handler,TIM_CHANNEL_1);   //一定要先清除原来的设置!!TIM_SET_CAPTUREPOLARITY(&TIM1_Handler,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);//CC1P=1 设置为下降沿捕获__HAL_TIM_SET_COUNTER(&TIM1_Handler,0);  //清空定时器值      RmtSta|=0X10;                    //标记上升沿已经被捕获}else //下降沿捕获{Dval=HAL_TIM_ReadCapturedValue(&TIM1_Handler,TIM_CHANNEL_1);//读取CCR1也可以清CC1IF标志位//在输入捕获模式下,当相应的ICx信号检测到跳变沿后,将使用捕获/比较寄存器(TIMx_CCRx)来锁存计数器的值。发生捕获事件时,//会将相应的CCXIF标志(TIMx_SR寄存器)置1,并可发送中断或DMA请求(如果已使能)。可通过软件方法向CCxIF写入0来给CCxIF//清零,或读取存储在TIMx_CCRx寄存器中的已捕获数据TIM_RESET_CAPTUREPOLARITY(&TIM1_Handler,TIM_CHANNEL_1);   //一定要先清除原来的设置!!TIM_SET_CAPTUREPOLARITY(&TIM1_Handler,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);//配置TIM5通道1上升沿捕获if(RmtSta&0X10)                    //完成一次高电平捕获 {if(RmtSta&0X80)//接收到了引导码{if(Dval>300&&Dval<800)          //560为标准值,560us{RmtRec<<=1;  //左移一位.RmtRec|=0;  //接收到0     }else if(Dval>1400&&Dval<1800) //1680为标准值,1680us{RmtRec<<=1;    //左移一位.RmtRec|=1;  //接收到1}else if(Dval>2200&&Dval<2600)  //得到按键键值增加的信息 2500为标准值2.5ms{RmtCnt++;         //按键次数增加1次RmtSta&=0XF0;    //清空计时器     }}else if(Dval>4200&&Dval<4700)       //4500为标准值4.5ms{RmtSta|=1<<7;    //标记成功接收到了引导码RmtCnt=0;     //清除按键次数计数器}                         }RmtSta&=~(1<<4);}                                  }
}

接收数据验证

//处理红外键盘
//返回值:
//   0,没有任何按键按下
//其他,按下的按键键值.
u8 Remote_Scan(void)
{        u8 sta=0;       u8 t1,t2;  if(RmtSta&(1<<6))//得到一个按键的所有信息了{ t1=RmtRec>>24;           //得到地址码t2=(RmtRec>>16)&0xff; //得到地址反码 if((t1==(u8)~t2)&&t1==REMOTE_ID)//检验遥控识别码(ID)及地址 { t1=RmtRec>>8;t2=RmtRec;     if(t1==(u8)~t2)sta=t1;//键值正确  }   if((sta==0)||((RmtSta&0X80)==0))//按键数据错误/遥控已经没有按下了{RmtSta&=~(1<<6);//清除接收到有效按键标识RmtCnt=0;      //清除按键次数计数器}}  return sta;
}

正点原子阿波罗STM32F7-红外遥控原理及代码相关推荐

  1. 正点原子阿波罗STM32F429开发板资料发布,采用底板+核心板

    正点原子阿波罗STM32F429开发板资料发布,采用底板+核心板.... https://www.amobbs.com/thread-5654611-1-1.html 正点原子STM32开发板 htt ...

  2. 正点原子阿波罗F429+STM32CubeMX+LAN8720+LWIP:不带操作系统实现网络热插拔

    1.前言 此文章是基于正点原子阿波罗F429开发版的, 利用STM32CubeMX新建一个项目带串口printf输出的,请查看我前面的文章,这里跳过新建项目的那些. 点击跳转 2.TM32CubeMX ...

  3. 遥控汽车的编程c语言,智能小车循迹、避障、红外遥控C语言代码.docx

    //智能小车避障.循迹.红外遥控C语言代码 // 实现功能有超声波避障, 红外遥控智能小车, 红外传感器实现小车自动循迹, 1602 显示小 车的工作状态,另有三个独立按键分别控制三种状态的转换 // ...

  4. 循迹智能小车c语言主程序,智能小车循迹、避障、红外遥控C语言代码

    <智能小车循迹.避障.红外遥控C语言代码>由会员分享,可在线阅读,更多相关<智能小车循迹.避障.红外遥控C语言代码(13页珍藏版)>请在人人文库网上搜索. 1.智能小车避障.循 ...

  5. vp230引脚功能_正点原子阿波罗STM32F767

    一. 硬件整体介绍 1.       底板 底板布局功能图 1.1   CAN总线接口: 采用的是TJA1050CAN总线芯片,在CAN通信驱动芯片中有:PCA82C250.SN65HVD230.VP ...

  6. 正点原子阿波罗开发板下载调试的bug

    最近购买了正点原子的阿波罗的开发板,评估STM32F429的以太网功能.原子的开发板设计的不真不错,功能强大,外形设计优美.更多的优点我就不夸了. 新板子到手的肯定是首先连接仿真器下载一段代码进去,下 ...

  7. STC89C52单片机红外遥控中断以及代码显示

    目录 红外遥控简介 硬件电路 基本发送与接收 NEC通信协议 简单的叙述一下代码思路: 遥控建码 51单片机的外部中断 STC89C52的外部中断有两种触发方式: 下降沿触发和低电平触发 外部中断寄存 ...

  8. 腾讯嵌入式系统tos移植到正点原子阿波罗F429

    1.前言 STM32CubeMX初始化,点击跳转 cubeMX的初始化配置我就放在上个文章了,这里省略掉. 修改修改一点 2.下载tos源码 点击跳转 3.移植 在项目文件夹下新建tos文件夹.并把源 ...

  9. 基于正点原子阿波罗 STM32F429 上手RT-Thread

    RT-Thread STM32F429源码: https://github.com/RT-Thread/rt-thread/ rt-thread 目录 目录名 描述 bsp Board support ...

  10. 正点原子阿波罗F429+STM32CubeMX+LAN8720+LWIP+Freetos:带操作系统实现网络热插拔

    1.前言 前文提要 点击跳转 点击跳转代码下载 2.STM32CubeMX配置 打开ETH中断 配置freertos 已经配置完成了,点击生成代码.打开代码. 3.代码调试 3.1.main.c调试 ...

最新文章

  1. 公路病害检测有了“智慧眼”,思谋AI“助力”广东省高速公路
  2. css 兼容ie6,ie7,ff的fixed,元素上下端固定定位方法
  3. JavaScript中变量提升是什么?如何实现?
  4. ITK:转换文件格式
  5. circle后面是什么意思 python_python小课堂16 - 函数篇
  6. 谷歌guava_Google Guava BloomFilter
  7. 计算机英语 考研 翻译,研究生英语翻译笔记
  8. dell服务器t330进入不了系统,Re: 戴尔T330服务器故障
  9. DeepMind的脑补AI再获新技能:看文字知场景、复杂环境、连续视频……
  10. gitee项目能用SVN拉取吗_基于SpringBoot的车牌识别系统(附项目地址)
  11. Android中RelativeLayout及TableLayout使用说明
  12. 详解第一个CUDA程序kernel.cu
  13. linux连接交换机软件,如何用超级终端连接交换机 - 全文
  14. 新能源车提车、上牌流程
  15. iphonex时间显示蓝色_iphonex时间显示蓝色
  16. 211计算机考研到985难度,普通人想考研到985/211院校到底有多难?听听他们的心声!...
  17. mysql临时表在哪找_MySQL 中的临时表
  18. ubuntu壁纸1080p
  19. 900句--熟背后交流无障碍
  20. 算法与数据结构入门一篇就搞定

热门文章

  1. 黄河金岸诗词赋联大赛获奖名单
  2. tv 斐讯n1原生android_斐讯T1刷原生安卓TV
  3. R语言处理非线性回归模型C-D方程,【译文】R语言非线性回归入门
  4. latex 小于_小于等于 latex
  5. Matter 研讨会回顾(第二期)|乐鑫 Matter SDK 开发平台介绍和使用
  6. 柳州铁一中机器人_柳州铁一中学学子在2020年广西中小学电脑机器人竞赛中勇创佳绩...
  7. C#替换方向性的 Unicode 控制字符,解决无法匹配iphone 通讯录复制的手机号码问题
  8. 刨根究底字符编码之二——关键术语解释(下)
  9. 计算机怎么怎么打文件夹加密文件,电脑文件夹怎么加密 4种文件夹加密方法
  10. 【cs224n-11】Contextual Word Representations: BERT