kiki03z 發表於 2010-10-24 20:10:45

用PIC製作紅外線通訊(使用彙編語言)遇到問題了

在下使用的是PIC16F877A做接收器 PIC16F877做發送
震盪頻率10MHZ
紅外線接收模組使用IR-001T538KHZ紅外線發射使用HIRB5
設計功能
發送器有4個按鈕分別連接接收器的4個LED 還有一個控制LED熄滅的按鈕
現在電路接好程式也用好了
可是就是沒有任何動作
拜託誰來救救我
以下是程式碼
;紅外線發射器
;*************
LIST P=PIC16F877
INCLUDE "P16F877.INC"
;**********
LEDOFF      EQU   70H             ;設定LED熄滅數據
LEDON         EQU   71H             ;設定LED點亮數據
CNT1          EQU   72H             ;定時器1的計數變量
CNT2          EQU   73H             ;定時器2的計數變量
CNT3          EQU   74H             ;定時器3的計數變量
WWW         EQU   75H             ;截波的計數變量
STATUS      EQU   03H
OPTION_REG    EQU   81H
PORTA         EQU   05H
TRISA         EQU   85H
PORTB         EQU   06H
TRISB         EQU   86H
;******************
         ORG   0000H               ;儲存程序的起始地址
         NOP
         BSF   STATUS,RP0          ;選擇儲存單元第1列
         CLRF    TRISA               ;將端口A全部設為輸出模式
         MOVLW   0FFH                ;端口B設定用數據
         MOVWF   TRISB               ;將端口B全部設為輸入模式
         BCF   OPTION_REG,7      ;端口B的上拉電組有效
         BCF   STATUS,RP0          ;選擇儲存單元第0列
         MOVLW   LEDOFF            ;將熄燈數據放入W暫存器
         MOVWF   PORTA               ;從端口A輸出熄燈數據
;******讀取按鈕數據*********
REPEAT   BTFSS   PORTB,4         ;檢查SW4
         GOTO    UE            ;若為0(ON)則跳轉至上
         BTFSS   PORTB,3         ;檢查SW3
         GOTO    MIGI            ;若為0(ON)則跳轉至右
         BTFSS   PORTB,0         ;檢查SW0
         GOTO    SHITA         ;若為0(ON)則跳轉至下
         BTFSS   PORTB,2         ;檢查SW2
         GOTO    HIDARI          ;若為0(ON)則跳轉至左
         BTFSS   PORTB,1         ;檢查SW1
         GOTO    NAKA            ;若為0(ON)則跳轉至中
         GOTO    REPEAT          ;重複
;*****發送各個按鈕的數據*****
UE       CALL    B_1             ;開始位1
         CALL    B_0             ;數據4位B0001
         CALL    B_0
         CALL    B_0
         CALL    B_1
         CALL    B_1             ;停止位10101
         CALL    B_0
         CALL    B_1
         CALL    B_0
         CALL    B_1
         CALL    TIMER3          ;延時
         CALL    TIMER3
         GOTO    REPEAT
MIGI   CALL    B_1             ;開始位1
         CALL    B_0             ;數據4位B0010
         CALL    B_0
         CALL    B_1
         CALL    B_0
         CALL    B_1             ;停止位10101
         CALL    B_0
         CALL    B_1
         CALL    B_0
         CALL    B_1
         CALL    TIMER3          ;延時
         CALL    TIMER3
         GOTO    REPEAT
SHITA    CALL    B_1             ;開始位1
         CALL    B_0             ;數據4位B0100
         CALL    B_1
         CALL    B_0         
         CALL    B_0         
         CALL    B_1             ;停止位10101         
         CALL    B_0         
         CALL    B_1         
         CALL    B_0         
         CALL    B_1
         CALL    TIMER3          ;延時
         CALL    TIMER3
         GOTO    REPEAT
