图1,pt226x数据帧
但是,地址和数据的有效值是由两个脉冲组成,如下图所示:
图2,有效数据位表示

大家由没有发现,这里有个很变态的地方,长脉冲和短脉冲的组合给浪费掉了!
嗯,就是这么变态。
但是,既然一个有效数据位有三种状态,那么显然在单片机里面,一个数据位只能表示0和1是不够的,这样还得扩展成2bit来表示三种状态,短脉冲短对应数据位0,长脉冲为1。
那么一个pt2262的有效位就是00b,11b,01b三种状态,这样对于单片机来说存储这些数据就变成了16位地址和8位数据。
第二、开始解码
图3,完整数据帧
一个完整的物理据帧由:16个地址脉冲+8位数据脉冲+1个结束位短高电平脉冲(4T)+1个低电平间隔(124T)
1.如何确定帧头?
只有一个结束位和低电平间隔是和数据地址有区别的,嗯,就是它了,可以作为帧头判断。
2.有效数据接收
根据图3,一个T表示一个时钟周期,地址和数据位一个短电平是4T,一个长电平是12T。
为了单片机方便解码,我们定义T=100us:
数据位0:一个短高电平(4T=400us)+一个长低电平(12T=120us)
数据位1:一个长高电平(12T=120us)+一个短低电平(4T=120us)
T
3.单片机编程实现
有了上面的分析,我们只需要实现脉冲宽度测量就可以了。
a.采用timer3作为脉冲测量定时器,计时单位是1us
b.接收管脚配置位为数据中断,在脉冲的上升沿和下降沿取定时器的计数值
c.在中断服务程序里面获取数据,这里采用状态机来解码
c.1 查找帧头短高电平, 从变为高电平时刻开始计时
c.2 变为低电平时,判断短高电平脉宽是否满足要求,如果满则要求则对低电平脉冲计时,
否则重置状态机,重新开始。
c.3变为高电平时,判断低电平脉宽是否满足要求,如果满足要求则开始接收数据,否则重新开始
d.开始数据接收解码
d.1状态机奇数获取数据的高电平脉宽,每个数据帧由24个高电平脉宽
d.2 状态机偶数获取数据的低电平脉宽,每个数据帧由24个低电平脉宽,同时判断数据的有效性
如果第一帧数据接收完成,则启动第二帧数据接收。
d.3 只有连续两帧数据接收完成,并且两帧数据一样才判断为有效数据,进而进行数据处理
4.总结
固定码解码其实并不复杂,并且方法也有很多种,上面给出的方法是最直观的方法,可以一个数据位一个数据位去思考。但是关键是要把协议格式理解清楚,也就事半功倍了。其他就是对编程能力考验,程序里面没有任何讨巧的地方,都是最普通的代码,希望对各位单片机爱好者有一定帮助。