文章目录
- 一、功能简介
- 二、软件设计
- 三、实验现象
- 联系作者
一、功能简介
系统运行后,LCD1604液晶显示心率、血氧、血压和体温,及其阈值;可通过K3键进入阈值设置模式,K1和K2加减调节,K4确定;当检测心率、血氧、血压和体温任意超限则蜂鸣器报警;
同时系统会将数据通过蓝牙传输出去;
二、软件设计
/*
作者:嗨小易(QQ:3443792007)
*/
//系统数据获取
void sys_data_get(void)
{
static u8 i=0;
while(1)
{
i++;
//间隔采集温度
if(i%5==0)
{
sys_ctrl.temp=DS18B20_GetTemperture()*10;//放大10倍,保留小数点后1位
}
//获取血氧
sys_ctrl.oxy=pcf8591_read_adcvalue(0);
sys_ctrl.oxy=pcf8591_read_adcvalue(0);
sys_ctrl.oxy=cal_map(sys_ctrl.oxy,0,255,0,150);
//获取高低压
sys_ctrl.xy_hval=pcf8591_read_adcvalue(1);
sys_ctrl.xy_hval=pcf8591_read_adcvalue(1);
sys_ctrl.xy_lval=pcf8591_read_adcvalue(2);
sys_ctrl.xy_lval=pcf8591_read_adcvalue(2);
break;
}
}
//系统数据显示
void sys_data_show(void)
{
u8 buf[5];
static u8 i=0;
while(1)
{
//正常模式
if(sys_ctrl.mode==0)
{
//温度显示
buf[0]=sys_ctrl.temp/100+0x30;
buf[1]=sys_ctrl.temp%100/10+0x30;
buf[2]='.';
buf[3]=sys_ctrl.temp%100%10+0x30;
buf[4]='\0';
lcd1604_show_string(3,0,buf);
//心率显示
if(sys_ctrl.sta==1)
{
sys_ctrl.sta=0;
sys_ctrl.cnt=0;
lcd1604_show_nums(3,1,sys_ctrl.heart,3,0);
EXTI_Sta(1);//打开计数
}
//血氧显示
lcd1604_show_nums(3,2,sys_ctrl.oxy,3,0);
//血压低显示
lcd1604_show_nums(4,3,sys_ctrl.xy_lval,3,0);
//血压高显示
lcd1604_show_nums(13,3,sys_ctrl.xy_hval,3,0);
//温度阈值显示
buf[0]=sys_ctrl.temph/100+0x30;
buf[1]=sys_ctrl.temph%100/10+0x30;
buf[2]='.';
buf[3]=sys_ctrl.temph%100%10+0x30;
buf[4]='\0';
lcd1604_show_string(11,0,buf);
//心率阈值显示
lcd1604_show_nums(9,1,sys_ctrl.heartl,3,0);
lcd1604_show_nums(13,1,sys_ctrl.hearth,3,0);
//血氧阈值显示
lcd1604_show_nums(9,2,sys_ctrl.oxyl,3,0);
lcd1604_show_nums(13,2,sys_ctrl.oxyh,3,0);
//蓝牙传输数据
i++;
if(i%4==0)
{
printf("\r\n体温:");
buf[0]=sys_ctrl.temp/100+0x30;
buf[1]=sys_ctrl.temp%100/10+0x30;
buf[2]='.';
buf[3]=sys_ctrl.temp%100%10+0x30;
buf[4]='\0';
UART_SendString(buf);
printf("\r\n");
printf("心率:%d\r\n",sys_ctrl.heart);
printf("血氧:%d\r\n",sys_ctrl.oxy);
printf("血压低:%d\r\n",sys_ctrl.xy_lval);
printf("血压高:%d\r\n",sys_ctrl.xy_hval);
}
}
//设置阈值下,数字闪烁提示
switch(sys_ctrl.mode)
{
case 1://温度阈值
lcd1604_show_string(11,0," ");
delay_ms(50);
buf[0]=sys_ctrl.temph/100+0x30;
buf[1]=sys_ctrl.temph%100/10+0x30;
buf[2]='.';
buf[3]=sys_ctrl.temph%100%10+0x30;
buf[4]='\0';
lcd1604_show_string(11,0,buf);
break;
case 2://心率下限
lcd1604_show_string(9,1," ");
delay_ms(50);
lcd1604_show_nums(9,1,sys_ctrl.heartl,3,0);
break;
case 3://心率上限
lcd1604_show_string(13,1," ");
delay_ms(50);
lcd1604_show_nums(13,1,sys_ctrl.hearth,3,0);
break;
case 4://血氧下限
lcd1604_show_string(9,2," ");
delay_ms(50);
lcd1604_show_nums(9,2,sys_ctrl.oxyl,3,0);
break;
case 5://血氧上限
lcd1604_show_string(13,2," ");
delay_ms(50);
lcd1604_show_nums(13,2,sys_ctrl.oxyh,3,0);
break;
}
break;
}
}
//系统功能控制
void sys_fun_ctrl(void)
{
//正常模式
if(sys_ctrl.mode==0)
{
//如果温度、血氧、心率、血压超限,蜂鸣器报警
if(sys_ctrl.temp>sys_ctrl.temph ||
sys_ctrl.heart>sys_ctrl.hearth || sys_ctrl.heart<sys_ctrl.heartl
|| sys_ctrl.oxy>sys_ctrl.oxyh || sys_ctrl.oxy<sys_ctrl.oxyl
|| sys_ctrl.xy_hval>XY_HVAL1 || sys_ctrl.xy_hval<XY_HVAL2
|| sys_ctrl.xy_lval>XY_LVAL1 || sys_ctrl.xy_lval<XY_LVAL2)
{
beep_alarm(2,2000);
}
}
}
//应用控制系统
void appdemo_show(void)
{
u8 i=10;
sys_parm_init();//系统参数初始化
KEY_Init();
BEEP_Init();
pcf8591_init();
My_EXTI_Init();
TIM2_Init(100,800-1);
USART1_Init(9600);
//等待数据稳定
while(i--)
{
//读取温值
sys_ctrl.temp=DS18B20_GetTemperture()*10;
delay_ms(100);
}
lcd1604_init();//LCD1604初始化
sys_open_show();//系统初始界面显示
EXTI_Sta(1);//打开计数
while(1)
{
sys_data_set();//系统数据设置
sys_data_get();//系统数据获取
sys_data_show();//系统数据显示
sys_fun_ctrl();//系统功能控制
}
}
//定时器2中断
void TIM2_IRQHandler(void)
{
static u8 i=0;
if(TIM_GetITStatus(TIM2,TIM_IT_Update))
{
i++;
if(i>=100)//间隔1S
{
i=0;
EXTI_Sta(0);//关闭计数
TIM_Cmd(TIM2,DISABLE);//关闭定时器
sys_ctrl.sta=1;
sys_ctrl.heart=sys_ctrl.cnt;
}
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
//外部中断函数
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line14)==1)
{
if(sys_ctrl.cnt==0)TIM_Cmd(TIM2,ENABLE);//打开定时器
sys_ctrl.cnt++;
}
EXTI_ClearITPendingBit(EXTI_Line14);
}
三、实验现象
B站演示视频:https://space.bilibili.com/444388619
联系作者
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。