目录
项目成品图片:

哔哩哔哩视频链接:
(资料分享见文末)
基于STM32的心率血氧手环(可报警)。功能如下:

- int main(void)
- {
- unsigned char i;
- DelayInit();
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
- I2C_Configuration(); //IIC初始化
- OLED_Init(); //OLED初始化
- KEY_Init(); //按键初始化
- DelayMs(200);
- CheckNewMcu();
- OLED_CLS();//清屏
- DS18B20_Init();
- DS1302_Init(&SysDate);
- DelayMs(100);
- for(i=0;i<8;i++)OLED_ShowCN(i*16,2,i+8,0);//测试显示中文:欢迎使用使能手环
- DelayMs(1000);
- OLED_CLS();//清屏
- DS1302_DateRead(&SysDate);//读时间
- OLED_CLS();//清屏
- for(i=0;i<2;i++)OLED_ShowCN(i*16,4,i+16,1);//测试显示中文:心率
- for(i=0;i<2;i++)OLED_ShowCN(i*16+48,4,i+18,1);//测试显示中文:血氧
- for(i=0;i<2;i++)OLED_ShowCN(i*16+95,4,i+20,1);//测试显示中文:步数
- OLED_ShowCentigrade(112, 2); //℃
- IIC_init();//IIC初始化
- uart1_Init(9600);
- adxl345_init();//ADXL345初始化
- Init_MAX30102();//MAX30102初始化
- TIM2_Init(99,719); //定时器初始化,定时1ms
- //Tout = ((arr+1)*(psc+1))/Tclk ;
- //Tclk:定时器输入频率(单位MHZ)
- //Tout:定时器溢出时间(单位us)
- while(1)
- {
- shanshuo=!shanshuo;
- KeySettings();
- DisplayTime();
- if(setn == 0)//不在设置状态下,读取相关数据
- {
- DisplayTemperature();
- GetSteps();
- GetHeartRateSpO2();
- if(fallTime==0)
- {
- if(displayfall==0)
- {
- displayfall=1;
- OLED_CLS();//清屏
- for(i=0;i<3;i++)OLED_ShowCN(i*16+48,2,i+64,0);//测试显示中文:跌倒
- UsartSendReceiveData();
- DelayMs(1000);DelayMs(1000);
- OLED_CLS();//清屏
- for(i=0;i<2;i++)OLED_ShowCN(i*16,4,i+16,1);//测试显示中文:心率
- for(i=0;i<2;i++)OLED_ShowCN(i*16+48,4,i+18,1);//测试显示中文:血氧
- for(i=0;i<2;i++)OLED_ShowCN(i*16+95,4,i+20,1);//测试显示中文:步数
- OLED_ShowCentigrade(112, 2); //℃
- }
- }
- }
- UsartSendReceiveData();
- DelayMs(10);
- }
- }
- void TIM2_IRQHandler(void)//定时器2中断服务程序,用于记录时间
- {
- static u16 timeCount1 = 0;
- static u16 timeCount3 = 0;
- if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
- {
- TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除中断标志位
- timeCount1 ++;
- if(timeCount1 >= 800)
- {
- timeCount1 = 0;
- sendFlag = 1;
- if(tiltFlag)
- {
- if(fallTime>0)fallTime--; //跌倒时间倒计时
- }
- }
- timeCount3 ++;
- if(timeCount3 >= 100)
- {
- timeCount3=0;
- if(fallTime==0){ //跌倒蜂鸣器报警
- BEEP=1;
- }
- else
- {
- if(((hrAvg!=0)&&(hrAvg>=xinlvMax||hrAvg<=xinlvMin))||((spo2Avg!=0)&&(spo2Avg<=spo2Min))||(temperature>=tempMax||temperature<=tempMin))//不在范围蜂鸣器报警
- {
- BEEP=~BEEP;
- beepFlag|=0x01;
- }else
- {
- beepFlag&=0xFE;
- BEEP=0;
- }
- }
- }
- }
- }