目录
一、主要功能
设计一款用于施工工地的安全帽监测系统,能够实现实时监测施工人员的健康状况(心率和血氧),并能保证施工人员在工地上始终佩戴安全帽。功能可划分为两个模块:健康监测模块和安全帽佩戴监测模块。 健康监测模块搭载心率和血氧传感器,可实时监测用户血氧信息。当用户血氧和心率值异常时,报警系统会发出警报,同时将信息发送到监控端(串口)。 安全帽佩戴监测模块可实时监测用户佩戴情况,压力传感器,压力异常时,当佩戴出现异常情况时,报警系统会发出警报
仿真图:编辑
二、硬件资源
基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。
本系统包括51单片机最小系统、LCD1602显示屏、MPX4117压力传感器、血氧传感器、心率传感器、灯光报警电路、ADC0832数模转换器、虚拟串口和按键电路。
三、程序编程
#include <REGX52.H>
#include<intrins.h>
#include<stdio.h>
#include "Delay.h"
#include "LCD1602.h"
#include "Beep.h"
#define uchar unsigned char
#define uint unsigned int
/*引脚定义*/
sbit LEDBJ = P2^3; //LED灯引脚
sbit BEEP = P2^4; //蜂鸣器引脚
sbit CS = P1^0; //ADC0832引脚定义
sbit CLK = P1^1;
sbit DIO = P1^2;
sbit CS1 = P1^3; //ADC0832引脚定义
sbit CLK1 = P1^4;
sbit DIO1 = P1^5;
sbit CS2 = P2^0; //ADC0832引脚定义
sbit CLK2 = P2^1;
sbit DIO2 = P2^2;
sbit key = P1^7;
/*变量定义*/
static int yalimax=100,yalimin=50,fenchenmax=100,fenchenmin=50;
static uchar u,U,XY,u1,U1,YL,u2,U2,XL;
int flag = 0;
/*函数定义初始化*/
void anjianjc();
void WARNING();
void WARNING() //报警检测
{
if(YL > 100)
{
if(XL > 80 && XY > 80)
{
printf("心率和血氧异常,请查看身体!\\r\\n");
LEDBJ = 1;
BEEP = 1;
Delay(1000);
}
else if(XY >80)
{
printf("血氧异常,请查看身体!\\r\\n");
LEDBJ = 1;
BEEP = 1;
Delay(1000);
}
else if(XL > 80)
{
printf("心率异常,请查看身体!\\r\\n");
LEDBJ = 1;
BEEP = 1;
Delay(1000);
}
else
{
LEDBJ = 0;
BEEP = 0;
}
LEDBJ = 1;
}
else
{
LEDBJ = 0;
}
}
//串口初始化
void init_com(void)
{
TMOD =0x20; //设T0为方式1,GATE=1;
SCON=0x50; //开启串口
TH1=0xFD; //波特率是9600bps
TL1=0xFD;
TR1=1; //开启定时器
TI=1;
EA=1;
}
uchar get\_AD\_Res() //ADC0832启动读取函数
{
uchar i, data1=0, data2=0;
CS=0;
CLK=0;DIO=1;\_nop\_();
CLK=1;\_nop\_();
CLK=0;DIO=1;\_nop\_();
CLK=1;\_nop\_();
CLK=0;DIO=0;\_nop\_();
CLK=1;\_nop\_();
CLK=0;DIO=1;\_nop\_();
for(i=0; i<8; i++)
{
CLK=1;\_nop\_();
CLK=0;\_nop\_();
data1=(data1<<1)|(uchar)DIO;
}
for(i=0; i<8; i++)
{
data2=data2|(uchar)DIO<<i;
CLK=1;\_nop\_();
CLK=0;\_nop\_();
}
CS=1;
return(data1 == data2)?data1:0;
}
uchar get\_AD\_Res1() //ADC0832启动读取函数
{
uchar i, data1=0, data2=0;
CS1=0;
CLK1=0;DIO1=1;\_nop\_();
CLK1=1;\_nop\_();
CLK1=0;DIO1=1;\_nop\_();
CLK1=1;\_nop\_();
CLK1=0;DIO1=0;\_nop\_();
CLK1=1;\_nop\_();
CLK1=0;DIO1=1;\_nop\_();
for(i=0; i<8; i++)
{
CLK1=1;\_nop\_();
CLK1=0;\_nop\_();
data1=(data1<<1)|(uchar)DIO1;
}
for(i=0; i<8; i++)
{
data2=data2|(uchar)DIO1<<i;
CLK1=1;\_nop\_();
CLK1=0;\_nop\_();
}
CS1=1;
return(data1 == data2)?data1:0;
}
uchar get\_AD\_Res2() //ADC0832启动读取函数
{
uchar i, data1=0, data2=0;
CS2=0;
CLK2=0;DIO2=1;\_nop\_();
CLK2=1;\_nop\_();
CLK2=0;DIO2=1;\_nop\_();
CLK2=1;\_nop\_();
CLK2=0;DIO2=0;\_nop\_();
CLK2=1;\_nop\_();
CLK2=0;DIO2=1;\_nop\_();
for(i=0; i<8; i++)
{
CLK2=1;\_nop\_();
CLK2=0;\_nop\_();
data1=(data1<<1)|(uchar)DIO2;
}
for(i=0; i<8; i++)
{
data2=data2|(uchar)DIO2<<i;
CLK2=1;\_nop\_();
CLK2=0;\_nop\_();
}
CS2=1;
return(data1 == data2)?data1:0;
}
void main() //主函数
{
init_com(); //串口初始化
LCD_Init(); //显示屏初始化:
LEDBJ = 0; //关掉报警灯光
BEEP = 0; //关掉蜂鸣器
do
{
u=get\_AD\_Res(); //压力传感器
U=(250*u)/128;
YL=200*U/250;
u1=get\_AD\_Res1(); //心率传感器
U1=(250*u1)/128;
XL=200*U1/250;
u2=get\_AD\_Res2(); //血氧传感器
U2=(250*u2)/128;
XY=200*U2/250;
if(key == 0)
{
Delay(150);
if(key == 0)
{
flag++;
if(flag == 3)
{
flag = 0;
}
}
}
switch(flag)
{
case 0: LCD\_ShowNum(1,4,YL,3); LCD\_ShowString(1,1,"YL:"); break;
case 1: LCD\_ShowNum(1,4,XL,3); LCD\_ShowString(1,1,"XL:");break;
case 2: LCD\_ShowNum(1,4,XY,3);LCD\_ShowString(1,1,"XY:");break;
default:break;
}
WARNING(); //报警检测
} while(1);
}
四、实现现象
具体动态效果看B站演示视频:
基于51单片机的安全帽检测系统(压力传感器,血氧和心率传感器)_哔哩哔哩_bilibili
全部资料(源程序、仿真文件、安装包、演示视频):
所有源程序和仿真,原理图,流程图等:
链接:https://pan.baidu.com/s/1Wm_zhlAseaw-f0hxnaqKWQ
提取码:e998
–来自百度网盘超级会员V4的分享