電路原理圖如下:
這是小車的protus仿真原理圖
;----------------------------------------------------
INCLUDE"F:\MPASM Suite\P16F877A.INC"
TMR0B EQU 029H ;10MS
;-------------------------------------------------
;主程序
;--------------------------------------------------
ORG 0000H
NOP
BSF STATUS,RP0
MOVLW 00H
MOVWF TRISC
MOVLW B'11110000' ;定義RD口的高4位為前置四個紅外光反信號的輸入,低四位作為輸出控制電機IN1/IN2/IN3/IN4
MOVWF TRISD
MOVLW 07H ;TMR0定時器分頻比為1:256
MOVWF OPTION_REG
GOTO ST
;--------------------------------------------
;初始化PWM1、2
;--------------------------------------------
ST BSF STATUS,RP0
MOVLW 0FFH
MOVWF PR2
BCF STATUS,RP0
MOVLW 4DH
MOVWF CCPR1L
MOVWF CCPR2L
CALL WIDTH3030
MOVLW 0CH
MOVWF CCP1CON ;CCPxX、CCPxY置零
MOVWF CCP2CON
;CLRF T2CON ;定義定時器TMR2工作方式為1:1分頻
MOVLW B'00000011' ;定義定時器TMR2工作方式 1:16分頻
MOVWF T2CON
BSF T2CON,TMR2ON ;啟動TMR2定時
CALL TEST1
GOTO $-1
; MOVLW 0FFH
; MOVWF PR2
; MOVLW 0CH
; MOVWF CCP1CON
; MOVWF CCP2CON
; MOVLW B'00000011' ;定義定時器TMR2工作方式 1:16分頻
; MOVWF T2CON
;CALL WIDTH3030 ;設置脈寬為30 30
;BSF T2CON,TMR2ON
; CALL TEST1
; GOTO $-1
;----------------------------------------------
;脈寬控制調制
;---------------------------------------------
WIDTH3030 MOVLW 30H ;CCP1設置為30%占空比
MOVWF CCPR1L
MOVLW 28H ;CCP2設置為30%占空比
MOVWF CCPR2L
RETURN
WIDTH2040 MOVLW 7H ;CCP1設置為20%占空比
MOVWF CCPR1L
MOVLW 48H ;CCP2設置為40%占空比
MOVWF CCPR2L
RETURN
WIDTH4020 MOVLW 51H ;CCP1設置為40%占空比
MOVWF CCPR1L
MOVLW 7H ;CCP2設置為20%占空比
MOVWF CCPR2L
RETURN
;---------------------------------------------
; 光反數據放入26H
;--------------------------------------------
TEST1 BCF STATUS,RP0 ;返回體0
MOVF PORTD,W
MOVWF 25H ;將檢測信息放入25H
MOVF 25H,W
MOVWF 26H ;將檢測信息轉至中間變量
SWAPF 26H,F
;----------------------------------------------------------
;檢驗光反,控制轉向
;--------------------------------------------------------
BTFSC 26H,2
GOTO DET2 ;左側廣反輸出為1時,未檢測到黑線,轉而檢測右側輸出
GOTO DET1 ;左側廣反輸出為0時,檢測到黑線,轉而檢測右側輸出
DET1 BTFSC 26H,1
GOTO RIGHT111 ;0X1: 右拐
GOTO RUN111 ;0X0:停止
DET2 BTFSC 26H,1
GOTO RUN111 ;1X1時,直行
GOTO LEFT111 ;1X0時,左拐
;----------------
;直行子程序
;---------------
RUN111 BCF STATUS,RP0
BCF PORTC,6 ;直行,兩燈都不亮
BCF PORTC,7
CALL WIDTH3030
MOVF PORTD
MOVWF 27H
MOVLW 0F0H
ANDWF 27H,F
MOVLW B'00001010' ;IN1:1 IN2:0 IN4:1 IN3:0 : 直行
ADDWF 27H,W
MOVWF PORTD
GOTO LEGEND1
;---------------------------
;停止子程序
;---------------------------
STOP111 BCF STATUS,RP0
BSF PORTC,6 ;直行停止,兩燈都滅
BSF PORTC,7
MOVF PORTD
MOVWF 27H
MOVLW 0F0H
ANDWF 27H,F
MOVLW B'00000000' ;IN1:0 IN2:0 IN4:0 IN3:0 : 停止
ADDWF 27H,W
MOVWF PORTD
GOTO LEGEND1
;--------------------------------
;左拐子程序
;--------------------------------
LEFT111 BCF STATUS,RP0
BSF PORTC,7 ; 右拐,亮右轉向燈
BCF PORTD,6
CALL WIDTH2040
MOVF PORTD
MOVWF 27H
MOVLW 0F0H
ANDWF 27H,F
MOVLW B'00001010' ;IN1:0 IN2:0 IN4:1 IN3:0 : 左拐
ADDWF 27H,W
MOVWF PORTD
GOTO LEGEND1
;---------------------------------
;右拐子程序
;---------------------------------
RIGHT111 BCF STATUS,RP0
BSF PORTC,6 ; 右拐,亮右轉向燈
BCF PORTD,7
CALL WIDTH4020
MOVF PORTD
MOVWF 27H
MOVLW 0F0H
ANDWF 27H,F
MOVLW B'00001010' ;IN1:1 IN2:0 IN3:0 IN4:0 : 右拐
ADDWF 27H,W
MOVWF PORTD
LEGEND1 RETURN
;---------------------------------------
;延時子程序
;---------------------------------------
DELAY10MS BCF INTCON,T0IF
MOVLW TMR0B
MOVWF TMR0
LP1 BTFSS INTCON,T0IF
GOTO LP1
RETURN
;------------------------------------------------------
END
;---------------------------------------------------
|