基于STM32单片机生理监控心率脉搏TFT彩屏波形曲线

1、系统功能介绍

本设计由STM32F103C8T6单片机核心板电路+心率传感器电路+报警电路+按键+TFT彩屏组成。

  • 1、TFT液晶实时显示心率值。
  • 2、TFT液晶实时显示采集到的的模拟信号的曲线图,直接显示心率变化曲线。
  • 3、通过按键可以设置心率报警阈值,按键有设置按键、设置+、设置-,在设置情况下可以对设置值进行加减。
  • 4、当前心率值超过设置阈值,蜂鸣器报警,同时显示心率值为红色;否则蜂鸣器不报警,心率值显示蓝色。

2、演示视频

3、系统框图

4、系统电路介绍

4.1、STM32单片机最小系统设计

  • STM32系列处理器是意法半导体ST公司生产的一种基于ARM 7架构的32位、支持实时仿真和跟踪的微控制器。选择此款控制芯片是因为本系统设计并非追求成本的最低或更小的功耗,而是在实现本设计功能的前提下能够提供更丰富的接口和功能以便于设计实验系统各实验项目所需的外围扩展电路。
  • STM32F103C8T6单片机核心板接口电路图如下图所示

4.2、按键电路设计

  • 按键的单片机控制引脚默认为高电平,当按键按下后,单片机的相关引脚则变成低电平。进而实现对系统的手动输入。注意,按键个数可变。其电路原理图如下图所示。
  • 电路原理图如下图所示:

4.3、蜂鸣器报警电路设计

  • 有源蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。
  • 按键电路设计如下图所示:

4.4、Pulsesensor脉搏心率传感器模块电路设计

  • 脉搏心率传感器是用来测试心跳速率的传感器,实质是一款集成了放大电路和噪声消除电路的光学心率传感器。可以通过此传感器开发出和心率有关的互动作品。传感器可以戴在手指或者耳垂上。光电传感器将脉搏信号转换为电信号,此装置需要把手指放在传感器表盘上,光电传感器,此传感器是集成了放大电路和噪声消除电路的光学心率传感器,光电传感器一侧的发光二极管发光,当脉搏跳动时,指尖或者耳垂的动脉血管血容量发生周期性变化,透过指尖的光强度同时发生变化。另一侧的光电三极管将接收到的红外光信号转化为电信号。

  • 电路原理图如下图所示:

  • 实物图

5、程序设计

5.1、LCD TFT屏幕初始化

