编号:50
基于51单片机的心率计(上下限报警+蓝牙)
功能描述:
50、基于51单片机的心率计(上下限报警+蓝牙)
由 51单片机最小系统+心率模块 +LCD1602显示模块+独立按键+声光报警模块+串口模拟蓝牙模块组成
1、采用51单片机为主控制器
2、采用心率传感器PulseSensor测量心率。
3、LCD1602显示测得的心率值。
4、三个独立按键可设定心率上下限值。
5、当测得心率超出范围时,声光报警。
6、通过串口蓝牙模块将心率发送至串口。
视频演示链接:
50、基于51单片机的心率计(上下限报警+蓝牙)
仿真图:
PCB图:
实物图:
程序源码:
/***********************************************
***********************************************/
#include "reg52.h"
#include "lcd1602.h"
#include "delay.h"
#include "KEY.h"
#include "lcd1602.h"
#include "pulsesensor.h"
#include "uart.h"
sbit beep = P2^3; //蜂鸣器控制脚
sfr T2MOD = 0xc9; //timer2 mode register
bit flag_beep = 0; //报警标志位
bit flag_timer = 0; //600ms定时时间到标志位
short Htup = 150,Htdw = 50; //心率上限 默认150 下限默认50
/************************************************************************
* 函数: void Timer2Init(void)
* 描述: 定时器1初始化函数
* 参数: none.
* 返回: none.
* 备注:定时50ms 11.0592MHz
************************************************************************/
void Timer2Init(void) //50毫秒@11.0592MHz
{
T2MOD = 0; //初始化模式寄存器
T2CON = 0; //初始化控制寄存器
TL2 = 0x00; //设置定时初值
TH2 = 0x4C; //设置定时初值
RCAP2L = 0x00; //设置定时重载值
RCAP2H = 0x4C; //设置定时重载值
TR2 = 1; //定时器2开始计时
ET2 = 1; //开始计数
EA = 1; //开总中断
}
void main(void)
{
unsigned char keyvalue = 0; //键值
unsigned char Dis_mode = 0; //显示状态标志 0:显示传感器数据 1:显示日期时间
short heart = 0; //定义心率变量
Lcd1602_Init(); //LCD1602液晶初始化
EXIT0_Init(); //外部中断初始化
Timer0Init(); //10毫秒@11.0592MHz
Timer2Init(); //50毫秒@11.0592MHz
UartInit(); //9600bps@11.0592MHz
Lcd1602_String(0,0,"Heart Rate: "); //从第11行第0列开始显示
Lcd1602_String(0,1," ---r/min");
while(1)
{
heart =Pulsesensor_Read(); //获取心率值
if(heart==0) //未检测到心率信号
{
Lcd1602_Write_Com(0xc0+8); //设定显示位置第二行 第13列
Lcd1602_Write_Data('-');
Lcd1602_Write_Data('-');
Lcd1602_Write_Data('-');
Lcd1602_Write_Data('r');
Lcd1602_Write_Data('/');
Lcd1602_Write_Data('m');
Lcd1602_Write_Data('i');
Lcd1602_Write_Data('n');
flag_beep = 0; //关报警标志位
}
else //检测到心率信号
{
Lcd1602_Write_Com(0xc0+8); //设定显示位置第二行 第13列
Lcd1602_Write_Data(heart/100+0X30);
Lcd1602_Write_Data(heart%100/10+0X30);
Lcd1602_Write_Data(heart%100%10+0X30);
Lcd1602_Write_Data('r');
Lcd1602_Write_Data('/');
Lcd1602_Write_Data('m');
Lcd1602_Write_Data('i');
Lcd1602_Write_Data('n');
if(heart>(Htup)
||heart<(Htdw)) //当前超过上下限
{
flag_beep = 1; //开报警标志 执行报警程序在定时器中断
}
else
{
flag_beep = 0; //关报警标志位
}
}
KEY_Set();
if(flag_timer==1) //1s到
{
flag_timer = 0; //清除标志位
if(heart==0) //未检测到心率信号 发送---\r\n
{
Uart_SendChar('T'); //发送到串口 通过蓝牙透传出去 字母T开头 可以自己定义
Uart_SendChar('-');
Uart_SendChar('-');
Uart_SendChar('-');
Uart_SendChar('\r');
Uart_SendChar('\n');
}
else //检测到心跳 发送 xxx\r\\n
{
Uart_SendChar('T'); //发送到串口 通过蓝牙透传出去 字母T开头 可以自己定义
Uart_SendChar(heart/100+0X30);
Uart_SendChar(heart%100/10+0X30);
Uart_SendChar(heart%100%10+0X30);
Uart_SendChar('\r');
Uart_SendChar('\n');
}
}
}
}
//定时器2中断服务函数 50ms
void tm2_isr() interrupt 5 using 1
{
static unsigned int cnt=0;
static unsigned int cnt1=0;
TF2 = 0;
cnt++;
cnt1++;
if(cnt1%8==0) //50ms*8 =400ms
{
cnt1 = 0;
if(flag_beep==1) //报警标志位打开
beep = ~ beep; //蜂鸣器控制脚取反 400ms取反一次 产生滴滴滴 响声 而不是一直长鸣
else
beep = 1; //高电平关闭报警
}
if(cnt%20==0) //50ms*20 =1000ms
{
cnt = 0;
flag_timer = 1; //1000ms到 赋值标志为1 1000ms赋一次 1000ms不是必须的 可以自己修改
}
}
软件免费下载地址:
1、Proteus仿真软件
文件内容:Proteus7.8安装包、Proteus8.6安装包、Proteus.8.10安装包、Proteus Professional 8.11 SP0安装包
链接:https://pan.baidu.com/s/11LNUZ9BJXWvXf1C4dPc3_w
提取码:2756
2、KEIL4 C51软件安装包
链接:https://pan.baidu.com/s/1CTZBqDsPsyIbjCIjI_birA
提取码:sy2a
文件下载:
链接:https://pan.baidu.com/s/1OWXRtBQYMKJ_2-jqFjfL4A?pwd=fhwk
提取码:fhwk