【Proteus仿真】51单片机+超声波模块HC-SR04+ LCD1602显示测距

【Proteus仿真】51单片机+超声波模块HC-SR04+ LCD1602显示测距


  • 🌼Proteus仿真演示:
    在这里插入图片描述

📑超声波模块HC-SR04

  • 🌿有效探测距离:2cm-450cm

在这里插入图片描述

📓主要引脚功能

📋超声波模块有4个引脚,分别为Vcc、 Trig(控制端)、 Echo(接收端)、 GND;其中VCC、GND接上5V电源, Trig(控制端)控制发出的超声波信号,Echo(接收端)接收反射回来的超声波信号。

📝程序代码

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
126
127
128
129
130
131
132
133
134
135
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define NOP() {\_nop\_();\_nop\_();\_nop\_();\_nop\_();}
//------LCD引脚-----
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
//------超声波引脚-------
sbit Tx=P3^3; //触发控制信号输入
sbit Rx=P3^2; //回响信号输出
uchar code table[]={"Distance :"}; //LCD第一行显示
uchar temp_dis[]= {"000.0 cm"}; //LCD第二行
long int t,distance;
uchar cache[4]={0,0,0,0};
//--------延时-------
void delay(uint ms)
{
uint t;
while(ms--)
for(t=0;t<120;t++);
}
//-------读LCD状态-------
uchar read\_lcd\_state()
{
uchar state;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
\_nop\_();
state=P0;
LCD_EN=0;
\_nop\_();
return state;
}
//-------忙等待------
void lcd\_busy\_wait()
{
while((read\_lcd\_state() & 0x80)==0x80);
NOP();
}
//----------LCD写指令----------
void lcd\_write\_com(uchar com)
{
lcd\_busy\_wait();
LCD_RS=0; //RS为0时,写指令,RS为1时,写数据
LCD_RW=0;
P0=com;
NOP();
LCD_EN=1;
NOP();
LCD_EN=0;
}
//----------LCD写数据----------
void lcd\_write\_data(uchar dat)
{
lcd\_busy\_wait();
LCD_RS=1;
LCD_RW=0;
P0=dat;
NOP();
LCD_EN=1;
NOP();
LCD_EN=0;
}
//-------LCD初始化-------
void lcd\_init()
{
LCD_EN=0;
lcd\_write\_com(0x38); //LCD显示模式设置
lcd\_write\_com(0x0c); //LCD显示开/关及光标设置
lcd\_write\_com(0x06); //当写一个字符后地址指针加1,且光标加1
lcd\_write\_com(0x01); //显示清屏
}
//---------设置液晶显示位置-----------
void set\_lcd\_pos(uchar p)
{
lcd\_write\_com(p|0x80);
}
//---------液晶显示程序----------
void lcd\_print(uchar p,uchar \*s,uint low)
{
uint num;
set\_lcd\_pos(p);
for(num=0;num<low;num++)
{
lcd\_write\_data(s[num]);
delay(1);
}
}
void HC05\_Init()
{
Tx=1; //触发脉冲
NOP();NOP();NOP();NOP();
Tx=0;
distance=0.175\*t; //距离计算
}
void distance\_convert(long int dat)
{
cache[0]=dat/1000;
cache[1]=dat/100%10;
cache[2]=dat/10%10;
cache[3]=dat%10;
temp_dis[0]=cache[0]+'0';
temp_dis[1]=cache[1]+'0';
temp_dis[2]=cache[2]+'0';
temp_dis[4]=cache[3]+'0';
}
//------------主程序-----------
void main()
{
lcd\_init();
delay(5);
TMOD=0x19;
EA=1; //开总中断
TR0=1; //启动定时器
EX0=1; //开外部中断
IT0=1; //设置为下降沿中断方式
while(1)
{
HC05\_Init();
distance\_convert(distance);
lcd\_print(0x01,table,10);
lcd\_print(0x44,temp_dis,8);
}
}
//外部中断0
void int0() interrupt 0
{
t=(TH0\*256 + TL0); //计算高电平持续的时间,上升沿到来时候开始计时,下降沿到来进入外部中断,关闭计时器,停止计时
TH0=0;
TL0=0;
}


📚程序源码和仿真资源

🔖本实验基于Proteus8.12平台。

1
2
3
链接:https://pan.baidu.com/s/1vF5A6um28qi8SZniPpOCbg 
提取码:a3ld //请使用复制粘贴命令


📗例程二:带温度显示和距离报警

在这里插入图片描述

  • 📚例程二资源
1
2
3
链接:https://pan.baidu.com/s/1EQ9T6ORfwbO79h\_6ryNM6A 
提取码:0uae


上帝会把我们身边最好的东西拿走,以提醒我们得到的太多 –电影·四根羽毛