?? 用pic做紅外線遙控接收2.txt
字號:
紅外接收目前用的比較多的有三種方法.
1,查詢法,既軟件不停地查詢是否為低(遙控信號)然后通過精確延時讀頭碼.和
數(shù)據(jù)0或1碼.
2,讀到有信號輸入時開打開定時計數(shù)器,然后通過讀定時器的中斷次數(shù),來判定頭碼和0,1的.
3 RB0或RB4-RB7加定時器(或軟件延時)利用輸入中斷的好處是可做實時控制.
如下:
;***發(fā)射為6221,把接收到的碼值送到ICD的PORTC口顯示******
;**************** ***************
org 0000h
nop
goto start
org 0004h
goto serv
;**************************************************
start
bsf status,rp0 ;體1
movlw 0000h
movwf trisc ;C口輸出
movlw 0ffh ;B口RB0輸入
movwf trisb
movlw B'00000100' ;1:64
movwf option_reg ;TMR0定時器
bcf status,rp0 ;體0
clrf intcon ;10010000
bsf intcon,7 ;開放INT下降沿中斷
bsf intcon,4
bcf intcon,1
clrf portc
loop
sleep
nop
goto loop
;*************現(xiàn)場保護********************************
serv
movwf w_temp
swapf status,0
clrf status
movwf status_temp
movf pclath,0
movwf pclath_temp
clrf pclath
;***************遙控處理.******************************
bcf intcon,1
btfsc portb,0 ;檢測RB0是否為0.
goto zdhh ;RB0不為0,誤中斷.反回
call delay8 ;調(diào)用8MS延時.頭碼檢測.
btfsc portb,0 ;檢測頭碼
goto zdhh ;不是中斷反回
call delay5 ;延時5MS后進行數(shù)據(jù)檢測.
btfss portb,0 ;檢測RB0是否為高電平.
goto zdhh ;不是繼續(xù)檢測.
;*********************************************
clrf data1 ;20H
clrf data2 ;21H
clrf data3 ;22H
clrf data4 ;24H
clrf jsp2 ;32位計數(shù)器
clrf sj ;接收的數(shù)據(jù)寄存器
clrf jsp1 ;8位計數(shù)器
movlw 0x20 ;20H寄存器送W
movwf fsr ;由W送20H到FSR
jc btfsc portb,0 ;檢測RB0是否為低電平.
goto jc ;不是繼續(xù)檢測.
;**************0和1數(shù)據(jù)檢測****************************
js call delay1 ;延時1.3MS
btfsc portb,0 ;檢測頭碼過后是0還是1,
goto s1 ;檢測的數(shù)據(jù)不"1"
;*************0數(shù)據(jù)處理*****************************
bcf sj,c ;數(shù)據(jù)是"0"
rrf sj,1 ;0數(shù)據(jù)右移到SJ寄存器
goto j1
;**************1數(shù)據(jù)處理.*************************
s1 bsf sj,c
rrf sj,1
ddp btfsc portb,0
goto ddp
;**************RAM移位***************************
j1 incf jsp1 ;8位計數(shù)寄存器
incf jsp2 ;32位數(shù),計存器.
btfss jsp1,3 ;是否有8位
goto js
clrf jsp1
movf sj,0 ;移8位數(shù)到W
movwf indf ;W到DATA
incf fsr ;RAM地址加1
clrf sj
;*****************************
btfss jsp2,5 ;檢測是否接收完32位.
goto js ;否,再檢測.
movlw B'10001111' ;送IC高8位碼
xorwf data1,0 ;相減(Z:1=結(jié)果為0;0=結(jié)果不為0)
btfss status,2 ;結(jié)果為0則下一步.
goto zdhh ;相減結(jié)果不為0中斷返回
movlw B'101010101' ;低8位IC碼檢測
xorwf data2,0
btfss status,2
goto zdhh
;comf data4,0 ;數(shù)據(jù)反碼檢測.暫不用.
;subwf data3,0
;btfss status,2
;goto zdhh
movf data3,0 ;送數(shù)碼到C口
movwf portc
goto zdhh ;接收完32位則中斷返回
;****************zdhh中斷返回程序*********************
zdhh
movf pclath_temp,0
movwf pclath
swapf status_temp,0 ;交換STATUS與W內(nèi)容,將體選還原.
movwf status ;將W內(nèi)容送STATUS寄存器
swapf w_temp,1 ;交換w_temp
swapf w_temp,0 ;交換w_temp與w內(nèi)容,將w_temp內(nèi)?
bcf intcon,1
retfie ;中斷返回,
;****************8ms*********************************
delay8 bcf intcon,5
bcf intcon,2
movlw D'15'
movwf tmr0
loop1 btfss intcon,2
goto loop1
return
;****************5ms*********************************
delay5 bcf intcon,5
bcf intcon,2
movlw D'120'
movwf tmr0
loop2 btfss intcon,2
goto loop2
return
;****************1.3ms*******************************
delay1 bcf intcon,5
bcf intcon,2
movlw D'240'
movwf tmr0
loop3 btfss intcon,2
goto loop3
return
;*************
end
錯碼的可能有兩種
一個是字頭對不好
一個是數(shù)據(jù)傳輸有錯誤 特別是時序錯誤
后面的可以用軟件校驗
字頭不好確認 最好可以在軟件規(guī)定上連續(xù)多發(fā)幾個 然后用移位方法判斷有多次連續(xù)相同子頭出現(xiàn) 對齊字頭 比如連續(xù)出現(xiàn)20個1 0轉(zhuǎn)換后 表示準備發(fā)送數(shù)據(jù) 然后等待1 0 傳輸結(jié)束后 跟著有一個字頭 如11110000 這樣 后面就可以接數(shù)據(jù)了
A 我在外面買了一個萬能遙控器,他就是用pic16c57c作的,那就說明它是沒有中斷的,我真搞不懂他是怎么做的,它是沒有解碼芯片的,請問有誰知道,我現(xiàn)在也在做這個,有誰能提示一下,謝謝。
B 這很容易
上次我用兩片PIC16C57C作了一個發(fā)射與一個接收的小模塊。有效控制,沒能出現(xiàn)亂碼,但有一缺點就是會受到其它紅外線產(chǎn)品的干擾!!
C 紅外接受
用外中斷,加定時,即可檢測出編碼,非常準確。我用的是PIC16F72芯片。
D 我使用紅外線接受管加兩級放大,看紅外線的輸出波形,用長虹的遙控器當信號源,在示波器上要打到10ms才能看到完整的信號波形,像個穩(wěn)壓后的波形一樣的東西,我看了有關方面的書說,紅外線信號時調(diào)制在38khz的信號上的,那我將示波器打到50ns上為什么看不到波形,這樣的話程序不是沒有辦法編了,望哪位高人幫幫我,謝謝
E 可以用CCP中的input capture(輸入捕捉)功能,很好用的,仔細閱讀一下input capture有關內(nèi)容,很容易的
在CCP的引腳上若有事件發(fā)生(可設置為上升沿,下降沿或其他方式),TMR1的內(nèi)容背記錄,這樣很準確的,即使中斷響應較慢也沒問題的,這樣的功能來做紅外遙控最恰當不過!!
F 回復紅外定時接收原理
用RB0做中斷(FIRST:RISING TRIG,SECOND:FALLING TRIG),同時啟動TIMER2定時100US)計數(shù).當下一個中斷來臨時,由TIMER2有88個數(shù),9MS就檢測出來。其余時間,
類推。注意,RBO的中斷沿,要根據(jù)時序,來改變。據(jù)此原理,很容易編出代碼。
還有一個地方值得注意 ; 紅外信號的衰減很厲害的,所以一定要考慮它的接受范圍的選擇
其實用那種方法都可以,在接收數(shù)據(jù)時時間方面留夠余量,這樣對正確接收數(shù)據(jù)有好處
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -