PIC做的红外线遥控接收程序
扫描二维码
随时随地手机看文章
红外接收目前用的比较多的有三种方法.
1,查询法,既软件不停地查询是否为低(遥控信号)然后通过精确延时读头码.和
数据0或1码.
2,读到有信号输入时开打开定时计数器,然后通过读定时器的中断次数,来判定头码和0,1的.
3RB0或RB4-RB7加定时器(或软件延时)利用输入中断的好处是可做实时控制.
如下:
;***发射为6221,把接收到的码值送到ICD的PORTC口显示******
;*******************************
org0000h
nop
gotostart
org0004h
gotoserv
;**************************************************
start
bsfstatus,rp0;体1
MOVlw0000h
MOVwftrisc;C口输出
MOVlw0ffh;B口RB0输入
MOVwftrisb
MOVlwB’00000100’;1:64
MOVwfoption_reg;TMR0定时器
bcfstatus,rp0;体0
clrfiNTCon;10010000
bsfintcon,7;开放INT下降沿中断
bsfintcon,4
bcfintcon,1
clrfportc
loop
sleep
nop
gotoloop
;*************现场保护********************************
serv
MOVwfw_temp
swapfstatus,0
clrfstatus
MOVwfstatus_temp
MOVfpclath,0
MOVwfpclath_temp
clrfpclath
;***************遥控处理.******************************
bcfintcon,1
btfscportb,0;检测RB0是否为0.
gotozdhh;RB0不为0,误中断.反回
calldelay8;调用8MS延时.头码检测.
btfscportb,0;检测头码
gotozdhh;不是中断反回
calldelay5;延时5MS后进行数据检测.
btfssportb,0;检测RB0是否为高电平.
gotozdhh;不是继续检测.
;*********************************************
clrfdata1;20H
clrfdata2;21H
clrfdata3;22H
clrfdata4;24H
clrfjsp2;32位计数器
clrfsj;接收的数据寄存器
clrfjsp1;8位计数器
MOVlw0x20;20H寄存器送W
MOVwffsr;由W送20H到FSR
jcbtfscportb,0;检测RB0是否为低电平.
gotojc;不是继续检测.
;**************0和1数据检测****************************
jscalldelay1;延时1.3MS
btfscportb,0;检测头码过后是0还是1,
gotos1;检测的数据不"1"
;*************0数据处理*****************************
bcfsj,c;数据是"0"
rrfsj,1;0数据右移到SJ寄存器
gotoj1
;**************1数据处理.*************************
s1bsfsj,c
rrfsj,1
ddpbtfscportb,0
gotoddp
;**************RAM移位***************************
j1incfjsp1;8位计数寄存器
incfjsp2;32位数,计存器.
btfssjsp1,3;是否有8位
gotojs
clrfjsp1
MOVfsj,0;移8位数到W
MOVwfindf;W到DATA
incffsr;RAM地址加1
clrfsj
;*****************************
btfssjsp2,5;检测是否接收完32位.
gotojs;否,再检测.
MOVlwB’10001111’;送IC高8位码
xorwfdata1,0;相减(Z:1=结果为0;0=结果不为0)
btfssstatus,2;结果为0则下一步.
gotozdhh;相减结果不为0中断返回
MOVlwB’101010101’;低8位IC码检测
xorwfdata2,0
btfssstatus,2
gotozdhh
;comfdata4,0;数据反码检测.暂不用.
;subwfdata3,0
;btfssstatus,2
;gotozdhh
MOVfdata3,0;送数码到C口
MOVwfportc
gotozdhh;接收完32位则中断返回
;****************zdhh中断返回程序*********************
zdhh
MOVfpclath_temp,0
MOVwfpclath
swapfstatus_temp,0;交换STATUS与W内容,将体选还原.
MOVwfstatus;将W内容送STATUS寄存器
swapfw_temp,1;交换w_temp
swapfw_temp,0;交换w_temp与w内容,将w_temp内?
bcfintcon,1
retfie;中断返回,
;****************8ms*********************************
delay8bcfintcon,5
bcfintcon,2
MOVlwD’15’
MOVwftmr0
loop1btfssintcon,2
gotoloop1
return
;****************5ms*********************************
delay5bcfintcon,5
bcfintcon,2
MOVlwD’120’
MOVwftmr0
loop2btfssintcon,2
gotoloop2
return
;****************1.3ms*******************************
delay1bcfintcon,5
bcfintcon,2
MOVlwD’240’
MOVwftmr0
loop3btfssintcon,2
gotoloop3
return
;*************
end
错码的可能有两种
一个是字头对不好
一个是数据传输有错误特别是时序错误
后面的可以用软件校验
字头不好确认最好可以在软件规定上连续多发几个然后用移位方法判断有多次连续相同子头出现对齐字头比如连续出现20个10转换后表示准备发送数据然后等待10传输结束后跟着有一个字头如11110000这样后面就可以接数据了
A我在外面买了一个万能遥控器,他就是用pic16c57c作的,那就说明它是没有中断的,我真搞不懂他是怎么做的,它是没有解码芯片的,请问有谁知道,我现在也在做这个,有谁能提示一下,谢谢。
B这很容易
上次我用两片