Robofun 機器人論壇

標題: 用PIC製作紅外線通訊(使用彙編語言)遇到問題了 [打印本頁]

作者: kiki03z    時間: 2010-10-24 20:10
標題: 用PIC製作紅外線通訊(使用彙編語言)遇到問題了
在下使用的是PIC16F877A做接收器 PIC16F877做發送
震盪頻率10MHZ
紅外線接收模組使用IR-001T5  38KHZ紅外線發射使用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
         DECFSZ  WWW,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
         DECFSZ  WWW,1
         GOTO    L1
         RETURN
;******時間子程序*******
TIMER1   MOVLW   D'6'            ;12.8us定時器子程序
         MOVWF   CNT1
         NOP
         NOP
LOOP1    NOP
         NOP
         DECFSZ  CNT1,1
         GOTO    LOOP1
         RETURN
TIMER2   MOVLW   D'62'           ;0.1ms定時器子程序
         MOVWF   CNT2
LOOP2    NOP
         DECFSZ  CNT2,1
         GOTO    LOOP2
         RETURN
TIMER3   MOVLW   D'100'          ;10ms定時器子程序
         MOVWF   CNT3
LOOP3    NOP
         CALL    TIMER2
         DECFSZ  CNT3,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
         DECFSZ  WWW,1
         GOTO    CH
         BTFSC   PORTA,4        ;核對紅外線模組
         GOTO    REPEAT         ;如果為OFF則出錯,返回
         CLRF    KEEP           ;儲存接收數據的暫存器1清空
;*****讀取發送數據中的四位******
         MOVLW   D'46'          ;12.8x50=600us動作數據1
         MOVWF   WWW
L0      CALL    TIMER1
         DECFSZ  WWW,1
         GOTO    L0
         BTFSS   PORTA,4        ;檢查紅外線模組
         BSF     KEEP,3         ;若為ON則設置保存暫存器1
         MOVLW   D'46'          ;12.8x50=600us動作數據1
         MOVWF   WWW
L1       CALL    TIMER1
         DECFSZ  WWW,1
         GOTO    L1
         BTFSS   PORTA,4        ;檢查紅外線模組
         BSF     KEEP,2         ;若為ON則設置保存暫存器1
         MOVLW   D'46'          ;13x50=600us動作數據2
         MOVWF   WWW
L2       CALL    TIMER1
         DECFSZ  WWW,1
         GOTO    L2
         BTFSS   PORTA,4        ;檢查紅外線模組
         BSF     KEEP,1         ;若為ON則設置保存暫存器1
         MOVLW   D'46'          ;12.8x50=600us動作數據3
         MOVWF   WWW
L3       CALL    TIMER1
         DECFSZ  WWW,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
         DECFSZ  WWW,1
         GOTO    L4
         BTFSC   PORTA,4        ;檢查紅外線模組
         GOTO    REPEAT         ;若為OFF 則出錯,返回
         MOVLW   D'46'          ;12.8x50=600us動作數據5
         MOVWF   WWW
L5       CALL    TIMER1
         DECFSZ  WWW,1
         GOTO    L5
         BTFSS   PORTA,4        ;檢查紅外線模組
         GOTO    REPEAT         ;若為ON 則出錯,返回
         MOVLW   D'46'          ;12.8x50=600us動作數據6
         MOVWF   WWW
L6       CALL    TIMER1
         DECFSZ  WWW,1
         GOTO    L6
         BTFSC   PORTA,4        ;檢查紅外線模組
         GOTO    REPEAT         ;若為OFF 則出錯,返回
         MOVLW   D'46'          ;12.8x50=600us動作數據6
         MOVWF   WWW
L7       CALL    TIMER1
         DECFSZ  WWW,1
         GOTO    L7
         BTFSS   PORTA,4        ;檢查紅外線模組
         GOTO    REPEAT         ;若為ON 則出錯,返回
         MOVLW   D'46'          ;12.8x50=600us動作數據6
         MOVWF   WWW
L8       CALL    TIMER1
         DECFSZ  WWW,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
         DECFSZ  CNT1,1
         GOTO    LOOP1
         RETURN
         END                    ;程序結束




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2