; [Robot.asm] - [obstacle Detection and Avoidance] ; ; [ ; The microcontroller is used to: ; 1.Generate 38.4khz IR signal ; 2.Interface IR reciever ; 3.Interface Motors ; 4.Interface with computer using serial port ; ] ; ; Started: [14.12.03] ; ; Hardware Notes: ; [uc- AT89c2051; IR reciever-TSOP1738; RS-232 chip-MAX232] ; [11.059MHz] ; [Reset- Active high] ; [P3.3-P3.4=IR LED's P3.5=TSOP PORT1=Motor Interface] ;;;;;;;;;;; ;variable declarations ;;;;;;;;;;; rec EQU 00h ;alias R0 dir EQU 01H ;alias R1 temp1 EQU 02h ;alias R2 temp2 EQU 03h ;alias R3 org 0 ajmp mainprog ;;;;;;;;;;; ;Interrupts ;;;;;;;;;;; ;serial port interrupt org 023h acall sinterrupt reti ;;;;;;;;; ;Initializations ;;;;;;;;; org 030h mainprog: mov R0,#0 ;rec mov R1,#0 ;dir mov R2,#0 ;temp1 mov R3,#0 ;temp2 mov P1,#0 mov SP,#017h mov SCON,#01010000b ;serial port in 8 bit mode 1 mov TMOD,#00100001b ;timer 1 in mode 2 - timer 0 in mode 1 clr TF0 ;new addition ;baud rate for serial transfer mov TH1,#0FDh ;9600 baud rate ;set interrupt flags mov IE,#10010000b setb TR1 ;start timer1 mov A,#10111101b mov P1,A main: mov A,#00010000b ;check for halt anl A,R1 jz transmit mov P1,#0 mov A,#00010000b chkpt: anl A,R1 jnz chkpt transmit: mov A,#00011000b ;set toggle for led mov temp1,#0Dh ;14 cycles blink: xrl P3,A ;toggle led mov temp2,#05h ;delay hold: djnz temp2,hold ;" xrl P3,A ;toggle led mov temp2,#04h ;delay hold1: djnz temp2,hold1 ;delay djnz temp1,blink ;14 cycles detect: mov A,#00010000b ;check for halt anl A,R1 jnz main mov A,P3 ;check tsop output anl A,#00100000b jz obstacle ;obstacle detected acall delay_400 ajmp main obstacle: mov A,#00010000b ;check for halt anl A,R1 jnz main mov A,#10110000b mov P1,A acall rotate_delay mov A,#00010000b ;check for halt anl A,R1 jnz main mov A,#10111101b mov P1,A ajmp main ;;;;;;;;;;;;;;; sinterrupt: ;;;;;;;;;;;;;;; jnb RI,chk_ti mov rec,SBUF clr RI cjne R0,#'W',left mov dir,#01h mov A,#10111101b mov P1,A ajmp ack left: cjne R0,#'A',backward mov dir,#02h mov A,#00001101b mov P1,A ajmp ack backward: cjne R0,#'S',right mov dir,#04h mov A,#11000110b mov P1,A ajmp ack right: cjne R0,#'D',r_stop mov dir,#08h mov A,#10110000b mov P1,A ajmp ack r_stop: cjne R0,#'H',ack mov dir,#10h mov P1,#0h ack: mov SBUF,#'Z' ;send Z as acknowldegement chk_ti: jnb TI,ext clr TI ext: ret ;;;;;;;;;;;;; delay_400: ;;;;;;;;;;;;; mov temp2,#2 dly_1: mov temp1,#200 dly_2: djnz temp1,dly_2 djnz temp2,dly_1 ret ;;;;;;;;;;;; rotate_delay: ;;;;;;;;;;;; ;create 1 sec delay using timer 0 mov temp1,#20 rdly1: mov TH0,#76 mov TL0,#01 setb TR0 rdly2: jnb TF0,rdly2 clr TF0 clr TR0 djnz temp1,rdly1 ret