HIDARI   CALL    B_1             ;開始位1         
         CALL    B_1             ;數據4位B1000
         CALL    B_0         
         CALL    B_0         
         CALL    B_0         
         CALL    B_1             ;停止位10101      
         CALL    B_0         
         CALL    B_1         
         CALL    B_0         
         CALL    B_1
         CALL    TIMER3          ;延時
         CALL    TIMER3
         GOTO    REPEAT
NAKA   CALL    B_1             ;開始位1
         CALL    B_0             ;數據4位B0000
         CALL    B_0         
         CALL    B_0         
         CALL    B_0         
         CALL    B_1             ;停止位10101   
         CALL    B_0         
         CALL    B_1         
         CALL    B_0         
         CALL    B_1
         CALL    TIMER3          ;延時
         CALL    TIMER3
         GOTO    REPEAT
;****發送數據0********
B_0      MOVLW   D'46'         ;12.8X46=600us
         MOVWF   WWW
         MOVLW   LEDOFF          ;將熄燈數據放入W暫存器
         MOVWF   PORTA         ;從端口A輸出熄燈數據
L0       CALL    TIMER1
         DECFSZWWW,1
         GOTO    L0
         RETURN
;*****發送數據1********
B_1      MOVLW   D'23'         ;12.8X46=600us
         MOVWF   WWW
L1       MOVLW   LEDON         ;將點亮數據放入W暫存器
         MOVWF   PORTA         ;從端口A輸出點亮數據
         CALL    TIMER1
         MOVLW   LEDOFF          ;將熄燈數據放入W暫存器
         MOVWF   PORTA         ;從端口A輸出熄燈數據
         CALL    TIMER1
         DECFSZWWW,1
         GOTO    L1
         RETURN
;******時間子程序*******
TIMER1   MOVLW   D'6'            ;12.8us定時器子程序
         MOVWF   CNT1
         NOP
         NOP
LOOP1    NOP
         NOP
         DECFSZCNT1,1
         GOTO    LOOP1
         RETURN
TIMER2   MOVLW   D'62'         ;0.1ms定時器子程序
         MOVWF   CNT2
LOOP2    NOP
         DECFSZCNT2,1
         GOTO    LOOP2
         RETURN
TIMER3   MOVLW   D'100'          ;10ms定時器子程序
         MOVWF   CNT3
LOOP3    NOP
         CALL    TIMER2
         DECFSZCNT3,1
         GOTO    LOOP3
         RETURN
         END                     ;程序結束


;紅外線接收器
;************
      LIST       P=PIC16F877A
      INCLUDE   "P16F877A.INC"
;****************
LEDOFF   EQU   70H            ;設定LED熄滅數據
CNT1       EQU   71H            ;定時器的計數變量
KEEP       EQU   72H            ;儲存接收數據
WWW      EQU   73H            ;載波的計數變量
PORTA      EQU   05h
PORTB      EQU   06h
TRISA      EQU   85h
TRISB      EQU   86h
STATUS   EQU   03H
OPTION_REG EQU   81H
;****************
         ORG   0000h            ;程序儲存起始地址
         NOP
         BSF   STATUS,RP0   ;選擇儲存單元第1列
         MOVLW   1FH            ;端口A設定用數據
         MOVWF   TRISA         ;將端口A全部設為輸入模式
         CLRF    TRISB          ;將端口B全部設為輸出模式
         BCF   STATUS,RP0   ;選擇儲存單元第0列
         MOVLW   LEDOFF         ;將熄燈數據放置W暫存器
         MOVWF   PORTB          ;從端口B輸出熄燈數據
;*****取紅外線模組******
REPEAT   BTFSS   PORTA,4      ;
         GOTO    RX             ;如果為ON則出錯返回
         GOTO    REPEAT         ;重複
;*****核對兩次開始位*********
RX       MOVLW   D'32'          ;12.8X35=420us
         MOVWF   WWW
