温度通信系统 LCD显示+上位机显示 传感器使用的是ds18b20,LCD显示温度,还可以串口通信在pc上显示温度,并且有VB的上位机实时显示波形,实物验证成功 自己写的代码,注释详细 有代码有仿真 上位机显示

这温度监控系统折腾了我整整一个礼拜,从DS18B20的诡异时序到VB上位机曲线卡顿,踩的坑比写的代码都多。先上实物效果:1602液晶实时显示26.5℃的绿色字符,电脑屏幕上红色温度曲线像心电图一样规律跳动。下面把核心代码和踩坑经验拆开说说。

温度通信系统 LCD显示+上位机显示 传感器使用的是ds18b20,LCD显示温度,还可以串口通信在pc上显示温度,并且有VB的上位机实时显示波形,实物验证成功 自己写的代码,注释详细 有代码有仿真 上位机显示

DS18B20这玩意儿看着就两根线,操作起来却要精确到微秒。初始化时序不对直接罢工,上拉电阻没接好温度值乱跳。后来在面包板上焊了个4.7K电阻才稳定,代码里加了三次读取校验:

// 单总线复位脉冲(注意这个延时必须精确)
DS18B20_Reset() {
    DQ = 0;
    delay_us(480);  // 保持480-960μs
    DQ = 1;
    delay_us(60);   // 等待传感器回应
    if(!DQ) {
        delay_us(400);
        return 1;   // 检测到设备
    }
    return 0;       // 设备未响应
}

这段代码调了整整两天——最开始用定时器中断处理其他任务,结果导致延时函数不准,传感器死活不响应。后来改用纯轮询方式才搞定。

液晶显示部分用了HD44780驱动,自定义了℃符号。有意思的是发现1602的D4-D7接法会影响刷新速度,改成4线模式后闪烁问题消失了:

// 自定义温度符号
unsigned char tempChar[8] = {0x18,0x18,0x03,0x04,
                             0x04,0x04,0x03,0x00}; 
LCD_CustomChar(0, tempChar);  // 注册到CGRAM
LCD_PutCmd(0x80);            // 第一行首位
LCD_PutStr("Temp: ");
LCD_PutChar(0);              // 显示自定义符号

串口通信开始直接用printf发送,结果上位机经常收不全数据。改成原始字节发送反而稳定,每500ms发送一次带校验位的数据包:

void USART_SendTemp(float temp) {
    uint8_t data[4];
    *(float*)data = temp;  // 浮点数转字节数组
    USART_SendByte(0xAA);  // 帧头
    for(int i=0; i<4; i++) {
        USART_SendByte(data[i]);
    }
    USART_SendByte(0x55);  // 帧尾
}

上位机用VB6写的,用MSComm控件接收数据。最坑的是VB的Byte数组处理——收到数据要先判断帧头帧尾,还要处理粘包问题。曲线绘制用了PictureBox的Line方法,后来发现数据量大了会卡,改成双缓冲后流畅多了:

Private Sub DrawWave()
    Static lastX As Integer
    currentX = (currentX + 2) Mod Picture1.Width
    Picture1.Line (lastX, lastY)-(currentX, newY), vbRed
    lastX = currentX: lastY = newY
    If currentX = 0 Then Picture1.Cls  // 满屏后清屏
End Sub

仿真时Proteus里的DS18B20模型和实物表现不一致,温度值变化有延迟。后来在实物调试时发现,传感器离单片机太近会受干扰,用杜邦线隔开20cm后读数才稳定。整个系统跑起来后,用手捏住传感器,看到液晶数字跳动和电脑曲线爬升的瞬间,感觉这周掉的头发值了。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