|
楼主 |
发表于 2007-10-6 15:10:18
|
显示全部楼层
楼上的已发,请注意查收!
需要说明一点,调试和使用时不要在有太阳光照射到的地方,最好把窗帘拉上,在日光灯下没有问题,否则会调试失败。
光电管RG149买不到,可以用ST168。
源程序见下面,没有用c,用汇编写的, 很乱,大家不要见笑。
红外遥控模式,后来因各种原因,没有条件调试,没有弄好。自由模式,你可以自己根据需要更改。RF模块是四通道的,最好选用6通道的那种,我这个因按键不够,只有前后左控制,没有向右转功能。
;使用L293控制马达
;******************************
;硬件连接:
;P0.0,P0.1,P0.2----左电机控制
;P2.5,P2.6,P2.7----右电机控制
;P0.3-P0.7----RF module
;P2.0---forward indicator
;P2.1---right indicator
;P2.2---left indicator
;P3.4-----CENTRAL Detect
;P3.5-----RIGHT Detect
;P3.6-----LEFT Detect
;P3.2-----FORWARD Detect SWITCH
;P2.4-----START&REMOTE_receiver
;P2.3-----前左方避障侦测
;P3.7-----前右方避障侦测
;P1.0-----=0,循迹模式
;P1.1-----=0,FREE模式
;P1.2-----=0,IR遥控模式
;P1.0&P1.1&P1.2-----=1,RF遥控模式
;****Forard********************
;P0.1&P2.6=1,P2.5&P0.0=1,P2.7&0.2=0
;P2.0=0,P2.1&P2.2=1---LED indicator
;*******Back****************
;P0.1&P2.6=1,P2.5&P0.0=0,P2.7&0.2=1
;P2.0=0,P2.1&P2.2=1---LED indicator
;*******Left****************
;P0.1=0,P2.6=1,P2.5=1,P2.7=0
;P2.0=1,P2.1=1,P2.2=0---LED indicator
;*******Right****************
;P0.1=1,P2.6=0,P0.0=1,P0.2=0
;P2.0=1,P2.1=0,P2.2=1---LED indicator
;*******Stop****************
;P2.6&p0.1=0
;P2.0=1,P2.1=1,P2.2=1---LED indicator
;********IR接收定义***********
;1ms---forward
;2ms---back
;3ms---right
;4ms---left
;5ms---stop
;*******RF接收定义***********
;P0.7=1 Forard
;P0.6=1 Back
;P0.5=1 Stop
;P0.4=1 Right
;P0.3
;*******主程序***********************
ORG 0000h
AJMP START
ORG 0003H
AJMP INT
ORG 0030H
START:
C_Detect EQU P3.4
R_Detect EQU P3.5
L_Detect EQU P3.6
MOV TMOD, #01
MOV TH1,#0FFH
MOV TL1,#0F3H
SETB EA
CLR ET1 ;Set time1
SETB EX0 ;开中断
;******电机控制I/O置0**********
CALL MOTOR ;MOTOR RESET
;************循迹模式******************************
track:
MOV A,P1
CJNE A,#11111110B,free ;模式判断
CLR EX0 ;关中断
JB P2.4,$ ;等待遙控信號
C_D:
JB C_Detect,R_D ;检查中间是否有黑色线,没有转到右边侦测
CALL Forwardset ;在黑线位置,向前走
C_D1:
JNB C_Detect,$ ;继续侦测
CALL MOTOR ;偏离黑线,stop
R_D:
JB R_Detect,L_D ;检查右边是否有黑线,没有转到左边去侦测
CALL Rightset ;右边处于黑线位置,向右边转
JB C_Detect,$ ;中间转到黑线就停止
CALL Forwardset ;
AJMP C_D1 ;到中间侦测
L_D:
JB L_Detect,C_D ;检查左边是否处于黑线位置,没有转到中间
CALL leftset ;左边处于黑线位置,向左转
JB C_Detect,$ ;中间转到黑线就停止
CALL Forwardset ;
AJMP C_D1 ;到中间去侦测
;*********FREE模式************************
free:
CJNE A,#11111101B,IR ;模式判断
JB P2.4,$ ;等待遙控信號开始
CLR EX0 ;关中断
LOOP:
CALL Forwardset
FREELOOP:
JB P3.2,FR
CALL Backset ;前方有障碍物,先后退0.2s
CALL DELAY02
CALL leftset ;然后向左转
CALL DELAY ;向右转1.3s
AJMP LOOP
FR: ;检测前右方是否右障碍物
JB P3.7,FL ;有,向左转0.6s
CALL leftset
CALL DELAY06
AJMP LOOP
FL: ;检测前左方是否右障碍物
JB P2.3,FREELOOP ;有,向右转0.6s
CALL Rightset
CALL DELAY06
AJMP LOOP
;*********IR Receiver***************************
IR:
CJNE A,#11111011B,RF ;模式判断
REMOTE:
Forward:
JB P2.4,$ ;
CALL YS3
JNB P2.4,Back
CALL Forwardset
AJMP REMOTE
Back:
CALL YS3
JNB P2.4,Right
CALL Backset
AJMP REMOTE
Right:
CALL YS3
JNB P2.4,Left
CALL Rightset
AJMP REMOTE
Left:
CALL YS3
JNB P2.4,Stop
CALL Leftset
AJMP REMOTE
Stop:
CALL YS3
JNB P2.4,REMOTE
CALL MOTOR
AJMP REMOTE
;********RF receiver**********************
RF:
CJNE A,#11111111B,out ;模式判断
CLR EX0 ;关中断
RF_Forward:
JNB P0.7,RF_Back ;P1.0=1 Receiver forward
CALL Forwardset
;JB P0.7,$ ;等待变为低电平
RF_Back:
JNB P0.6,RF_Stop ;P1.1=1 BACK
CALL Backset
;JB P0.6,$ ;等待变为低电平
RF_Stop:
JNB P0.5,RF_Left ;P1.2=1 STOP
CALL MOTOR
;JB P0.5,$ ;等待变为低电平
RF_Left:
JNB P0.4,FR_RF ;P1.3=1 Left
CALL Leftset
;JB P0.4,$ ;等待变为低电平
FR_RF: ;检测前右方是否右障碍物
JB P3.7,FL_RF ;有,向左转0.6s
CALL leftset
CALL DELAY06
AJMP RF_Forward
FL_RF: ;检测前左方是否右障碍物
JB P2.3,RF_Forward ;有,向右转0.6s
CALL Rightset
CALL DELAY06
AJMP RF_Forward
out:
AJMP track
;********motor control*********************
Forwardset:
SETB P2.1
SETB P2.2
CLR P2.0 ;LED,Indicator
SETB P0.1
SETB P2.6
SETB P2.5
SETB P0.0
CLR P2.7
CLR P0.2 ;Forard控制
ret
Backset:
CLR P2.0
SETB P2.1
SETB P2.2 ;LED,Indicator
SETB P0.1
SETB P2.6
CLR P2.5
CLR P0.0
SETB P2.7
SETB P0.2 ;Back控制
ret
Rightset:
SETB P2.0
CLR P2.1
SETB P2.2 ;LED,Indicator
SETB P0.1
CLR P2.6
SETB P0.0
CLR P0.2 ;Right控制
ret
Leftset:
SETB P2.0
SETB P2.1
CLR P2.2 ;LED,Indicator
CLR P0.1
SETB P2.6
SETB P2.5
CLR P2.7 ;Left控制
ret
MOTOR: ;停止
CLR P0.1
CLR P2.6
setb p2.0
RET
;*********延时1.3S程序***************
DELAY:
MOV R2,#65
S1: MOV R3,#40
S2:MOV R4,#249
S3:DJNZ R4,S3
DJNZ R3,S2
DJNZ R2,S1
RET
;*********延时0.2秒程序*****************
DELAY02:
MOV R2,#10
A1: MOV R3,#40
A2:MOV R4,#249
A3:DJNZ R4,A3
DJNZ R3,A2
DJNZ R2,A1
RET
;*********延时0.6秒程序*****************
DELAY06:
MOV R2,#30
E1: MOV R3,#40
E2:MOV R4,#249
E3:DJNZ R4,E3
DJNZ R3,E2
DJNZ R2,E1
RET
;*******延时程序3,延时1000微秒********
YS3: MOV R4,#20;
D3:MOV R5,#248
DJNZ R5,$
DJNZ R4,D3
RET
;***********中断程序**************************
INT: ;前方有避障物,先后退0.5s,再向右转1.3s(约90度)
PUSH ACC
PUSH PSW
;*********向后退****************
CLR P2.0
SETB P2.1
SETB P2.2 ;LED,Indicator
SETB P0.1
SETB P2.6
CLR P2.5
CLR P0.0
SETB P2.7
SETB P0.2 ;Back控制
MOV R2,#10
B1: MOV R3,#40
B2:MOV R4,#249
B3:DJNZ R4,B3
DJNZ R3,B2
DJNZ R2,B1 ;延时0.2s
;*********向右转****************
SETB P2.0
CLR P2.1
SETB P2.2 ;LED,Indicator
SETB P0.1
CLR P2.6
SETB P0.0
CLR P0.2 ;向右转
MOV R2,#65
d1: MOV R3,#40
d2:MOV R4,#249
f3:DJNZ R4,f3
DJNZ R3,d2
DJNZ R2,d1 ;转1.3s(大约可以转90度)
;************继续向前************
SETB P2.1
SETB P2.2
CLR P2.0 ;LED,Indicator
SETB P0.1
SETB P2.6
SETB P2.5
SETB P0.0
CLR P2.7
CLR P0.2 ;Forard控制
POP PSW
POP ACC
RETI ;退出中断
END |
|