?? 用pic做紅外線遙控接收1.txt
字號:
如何用PIC做紅外線遙控接收?
============================
先用20106之類的片子解調后,你用示波器掛在20106的輸出端就可以查看遙控波形。
=============================
NEC遙控接收第一次正常,以后就不行了(附遙控子程序)請指正。
不才是PIC領域的新手,最近寫了一個關于NEC遙控接收解碼的測試程序,下面是此程序的遙控解碼部分但是它只能第一次正確判斷出接收碼,以后就不行了請高手指點
我知道遙控碼的連發情況,但我已經設置了32位接收碼的計數器,應該不會有問題的
我判斷0(1.125ms)和1(2.25ms) 由于我用的是C57,只能通過查詢方式來確定.通過高電平的時間(以下程序中延時0.9MS)不同來決定0或1的。
;NEC格式遙控碼的接收與解碼子程序
;本程序中采用PORTA 0口接收紅外遙控,地址碼為00H,高位FFH,數據碼為00H,反碼為FFH,接收到的依次存放到 25H ADD8L, 26H ADD8H,DAT8 27H ,
28H DAT8F寄存器中。
;第一次接收到此信號即關機.
;============ GOOD ========================
REMOTE_RECEIVER
CLRF 20H ;20H的第0位遙控接收正確與否標志位
BTFSC PORTA,0 ;RA0=0接收到信號
GOTO BACK ;判斷9MS低電平和4.5MS高電平。
;----5ms delay----------------
MOVLW 06H ;防止抖動,延時5ms
MOVWF 30H
LOOP4 MOVLW 0FFH
MOVWF 31H
LOOP5 DECFSZ 31H,1
GOTO LOOP5
DECFSZ 30H,1
GOTO LOOP4
;-----------------------------
BTFSC PORTA,0
GOTO BACK ;遙控接收無效。
LOOP0 BTFSS PORTA,0 ;遙控接收,等待高電平出現,約9-5ms
GOTO LOOP0
;------------測一個脈沖接收-----
STEP MOVLW D'32' ;設置32位接收碼的計數器.
MOVWF BIT32
STEP1 BTFSC PORTA,0 ;等待4.5ms
GOTO STEP1
STEP2 BTFSS PORTA,0
GOTO STEP2
;-----------------------------
MOVLW D'180' ;延時0.9ms,測試高電平的脈寬。
MOVWF 29H
BCF STATUS,C
WAIT NOP
NOP
DECFSZ 29H,1
GOTO WAIT
;-----------------------------
BTFSS PORTA,0 ;PA0 TO C
GOTO C0
GOTO C1
C0 BCF STATUS,C
GOTO STEP3
C1 BSF STATUS,C
STEP3 MOVLW D'4'
MOVWF 2AH
MOVLW 28H ;28H是DAT8F的地址
MOVWF FSR ;利用FSR進行間接尋址。
STEP4 RLF INDF,1
DECF FSR,1
DECFSZ 2AH,1
GOTO STEP4
DECFSZ BIT32,1
GOTO STEP1
MOVF ADD8L,0
XORLW 00H
BTFSS STATUS,Z
GOTO BACK ;低8位地址碼不對,返回
MOVF ADD8H,0
XORLW 0FFH
BTFSS STATUS,Z
GOTO BACK
MOVF DAT8,0 ;8位數據碼不對,返回
XORLW 00H
BTFSS STATUS,Z
GOTO BACK
MOVF DAT8F,0 ;8位數據反碼不對,返回
XORLW 0FFH
BTFSS STATUS,Z
GOTO BACK
GOTO REM_OK ;代碼接收正確
BACK BSF 20H,0
REM_OK RETURN
回復 先清32位數據再接收.
然后每接收完8位后,RAM要清0
如;**************RAM移位***************************
j1 incf jsp1 ;8位計數寄存器
incf jsp2 ;32位數,計存器.
btfss jsp1,3 ;是否有8位
goto js
clrf jsp1
movf sj,0 ;移8位數到W
movwf ** ;W到DATA
incf f ;RAM地址加1
clrf sj ;注意這里!!!!!!!!!!!!!!!
;*****************************
btfss jsp2,5 ;檢測是否接收完32位.
goto js ;否,再檢測.
這是6122和6121 IC的接收程序.
發表于:2003-03-04 17:34:51
小寶:很高興看到你的提示,不過我的程序不是按照每8位接收后經過RAM放入寄存器中,而是每位都經過4次循環移位后直接放入存放數據的寄存器中(參見接收程序中的STEP4),所以不可能按昭你所說的那樣清0。
你的程序單獨看是沒有問題的。我想關鍵在于發射編碼究竟如何?你所謂“第一次可以,以后就不行了”,是不是每次復位后的第一次發射和接受是正常的?如果是這樣的,說明還是連發的處理不是很合適。發生連發時,應該將25H-28H清空。否則第二次發射時,25H-28H已經有了部分不完整的數據,造成移位過程中的錯誤數據,接受失敗。
我的意見不一定正確,僅供參考。
NEC遙控接收問題
NEC遙控接收問題出錯在位接收上。
我看程序有點問題,主要是在接收位上,應該是每接受8位后才把FSR-1,在回到接受程序上。如此進行4次可以接受32位的數據。
發表于:2003-03-04 20:46:38
并不是位接收問題
我那程序的位接收問題不是先接收8位再保存的,那個4次循環指的是每接收一位后即改變STATUS標志位C,同時4個接收寄存器依次帶C位移位,等到接收32位后(即第1位移位32次后恰好保存到了第一個接收寄存器的第7位,第2位移到了第6位)你可以自己演示一下,這樣32位正好保存到了4個寄存器中。
可以參見我那段程序的STEP3,STEP4。
很感謝有這么多熱心的朋友關心這個問題!
=========================
紅外線遙控編碼有幾種類型
類型不知道,但格式有上千種
我要做個通用型的紅外接收器, 就是不管遙控器發送什么碼,反正照收不誤, 然后按原樣把它發送出去, 我想用PIC做,你看要用哪種型號的控制器做較好!
既然是轉發你管他格式干什么?
你又不解碼,只要檢測聯接紅外管的PIC的I/O口的電壓變化就行了,再在另一個腳把他發送出去。送你一個檢測紅外的小程序。只不過要自己做一點電路。點擊瀏覽該文件
最后一位數據位的寬度如何檢測!!
以紅外接收器為準,如果沒有遙控信號的情況下,接收器的輸出端是不是高電平,如果是,最后一位碼,0.56ms低電平過后,接著是出現高電平對吧,那高電平的寬度如何確定就不好辦了!請教老兄!
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -