|
本人一新手,刚刚从事单片机开发工作不到3个月,最近用到红外遥控器接收,将自己的设计思路跟大家共享一下。欢迎拍砖。
红外发送一般有两种方式,一种是占空比,另外一种是码长。
占空比方式是指“1”和“0”码的长度一致,只是占空比不同。以我接触到的为例,每位数据的码长均为1.6ms,但“0”码为低电平1.2ms,高电平0.4ms,“1”码为低电平0.4ms,高电平1.2ms。每帧数据12位,最高的12、11、10这三位为头码,固定为110,第9、8位为用户码,由用户决定,剩下的第7~1位为按键码。当按下不松时会持续发码,每帧数据之间间隔8ms,发送码和按键码表如下图:(注意发送码和接收码互补)
![](http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_597505.JPG)
红外码表 (原文件名:码表.JPG)
![](http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_597504.JPG)
按键码表 (原文件名:按键码表.JPG)
因为使用的是三星的S3C9498芯片,估计用过的人不多,而且用的是汇编语言,还有一些是公司自己定义的宏,所以程序就不贴出来了,下面是流程图。由于上头明确表示不允许使用捕获方式,所以采用的是125us查询一次的方法,检测一个周期中心的值来获得接收码的值,即读取上图红外码表中红线位置处的值,蓝线位置是可能出现的误差范围(-125us~+125us,即多或者少判定了1次)。
![](http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_597524.JPG)
流程图 (原文件名:流程图.JPG)
变量说明:
TA:接收码长计数器,因为2帧数据之间间隔8ms,8/0.125=64,考虑误差,当TA>=62时认为一帧数据发送结束,当TA>=90时认为按键已经松开
HC(HalfCounter):半周期计数器,一位的长度为1.6/0.125=12.8,取13,其中心为7
BitC(BitCounter):接收到位数据计数器,每接收1位加1,正常到12即1帧数据长度后清0
RecC:接收到的数据帧计数器,每接收到1帧数据加1,可用于判连按
bCheck:接收码检测标志位,置高表示该数据已经检测过
bBit1:高电平标志位,置高表示检测到高电平。
InPin(InputPin):红外接收头数据引脚
编程思路:
每125us查询一次,
读TA值,大于90,直接去判断引脚是否变为低电平
小于90,判断数据是否处理过,bChenk=?
处理过,bCheck=1,判断引脚电平,InPin=?
InPin=1,置高电平位,bBit1=1,返回
InPin=0,判断之前是否为高电平,bBit1=?
bBit1=0,说明不是第1个低电平,数据未接收完毕,返回
bBit=1,说明是第1个低电平,即一个新的数据开始。就开始判断刚结束的数据
10<TA<15(1.25ms~1.875),一位接收完毕,bCheck=0,TA=0,bBit1=0,为下一位接收作准备,返回
TA>62(7.75ms),一帧数据接收完毕,转到接收码校验处理程序。
未处理,bCheck=0, 判断是否到中心位置,++HC=?
HC<7,未到中心位置,返回
HC>=7,到中心位置,判断引脚电平,InPin=?
InPin=1,接收到的数据位为1
InPin=0,接收到的数据位为0
数据处理,BitC++,HC=0,bCheck=1返回
数据校验流程图如下,只是说下因为是在第1个低电平处理上1个数据,所以RecC=1时有可能是上次按键发送的最后一个数据,所以判断RecC=2时候的数据。
![](http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_597544.JPG)
校验流程图 (原文件名:红外接收校验流程图.JPG)
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|