红外遥控应用广泛,而编码及识别往往是单片机初学者最头痛的问题,其实红外编码及识别并不难,关键是要掌握红外编码及识别的方法,首先让我们来了解下红外编码.
一.红外编码.
红外编码一般是以下格式.
9ms 高电平的头+2.4ms低电平的结果码+8byte address code+8byte address code+8 byte user data+ 8byte data
由于采用一体化红外接收头,所以这里要注意发送的高电平实际上是38K的载波,就是高低电平按38K的频率不断地变换,一体化接收头会自动识别,整理为低电平.
另外一点要注意的是,发送的1,和0如图所示,其实是低电平的时间长短不同.高电平的时间都为560us.判断低电平的时间是识别0,1的关键.
二,红外识别.
红外识别实际上是发送的相反过程.如高电平接收后是低电平,以下是识别流程,
1.判断9MS头是否OK
2.判断结果码.
3.数据560us低电平结束,高电平开始,开始判断接收数据. 长的高电平为1,反之为0.
4.32BYTE接收完否?没有,重复第三步.
三,连续码的问题.
如果用户长按,实际上是只发送一个9MS头,和一个结果码,还有一个560us高电平即可.这样读出的数据实际上是一个固定的值.根据这个值就可以判断是否是连发代码.
这里简单讲了红外编码及识别的初步知识,以下是部分识别代码.
;---------------------------------------------------
ir_rec
movlw 0x20
movwf IPOD3 ;4*8=32 bits.
ir_begin
movlw 0x09 ;9
movwf IPOD2
ir_rec_data
call delay120us ;delay delay120us
btfss _IR
goto ir_low ;low....
decfsz IPOD2,F
goto ir_rec_data ;9*120us...if low then 0,
setc ;still high? 1
goto ir_save_data
ir_low
clrc
ir_save_data
rlf IPOD5,F
rlf IPOD6,F
rlf IPOD7,F
rlf IPOD8,F ;4*8=32 bits.
movlw .80 ;80
movwf IPOD2
ir_next
call delay120us ;delay120us
btfss _IR
goto ir_next_bit ;next bit
decfsz IPOD2,F ;80*120us=9.6ms
goto ir_next
bsf _IROK
retlw 0 ;return