占空比红外接收方式流程图,也许有人用得着【恢复】
本人一新手,刚刚从事单片机开发工作不到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)
占楼,明天有空发下码长方式的流程图 虽然用不到,但还是多谢楼主的精神 标记 很有用的资料, mark 发思路,很好,谢谢楼主,收藏待用! mark,备用,正打算自己复制一个建伍的遥控器 好帖马克之 mark mark 能不能说说,为什么明确不能使用输入捕获方式??
红外就是3种方式
输入捕获
外部中断+定时器计算时长
定时查询 标记 mark 很好! 这个不错,要顶,要支持! 谢谢分享 RecC能否在按键处理后清零,=1时就认为是有按键! MARK 我来顶顶! mark
{:smile:} 好贴顶一下。 我来看看,最近在研究红外啊~~ 学习一下....
页:
[1]