51单片机超声波测距与温度补偿实战

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单片机有所帮助!要是有问题,欢迎留言交流。

相关推荐
holeer6 天前
CS.Math 之《离散数学》| 知识点笔记
数据结构·数据库·数学建模·操作系统·抽象代数·计算机组成
ECT-OS-JiuHuaShan12 天前
弦论:高度创造性但因果链断裂、数学自洽但递归不健康
人工智能·程序人生·数学建模·抽象代数·拓扑学
hxl26822 天前
为何要研究直线沿本身的伸缩变换?
抽象代数
ECT-OS-JiuHuaShan1 个月前
国学不姓儒:儒学的本质是归纳思维,不是递归思维,所以儒学不是独立学术体系,是学术二道贩子
人工智能·程序人生·数学建模·抽象代数·拓扑学
聊天QQ:688238862 个月前
基于Matlab Simulink的增程式混合动力汽车建模与仿真教学:全方位解析手把手搭建流程...
抽象代数
modest_laowang4 个月前
矩阵李群的李代数的几何意义
线性代数·矩阵·抽象代数·拓扑学
The_Killer.4 个月前
近世代数(抽象代数)详细笔记--环(也有域的相关内容)
笔记·学习·抽象代数·
The_Killer.4 个月前
近世代数(抽象代数)详细笔记--域
笔记·抽象代数
The_Killer.4 个月前
近世代数(抽象代数)详细笔记--群
学习·抽象代数·