基于单片机的非接触式人体红外测温系统

设计简介:

本设计是基于单片机的非接触式人体红外测温系统,主要实现以下功能:

  • 可通过LCD1602显示温度和是否有人;
  • 可通过按键调整温度阈值;
  • 可通过红外对管监测是否有人;
  • 可通过语音播报TTS播报温度和温度状态。

标签:51单片机、LCD1602、非接触人体测温、语音播报

效果图:

总体资料:

原理图:

软件设计流程:

系统框图:

本设计以STC89C52单片机为核心控制器,加上其他的模块一起组成非接触人体红外测温的整个系统,其中包含中控部分、输入部分和输出部分。中控部分采用了STC89C52单片机,其主要作用是获取输入部分数据,经过内部处理,控制输出部分。输入由四部分组成,第一部分是MLX90614红外测温模块,通过该模块可检测当前的人体温度;第二部分是红外对管模块,通过该模块可检测当前是否有人;第三部分是独立按键,通过三个独立按键切换界面和设置人体温度的上下限值;第四部分是供电电路,给整个系统进行供电。输出由三部分组成,第一部分是LCD1602显示模块, 通过该模块可以显示当前人体温度、是否有人、设置人体温度的最大值等;第二部分是语音模块,当检测到有人且计时3S后,该模块语音播报温度及温度是否正常;第三部分是蜂鸣器,若当前人体温度大于设置的最大值或小于设置的最小值,则蜂鸣器每隔100ms报警一次,若当前人体温度小于或等于设置的最大值,则蜂鸣器停止报警。

  • 9
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个简单的代码示例,可以实现你所描述的功能: ```c #include <reg52.h> #include <intrins.h> #define FOSC 11059200L #define BAUD 9600 typedef unsigned char uchar; typedef unsigned int uint; sbit SCL=P2^1; sbit SDA=P2^0; sbit E=P1^7; sbit RW=P1^6; sbit RS=P1^5; // I2C总线相关操作 void delay5us() _naked { _asm nop nop nop nop _endasm; } void i2c_start() { SDA = 1; delay5us(); SCL = 1; delay5us(); SDA = 0; delay5us(); SCL = 0; delay5us(); } void i2c_stop() { SDA = 0; delay5us(); SCL = 1; delay5us(); SDA = 1; delay5us(); } void i2c_ack() { SDA = 0; delay5us(); SCL = 1; delay5us(); SCL = 0; delay5us(); SDA = 1; delay5us(); } void i2c_nack() { SDA = 1; delay5us(); SCL = 1; delay5us(); SCL = 0; delay5us(); SDA = 1; delay5us(); } uchar i2c_write_byte(uchar dat) { uchar i, ack_bit; for(i=0; i<8; i++) { SDA = (dat & 0x80) >> 7; dat <<= 1; delay5us(); SCL = 1; delay5us(); SCL = 0; delay5us(); } SDA = 1; delay5us(); SCL = 1; delay5us(); ack_bit = SDA; SCL = 0; delay5us(); return ack_bit; } uchar i2c_read_byte() { uchar i, dat = 0; SDA = 1; delay5us(); for(i=0; i<8; i++) { dat <<= 1; SCL = 1; delay5us(); dat |= SDA; SCL = 0; delay5us(); } return dat; } // MLX90614红外测温模块相关操作 void mlx90614_init() { i2c_start(); i2c_write_byte(0xB4); i2c_write_byte(0x01); i2c_write_byte(0x60); i2c_stop(); } float mlx90614_get_temp() { uchar i, temp_h, temp_l; float temp; i2c_start(); i2c_write_byte(0xB4); i2c_write_byte(0x07); i2c_stop(); i2c_start(); i2c_write_byte(0xB5); temp_h = i2c_read_byte(); temp_l = i2c_read_byte(); i2c_nack(); i2c_stop(); temp = (temp_h << 8) | temp_l; temp *= 0.02; temp -= 273.15; return temp; } // LCD1602显示模块相关操作 void lcd_write_cmd(uchar cmd) { RS = 0; RW = 0; P0 = cmd; E = 1; _nop_(); _nop_(); E = 0; } void lcd_write_data(uchar dat) { RS = 1; RW = 0; P0 = dat; E = 1; _nop_(); _nop_(); E = 0; } void lcd_init() { lcd_write_cmd(0x38); lcd_write_cmd(0x0C); lcd_write_cmd(0x06); lcd_write_cmd(0x01); } void lcd_display_temp(float temp) { uchar i, temp_int, temp_dec; temp_int = (uchar)temp; temp_dec = (uchar)((temp - temp_int) * 100); lcd_write_cmd(0x80); lcd_write_data('T'); lcd_write_data('e'); lcd_write_data('m'); lcd_write_data('p'); lcd_write_data(':'); lcd_write_data(' '); lcd_write_data(temp_int / 10 + '0'); lcd_write_data(temp_int % 10 + '0'); lcd_write_data('.'); lcd_write_data(temp_dec / 10 + '0'); lcd_write_data(temp_dec % 10 + '0'); lcd_write_data('C'); } // 主函数 void main() { float temp; TMOD = 0x20; TH1 = TL1 = -(FOSC/12/32/BAUD); TR1 = 1; SCON = 0x50; ES = 1; EA = 1; lcd_init(); mlx90614_init(); while(1) { temp = mlx90614_get_temp(); lcd_display_temp(temp); delay_ms(500); } } // 串口中断服务函数 void uart_isr() interrupt 4 { RI = 0; TI = 0; } ``` 这段代码使用了STC89C52单片机,通过I2C总线与MLX90614红外测温模块进行通信,读取人体温度值,然后通过LCD1602显示模块将温度值显示出来。 注意,这段代码中串口通信部分还没有实现,如果需要使用串口通信功能,需要自己添加相关代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

特纳斯电子校园

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值