Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Interface AT89C51 with ultrasonic sensor and LCD

Status
Not open for further replies.

giordano

Newbie level 5
Newbie level 5
Joined
Nov 28, 2012
Messages
8
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Location
Indonesia
Visit site
Activity points
1,376
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?



Code C - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#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();
 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);   
 }
}

 

Attachments

  • ultralcd.JPG
    ultralcd.JPG
    216.3 KB · Views: 103

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top