1. 项目概述
这个基于51单片机的非接触式红外测温系统,是我最近完成的一个嵌入式硬件项目。它通过红外温度传感器采集物体表面温度,使用LCD1602显示屏实时显示,并通过蓝牙模块将数据无线传输到手机端。整套系统成本控制在50元以内,非常适合作为电子爱好者的练手项目或高校学生的课程设计。
我在实际开发过程中发现,这种非接触测温方案在工业设备监控、医疗辅助测量、智能家居等领域都有广泛应用前景。相比传统接触式测温,它避免了交叉感染风险,响应速度更快(实测可达0.5秒),测量范围也更广(-20℃~100℃)。
2. 核心硬件选型与原理
2.1 主控芯片选择
项目选用经典的STC89C52作为主控芯片,这是基于8051内核的8位单片机,主要考虑因素包括:
- 价格低廉(约3元/片)
- 内置4KB Flash存储器,满足程序存储需求
- 32个I/O口完全够用
- 成熟的开发环境和丰富的学习资料
注意:虽然AT89S52等芯片引脚兼容,但烧录方式不同,建议初学者直接使用STC系列,可通过USB-TTL直接下载程序。
2.2 红外温度传感器
采用MLX90614非接触红外温度传感器,其核心优势在于:
- 测量精度±0.5℃(在人体温度范围内)
- 标准I2C通信接口
- 3.3V工作电压(需注意电平转换)
- 出厂已校准,无需额外标定
实际使用中发现,传感器与被测物体的距离系数(D:S)为10:1,即距离10cm时测量直径1cm的区域。这个参数直接影响测量精度,建议通过3D打印一个定位支架来固定测量距离。
2.3 显示模块
使用经典的LCD1602液晶屏显示温度数据,接线方式为4位数据总线模式(DB4-DB7),节省了4个IO口。在程序初始化时需特别注意:
c复制void LCD_init()
{
LCD_write_cmd(0x28); // 4位总线,2行显示,5x8点阵
delay_ms(5);
LCD_write_cmd(0x0C); // 开显示,无光标
delay_ms(5);
LCD_write_cmd(0x06); // 写入后地址自动加1
delay_ms(5);
LCD_write_cmd(0x01); // 清屏
delay_ms(5);
}
2.4 蓝牙传输模块
选用HC-05主从一体蓝牙模块,关键配置要点:
- 进入AT模式需在未上电时按住按键再通电
- 波特率设置为9600(与程序匹配)
- 模块角色配置为从机(Slave)
- 配对密码可修改为简单易记的"1234"
实测中发现,安卓手机通过"蓝牙串口"APP接收数据最稳定,iOS系统推荐使用"LightBlue"。
3. 电路设计详解
3.1 电源设计
系统采用USB 5V供电,通过AMS1117-3.3稳压芯片为MLX90614提供3.3V电源。这部分电路要特别注意:
- 输入输出端都需要加10μF电解电容和0.1μF陶瓷电容滤波
- 3.3V和5V地线之间用0Ω电阻或磁珠连接
3.2 传感器接口电路
MLX90614的I2C接口需要上拉电阻(通常4.7kΩ),但STC单片机内部已有弱上拉,所以实际电路可以省略外部上拉电阻,这是我通过多次实验验证的简化方案。
3.3 蓝牙模块连接
HC-05模块与单片机通过UART连接,注意:
- TXD接单片机RXD(P3.0)
- RXD接单片机TXD(P3.1)
- 无需连接RTS/CTS硬件流控引脚
4. 软件实现关键点
4.1 温度读取流程
MLX90614的温度读取采用标准I2C协议,具体时序如下:
- 发送起始条件
- 发送设备地址(0x5A<<1)
- 发送读取RAM命令(0x07)
- 读取2字节温度数据(低字节在前)
- 计算实际温度:Temp = (data[1]<<8 + data[0]) * 0.02 - 273.15
实测技巧:连续读取时建议间隔至少200ms,否则可能因传感器发热导致测量偏差。
4.2 蓝牙数据传输协议
设计简单的数据帧格式提高传输可靠性:
code复制[起始符][整数部分][小数点][小数部分][单位][结束符]
示例: "T36.5C\n"
手机端程序可通过识别起始符'T'和结束符'\n'来完整截取一帧数据。
4.3 按键消抖处理
采用状态机方式实现按键检测,比简单延时更可靠:
c复制enum key_state {IDLE, PRESS_DETECT, PRESS_CONFIRM, RELEASE};
void key_scan()
{
static enum key_state state = IDLE;
static uint8_t last_key = 1;
uint8_t current_key = KEY_PIN;
switch(state)
{
case IDLE:
if(current_key == 0 && last_key == 1) {
state = PRESS_DETECT;
last_key = 0;
}
break;
case PRESS_DETECT:
if(current_key == 0) {
delay_ms(10); // 消抖延时
state = PRESS_CONFIRM;
} else {
state = IDLE;
}
break;
// 其他状态处理...
}
}
5. 制作与调试经验
5.1 PCB设计注意事项
- 红外传感器周围避免布置发热元件
- 蓝牙天线区域(模块背面)下方不要走线
- 晶振尽量靠近单片机且用地线包围
- 电源走线宽度建议≥0.5mm
5.2 常见问题排查
-
LCD显示乱码:
- 检查对比度电位器调节
- 确认初始化时序正确
- 测量背光电压(通常3-5V)
-
蓝牙无法连接:
- 确认模块进入配对状态(快闪)
- 检查手机是否已配对过其他设备
- 重新上电测试
-
温度读数异常:
- 检查传感器供电电压(3.3V±0.1V)
- 确认I2C上拉电阻是否合适
- 避免强光直射传感器
6. 项目优化方向
在实际使用中,我发现还可以做以下改进:
- 增加温度报警功能,超过阈值时蜂鸣器提示
- 改用OLED显示屏,实现更丰富的界面
- 添加数据存储功能,记录温度变化曲线
- 开发专用APP,实现历史数据查询和分析
这个项目最让我有成就感的部分是蓝牙传输的稳定性优化。最初版本在3米外就经常断连,后来通过以下措施将有效距离提升到8米:
- 在蓝牙模块电源端增加100μF钽电容
- 调整天线方向与手机保持平行
- 优化数据发送间隔(从100ms改为500ms)
