功能介绍:
0.本系统采用STC89C52作为单片机
1.采用LCD1602作为显示液晶可实时显示各项参数的状态
3.采用SIM800L作为短信通信模块,当检测到老人有特殊情况时候发短信到监护人手机
4.火焰检测使用模块,方便接插
5.心率脉搏检测采用成熟的模块,外接LM393比较器将心率信号进一步整形给单片机采集
6.加速度传感器采用的是ADXL345模块,用于检测老人是否跌倒。

原理图:

PCB:

主程序:

#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include <math.h> //Keil library
#include "delay.h"
#include "adxl345.h"
#include "lcd1602.h"#define ON  0
#define OFF 1sbit FIRE_MONITOR = P1^2;
sbit BUZZER = P2^2;
sbit KEY_ALARM = P3^5; //手动报警按钮
sbit KEY_CANCEL  = P3^3; //退出报警unsigned char dispFlag = 0; //刷新数据标志
bit fireFlag = OFF;
unsigned char fireDelaySec = 0; //温度过高计时bit fallFlag = OFF;  //摔倒标志
unsigned char fallDelaySec = 0;   //摔倒计时unsigned char datIndex = 0;
unsigned int timeCnt = 0;
unsigned int heartRateBuf[6] = {0}; //暂存心率值
bit heartRateFlag = OFF; //心率报警标志
unsigned char heartRateDelaySec = 0; //心率超标计时
unsigned int heartRate = 0;bit refreshFlag = 0;
bit updateFlag = 0; //更新心率标志
bit alarmFLag = OFF;  //自动报警标志
bit alarmFLag1 = OFF; //手动报警标志unsigned char dis[16];unsigned char i;
unsigned char x;void Ext0_Init(void); //外部中断0初始化程序
void Timer0_Init(void); //函数声明
void Timer1_Init(void); //函数声明
void KeyProcess(void);
void GSM_Send(void);
void HeartRate_Monitor(void);void UART_Init(void);
void UART_SendByte(unsigned char dat);
void UART_SendStr(unsigned char *s, unsigned char length);void main(void)
{static unsigned char ErrorNum = 0; //adxl345数据判断结果计数static unsigned char CheckNum = 0;Ext0_Init();Timer0_Init(); //定时器0初始化Timer1_Init(); //定时器1初始化UART_Init();Init_ADXL345();            //初+始化ADXL345Single_Read_ADXL345(0X00); //读出的数据为0XE5,表示正确LCD_Init();LCD_Clear();LCD_DispStr(0, 0, "    Welcome!    ");DelayS(3);UART_SendStr("AT+CMGF=1\r\n", 11);DelayS(3);LCD_Clear();while (1) //主循环{if (refreshFlag == 1){HeartRate_Monitor(); //心率监测}if (dispFlag == 1) //定时读取温度标志{dispFlag = 0;if (FIRE_MONITOR == 0) //检测到由火焰{DelayMs(20);if (FIRE_MONITOR == 0) //确认检测到由火焰{fireFlag = ON; //火焰预警标志}}else{fireFlag = OFF;}if (updateFlag == 0) //如果显示关  检测心率是否真实{heartRate = 0;}else //如果显示开{// heartRate = 60000 / (heartRateBuf[1] / 5 + heartRateBuf[2] / 5 + heartRateBuf[3] / 5 + heartRateBuf[4] / 5 + heartRateBuf[5] / 5); //心率计算 5次求平均值heartRate = 60000 / ((heartRateBuf[1]>>2) + (heartRateBuf[2]>>2) + (heartRateBuf[3]>>2) + (heartRateBuf[4]>>2)); //心率计算 4次求平均值}if (heartRate > 100) //心率超过100{heartRateFlag = ON; //心率预警标志}else{heartRateFlag = OFF;}ReadData_x(); //检测姿态CheckNum++;if ((fabs(temp_X) < 450) && (fabs(temp_Y) < 450)) //方位值判断 查看正常次数{;}else //错误次数{ErrorNum++;}if (CheckNum >= 5) //进行5次处理{if (ErrorNum > 3) //3次以上则认为摔倒{fallFlag = ON;}else{fallFlag = OFF;}             //清除 摔倒标志ErrorNum = 0; //清空滤波计数CheckNum = 0; //清除总计数}sprintf(dis, "HeartRate:%3.0fbpm", (float)heartRate);LCD_DispStr(0, 0, dis); //显示心率if (fireFlag == ON){LCD_DispStr(0, 1, "fire"); //显示火焰fireDelaySec++; //火焰检测计时}else{LCD_DispStr(0, 1, "    "); //显示fireDelaySec = 0; //否则清零}if (heartRateFlag == ON){LCD_DispStr(5, 1, "heart"); //显示心率异常heartRateDelaySec++; //火焰检测计时} else{LCD_DispStr(5, 1, "     "); //显示heartRateDelaySec = 0; //否则清零}if (fallFlag == ON){LCD_DispStr(11, 1, "fall"); //显示摔倒fallDelaySec++; //摔倒计时}else{LCD_DispStr(11, 1, "    "); //显示fallDelaySec = 0; //否则清零}}if ((fireFlag == OFF) && (heartRateFlag == OFF) && (fallFlag == OFF)){alarmFLag = OFF; //关闭报警}if ((fireDelaySec >= 10) || (heartRateDelaySec >= 10) || (fallDelaySec >= 10)) //一定时间上报{alarmFLag = ON;}if (alarmFLag == ON || alarmFLag1 == ON) {BUZZER = ON;GSM_Send();}else{BUZZER = OFF;}KeyProcess();}
}void KeyProcess(void)
{if (KEY_ALARM == 0) //报警按键按下{DelayMs(5);if (KEY_ALARM == 0){alarmFLag1 = ~alarmFLag1;}while (KEY_ALARM == 0);}else if (KEY_CANCEL == 0) //清零按键按下{DelayMs(5);if (KEY_CANCEL == 0){fireFlag = OFF;     //火焰标志清零heartRateFlag = OFF; //心率超高标志清零fallFlag = OFF; //摔倒标志清零alarmFLag = OFF;    alarmFLag1 = OFF; }while (KEY_CANCEL == 0);}
}void HeartRate_Monitor(void)
{EX0 = 0;TR0 = 0;TR1 = 0;refreshFlag = 0;heartRateBuf[datIndex] = timeCnt * 5; //算出间隔时间TH0 = 0xEE; //(65536 - 0.005*11059200/12 + 200) / 256TL0 = 0xC8; //(65536 - 0.005*11059200/12 + 200) % 256  5mstimeCnt = 0; //50ms计数清零datIndex++;if (datIndex > 5) //记录到超过等于4次时间{datIndex = 1;   //计数从1开始updateFlag = 1; //测得5次开始显示}EX0 = 1;TR0 = 1;TR1 = 1;}void GSM_Send(void)
{UART_SendStr("AT+CMGF=1\r\n", 11);DelayS(2);UART_SendStr("AT+CSCS=\"GSM\"\r\n", 15);DelayS(2);UART_SendStr("AT+CMGS=\"+86xxxxxxxxxxx\"\r\n", 26); //可以修改电话号码DelayS(2);if (alarmFLag1 == ON){UART_SendStr("I'm not well!\x1a", 14); //可以修改短信内容,不可以发汉字,如果发汉字的话,需要转化为特定的码alarmFLag1 = OFF;}if (fireDelaySec >= 10){UART_SendStr("The house is on fire!\x1a", 22); //可以修改短信内容,不可以发汉字,如果发汉字的话,需要转化为特定的码fireDelaySec = 0;                //清除计数}if (heartRateDelaySec >= 10){UART_SendStr("Arrhythmia!\x1a", 12); //可以修改短信内容,不可以发汉字,如果发汉字的话,需要转化为特定的码heartRateDelaySec = 0;                //清除计数}if (fallDelaySec >= 10){UART_SendStr("I fell down!\x1a", 13); //可以修改短信内容fallDelaySec = 0;              //清除计数}DelayS(1);}/***********外部中断0初始化程序****************/
void Ext0_Init() //外部中断0初始化程序
{IT0 = 1; //外部中断0负跳变中断PX0 = 1; //设置高优先级EX0 = 1; //允许外部中断0中断
}void Ext0_Interrupt() interrupt 0
{if (timeCnt < 100) //当连续两次检测时间间隔小于10*50ms=500ms不处理{TR0 = 1; //开定时器}else{refreshFlag = 1;}
}/*************定时器初始化程序***************/
void Timer0_Init()
{TMOD &= 0xF0;TMOD |= 0x01; //定时器0工作方式1TH0 = 0xB8; //(65536 - 0.02*11059200/12) / 256TL0 = 0x00; //(65536 - 0.02*11059200/12) % 256  20msPT0 = 1;    //设置高优先级ET0 = 1;    //开定时器0中断TR0 = 1;    //允许定时器0定时
}/*************定时器0中断服务程序***************/
void Timer0_Interrupt() interrupt 1
{TH0 = 0xEE; //(65536 - 0.005*11059200/12 + 200) / 256TL0 = 0xC8; //(65536 - 0.005*11059200/12 + 200) % 256  5mstimeCnt++; //每5ms一次计数if (timeCnt > 250) //当超过25*50ms=1.5s没有检测到信号停止显示{datIndex = 0;   //数据个数清零timeCnt = 0;  //50ms计数清零updateFlag = 0;TR0 = 0;      //定时器关}
}void Timer1_Init(void)
{TMOD &= 0x0F;                //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TMOD |= 0x10;                //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TH1 = 0xB8; //(65536 - 0.02*11059200/12) / 256TL1 = 0x00; //(65536 - 0.02*11059200/12) % 256  20msEA = 1;  //总中断打开ET1 = 1; //定时器中断打开TR1 = 1; //定时器开关打开
}void UART_Init(void)
{SCON = 0x50;TH2 = 0xFF;TL2 = 0xFD;RCAP2H = 0xFF;  //(65536-(FOSC/32/BAUD))   BAUD = 115200 FOSC = 11059200RCAP2L = 0xFD;/*****************/TCLK = 1;RCLK = 1;C_T2 = 0;EXEN2 = 0;/*****************/TR2 = 1;ES   = 1; //打开串口中断EA   = 1; //打开总中断
}void UART_SendByte(unsigned char dat) //串口发送单字节数据
{unsigned char time_out;time_out = 0x00;SBUF = dat;                       //将数据放入SBUF中while ((!TI) && (time_out < 100)) //检测是否发送出去{time_out++;DelayUs10x(2);}       //未发送出去 进行短暂延时TI = 0; //清除ti标志
}void UART_SendStr(unsigned char *s, unsigned char length) //发送定长度字符串
{unsigned char NUM;NUM = 0x00;while (NUM < length) //发送长度对比{UART_SendByte(*s); //放松单字节数据s++;              //指针++NUM++;            //下一个++}
}void Timer1_Interrupt(void) interrupt 3
{static unsigned char times_20ms = 0; //定时20ms计时TH1 = 0xB8; //(65536 - 0.02*11059200/12) / 256TL1 = 0x00; //(65536 - 0.02*11059200/12) % 256  20mstimes_20ms++;if (times_20ms > 50){times_20ms = 0;dispFlag = 1; //显示标志置1}
}void UART_SER(void) interrupt 4 //串行中断服务程序
{    if (RI) //判断是接收中断产生RI = 0; //标志位清零if (TI) //如果是发送标志位,清零TI = 0;
}

实物演示视频:
https://www.bilibili.com/video/BV1cY411F7Lc/

基于51单片的物联网空巢老人安全监护系统心率跌倒检测原理图PCB相关推荐

  1. 基于51单片的智能饮水机设计(实物图+源码+原理图+参考论文)

     资料编号:053 采用51单片机,可以继电器模拟自动恒温加热,感应出水,自动加水,热水和冷水切换,LCD1602显示等,全套资料齐全 具体功能请看下方演示视频 53-基于51单片的智能饮水机设计(实 ...

  2. 基于51单片机智能家居家电继电器开关插座定时WiFi无线proteus仿真原理图PCB

    功能: 0.本系统采用STC89C52作为单片机 1.手机通过wifi控制4路继电器的开和关以及定时: 手机发送OA,继电器全部打开, 手机发送CA,继电器全部关闭, 手机发送O14,继电器14打开, ...

  3. 基于51单片机的电流电压过流过压监测声光报警器proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前检测的电压电流值 2.当电压/电流超过设定阈值时,蜂鸣器报警 3.按键可切换界面,并设置电压/电流阈值 原理图: ...

  4. 基于51单片机的可控硅调压调光程序-带过零检测

    基于51单片机的可控硅调压调光程序-带过零检测 #include<reg52.h> #include<intrins.h> sbitledRS=P1^0; sbitledRW= ...

  5. 3、基于51单片机的智能水箱控制系统-温度-PH值-水位(仿真+程序+原理图)

    目录 基于51单片机的智能水箱控制系统 1.主要功能 2.实验结果 3.仿真工程 4.原理图 5.程序源码 6.资源获取 基于51单片机的智能水箱控制系统 1.主要功能 51单片机检测水箱内温度,ph ...

  6. 基于51单片机的医用输液点滴监测报警器(实物图+源码+原理图+参考论文)

     资料编号:052 1. 实现模拟点滴输液报警器的基本功能: 2. 对点滴速度进行监测,超过一定速度报警: 3. 对药体位置进行监测,当低于一定高度时报警. 全套资料齐全,具体功能请看下方演示视频 5 ...

  7. 基于51单片机的蓝牙控制双色LED点阵显示屏(实物图+原理图+源码+全套资料)

    资料编号:086 采用stm32单片机,可以通过蓝牙app控制点阵显示不同效果, 具体功能请看演示视频,全套资料齐全: 86-基于51单片机的蓝牙控制双色LED点阵显示屏(实物图+原理图+源码+全套资 ...

  8. 53-基于51单片的智能饮水机设计(实物图+源码+原理图)

    编号: 053 采用51单片机,可以继电器模拟自动恒温加热,感应出水,自动加水,热水和冷水切换 LCD1602显示等,全套资料齐全 经过实验验证,切实可行,配备详细代码注释,有原理图+PCB+源程序+ ...

  9. stm32的语音识别_基于stm32循迹避障语音控制金属探测蓝牙小车设计(原理图+pcb+源码+参考文档)...

    功能描述及设计原理: 小车具有检测里程功能,在金属探测模式,槽型光耦会检测小车车轮的圈数,以此来计算小车行走的里程,并可以通过OLED屏幕显示出来.还可以显示小车的工作模式以及小车距离前方障碍物的距离 ...

最新文章

  1. 网页制作常见的问题(怎样兼容IE6/IE7/火狐浏览器)
  2. 为office添加繁简体转换
  3. html脚本详解,HTML脚本教程详解
  4. C和指针:第十三,十四章
  5. 关于datagrid中控件利用js调用后台方法事件的问题
  6. svn 文件状态标记含义
  7. 数据结构思维 第六章 树的遍历
  8. 基于MATLAB的面向对象编程(1)——类,属性,方法
  9. 工信部通告:任何组织和机构不得继续实施“计算机信息系统集成企业资质认定”...
  10. 一个民工的数字化生活
  11. Git和Github的学习
  12. ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行
  13. PHP在哪里执行_php文件放在哪运行
  14. 今年第一个项目来说NET的中间语言
  15. Web设计师须知的10项SEO技巧
  16. Mac环境下安装Pod
  17. php log 行号 debug_backtrace,PHP 基于debug_backtrace的流程日志与日志分析
  18. jQuery封装的选项卡方法
  19. wordpress主题模板开发制作教程
  20. torch的maximum与max以及导出onnx

热门文章

  1. 使用 SwitchHosts 一个修改、管理、切换多个 hosts 无法生效问题
  2. 如何在LINUX下利用QT调用第三方软件WPS
  3. grep正则表达式匹配中括号的方法实例
  4. mlc颗粒的m.2固态有哪些(多款MLC企业级SSD性能实测)
  5. IntelliJ IDEA 中配置连接MySQL数据库
  6. 安装Matplotlib
  7. Linux 传输文件
  8. javascript 内置对象Math总结及其案例
  9. 独立开发者之路(二)
  10. SQL 在查询结果中增加标记字段