单片机设计_心率血氧仪(STM32 TFT液晶屏)

news/2024/11/24 19:05:57/

想要更多项目私wo!!!

一、电路设计

        此电路有STM32最小系统板、TFT液晶屏、MAX30102传感器和蜂鸣器电路组成。

硬件资料

        MAX30102是一个集成的脉搏血氧仪和心率监测模块。它包括内部发光二极管,光电探测器,光学元件,以及低噪音的电子设备。MAX30102提供了一个完整的系统解决方案来简化移动和可穿戴设备的设计过程。

        MAX30102运行在一个1.8V电源和一个单独的5.0V电源的内部发光二极管。通信是通过一个标准的i2c兼容接口。该模块可以通过零备用电流的软件关闭,使电力轨道始终保持供电。

二、运行效果图

三、部分代码

/*--Include-start-------------------------------------------------------------*/
#include "MAX30100.h"
#include "IICcom.h"/*define ---------------------------------------------------------------------*/
#define max30100_WR_address 0xAE#define I2C_WR	0		/* д¿ØÖÆbit */
#define I2C_RD	1		/* ¶Á¿ØÖÆbit *//*Global data space ----------------------------------------------------------*/uint8_t max30100_Bus_Write(uint8_t Register_Address, uint8_t Word_Data)
{/* ²ÉÓô®ÐÐEEPROMËæ¼´¶ÁÈ¡Ö¸ÁîÐòÁУ¬Á¬Ðø¶ÁÈ¡Èô¸É×Ö½Ú *//* µÚ1²½£º·¢ÆðI2C×ÜÏßÆô¶¯ÐźŠ*/I2C_Start();/* µÚ2²½£º·¢Æð¿ØÖÆ×Ö½Ú£¬¸ß7bitÊǵØÖ·£¬bit0ÊǶÁд¿ØÖÆ룬0±íʾд£¬1±íʾ¶Á */I2C_SendByte(max30100_WR_address | I2C_WR);	/* ´Ë´¦ÊÇдָÁî *//* µÚ3²½£º·¢ËÍACK */if (I2C_WaitAck() != 0){goto cmd_fail;	/* EEPROMÆ÷¼þÎÞÓ¦´ð */}/* µÚ4²½£º·¢ËÍ×Ö½ÚµØÖ· */I2C_SendByte(Register_Address);if (I2C_WaitAck() != 0){goto cmd_fail;	/* EEPROMÆ÷¼þÎÞÓ¦´ð */}/* µÚ5²½£º¿ªÊ¼Ð´ÈëÊý¾Ý */I2C_SendByte(Word_Data);/* µÚ6²½£º·¢ËÍACK */if (I2C_WaitAck() != 0){goto cmd_fail;	/* EEPROMÆ÷¼þÎÞÓ¦´ð */}/* ·¢ËÍI2C×ÜÏßÍ£Ö¹ÐźŠ*/I2C_Stop();return 1;	/* Ö´Ðгɹ¦ */cmd_fail: /* ÃüÁîÖ´ÐÐʧ°Üºó£¬ÇмǷ¢ËÍÍ£Ö¹Ðźţ¬±ÜÃâÓ°ÏìI2C×ÜÏßÉÏÆäËûÉ豸 *//* ·¢ËÍI2C×ÜÏßÍ£Ö¹ÐźŠ*/I2C_Stop();return 0;
}uint8_t max30100_Bus_Read(uint8_t Register_Address)
{uint8_t  data;/* µÚ1²½£º·¢ÆðI2C×ÜÏßÆô¶¯ÐźŠ*/I2C_Start();/* µÚ2²½£º·¢Æð¿ØÖÆ×Ö½Ú£¬¸ß7bitÊǵØÖ·£¬bit0ÊǶÁд¿ØÖÆ룬0±íʾд£¬1±íʾ¶Á */I2C_SendByte(max30100_WR_address | I2C_WR);	/* ´Ë´¦ÊÇдָÁî *//* µÚ3²½£º·¢ËÍACK */if (I2C_WaitAck() != 0){goto cmd_fail;	/* EEPROMÆ÷¼þÎÞÓ¦´ð */}/* µÚ4²½£º·¢ËÍ×Ö½ÚµØÖ·£¬ */I2C_SendByte((uint8_t)Register_Address);if (I2C_WaitAck() != 0){goto cmd_fail;	/* EEPROMÆ÷¼þÎÞÓ¦´ð */}/* µÚ6²½£ºÖØÐÂÆô¶¯I2C×ÜÏß¡£ÏÂÃ濪ʼ¶ÁÈ¡Êý¾Ý */I2C_Start();/* µÚ7²½£º·¢Æð¿ØÖÆ×Ö½Ú£¬¸ß7bitÊǵØÖ·£¬bit0ÊǶÁд¿ØÖÆ룬0±íʾд£¬1±íʾ¶Á */I2C_SendByte(max30100_WR_address | I2C_RD);	/* ´Ë´¦ÊǶÁÖ¸Áî *//* µÚ8²½£º·¢ËÍACK */if (I2C_WaitAck() != 0){goto cmd_fail;	/* EEPROMÆ÷¼þÎÞÓ¦´ð */}/* µÚ9²½£º¶ÁÈ¡Êý¾Ý */{data = I2C_RadeByte();	/* ¶Á1¸ö×Ö½Ú */I2C_NoAck();	/* ×îºó1¸ö×Ö½Ú¶ÁÍêºó£¬CPU²úÉúNACKÐźÅ(Çý¶¯SDA = 1) */}/* ·¢ËÍI2C×ÜÏßÍ£Ö¹ÐźŠ*/I2C_Stop();return data;	/* Ö´Ðгɹ¦ ·µ»ØdataÖµ */cmd_fail: /* ÃüÁîÖ´ÐÐʧ°Üºó£¬ÇмǷ¢ËÍÍ£Ö¹Ðźţ¬±ÜÃâÓ°ÏìI2C×ÜÏßÉÏÆäËûÉ豸 *//* ·¢ËÍI2C×ÜÏßÍ£Ö¹ÐźŠ*/I2C_Stop();return 0;
}void max30100_FIFO_Read(uint8_t Register_Address,uint16_t  Word_Data[][2],uint8_t count)
{uint8_t i=0;uint8_t no = count;uint8_t data1, data2;/* µÚ1²½£º·¢ÆðI2C×ÜÏßÆô¶¯ÐźŠ*/I2C_Start();/* µÚ2²½£º·¢Æð¿ØÖÆ×Ö½Ú£¬¸ß7bitÊǵØÖ·£¬bit0ÊǶÁд¿ØÖÆ룬0±íʾд£¬1±íʾ¶Á */I2C_SendByte(max30100_WR_address | I2C_WR);	/* ´Ë´¦ÊÇдָÁî *//* µÚ3²½£º·¢ËÍACK */if (I2C_WaitAck() != 0){goto cmd_fail;	/* EEPROMÆ÷¼þÎÞÓ¦´ð */}/* µÚ4²½£º·¢ËÍ×Ö½ÚµØÖ·£¬ */I2C_SendByte((uint8_t)Register_Address);if (I2C_WaitAck() != 0){goto cmd_fail;	/* EEPROMÆ÷¼þÎÞÓ¦´ð */}/* µÚ6²½£ºÖØÐÂÆô¶¯I2C×ÜÏß¡£ÏÂÃ濪ʼ¶ÁÈ¡Êý¾Ý */I2C_Start();/* µÚ7²½£º·¢Æð¿ØÖÆ×Ö½Ú£¬¸ß7bitÊǵØÖ·£¬bit0ÊǶÁд¿ØÖÆ룬0±íʾд£¬1±íʾ¶Á */I2C_SendByte(max30100_WR_address | I2C_RD);	/* ´Ë´¦ÊǶÁÖ¸Áî *//* µÚ8²½£º·¢ËÍACK */if (I2C_WaitAck() != 0){goto cmd_fail;	/* EEPROMÆ÷¼þÎÞÓ¦´ð */}/* µÚ9²½£º¶ÁÈ¡Êý¾Ý */while (no){data1 = I2C_RadeByte();	I2C_Ack();data2 = I2C_RadeByte();I2C_Ack();Word_Data[i][0] = (((uint16_t)data1 << 8) | data2);  //data1 = I2C_RadeByte();	I2C_Ack();data2 = I2C_RadeByte();if(1==no)I2C_NoAck();	/* ×îºó1¸ö×Ö½Ú¶ÁÍêºó£¬CPU²úÉúNACKÐźÅ(Çý¶¯SDA = 1) */elseI2C_Ack();Word_Data[i][1] = (((uint16_t)data1 << 8) | data2); no--;	i++;}/* ·¢ËÍI2C×ÜÏßÍ£Ö¹ÐźŠ*/I2C_Stop();cmd_fail: /* ÃüÁîÖ´ÐÐʧ°Üºó£¬ÇмǷ¢ËÍÍ£Ö¹Ðźţ¬±ÜÃâÓ°ÏìI2C×ÜÏßÉÏÆäËûÉ豸 *//* ·¢ËÍI2C×ÜÏßÍ£Ö¹ÐźŠ*/I2C_Stop();
}void max30100_init(void)
{max30100_Bus_Write(0x06, 0x0b);  //mode configuration : temp_en[3]      MODE[2:0]=010 HR only enabled    011 SP02 enabled//max30100_Bus_Write(0x06, 0x0a);  //MODE[2:0]=010 HR only enabled     when used is mode ,the red led is not used.max30100_Bus_Write(0x01, 0xF0); //open all of interruptmax30100_Bus_Write(INTERRUPT_REG, 0x00); //all interrupt clearmax30100_Bus_Write(0x09, 0x33); //r_pa=3,ir_pa=3#if (SAMPLES_PER_SECOND == 50)max30100_Bus_Write(0x07, 0x43); //SPO2_SR[4:2]=000   50 per second    LED_PW[1:0]=11  16BITS
#elif (SAMPLES_PER_SECOND == 100)max30100_Bus_Write(0x07, 0x47); //SPO2_SR[4:2]=001  100 per second    LED_PW[1:0]=11  16BITS
#elif (SAMPLES_PER_SECOND == 200)max30100_Bus_Write(0x07, 0x4F); 
#elif (SAMPLES_PER_SECOND == 400)max30100_Bus_Write(0x07, 0x53); 
#endifmax30100_Bus_Write(0x02, 0x00); //set FIFO write Pointer reg = 0x00 for clear itmax30100_Bus_Write(0x03, 0x00);	//set Over Flow Counter  reg = 0x00 for clear itmax30100_Bus_Write(0x04, 0x0F);	//set FIFO Read Pointer  reg = 0x0f for   //waitting  write pointer eq read pointer   to   interrupts  INTERRUPT_REG_A_FULL
}

 


http://www.ppmy.cn/news/253822.html

相关文章

ECALL,BCALL,ICALL

eCall的基本原理可以描述为&#xff1a;在发生车祸的时候&#xff0c;车载系统自动拨打紧急呼救电话&#xff0c;同时通过语音通道将车祸相关信息发送到呼叫中心。 这里面有3个名词&#xff0c;看英文文档的时候经常会用到&#xff0c;翻译如下&#xff1a; 车载系统&#xff…

TCL和ELTCL?CDNEXT和CMRL?

2022年4月8日&#xff0c;一客户来电咨询在使用DSX2-8000选择测试标准的时候有“PoE”和“All”选项&#xff0c;不知和普通不带此符号的标准的区别在哪&#xff1f;不得不提的是&#xff0c;这和之前DTX系列&#xff0c;比如DTX-1800&#xff0c;测试结果区别所在了&#xff0…

TCL 基础

置换 TCL 解释器运用规则把命令分成一个个独立的单词&#xff0c;同时进行必要的置换。 TCL置换分为以下三类&#xff1a; 变量置换&#xff1a;$ TCL解释器会认为 $ 后面为变量名&#xff0c;将变量置换成它的值。 命令置换&#xff1a;[ ] [ ]内是一个独立的TCL语句 set a…

TCL编程练习

脚本还是得多练啊 1.用函数来实现对任意长度任意数列进行排序的功能&#xff0c;要求通过参数来选择从大到小排序&#xff0c;还是从小到大排序&#xff1b; 并将结果输出到一个文件里。例如&#xff0c;当输入2&#xff0c;9&#xff0c;4&#xff0c;3时&#xff0c;从大到小…

tcl编程练习1

1.用函数来实现对任意长度任意数列进行排序的功能&#xff0c;要求通过参数来选择从大到小排序&#xff0c;还是从小到大排序&#xff1b; 并将结果输出到一个文件里。例如&#xff0c;当输入2&#xff0c;9&#xff0c;4&#xff0c;3时&#xff0c;从大到小排序输出结果为&am…

初识Tcl(十):Tcl 过程

程序是什么&#xff0c;只不过代码块的一系列命令&#xff0c;提供了一个可重复使用的特定功能。它被用于避免相同的代码被重复在多个位置。程序相当于许多编程语言中使用的功能&#xff0c;并提供Tcl proc命令的帮助。 创建一个简单程序的语法如下所示。 proc procedureName…

Tcl语言学习

引言 Tcl 不是生产电视的那个公司的名字&#xff0c;是一种脚本语言。 Tcl 是一种脚本语言&#xff0c;具有简单的语法.和其它外壳语言&#xff08;c shell,ba shell&#xff09;有很多相似之处。 语法学习 关于Tcl的语法和tk工具的使用&#xff0c;我将《Tcl/Tk组合教程》上…

单片机stc89c52 lcd1602 9999秒倒计时 可按键控制

原料说明 keli4和KR-51单片机开发板和stc烧录工具 不多说&#xff0c;直接上代码。 #include "reg52.h" #define uchar unsigned char #define uint unsigned int sbit rsP2^0;//H数据&#xff0c;L命令 sbit lcdenP2^2;//高脉冲使能&#xff0c;使能脉宽最小150n…