目录
前言
在学习红外遥控实验的过程中,长按检测、连发码数量统计一直是学习的的难点,网上几乎搜不到关于连发码的检测和处理的相关教程;尽管可以搜到一些代码,但通常也不完整,没有注释,对于初学者来说阅读困难;为此,本教程将系统讲解一下支持连按的解码思路并给出详细代码,还会提供可运行的完整的工程代码下载链接,对于各类教程常见的NEC编码理论和指令接收部分,不再详细介绍。
先来看一下实验结果,本实验可以实现的功能是指令码的检测和打印;若进行长按,对应LED1指示灯点亮,直到松开后LED1熄灭,并且通过串口打印出接收到的连发码个数;若进行一次短按,理论上只打印命令值,不会打印连发码个数(取决于个人操作,松手慢的话依然会接收到几个连发码)。
基于STM32F103ZET6的完整工程代码,请到资源页下载:资源上传中请稍后
一、连发码的发送时机
网上关于连发码的发送时序的资料很少,本人经过一段时间的测试和研究,绘制了连发码的发送序列图,如上图所示。从图中可以看出:当第32位指令(控制反码的最后一位)发送完成后,不是立即发送连发码,而是先发一个低电平,一段时间后再发一个高电平,这一段波形的时间大概是40ms左右(时间根据遥控器的不同会有一些出入),这一段波形的作用有两个:
(1)单按时,多提供给定时器一个下降沿捕获,从而获得第32位指令的波形时间;
(2)通过这一小段延时,来进行按键消抖,给手一个松开的时间,若延时完,手还没有松开,则认为是连按,开始发送连发码。
二、解码思路(定时器的输入捕获功能)
1、NEC协议的编码时序(接收端)
(1)引导码的组成和时间
引导码由9ms的低电平和4.5ms的空闲(即高电平)组成,波形时间为13.5ms;
(2)数据码(0、1)的组成和时间
逻辑1是560us 的低电平和1680us 的高电平,波形时间为2.24ms;
逻辑0 是560us的低电平和560us 的高电平,波形时间为1.12ms;