温度通信系统 LCD显示+上位机显示 传感器使用的是ds18b20,LCD显示温度,还可以串口...
温度通信系统 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后读数才稳定。整个系统跑起来后,用手捏住传感器,看到液晶数字跳动和电脑曲线爬升的瞬间,感觉这周掉的头发值了。
更多推荐
所有评论(0)