基于STC15F2K60S2单片机和MLX90614红外温度传感器等元件设计一个红外快速检测人体温度的装置
时间: 2023-08-11 11:04:59 浏览: 164
该装置的设计流程如下:
1. 确定硬件元件:STC15F2K60S2单片机、MLX90614红外温度传感器、LCD显示屏、蜂鸣器、电源等。
2. 搭建硬件电路:按照电路图连接各个硬件元件。
3. 编写程序:使用Keil或其他编译器编写程序,实现单片机对传感器的读取、数据处理、控制LCD显示屏及蜂鸣器进行报警等功能。
具体的步骤如下:
1. 硬件元件确认
STC15F2K60S2单片机:这是一款高性能单片机,具有丰富的接口资源和强大的计算能力,适合用于嵌入式系统中。
MLX90614红外温度传感器:这是一款非接触式红外温度传感器,可以测量目标物体的表面温度,测量范围为-70℃~380℃,精度为±0.5℃。
LCD显示屏:这是一款16x2字符型液晶显示屏,可以显示单片机传输的数据,方便用户查看。
蜂鸣器:这是一款电子音响器件,可以发出一种高频声音,用于报警等功能。
电源:这是整个系统的电源,可以使用直流电源或者电池供电。
2. 硬件电路搭建
按照以下电路图连接各个硬件元件:
![电路图](https://img-blog.csdn.net/20180313204953889?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGFyZGluZzEwMTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/75)
3. 编写程序
编写程序实现以下功能:
(1)初始化程序:完成各个硬件元件的初始化工作。
(2)读取传感器数据:使用单片机读取MLX90614红外温度传感器测量到的温度数据。
(3)数据处理:对读取到的温度数据进行处理,计算出人体温度。
(4)控制LCD显示屏显示数据:将计算出的人体温度数据显示在LCD显示屏上。
(5)报警:当人体温度超过正常范围时,通过蜂鸣器进行报警。
程序示例:
```c
#include <STC15F2K60S2.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define TEMP_HIGH 38.0 // 温度报警上限
#define TEMP_LOW 35.0 // 温度报警下限
sbit BEEP = P1^5; // 蜂鸣器
sbit SDA = P1^1; // IIC总线数据线
sbit SCL = P1^0; // IIC总线时钟线
uchar buf[2]; // 存放读取到的温度值
/*************************************
函数名称:delay_us
功 能:微秒级延时
参 数:t,延时微秒数
返 回 值:无
*************************************/
void delay_us(uint t)
{
while (t--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
/*************************************
函数名称:Start_SHT30
功 能:启动IIC总线
参 数:无
返 回 值:无
*************************************/
void Start_IIC(void)
{
SDA = 1;
delay_us(2);
SCL = 1;
delay_us(2);
SDA = 0;
delay_us(2);
SCL = 0;
delay_us(2);
}
/*************************************
函数名称:Stop_IIC
功 能:结束IIC总线
参 数:无
返 回 值:无
*************************************/
void Stop_IIC(void)
{
SDA = 0;
delay_us(2);
SCL = 1;
delay_us(2);
SDA = 1;
delay_us(2);
}
/*************************************
函数名称:IIC_Ack
功 能:应答信号
参 数:无
返 回 值:无
*************************************/
void IIC_Ack(void)
{
SDA = 0;
delay_us(2);
SCL = 1;
delay_us(2);
SCL = 0;
delay_us(2);
}
/*************************************
函数名称:IIC_NAck
功 能:非应答信号
参 数:无
返 回 值:无
*************************************/
void IIC_NAck(void)
{
SDA = 1;
delay_us(2);
SCL = 1;
delay_us(2);
SCL = 0;
delay_us(2);
}
/*************************************
函数名称:Write_IIC_Byte
功 能:向IIC总线写入一个字节
参 数:byte,要写入的字节
返 回 值:无
*************************************/
void Write_IIC_Byte(uchar byte)
{
uchar i;
for (i = 0; i < 8; i++)
{
if ((byte & 0x80) == 0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
delay_us(2);
SCL = 1;
delay_us(2);
SCL = 0;
byte <<= 1;
delay_us(2);
}
}
/*************************************
函数名称:Read_IIC_Byte
功 能:从IIC总线读取一个字节
参 数:ack,是否发送应答信号
返 回 值:读取到的字节
*************************************/
uchar Read_IIC_Byte(bit ack)
{
uchar i, byte = 0;
SDA = 1;
for (i = 0; i < 8; i++)
{
byte <<= 1;
SCL = 1;
delay_us(2);
if (SDA)
{
byte |= 0x01;
}
SCL = 0;
delay_us(2);
}
if (ack)
{
IIC_Ack();
}
else
{
IIC_NAck();
}
return byte;
}
/*************************************
函数名称:Read_Temp
功 能:读取温度值
参 数:无
返 回 值:温度值
*************************************/
float Read_Temp(void)
{
float temp;
Start_IIC();
Write_IIC_Byte(0x5A << 1 | 0x00); // 发送器件地址和写指令
Write_IIC_Byte(0x07); // 发送读取温度命令
Start_IIC();
Write_IIC_Byte(0x5A << 1 | 0x01); // 发送器件地址和读指令
buf[0] = Read_IIC_Byte(1); // 读取第一个字节,发送应答
buf[1] = Read_IIC_Byte(0); // 读取第二个字节,发送非应答
Stop_IIC();
temp = (buf[1] << 8) | buf[0]; // 将两个字节拼接成一个16位的温度值
temp *= 0.02; // 温度值需要左移2位,所以要除以2的平方
temp -= 273.15; // 将温度值从K转换为℃
return temp;
}
/*************************************
函数名称:LCD_Init
功 能:LCD初始化
参 数:无
返 回 值:无
*************************************/
void LCD_Init(void)
{
P0 = 0x38;
delay_us(2000);
P0 = 0x0C;
delay_us(2000);
P0 = 0x01;
delay_us(2000);
}
/*************************************
函数名称:LCD_Show_Temp
功 能:LCD上显示温度值
参 数:temp,要显示的温度值
返 回 值:无
*************************************/
void LCD_Show_Temp(float temp)
{
uchar i, j, k;
uchar str[8];
sprintf(str, "Temp:%.1f", temp); // 将温度值转换为字符串
for (i = 0; i < 2; i++)
{
P0 = 0x80 + i * 0x40; // 设置显示位置
delay_us(2000);
for (j = 0; j < 8; j++)
{
k = str[i * 8 + j];
P0 = k;
delay_us(2000);
}
}
}
/*************************************
函数名称:BEEP_Alarm
功 能:蜂鸣器报警
参 数:无
返 回 值:无
*************************************/
void BEEP_Alarm(void)
{
BEEP = 1;
delay_us(50000);
BEEP = 0;
}
/*************************************
函数名称:Main
功 能:主函数
参 数:无
返 回 值:无
*************************************/
void Main()
{
float temp;
LCD_Init();
while (1)
{
temp = Read_Temp(); // 读取温度值
LCD_Show_Temp(temp); // 显示温度值
if (temp > TEMP_HIGH || temp < TEMP_LOW) // 温度超过正常范围,报警
{
BEEP_Alarm();
}
}
}
```
以上是一个简单的红外快速检测人体温度的装置设计流程,可以根据实际需求进行修改优化。
阅读全文