电路原理图如下:
;----------------------------------------------------
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
;---------------------------------------------------
|