I want to make a project to measure distance the use of ultrasonic sensor HC-S04 and liquid crystal display to display the gap in cm. i exploit AT89S51, the cause pin for ultrasonic sensor is P3.5 and the echo pin is P3.2. The echo pin is attached to P3.2 because i use interrupt so that whenever there may be a excessive it's going to activate timer zero and the length of high condition (in microsecond) can be transformed to cm (divided by fifty nine). I already ensure that the ultrasonic sensor works properly. The hassle is the liquid crystal display usually display output the equal variety forty five. It isn't varying even though the space among item and ultrasonic sensor trade. Can anybody assist me to solve this trouble?
[code]#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(unsigned int msec) { int i,j; for(i=0;i<msec;i++) for(j=0;j<1275;j++); } void lcd_cmd(unsigned char item) // Function to send command to LCD { dataport = item; rs= 0; rw=0; e=1; delay(1); e=0; return; } void lcd_data(unsigned char item) // Function to send data to LCD { dataport = item; rs= 1; rw=0; e=1; delay(1); e=0; return; } void lcd_data_string(unsigned char *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; } unsigned int get_range(void) { int range=0; int s; send_pulse(); while(!INT0);// in sake of these lines you can generate a delay of 40 Milli seconds=40000 micro while (INT0);// seconds 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); } }[/code]