void Lcd_Init(void)
{
  LCD_CS1 =1;
  if(LCD_CS1==0)
  {
    LCD_WR_REG_DATA(0,0);
    LCD_ShowString(0,0," ");
    LCD_ShowNum(0,0,0,0);
    LCD_Show2Num(0,0,0,0);
    LCD_DrawPoint_big(0,0);
    LCD_DrawRectangle(0,0,0,0);
    Draw_Circle(0,0,0);
  }
  LCD_RES=0;
  delay_ms(20);
  LCD_RES=1;
  delay_ms(20);
  LCD_CS1 =0;  //打开片选使能

  //************* Start Initial Sequence **********// 
  LCD_WR_REG(0xCF);  
  LCD_WR_DATA8(0x00); 
  LCD_WR_DATA8(0xD9); 
  LCD_WR_DATA8(0X30); 

  LCD_WR_REG(0xED);  
  LCD_WR_DATA8(0x64); 
  LCD_WR_DATA8(0x03); 
  LCD_WR_DATA8(0X12); 
  LCD_WR_DATA8(0X81); 

  LCD_WR_REG(0xE8);  
  LCD_WR_DATA8(0x85); 
  LCD_WR_DATA8(0x10); 
  LCD_WR_DATA8(0x78); 

  LCD_WR_REG(0xCB);  
  LCD_WR_DATA8(0x39); 
  LCD_WR_DATA8(0x2C); 
  LCD_WR_DATA8(0x00); 
  LCD_WR_DATA8(0x34); 
  LCD_WR_DATA8(0x02); 

  LCD_WR_REG(0xF7);  
  LCD_WR_DATA8(0x20); 

  LCD_WR_REG(0xEA);  
  LCD_WR_DATA8(0x00); 
  LCD_WR_DATA8(0x00); 

  LCD_WR_REG(0xC0);    //Power control 
  LCD_WR_DATA8(0x21);   //VRH[5:0] 

  LCD_WR_REG(0xC1);    //Power control 
  LCD_WR_DATA8(0x12);   //SAP[2:0];BT[3:0] 

  LCD_WR_REG(0xC5);    //VCM control 
  LCD_WR_DATA8(0x32); 
  LCD_WR_DATA8(0x3C); 

  LCD_WR_REG(0xC7);    //VCM control2 
  LCD_WR_DATA8(0XC1); 

  LCD_WR_REG(0x36);    // Memory Access Control 
  LCD_WR_DATA8(0x08); 

  LCD_WR_REG(0x3A);   
  LCD_WR_DATA8(0x55); 

  LCD_WR_REG(0xB1);   
  LCD_WR_DATA8(0x00);   
  LCD_WR_DATA8(0x18); 

  LCD_WR_REG(0xB6);    // Display Function Control 
  LCD_WR_DATA8(0x0A); 
  LCD_WR_DATA8(0xA2); 



  LCD_WR_REG(0xF2);    // 3Gamma Function Disable 
  LCD_WR_DATA8(0x00); 

  LCD_WR_REG(0x26);    //Gamma curve selected 
  LCD_WR_DATA8(0x01); 

  LCD_WR_REG(0xE0);    //Set Gamma 
  LCD_WR_DATA8(0x0F); 
  LCD_WR_DATA8(0x20); 
  LCD_WR_DATA8(0x1E); 
  LCD_WR_DATA8(0x09); 
  LCD_WR_DATA8(0x12); 
  LCD_WR_DATA8(0x0B); 
  LCD_WR_DATA8(0x50); 
  LCD_WR_DATA8(0XBA); 
  LCD_WR_DATA8(0x44); 
  LCD_WR_DATA8(0x09); 
  LCD_WR_DATA8(0x14); 
  LCD_WR_DATA8(0x05); 
  LCD_WR_DATA8(0x23); 
  LCD_WR_DATA8(0x21); 
  LCD_WR_DATA8(0x00); 

  LCD_WR_REG(0XE1);    //Set Gamma 
  LCD_WR_DATA8(0x00); 
  LCD_WR_DATA8(0x19); 
  LCD_WR_DATA8(0x19); 
  LCD_WR_DATA8(0x00); 
  LCD_WR_DATA8(0x12); 
  LCD_WR_DATA8(0x07); 
  LCD_WR_DATA8(0x2D); 
  LCD_WR_DATA8(0x28); 
  LCD_WR_DATA8(0x3F); 
  LCD_WR_DATA8(0x02); 
  LCD_WR_DATA8(0x0A); 
  LCD_WR_DATA8(0x08); 
  LCD_WR_DATA8(0x25); 
  LCD_WR_DATA8(0x2D); 
  LCD_WR_DATA8(0x0F); 

  LCD_WR_REG(0x11);    //Exit Sleep 
  delay_ms(120); 
  LCD_WR_REG(0x29);    //Display on 
 
} 

5.2、TFT屏幕显示字符串

void LCD_ShowString(u16 x,u16 y,const u8 *p)
{         
    while(*p!='\0')
    {       
        if(x>LCD_W-16){x=0;y+=16;}
        if(y>LCD_H-16){y=x=0;LCD_Clear(RED);}
        LCD_ShowChar(x,y,*p,0);
        x+=8;
        p++;
    }  
}

5.3、计算心率

void EXTI0_IRQHandler(void)
{
  if(xinLater>60)   //滤波防止抖动300ms
  {
    if(xinLater>400)		//滤波滤掉手指未放情况
    {
      xinLater =0;		//此时心率为0
    }
    else
    {
      xlTab[count++]=xinLater;//记录前后两次事件间隔 
      xinLater=0;
      if(count>=4)		//记录超过4次进行滤波处理
      {
        xinLv =60000/((xlTab[0]+xlTab[1]+xlTab[2]+xlTab[3])/4*5);//60000单位ms 表示60s /4求平均  *5每次定时5ms
        count=0;		//清除本次记录
      }   
      xinLater =0;	//延时清零
    }
  }
	
	EXTI_ClearITPendingBit(EXTI_Line0);  //清除EXTI0线路挂起位
}

6、资料下载

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-23 00:00:04       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-23 00:00:04       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-23 00:00:04       45 阅读
  4. Python语言-面向对象

    2024-07-23 00:00:04       55 阅读

热门阅读

  1. Apache虚拟主机VirtualHost配置项详解

    2024-07-23 00:00:04       15 阅读
  2. Discord机器人与Webhooks:构建实时交互

    2024-07-23 00:00:04       15 阅读
  3. 防火墙的经典体系结构及其具体结构

    2024-07-23 00:00:04       12 阅读
  4. ArcGIS Pro SDK (九)几何 8 线段

    2024-07-23 00:00:04       15 阅读
  5. 数据库之字符集

    2024-07-23 00:00:04       10 阅读
  6. WHAT - React Context 两层组件的优化机制

    2024-07-23 00:00:04       16 阅读
  7. Codeforces 923 div3 A-G

    2024-07-23 00:00:04       8 阅读