⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 避障机器人.txt

📁 汇编语言 另类避障机器人
💻 TXT
字号:
用单片机控制直流电机运行,从而控制机器人运动 
 ;我们这里只用一个传感器来检测前方是否有障碍物,用步进电机不断转动扫描 
 ;本程序最大特色是用步进电机带动传感器不断扫描,只需要一个传感器就可以检测各个角度是否有障碍物 
 ;这时遇到的最大问题是启动的时候如何让步进电机转到0度或者180度的位置(启动复位) 
 ;作者:全立波 

   stepIndex    EQU    23H  ;用来控制步序 
   stepCount    EQU    24H  ;用来记录电机转动步序 
   TCOUNT       EQU    25H  ;软件计数器 
   TMRVAR       EQU    61195 
   TCOUNTER  EQU    252 
   PK           BIT    00H 
  
   ORG 0000H 
   AJMP START 
   ORG 000BH 
   AJMP ITL 
   ORG 30H 

START: 
   MOV  SP,#5FH 
   ORL  P1,#00001111B;逻辑或操作 
   ;PK=0(右->左转),PK=1(左->右转) 
   CLR PK ;刚开始从右-->左 
   MOV stepIndex,#0 ;0~1 
   MOV stepCount,#1 ;1~5 
   MOV TCOUNT,#0 

   ;SETB P2.0 
   ;SETB P2.1 
   ;SETB P2.2 

   SETB P1.4 
   SETB P1.5 
   SETB P1.6 
    
   ;设置定时器工作方式 
   MOV TMOD,#00000001B 
   MOV TH0,#HIGH(TMRVAR) 
   MOV TL0,#LOW(TMRVAR) 
   SETB EA 
   SETB ET0 
   SETB TR0 

LOOP: 
  ; MOV   c,P2.2 
   MOV   c,P1.6 
   JC    LNEXT  ;如果c=1,代表前方没有检测到障碍物   
   ;这个时候我们通过角位移来判定是左边有障碍,还是右边有障碍 
   JB  PK,L_R  
   ;从右->左(PK=0) 
   MOV A,stepCount 
   CJNE A,#2,Not_EQU 
   ;右侧有障碍,向左拐 
   LCALL LEFT_TO 
   AJMP  LOOP 
L_R: 
   ;从左->右(PK=1) 
   MOV A,stepCount 
   CJNE A,#2,Not_EQU 
   ;左侧有障碍,向右拐 
   LCALL RIGHT_TO 
   AJMP  LOOP 
Not_EQU: 
   JC SMALL 
   JB PK,Not_EQU_L 
   LCALL RIGHT_TO 
   AJMP  LOOP 
Not_EQU_L: 
   LCALL LEFT_TO 
   AJMP  LOOP 
SMALL: 
   JB PK,SMALL_L 
   LCALL LEFT_TO 
   AJMP  LOOP 
SMALL_L: 
   LCALL RIGHT_TO 
   AJMP  LOOP 
LNEXT: 
   ;SETB  P2.0 
   ;SETB  P2.1 
   SETB  P1.4 
   SETB  P1.5 
   AJMP  LOOP 


LEFT_TO:;朝左拐 
   ;CLR   P2.0 
   ;SETB  P2.1 
   CLR   P1.4 
   SETB  P1.5 
   RET 

RIGHT_TO:;朝右拐 
   ;SETB P2.0 
   ;CLR  P2.1 
   SETB P1.4 
   CLR  P1.5 
   RET 

  

;中断处理程序,这个地方用来处理电机的前后左右转动    
ITL: 
   ;重新设置定时时间 
   PUSH ACC 
   PUSH PSW 
   MOV TH0,#HIGH(TMRVAR) 
   MOV TL0,#LOW(TMRVAR) 

   INC  TCOUNT        ;软件计数器加1 
   MOV  A,TCOUNT 
   CJNE A,#TCOUNTER,D_L1 
   MOV  TCOUNT,#0 
   JB   PK,INT_N1  
   MOV  DPTR,#rightToLeftTab ;PK=0(从右-->左) 
   AJMP INT_N2 

INT_N1: 
   ;PK=1(从左-->右) 
   MOV DPTR,#leftToRightTab 

INT_N2: 
   MOV  A,stepIndex 
   MOVC A,@A+DPTR 
   ORL  P1,#00001111B;如果某位是0的话通过这步操作让0变成1 
   ANL  P1,A;这样做比直接赋值要好,有效的防止了毛刺的产生 
    
   INC  stepCount 
   MOV  A,stepCount 
   CJNE A,#6,INT_N3 
   MOV  stepCount,#1 
   MOV  stepIndex,#0 
   JBC  PK,D_L1 
   SETB PK 
   AJMP D_L1 

INT_N3: 
   INC  stepIndex 
   MOV  A,stepIndex 
   CJNE A,#2,D_L1 
   MOV  stepIndex,#0 
D_L1: 
   POP  PSW 
   POP  ACC 
   RETI 
;步进电机扫描范围,先从右到左扫描(0~180),然后再从左到右扫描(180~0) 
;在扫描过程中一旦发现障碍,单片机控制机器人做相应转向 
;通过我的观察该步进电机转动10下走一圈 
;从右->左我们规定步序(1,2)为右侧发现障碍;步序(3,4,5)为左侧发现障碍 
;从左->右我们规定步序(3,2,1)为右侧发现障碍,步序(5,4)为左侧发现障碍 
;刚开始启动电机从右往左转,当步序到6后电机从左往右转 
rightToLeftTab:DB  11111110B,11111101B 
leftToRightTab:DB  11111011B,11110111B 

  END  
 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -