51单片机程序 超声波测距,带温度补偿, 两路超声波测距,18b20测温带温度补偿,lcd1602显示温度和实测距离。 keil4程序源码,有proteus仿真文件。
最近玩51单片机,搞了个超声波测距还带温度补偿的项目,同时有两路超声波测距,再结合18B20测温,最后用LCD1602显示温度和实测距离,还搭配了Keil4程序源码和Proteus仿真文件,今天就来和大家分享下。
一、原理介绍
(一)超声波测距
超声波测距的原理很简单,就是通过单片机发送一个超声波信号,然后等待回波。根据超声波从发射到接收的时间差,再结合声速,就能算出距离。公式是:距离 = 声速 × 时间 / 2 。不过呢,声速会受温度影响,所以需要温度补偿。
(二)18B20测温
18B20是数字温度传感器,它采用单总线协议与单片机通信。单片机通过这个单总线发送命令就能读取到当前的温度值。
(三)LCD1602显示
LCD1602用来显示温度和距离数据。它可以显示两行,每行16个字符。通过单片机发送相应的指令和数据,就能在上面显示我们想要的内容。
二、代码实现
(一)超声波测距部分
c
// 定义超声波引脚
sbit Trig1 = P1^0;
sbit Echo1 = P1^1;
unsigned int distance1;
void measureDistance1() {
unsigned int time;
Trig1 = 0;
_nop_();
_nop_();
Trig1 = 1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Trig1 = 0;
while (Echo1 == 0);
while (Echo1 == 1);
time = TH0 * 256 + TL0;
distance1 = time * 0.017;
TH0 = 0;
TL0 = 0;
}
这里定义了超声波的触发引脚Trig1和回响引脚Echo1 。measureDistance1函数里,先给Trig1发送一个短暂的高电平脉冲来触发超声波发送,然后等待Echo1变为高电平,记录这个时间,当Echo1再次变为低电平时,根据记录的时间算出距离。
(二)18B20测温部分
c
// 18B20引脚定义
sbit DQ = P2^2;
float temperature;
void delay(unsigned int time) {
unsigned int i, j;
for (i = 0; i < time; i++)
for (j = 0; j < 1275; j++);
}
bit init18b20() {
bit flag;
DQ = 1;
_nop_();
_nop_();
DQ = 0;
delay(80);
DQ = 1;
delay(14);
flag = DQ;
delay(20);
return flag;
}
unsigned char read18b20() {
unsigned char i, dat;
for (i = 0; i < 8; i++) {
DQ = 0;
dat >>= 1;
DQ = 1;
if (DQ)
dat |= 0x80;
delay(5);
}
return dat;
}
void write18b20(unsigned char dat) {
unsigned char i;
for (i = 0; i < 8; i++) {
DQ = 0;
DQ = dat & 0x01;
delay(5);
DQ = 1;
dat >>= 1;
}
}
void getTemperature() {
unsigned char low, high;
if (init18b20()) {
write18b20(0xCC);
write18b20(0x44);
delay(100);
if (init18b20()) {
write18b20(0xCC);
write18b20(0xBE);
low = read18b20();
high = read18b20();
temperature = (high << 8 | low) * 0.0625;
}
}
}
这部分代码实现了18B20的初始化、读取和写入操作。init18b20函数负责初始化18B20 ,read18b20函数读取温度数据,write18b20函数写入命令,getTemperature函数则综合这些操作获取实际的温度值。
(三)LCD1602显示部分
c
// LCD1602引脚定义
sbit RS = P2^0;
sbit RW = P2^1;
sbit E = P2^2;
#define LCD_DATA P0
void lcd_command(unsigned char cmd) {
LCD_DATA = cmd;
RS = 0;
RW = 0;
E = 1;
_nop_();
_nop_();
E = 0;
delay(2);
}
void lcd_data(unsigned char dat) {
LCD_DATA = dat;
RS = 1;
RW = 0;
E = 1;
_nop_();
_nop_();
E = 0;
delay(2);
}
void lcd_init() {
lcd_command(0x38);
delay(5);
lcd_command(0x0C);
delay(5);
lcd_command(0x06);
delay(5);
lcd_command(0x01);
delay(5);
}
void display() {
char tempStr[16];
char distStr1[16];
sprintf(tempStr, "Temp: %.2f C", temperature);
sprintf(distStr1, "Dist1: %d cm", distance1);
lcd_command(0x80);
for (int i = 0; i < 16; i++)
lcd_data(tempStr[i]);
lcd_command(0xC0);
for (int i = 0; i < 16; i++)
lcd_data(distStr1[i]);
}
这里定义了LCD1602的控制引脚RS、RW、E和数据引脚LCDDATA 。lcd command函数发送命令,lcddata函数发送数据,lcdinit函数初始化LCD1602 ,display函数则把温度和距离数据格式化后显示在LCD1602上。
三、Proteus仿真
在Proteus里搭建好电路,把51单片机、超声波模块、18B20、LCD1602连接好。然后加载Keil4生成的hex文件,运行仿真就能看到LCD1602上显示实时的温度和距离了。通过仿真可以方便地调试程序,看看各个模块是否正常工作。
51单片机程序 超声波测距,带温度补偿, 两路超声波测距,18b20测温带温度补偿,lcd1602显示温度和实测距离。 keil4程序源码,有proteus仿真文件。
总之,这个项目把51单片机的多个功能结合起来,实现了一个实用的超声波测距带温度补偿系统。希望对大家学习51单片机有所帮助!要是有问题,欢迎留言交流。
