protues仿真51单片机1602液晶显示器显示DS18B20与HD-SR04
时间: 2023-08-01 08:09:53 浏览: 97
首先,你需要在 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 液晶显示屏上。程序通过串口将数据发送到计算机上,可以使用串口助手等工具来查看数据。
阅读全文