I want to make a project to measure distance using ultrasonic sensor HC-S*04 and LCD to display the distance in cm. I use AT89C51, the trigger pin for ultrasonic sensor is P3.5 and the echo pin is P3.2. The echo pin is connected to P3.2 because I use interrupt so that whenever there is a HIGH it will activate timer 0 and the duration of HIGH condition (in microsecond) will be converted to cm (divided by 59). I already make sure that the ultrasonic sensor works well. The problem is the LCD always display output the same number 45. It is not varying although the distance between object and ultrasonic sensor change. Can anyone help me to solve this problem?
#include<REGX51.h>#include<intrins.h>// for using _nop_() function#define port P2#define dataport P0
sfr16 DPTR =0x82;
sbit trig=P3^5;
sbit rs=port^0;
sbit rw=port^1;
sbit e=port^2;void delay(unsignedint msec){int i,j;for(i=0;i<msec;i++)for(j=0;j<1275;j++);}void lcd_cmd(unsignedchar item)// Function to send command to LCD{
dataport = item;
rs=0;
rw=0;
e=1;
delay(1);
e=0;return;}void lcd_data(unsignedchar item)// Function to send data to LCD{
dataport = item;
rs=1;
rw=0;
e=1;
delay(1);
e=0;return;}void lcd_data_string(unsignedchar*str)// Function to send string to LCD{int i=0;while(str[i]!='\0'){
lcd_data(str[i]);
i++;
delay(1);}return;}void send_pulse(void)//to generate 10 microseconds delay{
TH0=0x00;TL0=0x00;
trig=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
trig=0;}unsignedint get_range(void){int range=0;int s;
send_pulse();
delay(40);// generate a delay of 40 Milli seconds=40000 micro
DPH=TH0;DPL=TL0;
TH0=0xFF;TL0=0xFF;
lcd_cmd(0x81);
delay(2);
lcd_data_string("output:");
lcd_cmd(0x8a);if(DPTR<35000){//actually you need to use 38000 but the sensor may not work at higher levels
range=DPTR/59;
s=range/100;
range=range%100;if(s!=0){
lcd_data(s+48);}else{
lcd_cmd(0x06);
s=range/10;
range=range%10;
lcd_data(s+48);
lcd_data(range+48);
lcd_data(' ');}}else{
range=0;// indicates that there is no obstacle in front of the sensor
lcd_cmd(0x06);
lcd_data(0);}return range;}void main(){
lcd_cmd(0x38);
lcd_cmd(0x0c);
delay(2);
lcd_cmd(0x01);
delay(2);
lcd_cmd(0x81);
delay(2);
lcd_data_string("start");
delay(20);
TMOD=0x09;//timer0 in 16 bit mode with gate enable
TR0=1;//timer run enabled
TH0=0x00;TL0=0x00;
P3=0x04;//setting pin P3.2 while(1){ get_range();
delay(2);}}
Not that I'm familiar with the u/sound sensor nor the microcontroller, but where in the code did you insert the wait state
until you see a ping response? All I saw was fixed delays, but maybe I missed it in the code.
It looks like the code is copied from here, but with the ping wait removed.
Ya that code is my reference but I change a little bit and add with lcd code. I also try with while state to wait the ping response(echo) and it was not working. My lcd always display number 44 and it was not varying according to distance.
Not that I'm familiar with the u/sound sensor nor the microcontroller, but where in the code did you insert the wait state
until you see a ping response? All I saw was fixed delays, but maybe I missed it in the code.
It looks like the code is copied from here, but with the ping wait removed.
What algorithm are you using to determine the distance?
I presume, the answer is, that you're waiting for a ping response.
But where in your code are you waiting for a ping response?
The code you copied from has this, but you've explicitly removed it,
and replaced it with a fixed delay (see line 68 of your code).
So, it is not surprising that it doesn't work. There may be more errors (I don't know).
You could try to disconnect the trigger wire to the ultrasound transmitter, to see if the behavior changes (it should).
Also, the echo may be arriving too early (your wall needs to be a few meters away).
I tried to disconnect the trigger wire to the ultrasonic sensor transmitter but the behavior did not change. LCD still display output=45. I am afraid that my lcd function is not correct.