文章目录
- 一、功能简介
- 二、软件设计
- 三、实验现象
- 联系作者
一、功能简介
系统运行后,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设计,视频分享,技术交流。