本设计由STC89C52单片机电路+LCD1602液晶显示电路+脉搏/心率传感器电路+LM393比较器模块电路+蓝牙模块电路+电源电路组成。
1、通过脉搏/心率传感器检测脉搏/心率。
2、将脉搏/心率实时显示在液晶上。
3、将脉搏/心率通过蓝牙模块上传到手机APP。
4、如果心率超过150,则设备向APP发送报警信息。
#include <reg52.h> //调用单片机头文件
#include <intrins.h>
#include "1602.h"
#include "delay.h"
unsigned char i_i=0,timecount=0,displayOK=0,rate=0,aa=0;//定义变量
unsigned int time[6]={0};
unsigned char tab_sk[16]="WO DE BI SHE "; //第一行显示
unsigned char tab_ht[16]="XL:000/min "; //第二行显示心率和温度
unsigned long time_50ms=0; //定时器变量
unsigned char sys_times=0;
void time_init(void); //函数定义
void init_int0(void);
void SendStr(unsigned char *s,unsigned char length);
void SendByte(unsigned char dat);
void UART_Init(void);
void main()
{
UART_Init();
time_init(); //初始化定时器
init_int0(); //外部中断0初始化程序
LCD_Init(); //初始化液晶
DelayMs(20); //延时有助于稳定
LCD_Clear(); //清屏
DelayMs(10);
LCD_Write_String(0,0,tab_sk); //初始化显示
LCD_Write_String(0,1,tab_ht); //初始化显示
while(1)
{
if(displayOK==0)//如果显示关 检测心率是否真实
{
rate = 0;
}
sys_times++;
DelayMs(50);
}
}
/*************定时器0初始化程序***************/
void time_init(void)
{
EA = 1; //开总中断
TMOD |= 0x01; //定时器0、定时器1工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
}
/***********外部中断0初始化程序****************/
void init_int0(void) //外部中断0初始化程序
{
EX0=1; //允许外部中断0中断
EA=1; //开总中断
IT0 = 1; //外部中断0负跳变中断
}
void int0() interrupt 0
{
EX0=0;//暂时关外部中断
if(timecount<8) //当连续两次检测时间间隔小于8*50ms=400ms不处理
{
TR0=1;//开定时器
}
else
{
time[i_i]=timecount*50+TH0*0.256+TL0/1000;//算出间隔时间
TL0 = 0x00; //设置定时初值
TH0 = 0x4C; //设置定时初值 // 50ms 11.0592
timecount=0;//50ms计数清零
i_i++;
if(i_i==6)//记录到超过等于6次时间
{
i_i=1;//计数从1开始
displayOK=1; //测得5次开始显示?
}
}
EX0=1;
}
/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{
TH0 = 0x3c;
TL0 = 0xb0; // 50ms 12M
timecount++;//每50ms一次计数
if(timecount>65) //当超过25*50ms=1.5s没有检测到信号停止显示
{
i_i=0;//数据个数清零
timecount=0;//50ms计数清零
displayOK=0;//显示关
TR0=0;//定时器关
TH0 = 0x3c;
TL0 = 0xb0; // 50ms 12M
}
}
void UART_Init(void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz
TL1 = TH1;
TR1 = 1; // TR1: timer 1 打开
EA = 1; //打开总中断
// ES = 1; //打开串口中断 ??
}
void SendByte(unsigned char dat)//串口发送单字节数据
{
unsigned char time_out;
time_out=0x00;
SBUF = dat; //将数据放入SBUF中
while((!TI)&&(time_out<100)) //检测是否发送出去
{time_out++;DelayUs2x(10);} //未发送出去 进行短暂延时
TI = 0; //清除ti标志
}
void SendStr(unsigned char *s,unsigned char length) //发送定长度字符串
{
unsigned char NUM;
NUM=0x00;
while(NUM<length) //发送长度对比
{
SendByte(*s); //放松单字节数据
s++; //指针++
NUM++; //下一个++
}
}
void UART_SER (void) interrupt 4 //串行中断服务程序
{
if(RI) //判断是接收中断产生
{
RI=0; //标志位清零
}
if(TI) //如果是发送标志位,清零
TI=0;
}
资料下载地址