|
在下使用的是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 ;程序結束 |
|