protues51超声波测距模块
时间: 2023-10-05 13:07:04 浏览: 104
Proteus51超声波测距模块是一种基于超声波原理实现距离测量的模块,通常由超声波发射器、接收器、控制电路、显示电路等部分组成。其工作原理是向目标物体发送一定频率的超声波信号,当信号遇到物体时,会产生回波并返回到接收器,通过计算回波信号的时间差可以得到目标物体与测距模块之间的距离。
在Proteus51超声波测距模块中,一般采用51单片机作为控制芯片,通过编程控制超声波发射和接收,进而实现距离测量。同时,还可以通过LED或LCD等显示模块将测量结果显示出来,实现实时监测。这种模块通常应用于距离测量、避障、智能家居等领域。
相关问题
protues仿真51单片机1602液晶显示器显示DS18B20与HD-SR04
首先,你需要在 Proteus 中添加 51 单片机和 DS18B20 温度传感器、HC-SR04 超声波测距模块以及 1602A 液晶显示屏。
接下来,你需要编写 51 单片机的程序,用于读取 DS18B20 传感器的温度和 HC-SR04 模块的距离,并将它们显示在 1602A 液晶显示屏上。
以下是一个简单的示例程序:
```
#include <reg52.h>
#include <stdio.h>
#define LCD_RS P1_0
#define LCD_RW P1_1
#define LCD_E P1_2
#define LCD_DATA P2
sbit Trig = P3^5; // 超声波模块触发管脚
sbit Echo = P3^2; // 超声波模块回波管脚
sbit DQ = P3^7; // 温度传感器管脚
unsigned char idata temp[5]; // 存储温度值
unsigned char idata dis[5]; // 存储距离值
void delay(unsigned int x) // 延时函数
{
unsigned int i, j;
for (i = x; i > 0; i--)
{
for (j = 110; j > 0; j--);
}
}
void write_command(unsigned char cmd) // 写命令函数
{
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 1;
LCD_DATA = cmd;
delay(5);
LCD_E = 0;
}
void write_data(unsigned char dat) // 写数据函数
{
LCD_RS = 1;
LCD_RW = 0;
LCD_E = 1;
LCD_DATA = dat;
delay(5);
LCD_E = 0;
}
void init_lcd() // 初始化液晶屏函数
{
write_command(0x38);
write_command(0x0c);
write_command(0x06);
write_command(0x01);
delay(20);
}
void write_string(unsigned char x, unsigned char y, unsigned char *s) // 写字符串函数
{
unsigned char i = 0;
if (y == 0)
{
write_command(0x80 + x);
}
else
{
write_command(0xc0 + x);
}
while (s[i] != '\0')
{
write_data(s[i]);
i++;
}
}
void ds18b20_init() // 初始化温度传感器函数
{
DQ = 1;
delay(1);
DQ = 0;
delay(480);
DQ = 1;
delay(60);
}
void ds18b20_write(unsigned char dat) // 写入温度传感器函数
{
unsigned char i;
for (i = 0; i < 8; i++)
{
DQ = 0;
DQ = dat & 0x01;
delay(6);
DQ = 1;
dat >>= 1;
}
}
unsigned char ds18b20_read() // 读取温度传感器函数
{
unsigned char i, dat = 0;
for (i = 0; i < 8; i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if (DQ)
{
dat |= 0x80;
}
delay(6);
}
return dat;
}
void ds18b20_convert() // 转换温度函数
{
ds18b20_init();
ds18b20_write(0xcc);
ds18b20_write(0x44);
}
void ds18b20_readtemp() // 读取温度函数
{
unsigned char i;
ds18b20_init();
ds18b20_write(0xcc);
ds18b20_write(0xbe);
for (i = 0; i < 5; i++)
{
temp[i] = ds18b20_read();
}
}
void ultrasonic_init() // 初始化超声波模块函数
{
Trig = 0;
}
void ultrasonic_send() // 发送超声波函数
{
Trig = 1;
delay(10);
Trig = 0;
}
void ultrasonic_receive() // 接收超声波函数
{
unsigned int i, j;
if (Echo == 1)
{
while (Echo == 1);
i = TH0;
j = TL0;
dis[0] = i / 100 + '0';
dis[1] = i % 100 / 10 + '0';
dis[2] = i % 10 + '0';
dis[3] = '.';
dis[4] = j / 10 + '0';
}
}
void main()
{
TMOD = 0x11; // 定时器 T0 和 T1 工作方式都为模式 1
TH1 = 0xfd; // 定时器 T1 计数初值,用于波特率设置
TL1 = 0xfd;
TR1 = 1; // 启动定时器 T1
PCON = 0x80; // 波特率加倍
SCON = 0x50; // 串口工作方式为模式 1,允许接收
ES = 1; // 允许串口中断
EA = 1; // 允许总中断
TH0 = 0;
TL0 = 0;
ultrasonic_init();
init_lcd();
write_string(0, 0, "Temp:");
write_string(0, 1, "Dist:");
while (1)
{
ds18b20_convert();
delay(100);
ds18b20_readtemp();
ultrasonic_send();
while (!Echo);
TR0 = 1;
while (Echo);
TR0 = 0;
ultrasonic_receive();
write_string(6, 0, temp);
write_string(6, 1, dis);
delay(1000);
}
}
void ser() interrupt 4 // 串口中断函数
{
if (RI == 1)
{
RI = 0;
}
if (TI == 1)
{
TI = 0;
}
}
```
这个程序使用 51 单片机来读取 DS18B20 温度传感器和 HC-SR04 超声波测距模块的数据,然后将它们显示在 1602A 液晶显示屏上。程序通过串口将数据发送到计算机上,可以使用串口助手等工具来查看数据。
阅读全文