CH       CALL    TIMER1
         DECFSZWWW,1
         GOTO    CH
         BTFSC   PORTA,4      ;核對紅外線模組
         GOTO    REPEAT         ;如果為OFF則出錯,返回
         CLRF    KEEP         ;儲存接收數據的暫存器1清空
;*****讀取發送數據中的四位******
         MOVLW   D'46'          ;12.8x50=600us動作數據1
         MOVWF   WWW
L0      CALL    TIMER1
         DECFSZWWW,1
         GOTO    L0
         BTFSS   PORTA,4      ;檢查紅外線模組
         BSF   KEEP,3         ;若為ON則設置保存暫存器1
         MOVLW   D'46'          ;12.8x50=600us動作數據1
         MOVWF   WWW
L1       CALL    TIMER1
         DECFSZWWW,1
         GOTO    L1
         BTFSS   PORTA,4      ;檢查紅外線模組
         BSF   KEEP,2         ;若為ON則設置保存暫存器1
         MOVLW   D'46'          ;13x50=600us動作數據2
         MOVWF   WWW
L2       CALL    TIMER1
         DECFSZWWW,1
         GOTO    L2
         BTFSS   PORTA,4      ;檢查紅外線模組
         BSF   KEEP,1         ;若為ON則設置保存暫存器1
         MOVLW   D'46'          ;12.8x50=600us動作數據3
         MOVWF   WWW
L3       CALL    TIMER1
         DECFSZWWW,1
         GOTO    L3
         BTFSS   PORTA,4      ;檢查紅外線模組
         BSF   KEEP,0         ;若為ON則設置保存暫存器1
;****核對5個停止位(10101)****
         MOVLW   D'46'          ;12.8x50=600us動作數據4
         MOVWF   WWW
L4       CALL    TIMER1
         DECFSZWWW,1
         GOTO    L4
         BTFSC   PORTA,4      ;檢查紅外線模組
         GOTO    REPEAT         ;若為OFF 則出錯,返回
         MOVLW   D'46'          ;12.8x50=600us動作數據5
         MOVWF   WWW
L5       CALL    TIMER1
         DECFSZWWW,1
         GOTO    L5
         BTFSS   PORTA,4      ;檢查紅外線模組
         GOTO    REPEAT         ;若為ON 則出錯,返回
         MOVLW   D'46'          ;12.8x50=600us動作數據6
         MOVWF   WWW
L6       CALL    TIMER1
         DECFSZWWW,1
         GOTO    L6
         BTFSC   PORTA,4      ;檢查紅外線模組
         GOTO    REPEAT         ;若為OFF 則出錯,返回
         MOVLW   D'46'          ;12.8x50=600us動作數據6
         MOVWF   WWW
L7       CALL    TIMER1
         DECFSZWWW,1
         GOTO    L7
         BTFSS   PORTA,4      ;檢查紅外線模組
         GOTO    REPEAT         ;若為ON 則出錯,返回
         MOVLW   D'46'          ;12.8x50=600us動作數據6
         MOVWF   WWW
L8       CALL    TIMER1
         DECFSZWWW,1
         GOTO    L8
         BTFSC   PORTA,4      ;檢查紅外線模組
         GOTO    REPEAT         ;若為OFF 則出錯,返回
;******接收數據後的處理*******
         MOVF    KEEP,0         ;將KEEP1中的數據轉移置w暫存器
         MOVWF   PORTA      ;OK則將W暫存器的數據從端口B輸出
         GOTO    REPEAT
;********定時器子程序********
TIMER1   MOVLW   D'6'          ;12.8us定時器子程序
         MOVWF   CNT1
         NOP
         NOP
LOOP1    NOP
         NOP
         DECFSZCNT1,1
         GOTO    LOOP1
         RETURN
         END                  ;程序結束
頁: [1]
查看完整版本: 用PIC製作紅外線通訊(使用彙編語言)遇到問題了