基于单片机的红外线遥控解码驱动(接收解码NEC协议)

废话不多说,为了证明我的驱动程序能够可靠的实现,先上两张图再说。

左图就是硬件方面,图中的绿色框框就是我使用的遥控器,当然也是要基于NEC红外线协议的,红色圈圈内就是我使用的红外接收头,这两者在某宝上都可以买到。红外接收头的接线尤其简单,只需要给他供电,然后把数据信号脚接在单片机的对应引脚上就OJBK了。由于没有现成的板子供我使用,我就找了一块旧板子自己搭了个电路,丑是丑了点,可是实用啊。

右图就是驱动成功后用串口打印出来的数据,其中key:0表示0号键位,后面跟着的shortDown,longDownStar,longDown,releaseLong分别表示按键短按下,按键长按开始,按键持续长按,按键长按释放四种状态,其实还有一个releaseShort表示按键短按释放,不过本图中没有表示出来,但是请人民群众放心,绝对可以实现的。

NEC协议:

既然我们要做基于NEC的红外遥控解码,那么我们首先就得了解啥是NEC协议,NEC嘛.......简单的来说不就是一个单线协议吗,这有啥难的。是哈!!!说是这么说,不过我们还是需要简单的了解一下,我这里仅仅介绍NEC的编码解码格式。
NEC的编码解码格式同其他的什么乱七八糟的无线单线解码格式差不多,具体分为同步码(引导头),地址码,地址反码,数据码(控制码),数据反码(控制反码),数据结束位,重复码,重复码结束位.....重复码,重复码结束位

注意:其他的都没什么,与一般的无线协议差不了多少,网上的说明文档也很多,但是,要注意两个地方“数据结束位”和“重复码结束位”,这两个地方网上好多的网友都没有注意,如果不注意这一点的话,只能做到获取按键按下,并不能像我一样,能实现长按和短按的区别,望大家尤其要注意这一点,后面我会具体讲到这两个结束位。

在讲具体的编码/解码协议之前,我需要声明一下:

我主要介绍的是解码协议,编码协议基本不讲,不过两者格式都是和上面讲的是一样的,没有区别,只不过为了编码解码方便,大家一般都是讲两者的编码电平反过来用,也就是说发送端发送的是高电平,接收端接收到的就是低电平,所以当你在网上看到其他博主的讲法或者波形不一样的时候一定要注意他讲的是编码还是解码的协议,还有就是这只是习惯问题,你要是喜欢可以自己做一个反向电路再把电平反回来也没有问题,我这里用的电路跟网上大部分的电路是一样的,接收端空闲状态下信号线是高电平。

介绍完编码的格式(协议帧)那就该具体介绍每一部分的编码内容了。

同步码:人家喜欢叫引导头或者别的什么我不在意,我就喜欢叫他同步码。同步码是由9ms的低电平和4.5ms的高电平组成也就是整个同步头的时间在9+4.5 = 13.5ms

同步码后面紧紧跟着4个字节的数据也就是前面讲的地址码,地址反码,数据码,数据反码组成,而每1Bit的数据组成是什么样的呢

逻辑1:逻辑1是由560us低电平和1680us高电平组成。

逻辑0:逻辑0是由560us低电平和560us高电平组成。

也就是说,这4个字节32bit的数据全部是由逻辑1和逻辑0组成的,这个过程的时间最低是(560+560)*32us = 35840us = 35.84ms,最高是(560+1680)*32us = 71680us = 71.68ms。

在介绍完四个字节的数据帧后,紧随再后的就是数据帧的停止位了。

数据帧的停止位:要注意,前面讲的数据帧1Bit都是由两端不同的电平组成的,都是由下降沿开始,上升沿结束的。但是,这里的停止位却只有一段电平————高电平组成,并且这段电平的长度是620us,那么你可能就有疑问了,一定是高电平吗?一定是,因为数据帧每一位是由下降沿开始,上升沿结束的,也就是说数据帧结束后只可能是高电平的状态,你品!你细品!!细细品!!!搞清楚了这个问题,那么数据帧的停止位还没有搞定吗?

重复码:重复码是用来表示按键连续按下的编码,也就是所你按下遥控器上的一个按键,直到松手为止,遥控器只会发出一段同步码,一段数据码,接着就是n段重复码了。重复码是由9ms低电平和2.5ms高电平组成。重复码每隔110ms发送一次,那么第一段重复码的发送时间该怎么算呢,我看了网上好多博主讲的,其实也没有讲得很清楚。所谓的每隔110ms发送一次重复码讲的是从同步码开始算起,那么我们一起来算一算第一段重复码会在什么时间段发送。

第一段重复码:同步码时间13.5ms+数据帧的时间(min:35.84ms  ,  max:71.68ms)+数据帧停止位560us =( min:49.9ms ,   max:85.74),那么第一段重复码发送时间应该在数据帧结束后的 110ms - ( min:49.9ms ,   max:85.74) = ( min:24.26ms ,   max:60.1ms)内,也就是说我们在数据帧结束后的24.26ms~60.1ms内应该要接收到第一段同步码,可以以此作为判断依据,当然,最好是从头直接算时间是最好的。

重复码停止位:发送端在每发送完一组重复码后都会发出一个停止位,重复码的停止位与数据帧的停止位一样也是又一段长度为560us的高电平组成。发完了重复码停止位后面会紧跟着n段重复码,每一段重复码的间隔时间不变都是110ms,那么同样我们也可以算一下一组重复码结束位后多长时间会接收都下一组重复码。110ms-(9ms+2.5ms+560us) = 97.94ms,也就是说在每一组重复码结束位后会随着97.94ms的高电平后发下一组重复码。

贴的这个图在数据跟我讲的略微有点不一样,但是内人是一致的,并且上图中的波形为发射端的波形,而不是接收端的波形。

网上讲的大多不够详细,缺胳膊断腿的,我不能说我讲的一定很详细,所有人都能根据我讲的做出驱动来,但是应该能弥补网上的一些其他博主没有讲到的地方,并且我自己确实按着这个思路便驱动做出来了。

这里我贴上一篇我认为讲得比较好的文档,不过是讲的编码部分的,也许对您会有帮助。

https://blog.csdn.net/lee_jimmy/article/details/81056420

我会上传我的做的驱动代码,您下载后只需要做简单的修改应该就能驱动模块了。

最后,水平有限,能力一般,讲得不够完善或者有错误的地方万望海涵,并请您在评论区告诉我让我及时更新,不误人误己。

发布了4 篇原创文章 · 获赞 0 · 访问量 394

猜你喜欢

转载自blog.csdn.net/qq_33784286/article/details/103310831