Ultrasonic range finder using 8051 .
A simple ultrasonic range finder using
8051 microcontroller is presented in this article. This ultrasonic
rangefinder can measure distances up to 2.5 meters at an accuracy of 1
centi meter. AT89s51 microcontroller and the ultrasonic transducer
module HC-SR04 forms the basis of this circuit. The ultrasonic module
sends a signal to the object, then picks up its echo and outputs a wave
form whose time period is proportional to the distance. The
microcontroller accepts this signal, performs necessary processing and
displays the corresponding distance on the 3 digit seven segment
display. This circuit finds a lot of application in projects like
automotive parking sensors, obstacle warning systems, terrain monitoring
robots, industrial distance measurements etc.
HC-SR04 ultrasonic module.
HC-SR04 is an ultrasonic ranging module
designed for embedded system projects like this. It has a resolution of
0.3cm and the ranging distance is from 2cm to 500cm. It operates from a
5V DC supply and the standby current is less than 2mA. The module
transmits an ultrasonic signal, picks up its echo, measures the time
elapsed between the two events and outputs a waveform whose high time is
modulated by the measured time which is proportional to the distance.
.The photograph of an HC-SR04 module is shown below.
The supporting circuits fabricated on
the module makes it almost stand alone and what the programmer need to
do is to send a trigger signal to it for initiating transmission and
receive the echo signal from it for distance calculation. The HR-SR04
has four pins namely Vcc, Trigger, Echo, GND and they are explained in
detail below.
1) VCC : 5V DC supply voltage is connected to this pin.
2) Trigger: The trigger
signal for starting the transmission is given to this pin. The trigger
signal must be a pulse with 10uS high time. When the module receives a
valid trigger signal it issues 8 pulses of 40KHz ultrasonic sound from
the transmitter. The echo of this sound is picked by the receiver.
3)Echo: At this pin, the module outputs a waveform with high time proportional to the distance.4) GND: Ground is connected to this pin.
HC-SR04 timing diagram.
From the timing diagram, you can see
that the 40KHz pulse train is transmitted just after the 10uS triggering
pulse and the echo output is obtained after some more time. The next
triggering pulse can be given only after the echo is faded away and this
time period is called cycle period. The cycle period for HC-SR04 must
not be below 50mS. According to datasheet, the distance can be
calculated from the echo pulse width using the following equations.
Distance in cm = echo pulse width in uS/58Distance in inch = echo pulse width in uS/148
Ultrasonic range finder using 8051- Circuit diagram.
The ultrasonic module is interfaced to
the microcontroller through P3.0 and P3.1 pins. Port0 used for
transmitting the 8 bit display data to the display and port pins P1.0,
P1.1, P1.2 are used for transmitting display drive signals for the
corresponding display units D1, D2, D3. Push button switch S1, capacitor
C3 and resistor R9 forms a de-bouncing reset circuitry. Capacitors
C1,C2 and crystal X1 are associated with the clock circuit.
Program.
ORG 00H // origin MOV DPTR,#LUT // moves the address of LUT to DPTR MOV P1,#00000000B // sets P1 as output port MOV P0,#00000000B // sets P0 as output port CLR P3.0 // sets P3.0 as output for sending trigger SETB P3.1 // sets P3.1 as input for receiving echo MOV TMOD,#00100000B // sets timer1 as mode 2 auto reload timer MAIN: MOV TL1,#207D // loads the initial value to start counting from MOV TH1,#207D // loads the reload value MOV A,#00000000B // clears accumulator SETB P3.0 // starts the trigger pulse ACALL DELAY1 // gives 10uS width for the trigger pulse CLR P3.0 // ends the trigger pulse HERE: JNB P3.1,HERE // loops here until echo is received BACK: SETB TR1 // starts the timer1 HERE1: JNB TF1,HERE1 // loops here until timer overflows (ie;48 count) CLR TR1 // stops the timer CLR TF1 // clears timer flag 1 INC A // increments A for every timer1 overflow JB P3.1,BACK // jumps to BACK if echo is still available MOV R4,A // saves the value of A to R4 ACALL DLOOP // calls the display loop SJMP MAIN // jumps to MAIN loop DELAY1: MOV R6,#2D // 1uS delay LABEL1: DJNZ R6,LABEL1 RET DLOOP: MOV R5,#100D // loads R5 with 100D BACK1: MOV A,R4 // loads the value in R4 to A MOV B,#100D // loads B with 100D DIV AB // isolates the first digit SETB P1.0 // activates LED display unit D1 ACALL DISPLAY // calls DISPLAY subroutine MOV P0,A // moves digit drive pattern for 1st digit to P0 ACALL DELAY // 1mS delay ACALL DELAY MOV A,B // moves the remainder of 1st division to A MOV B,#10D // loads B with 10D DIV AB // isolates the second digit CLR P1.0 // deactivates LED display unit D1 SETB P1.1 // activates LED display unit D2 ACALL DISPLAY MOV P0,A // moves digit drive pattern for 2nd digit to P0 ACALL DELAY ACALL DELAY MOV A,B // moves the remainder of 2nd division to A CLR P1.1 // deactivates LED display unit D2 SETB P1.2 // activates LED display unit D3 ACALL DISPLAY MOV P0,A // moves the digit drive pattern for 3rd digit to P0 ACALL DELAY ACALL DELAY CLR P1.2 // deactivates LED display unit D3 DJNZ R5,BACK1 // repeats the display loop 100 times RET DELAY: MOV R7,#250D // 1mS delay LABEL2: DJNZ R7,LABEL2 RET DISPLAY: MOVC A,@A+DPTR // gets the digit drive pattern for the content in A CPL A // complements the digit drive pattern (see Note 1) RET LUT: DB 3FH // look up table (LUT) starts here DB 06H DB 5BH DB 4FH DB 66H DB 6DH DB 7DH DB 07H DB 7FH DB 6FH END
About the program.
The first part of the program sets the
initial conditions. Port 0 and P0rt 1 are set as output ports for
sending digit drive patterns and digit drive signals respectively. Port
pin 3.0 is set as an output pin for sending the trigger signal to the
ultrasonic module for starting transmission and port pin 3.1 is set as
an input pin for receiving the echo. TMOD register of the
microcontroller is so loaded that the Timer 1 operates in mode2 8 bit
auto-reload mode. Timer 0 of the microcontroller is not used here. In
the next part of the program (loop MAIN) the TL1 and TH1 registers of
Timer1 are loaded with the initial values. TL1 is loaded with the
initial value to start counting from and TH1 is loaded with the reload
value. This is how timer 1 in mode 2 works: When TR1 bit of the TCON
register is set the TL1 starts counting from the initial value loaded
into it and keeps counting untill roll over (ie; 255D). When roll over
occurs, TF1 flag is set and TL1 is automatically loaded with the reload
value stored in TH1 and the sequence is repeated until TR1 is made low
by the program. The TF1 goes high at the first roll over and if you want
it as an indicator for each roll over, you have to clear it using the
program after each roll over. In the next part of the MAIN loop P3.0 is
set high for 10uS and then cleared to make 10uS triggering pulse. The
ultrasonic module issues a 40Khz pulse wave form after receiving this
trigger and the program waits until a valid echo is received at P3.1.
The pulse width of the echo signal is proportional to the distance to
the obstacle and so the next job of the program is to measure the pulse
width. Whenever there is a valid echo pulse at P3.1, the Timer1 starts
and it counts from the initial value to 255 ie: 255-207= 48 counts. Then
the counter restarts and accumulator increments by one for every
restart. This sequence is repeated until the echo signal at P3.1
vanishes (ie; P3.1 goes low). Now the content in A will be equal to the
number of Timer1 reloads which is in fact proportional to the distance.
From the datasheet it is clear that 58uS echo pulse width indicates 1cM
distance. When the processor is clocked by a 12MHz crystal, 58 counts
of Timer1 indicates 1cM. That means 1 reload is equal to 1cM. But here
we are letting the Timer1 to count only 48 times before reload and this
is done in order to compensate for the time lags caused by the branching
instructions used for checking the status of P3.0 and P3.1 pins. If
this trick is not done, the individual time lags cause by the branching
instructions will be cumulatively added to the observed pulse width and
the range finder will show a reading higher than the original distance.
Some trial and error was required for getting the correct Timer1 reload
value and with the 207D (ie; 48 counts) used here the error was found
to be less than half a centimeter which is quite fine in this context.
The next part of the program does necessary mathematics on the current
content in A and displays it as 3 digit readout on the display.
Notes.
1) The LUT used here was originally made
for a common cathode seven segment display and here we are using common
anode displays. The CPL A instruction will just complement the obtained
digit drive pattern and make is suitable for the common anode scheme.
If you have time ,then cook up an LUT for common anode scheme and
replace the current one using it. By this you can avoid the extra CPL A
instruction and it is the correct method.
2)The entire circuit can be powered from 5V DC.
3) Be careful while handling the
Ultrasonic module. There are a lot of sensitive surface mount devices
fabricated on its back side.
4)Go through these articles: Interfacing seven segment display to 8051, Delay using 8051 timer, Software delay routines using 8051.
No comments:
Post a Comment