wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 58488|回復(fù): 113
收起左側(cè)

max30100血氧心率制作stm32源碼 OLED顯示

  [復(fù)制鏈接]
ID:244405 發(fā)表于 2017-10-31 12:09 | 顯示全部樓層 |閱讀模式
使用模擬iic_MAX30100,簡易血氧心率制作,可用正電原子mini板,OLED顯示。整套資料提供給大家學(xué)習(xí)。主函數(shù)部分代碼
0.png

50Hz每采集一次數(shù)據(jù)集時間0.02s,共采集800次,用時16s
脈搏每跳動一次對應(yīng)一個波形的峰值,上圖共有20處峰值
計算(20/16)*60=75,可知心跳為每分鐘75次

50Hz采集心率數(shù)據(jù):
0.png

血氧檢測數(shù)據(jù)處理:
0.png

stm32單片機源程序如下:
  1. #include "stm32f10x.h"
  2. #include "usart.h"
  3. #include "ultrasonic.h"
  4. #include "stm32f10x_gpio.h"
  5. #include "stm32f10x_i2c.h"
  6. #include "delay.h"        //延時函數(shù) 1
  7. #include "delayl.h"        //延時函數(shù) 2
  8. #include <stdio.h>
  9. #include <math.h>
  10. #include "bsp_i2c_gpio.h"
  11. #include "oled.h"

  12. #define SAMPLE_50   //如果定義此宏就是50采樣率   否則是100


  13. /*************************************************
  14. 函數(shù): fputc(int ch, FILE *f)
  15. 功能: 重定向c庫函數(shù)printf到USART1
  16. 參數(shù): 無
  17. 返回: 無
  18. **************************************************/
  19. int fputc(int ch, FILE *f)
  20. {
  21.         USART_SendData(USART1, (unsigned char) ch);
  22.         while (!(USART1->SR & USART_FLAG_TXE));
  23.         return (ch);
  24. }


  25. #define USR_I2C_USED I2C1

  26. void I2C1_Configuration(void)
  27. {
  28.         I2C_InitTypeDef  I2C_InitStructure;
  29.         GPIO_InitTypeDef  GPIO_InitStructure;

  30.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
  31.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  32.    

  33.         /* PB6,7 SCL and SDA */
  34.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  36.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  38.         
  39.     I2C_DeInit(I2C1);
  40.     I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  41.     I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  42.     I2C_InitStructure.I2C_OwnAddress1 = 0x30;
  43.     I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  44.     I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  45.     I2C_InitStructure.I2C_ClockSpeed = 100000;//100K速度
  46.    
  47.         I2C_Cmd(I2C1, ENABLE);
  48.         I2C_Init(I2C1, &I2C_InitStructure);
  49.         /*允許1字節(jié)1應(yīng)答模式*/
  50.         I2C_AcknowledgeConfig(I2C1, ENABLE);

  51.     printf("I2C1_Configuration----\n\r");
  52. }

  53. void I2C2_Configuration(void)
  54. {
  55.         I2C_InitTypeDef  I2C_InitStructure;
  56.         GPIO_InitTypeDef  GPIO_InitStructure;

  57.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
  58.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  59.    

  60.         /* PB10,11 SCL and SDA */
  61.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10 | GPIO_Pin_11;
  62.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  63.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
  64.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  65.         
  66.     I2C_DeInit(I2C2);
  67.     I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  68.     I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  69.     I2C_InitStructure.I2C_OwnAddress1 = 0x30;
  70.     I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  71.     I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  72.     I2C_InitStructure.I2C_ClockSpeed = 100000;//100K速度
  73.    
  74.         I2C_Cmd(I2C2, ENABLE);
  75.         I2C_Init(I2C2, &I2C_InitStructure);
  76.         /*允許1字節(jié)1應(yīng)答模式*/
  77.         I2C_AcknowledgeConfig(I2C2, ENABLE);

  78.     printf("I2C2_Configuration----\n\r");
  79. }

  80. void I2C1_GPIO_Config(void)
  81. {

  82.         GPIO_InitTypeDef GPIO_InitStructure; //GPIO結(jié)構(gòu)體定義
  83.         
  84.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能I2C的IO口

  85.                 /* 使能與 I2C1 有關(guān)的時鐘 */
  86.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
  87.         
  88.         /* PB6-I2C1_SCL、PB7-I2C1_SDA*/
  89.         
  90.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;

  91.         
  92.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  93.         
  94.         //PIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; // 開漏輸出
  95.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  96.         
  97.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化結(jié)構(gòu)體配置

  98. }

  99. /* I2C 工作模式配置 */

  100. void I2C1_Mode_config(void)
  101. {
  102.                 /*定義I2C結(jié)構(gòu)體*/
  103.         I2C_InitTypeDef  I2C_InitStructure;



  104.                
  105.         /*配置為I2C模式*/
  106.         I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  107.         
  108.         /*該參數(shù)只有在I2C 工作在快速模式(時鐘工作頻率高于 100KHz)下才有意義。*/
  109.         I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  110.         
  111.         /*設(shè)置第一個設(shè)備自身地址*/
  112.         I2C_InitStructure.I2C_OwnAddress1 =0x30;
  113.         
  114.         /*使能應(yīng)答*/
  115.         I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;
  116.         
  117.         /*AT24C02地址為7位所以設(shè)置7位就行了*/
  118.         I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; /*時鐘速率,以HZ為單位的,最高為400khz*/
  119.         
  120.         I2C_InitStructure.I2C_ClockSpeed = 20000;

  121.         /* 使能 I2C1 */
  122.         I2C_Cmd(I2C1, ENABLE);
  123.         
  124.         /* I2C1 初始化 */
  125.         I2C_Init(I2C1, &I2C_InitStructure);
  126.         
  127.         
  128. }

  129. void I2C2_GPIO_Config(void)
  130. {

  131.         GPIO_InitTypeDef GPIO_InitStructure; //GPIO結(jié)構(gòu)體定義
  132.         
  133.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能I2C的IO口

  134.                 /* 使能與 I2C1 有關(guān)的時鐘 */
  135.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
  136.         
  137.         /* PB10-I2C2_SCL、PB11-I2C2_SDA*/
  138.         
  139.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;

  140.         
  141.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  142.         
  143.         //PIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; // 開漏輸出
  144.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  145.         
  146.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化結(jié)構(gòu)體配置

  147. }

  148. /* I2C 工作模式配置 */

  149. void I2C2_Mode_config(void)
  150. {
  151.                 /*定義I2C結(jié)構(gòu)體*/
  152.         I2C_InitTypeDef  I2C_InitStructure;

  153.         /*配置為I2C模式*/
  154.         I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  155.         
  156.         /*該參數(shù)只有在I2C 工作在快速模式(時鐘工作頻率高于 100KHz)下才有意義。*/
  157.         I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  158.         
  159.         /*設(shè)置第一個設(shè)備自身地址*/
  160.         I2C_InitStructure.I2C_OwnAddress1 =0x30;
  161.         
  162.         /*使能應(yīng)答*/
  163.         I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;
  164.         
  165.         /*AT24C02地址為7位所以設(shè)置7位就行了*/
  166.         I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; /*時鐘速率,以HZ為單位的,最高為400khz*/
  167.         
  168.         I2C_InitStructure.I2C_ClockSpeed = 100000;

  169.         /* 使能 I2C1 */
  170.         I2C_Cmd(I2C2, ENABLE);
  171.         
  172.         /* I2C1 初始化 */
  173.         I2C_Init(I2C2, &I2C_InitStructure);
  174.         
  175.         
  176. }


  177. /*************************************************
  178. 函數(shù): void main_init(void)
  179. 功能: main初始化
  180. 參數(shù): 無
  181. 返回: 無
  182. **************************************************/
  183. void main_init(void)
  184. {
  185.         Usart_Init();
  186.         //I2C1_GPIO_Config();
  187.         //I2C1_Mode_config();
  188.         //I2C1_Configuration();
  189.         bsp_InitI2C();
  190.         delay_init(72);            //延時初始化
  191. }

  192. extern void test_max30100_fun(void);
  193. extern u8 max10300_Bus_Read(u8 Register_Address);
  194. extern void max10300_init(void);

  195. /*************************************************
  196. 函數(shù): int main(void)
  197. 功能: main主函數(shù)
  198. 參數(shù): 無
  199. 返回: 無
  200. **************************************************/
  201. int main(void)
  202. {
  203.         u8 temp_num=0;
  204.          
  205.         main_init();
  206.         
  207.         max10300_init();
  208.         printf("\r\n stm32 init runing \r\n");
  209.         
  210.         delayl_init();                     //延時函數(shù)初始化         
  211.          
  212.         OLED_Init();                        //初始化OLED     

  213.         OLED_ShowString(0,0, "SpO2:",16);  
  214.                   
  215.         OLED_ShowString(0,30,"Heart Rate:",16);  
  216.                   
  217.         OLED_Refresh_Gram();//更新顯示到OLED
  218.         
  219.         
  220.         
  221.         
  222.         
  223.         /*
  224. while(1)
  225. {
  226.         delay_ms(1000);            
  227.         max10300_init();
  228.         temp_num = max10300_Bus_Read(0x16);
  229.         printf("當(dāng)前溫度 = %d\r\n",temp_num);
  230. }*/
  231.         while(1)
  232.         {        
  233.                 test_max30100_fun();
  234.                
  235.                
  236.                         
  237.                
  238.                
  239.                
  240.         }
  241. }




  242. #define max10300_WR_address 0xAE

  243. u8 max10300_Bus_Write(u8 Register_Address, u8 Word_Data)
  244. {

  245.         /* 采用串行EEPROM隨即讀取指令序列,連續(xù)讀取若干字節(jié) */

  246.         /* 第1步:發(fā)起I2C總線啟動信號 */
  247.         i2c_Start();

  248.         /* 第2步:發(fā)起控制字節(jié),高7bit是地址,bit0是讀寫控制位,0表示寫,1表示讀 */
  249.         i2c_SendByte(max10300_WR_address | I2C_WR);        /* 此處是寫指令 */

  250.         /* 第3步:發(fā)送ACK */
  251.         if (i2c_WaitAck() != 0)
  252.         {
  253.                 goto cmd_fail;        /* EEPROM器件無應(yīng)答 */
  254.         }

  255.         /* 第4步:發(fā)送字節(jié)地址 */
  256.         i2c_SendByte(Register_Address);
  257.         if (i2c_WaitAck() != 0)
  258.         {
  259.                 goto cmd_fail;        /* EEPROM器件無應(yīng)答 */
  260.         }
  261.         
  262.         /* 第5步:開始寫入數(shù)據(jù) */
  263.         i2c_SendByte(Word_Data);

  264.         /* 第6步:發(fā)送ACK */
  265.         if (i2c_WaitAck() != 0)
  266.         {
  267.                 goto cmd_fail;        /* EEPROM器件無應(yīng)答 */
  268.         }

  269.         /* 發(fā)送I2C總線停止信號 */
  270.         i2c_Stop();
  271.         return 1;        /* 執(zhí)行成功 */

  272. cmd_fail: /* 命令執(zhí)行失敗后,切記發(fā)送停止信號,避免影響I2C總線上其他設(shè)備 */
  273.         /* 發(fā)送I2C總線停止信號 */
  274.         i2c_Stop();
  275.         return 0;
  276. }



  277. u8 max10300_Bus_Read(u8 Register_Address)
  278. {
  279.         u8  data;


  280.         /* 第1步:發(fā)起I2C總線啟動信號 */
  281.         i2c_Start();

  282.         /* 第2步:發(fā)起控制字節(jié),高7bit是地址,bit0是讀寫控制位,0表示寫,1表示讀 */
  283.         i2c_SendByte(max10300_WR_address | I2C_WR);        /* 此處是寫指令 */

  284.         /* 第3步:發(fā)送ACK */
  285.         if (i2c_WaitAck() != 0)
  286.         {
  287.                 goto cmd_fail;        /* EEPROM器件無應(yīng)答 */
  288.         }

  289.         /* 第4步:發(fā)送字節(jié)地址, */
  290.         i2c_SendByte((uint8_t)Register_Address);
  291.         if (i2c_WaitAck() != 0)
  292.         {
  293.                 goto cmd_fail;        /* EEPROM器件無應(yīng)答 */
  294.         }
  295.         

  296.         /* 第6步:重新啟動I2C總線。下面開始讀取數(shù)據(jù) */
  297.         i2c_Start();

  298.         /* 第7步:發(fā)起控制字節(jié),高7bit是地址,bit0是讀寫控制位,0表示寫,1表示讀 */
  299.         i2c_SendByte(max10300_WR_address | I2C_RD);        /* 此處是讀指令 */

  300.         /* 第8步:發(fā)送ACK */
  301.         if (i2c_WaitAck() != 0)
  302.         {
  303.                 goto cmd_fail;        /* EEPROM器件無應(yīng)答 */
  304.         }

  305.         /* 第9步:讀取數(shù)據(jù) */
  306.         {
  307.                 data = i2c_ReadByte();        /* 讀1個字節(jié) */

  308.                 i2c_NAck();        /* 最后1個字節(jié)讀完后,CPU產(chǎn)生NACK信號(驅(qū)動SDA = 1) */
  309.         }
  310.         /* 發(fā)送I2C總線停止信號 */
  311.         i2c_Stop();
  312.         return data;        /* 執(zhí)行成功 返回data值 */

  313. cmd_fail: /* 命令執(zhí)行失敗后,切記發(fā)送停止信號,避免影響I2C總線上其他設(shè)備 */
  314.         /* 發(fā)送I2C總線停止信號 */
  315.         i2c_Stop();
  316.         return 0;
  317. }

  318. static void i2c_Delay(void)
  319. {
  320.         uint8_t i;

  321.         /* 
  322.                 CPU主頻168MHz時,在內(nèi)部Flash運行, MDK工程不優(yōu)化。用臺式示波器觀測波形。
  323.                 循環(huán)次數(shù)為5時,SCL頻率 = 1.78MHz (讀耗時: 92ms, 讀寫正常,但是用示波器探頭碰上就讀寫失敗。時序接近臨界)
  324.                 循環(huán)次數(shù)為10時,SCL頻率 = 1.1MHz (讀耗時: 138ms, 讀速度: 118724B/s)
  325.                 循環(huán)次數(shù)為30時,SCL頻率 = 440KHz, SCL高電平時間1.0us,SCL低電平時間1.2us

  326.                 上拉電阻選擇2.2K歐時,SCL上升沿時間約0.5us,如果選4.7K歐,則上升沿約1us

  327.                 實際應(yīng)用選擇400KHz左右的速率即可
  328.         */
  329.         for (i = 0; i < 30; i++);
  330. }
  331. #if 1
  332. void max10300_FIFO_Read(u8 Register_Address,u16  Word_Data[][2],u8 count)
  333. {
  334.         u8 i=0;
  335.         u8 no = count;
  336.         u8 data1, data2;
  337.         /* 第1步:發(fā)起I2C總線啟動信號 */
  338.         i2c_Start();

  339.         /* 第2步:發(fā)起控制字節(jié),高7bit是地址,bit0是讀寫控制位,0表示寫,1表示讀 */
  340.         i2c_SendByte(max10300_WR_address | I2C_WR);        /* 此處是寫指令 */

  341.         /* 第3步:發(fā)送ACK */
  342.         if (i2c_WaitAck() != 0)
  343.         {
  344.                 goto cmd_fail;        /* EEPROM器件無應(yīng)答 */
  345.         }

  346.         /* 第4步:發(fā)送字節(jié)地址, */
  347.         i2c_SendByte((uint8_t)Register_Address);
  348.         if (i2c_WaitAck() != 0)
  349.         {
  350.                 goto cmd_fail;        /* EEPROM器件無應(yīng)答 */
  351.         }
  352.         

  353.         /* 第6步:重新啟動I2C總線。下面開始讀取數(shù)據(jù) */
  354.         i2c_Start();

  355.         /* 第7步:發(fā)起控制字節(jié),高7bit是地址,bit0是讀寫控制位,0表示寫,1表示讀 */
  356.         i2c_SendByte(max10300_WR_address | I2C_RD);        /* 此處是讀指令 */

  357.         /* 第8步:發(fā)送ACK */
  358.         if (i2c_WaitAck() != 0)
  359.         {
  360.                 goto cmd_fail;        /* EEPROM器件無應(yīng)答 */
  361.         }

  362.         /* 第9步:讀取數(shù)據(jù) */
  363.         while (no)
  364.         {
  365.                 data1 = i2c_ReadByte();        
  366.                 i2c_Ack();
  367.                 data2 = i2c_ReadByte();
  368.                 i2c_Ack();
  369.                 Word_Data[i][0] = (((u16)data1 << 8) | data2);  //

  370.                
  371.                 data1 = i2c_ReadByte();        
  372.                 i2c_Ack();
  373.                 data2 = i2c_ReadByte();
  374.                 if(1==no)
  375.                         i2c_NAck();        /* 最后1個字節(jié)讀完后,CPU產(chǎn)生NACK信號(驅(qū)動SDA = 1) */
  376.                 else
  377.                         i2c_Ack();
  378.                 Word_Data[i][1] = (((u16)data1 << 8) | data2);

  379.                 no--;        
  380.                 i++;
  381.         }
  382.         /* 發(fā)送I2C總線停止信號 */
  383.         i2c_Stop();

  384. cmd_fail: /* 命令執(zhí)行失敗后,切記發(fā)送停止信號,避免影響I2C總線上其他設(shè)備 */
  385.         /* 發(fā)送I2C總線停止信號 */
  386.         i2c_Stop();
  387. }
  388. #else

  389. void max10300_FIFO_Read(u8 Register_Address,u16  Word_Data[][2],u8 count)
  390. {
  391.         u8 i=0;
  392.         u8 no = count;
  393.         u8 data1, data2;
  394.         

  395.         while(I2C_GetFlagStatus(USR_I2C_USED, I2C_FLAG_BUSY))
  396.                 ; //調(diào)用庫函數(shù)檢測I2C器件是否處于BUSY狀態(tài)
  397.                

  398.         I2C_AcknowledgeConfig(USR_I2C_USED, ENABLE);   /*允許1字節(jié)1應(yīng)答模式*/


  399.         I2C_GenerateSTART(USR_I2C_USED, ENABLE);
  400.          while(!I2C_CheckEvent(USR_I2C_USED, I2C_EVENT_MASTER_MODE_SELECT))
  401.                  ; //清除EV5
  402.         
  403.         I2C_Send7bitAddress(USR_I2C_USED, max10300_WR_address, I2C_Direction_Transmitter);
  404.         while(!I2C_CheckEvent(USR_I2C_USED,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
  405.                 ; //ADDR=1,清除EV6
  406.                
  407.         I2C_SendData(USR_I2C_USED, Register_Address);
  408.          while(! I2C_CheckEvent(USR_I2C_USED, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
  409.                  ;//移位寄存器非空,數(shù)據(jù)寄存器已經(jīng)空,產(chǎn)生EV8,發(fā)送數(shù)據(jù)到DR既可清除該事件

  410.         I2C_GenerateSTART(USR_I2C_USED, ENABLE);
  411.          while(!I2C_CheckEvent(USR_I2C_USED, I2C_EVENT_MASTER_MODE_SELECT))
  412.                  ; //清除EV5
  413.         
  414.         I2C_Send7bitAddress(USR_I2C_USED, max10300_WR_address, I2C_Direction_Receiver);
  415.         while(!I2C_CheckEvent(USR_I2C_USED, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));


  416.          while (no)
  417.     {        
  418.         
  419.                 while(!I2C_CheckEvent(USR_I2C_USED, I2C_EVENT_MASTER_BYTE_RECEIVED)); // EV7
  420.             data1 = I2C_ReceiveData(USR_I2C_USED);

  421.                 while(!I2C_CheckEvent(USR_I2C_USED, I2C_EVENT_MASTER_BYTE_RECEIVED)); // EV7
  422.             data2 = I2C_ReceiveData(USR_I2C_USED);

  423.             Word_Data[i][0] = (((u16)data1 << 8) | data2);  //



  424.        while(!I2C_CheckEvent(USR_I2C_USED, I2C_EVENT_MASTER_BYTE_RECEIVED)); // EV7
  425.                 data1 = I2C_ReceiveData(USR_I2C_USED);

  426.             if(no==1)
  427.                 {
  428.                      I2C_AcknowledgeConfig(I2C1, DISABLE);        //最后一位后要關(guān)閉應(yīng)答的
  429.                     I2C_GenerateSTOP(I2C1, ENABLE);                        //發(fā)送停止位
  430.                
  431.                 }

  432.                 while(!I2C_CheckEvent(USR_I2C_USED, I2C_EVENT_MASTER_BYTE_RECEIVED)); // EV7
  433.                 data2 = I2C_ReceiveData(USR_I2C_USED);

  434.                 Word_Data[i][1] = (((u16)data1 << 8) | data2);
  435.                 i++;

  436.                
  437.             /* Decrement the read bytes counter */
  438.             no--;
  439.     }
  440.         
  441.         I2C_AcknowledgeConfig(USR_I2C_USED, ENABLE);//將應(yīng)答位使能回去,等待下次通信
  442.         I2C_GenerateSTOP(I2C1, ENABLE);                        //發(fā)送停止位

  443. }

  444. #endif
  445. #define INTERRUPT_REG                                          0X00
  446. #define INTERRUPT_REG_A_FULL                          (0X01<<7)
  447. #define INTERRUPT_REG_TEMP_RDY                  (0X01<<6)
  448. #define INTERRUPT_REG_HR_RDY                          (0X01<<5)
  449. #define INTERRUPT_REG_SPO2_RDY                  (0X01<<4)
  450. #define INTERRUPT_REG_PWR_RDY                          (0X01<<0)



  451. void max10300_init()
  452. {
  453.         max10300_Bus_Write(0x06, 0x0b);  //mode configuration : temp_en[3]      MODE[2:0]=010 HR only enabled    011 SP02 enabled
  454.         //max10300_Bus_Write(0x06, 0x0a);  //MODE[2:0]=010 HR only enabled     when used is mode ,the red led is not used.
  455.         max10300_Bus_Write(0x01, 0xF0); //open all of interrupt
  456.         max10300_Bus_Write(INTERRUPT_REG, 0x00); //all interrupt clear
  457.         max10300_Bus_Write(0x09, 0x33); //r_pa=3,ir_pa=3

  458. #ifdef SAMPLE_50
  459.         max10300_Bus_Write(0x07, 0x43); //SPO2_SR[4:2]=000   50 per second    LED_PW[1:0]=11  16BITS
  460. #else
  461.         max10300_Bus_Write(0x07, 0x47); //SPO2_SR[4:2]=001  100 per second    LED_PW[1:0]=11  16BITS
  462. #endif
  463.         
  464.         max10300_Bus_Write(0x02, 0x00);   //set FIFO write Pointer reg = 0x00 for clear it
  465.         max10300_Bus_Write(0x03, 0x00);        //set Over Flow Counter  reg = 0x00 for clear it
  466.         max10300_Bus_Write(0x04, 0x0f);        //set FIFO Read Pointer  reg = 0x0f for   
  467.                                                                                         //waitting  write pointer eq read pointer   to   interrupts  INTERRUPT_REG_A_FULL
  468. }

  469. double my_floor(double x)
  470. {
  471.    double y=x;
  472.     if( (*( ( (int *) &y)+1) & 0x80000000)  != 0) //或者if(x<0)
  473.         return (float)((int)x)-1;
  474.     else
  475.         return (float)((int)x);
  476. }

  477. double my_fmod(double x, double y)
  478. {
  479.    double temp, ret;
  480.   
  481.    if (y == 0.0)
  482.       return 0.0;
  483.    temp = my_floor(x/y);
  484.    ret = x - temp * y;
  485.    if ((x < 0.0) != (y < 0.0))
  486.       ret = ret - y;
  487.    return ret;
  488. }


  489. #define XPI            (3.1415926535897932384626433832795)
  490. #define XENTRY        (100)
  491. #define XINCL        (XPI/2/XENTRY)

  492.   static const double XSinTbl[] = {
  493.         0.00000000000000000  , 0.015707317311820675 , 0.031410759078128292 , 0.047106450709642665 , 0.062790519529313374 ,
  494.         0.078459095727844944 , 0.094108313318514325 , 0.10973431109104528  , 0.12533323356430426  , 0.14090123193758267  ,
  495.         0.15643446504023087  , 0.17192910027940955  , 0.18738131458572463  , 0.20278729535651249  , 0.21814324139654256  ,
  496.         0.23344536385590542  , 0.24868988716485479  , 0.26387304996537292  , 0.27899110603922928  , 0.29404032523230400  ,
  497.         0.30901699437494740  , 0.32391741819814940  , 0.33873792024529142  , 0.35347484377925714  , 0.36812455268467797  ,
  498.         0.38268343236508978  , 0.39714789063478062  , 0.41151435860510882  , 0.42577929156507272  , 0.43993916985591514  ,
  499.         0.45399049973954680  , 0.46792981426057340  , 0.48175367410171532  , 0.49545866843240760  , 0.50904141575037132  ,
  500.         0.52249856471594880  , 0.53582679497899666  , 0.54902281799813180  , 0.56208337785213058  , 0.57500525204327857  ,
  501.         0.58778525229247314  , 0.60042022532588402  , 0.61290705365297649  , 0.62524265633570519  , 0.63742398974868975  ,
  502.         0.64944804833018377  , 0.66131186532365183  , 0.67301251350977331  , 0.68454710592868873  , 0.69591279659231442  ,
  503.         0.70710678118654757  , 0.71812629776318881  , 0.72896862742141155  , 0.73963109497860968  , 0.75011106963045959  ,
  504.         0.76040596560003104  , 0.77051324277578925  , 0.78043040733832969  , 0.79015501237569041  , 0.79968465848709058  ,
  505.         0.80901699437494745  , 0.81814971742502351  , 0.82708057427456183  , 0.83580736136827027  , 0.84432792550201508  ,
  506.         0.85264016435409218  , 0.86074202700394364  , 0.86863151443819120  , 0.87630668004386369  , 0.88376563008869347  ,
  507.         0.89100652418836779  , 0.89802757576061565  , 0.90482705246601958  , 0.91140327663544529  , 0.91775462568398114  ,
  508.         0.92387953251128674  , 0.92977648588825146  , 0.93544403082986738  , 0.94088076895422557  , 0.94608535882754530  ,
  509.         0.95105651629515353  , 0.95579301479833012  , 0.96029368567694307  , 0.96455741845779808  , 0.96858316112863108  ,
  510.         0.97236992039767667  , 0.97591676193874743  , 0.97922281062176575  , 0.98228725072868872  , 0.98510932615477398  ,
  511.         0.98768834059513777  , 0.99002365771655754  , 0.99211470131447788  , 0.99396095545517971  , 0.99556196460308000  ,
  512.         0.99691733373312796  , 0.99802672842827156  , 0.99888987496197001  , 0.99950656036573160  , 0.99987663248166059  ,
  513.         1.00000000000000000  };

  514. double XSin( double x )
  515. {
  516.     int s = 0 , n;
  517.     double dx , sx , cx;
  518.     if( x < 0 )
  519.         s = 1 , x = -x;
  520.     x = my_fmod( x , 2 * XPI );
  521.     if( x > XPI )
  522.         s = !s , x -= XPI;
  523.     if( x > XPI / 2 )
  524.         x = XPI - x;
  525.     n = (int)( x / XINCL );
  526.     dx = x - n * XINCL;
  527.     if( dx > XINCL / 2 )
  528.         ++n , dx -= XINCL;
  529.     sx = XSinTbl[n];
  530.     cx = XSinTbl[XENTRY-n];
  531.     x = sx + dx*cx - (dx*dx)*sx/2
  532.         - (dx*dx*dx)*cx/6
  533.         + (dx*dx*dx*dx)*sx/24
  534.         ;
  535.      
  536.     return s ? -x : x;
  537. }

  538. double XCos( double x )
  539. {
  540.     return XSin( x + XPI/2 );
  541. }


  542. /*********************************FFT*************************************
  543.                          快速傅里葉變換C函數(shù)
  544. 函數(shù)簡介:此函數(shù)是通用的快速傅里葉變換C語言函數(shù),移植性強,以下部分不依
  545.           賴硬件。此函數(shù)采用聯(lián)合體的形式表示一個復(fù)數(shù),輸入為自然順序的復(fù)
  546.           數(shù)(輸入實數(shù)是可令復(fù)數(shù)虛部為0),輸出為經(jīng)過FFT變換的自然順序的
  547.           復(fù)數(shù)
  548. 使用說明:使用此函數(shù)只需更改宏定義FFT_N的值即可實現(xiàn)點數(shù)的改變,F(xiàn)FT_N的
  549.           應(yīng)該為2的N次方,不滿足此條件時應(yīng)在后面補0
  550. 函數(shù)調(diào)用:FFT(s);
  551. 時    間:2010-2-20
  552. 版    本:Ver1.0
  553. 參考文獻:     
  554. **********************************************************************/

  555. #define PI 3.1415926535897932384626433832795028841971               //定義圓周率值
  556. #define FFT_N 1024                                                  //定義福利葉變換的點數(shù)

  557. struct compx     //定義一個復(fù)數(shù)結(jié)構(gòu)
  558.         {
  559.                 float real;
  560.                 float imag;
  561.         };                  

  562. struct compx s1[FFT_N+16];           //FFT輸入和輸出:從S[1]開始存放,根據(jù)大小自己定義
  563. struct compx s2[FFT_N+16];           //FFT輸入和輸出:從S[1]開始存放,根據(jù)大小自己定義


  564. /*******************************************************************
  565. 函數(shù)原型:struct compx EE(struct compx b1,struct compx b2)  
  566. 函數(shù)功能:對兩個復(fù)數(shù)進行乘法運算
  567. 輸入?yún)?shù):兩個以聯(lián)合體定義的復(fù)數(shù)a,b
  568. 輸出參數(shù):a和b的乘積,以聯(lián)合體的形式輸出
  569. *******************************************************************/
  570. struct compx EE(struct compx a,struct compx b)      
  571. {
  572.          struct compx c;
  573.          c.real=a.real*b.real-a.imag*b.imag;
  574.          c.imag=a.real*b.imag+a.imag*b.real;
  575.          return(c);
  576. }

  577. /*****************************************************************
  578. 函數(shù)原型:void FFT(struct compx *xin,int N)
  579. 函數(shù)功能:對輸入的復(fù)數(shù)組進行快速傅里葉變換(FFT)
  580. 輸入?yún)?shù):*xin復(fù)數(shù)結(jié)構(gòu)體組的首地址指針,struct型
  581. *****************************************************************/
  582. void FFT(struct compx *xin)
  583. {
  584.         int f,m,nv2,nm1,i,k,l,j=0;
  585.         struct compx u,w,t;

  586.         nv2=FFT_N/2;                  //變址運算,即把自然順序變成倒位序,采用雷德算法
  587.         nm1=FFT_N-1;  
  588.         for(i=0;i<nm1;i++)        
  589.         {
  590.                 if(i<j)                    //如果i<j,即進行變址
  591.                 {
  592.                         t=xin[j];           
  593.                         xin[j]=xin[i];
  594.                         xin[i]=t;
  595.                 }
  596.                 k=nv2;                    //求j的下一個倒位序
  597.                
  598.                 while(k<=j)               //如果k<=j,表示j的最高位為1   
  599.                 {           
  600.                         j=j-k;                 //把最高位變成0
  601.                         k=k/2;                 //k/2,比較次高位,依次類推,逐個比較,直到某個位為0
  602.                 }
  603.                
  604.                 j=j+k;                   //把0改為1
  605.         }
  606.          
  607.         {  //FFT運算核,使用蝶形運算完成FFT運算
  608.                 int le,lei,ip;                           
  609.                 f=FFT_N;
  610.                 for(l=1;(f=f/2)!=1;l++)                  //計算l的值,即計算蝶形級數(shù)
  611.                         ;
  612.                 for(m=1;m<=l;m++)                           // 控制蝶形結(jié)級數(shù)
  613.                 {                                           //m表示第m級蝶形,l為蝶形級總數(shù)l=log(2)N
  614.                         le=2<<(m-1);                            //le蝶形結(jié)距離,即第m級蝶形的蝶形結(jié)相距l(xiāng)e點
  615.                         lei=le/2;                               //同一蝶形結(jié)中參加運算的兩點的距離
  616.                         u.real=1.0;                             //u為蝶形結(jié)運算系數(shù),初始值為1
  617.                         u.imag=0.0;
  618.                         w.real=XCos(PI/lei);                     //w為系數(shù)商,即當(dāng)前系數(shù)與前一個系數(shù)的商
  619.                         w.imag=-XSin(PI/lei);
  620.                         for(j=0;j<=lei-1;j++)                   //控制計算不同種蝶形結(jié),即計算系數(shù)不同的蝶形結(jié)
  621.                         {
  622.                                 for(i=j;i<=FFT_N-1;i=i+le)            //控制同一蝶形結(jié)運算,即計算系數(shù)相同蝶形結(jié)
  623.                                 {
  624.                                         ip=i+lei;                           //i,ip分別表示參加蝶形運算的兩個節(jié)點
  625.                                         t=EE(xin[ip],u);                    //蝶形運算,詳見公式
  626.                                         xin[ip].real=xin[i].real-t.real;
  627.                                         xin[ip].imag=xin[i].imag-t.imag;
  628.                                         xin[i].real=xin[i].real+t.real;
  629.                                         xin[i].imag=xin[i].imag+t.imag;
  630.                                 }
  631.                                 u=EE(u,w);                           //改變系數(shù),進行下一個蝶形運算
  632.                         }
  633.                 }
  634.         }

  635. }

  636. u16 g_fft_index=0;

  637. u16 qsqrt(u32 a)
  638. {
  639.   u32 rem = 0, root = 0, divisor = 0;
  640.   u16 i;
  641.   for(i=0; i<16; i++)
  642.   {
  643.     root <<= 1;
  644.     rem = ((rem << 2) + (a>>30));
  645.     a <<= 2;
  646.     divisor = (root << 1) + 1;
  647.     if(divisor <= rem)
  648.     {
  649.       rem -= divisor;
  650.       root++;
  651.     }
  652.   }
  653.   return root;
  654. }

  655. #define START_INDEX    10   //濾出低頻干擾
  656. u16 find_max_num_index(struct compx *data,u16 count)
  657. {
  658.         u16 i=START_INDEX;
  659.         u16 max_num_index = i;
  660.         //struct compx temp=data[i];
  661.         float temp = data[i].real;
  662.         for(i=START_INDEX;i<count;i++)
  663.         {
  664.                 if(temp < data[i].real)
  665.                 {
  666.                         temp = data[i].real;
  667.                         max_num_index = i;
  668.                 }
  669.         }
  670.         printf("max_num_index=%d\r\n",max_num_index);
  671.         return max_num_index;
  672.         
  673. }

  674. #define CORRECTED_VALUE        50   //粗略標(biāo)定血液氧氣含量   ,精準(zhǔn)數(shù)據(jù)需要大量測量

  675. void sp02_treated_fun(u16 max_index)
  676. {
  677.         float sp02_num=0;
  678.          
  679.         delayl_init();                     //延時函數(shù)初始化           
  680.         OLED_Init();                        //初始化OLED     
  681.    
  682.          printf("\r\n zhiliu s1=%f,s2=%f \r\n",s1[0].real,s2[0].real);
  683.         printf("\r\n s1=%f,s2=%f \r\n",s1[max_index].real,s2[max_index].real);
  684.         if((s1[max_index].real*s2[0].real)>(s2[max_index].real*s1[0].real))  //if   ir>red      sp02>75%
  685.         {
  686.                 sp02_num = (s2[max_index].real*s1[0].real)/(s1[max_index].real*s2[0].real);
  687.                 printf("\r\nsp02_num  : %f\r\n",sp02_num*100);
  688.                 printf("\r\n血氧含量為: %f\r\n",(1-sp02_num)*100+CORRECTED_VALUE);
  689.                
  690.                 OLED_ShowString(0,0, "SpO2:",16);
  691.                 if((1-sp02_num)*100+CORRECTED_VALUE>99)
  692.                         OLED_ShowString(40,0, "99",16);
  693.                 else
  694.                         OLED_ShowNum(40,0,(1-sp02_num)*100+CORRECTED_VALUE,4,16);

  695.                 OLED_ShowString(80,0,"%",16);
  696.                 OLED_ShowString(0,30,"Heart Rate:",12);   
  697.                 OLED_Refresh_Gram();//更新顯示到OLED         
  698.                
  699.         }
  700.         else   // sp02<75%
  701.         {
  702.                 printf("\r\n 嚴(yán)重缺氧! \r\n");
  703.                
  704.                 OLED_ShowString(0,0, "SpO2:",16);
  705.                 OLED_ShowString(40,0,"ANOXIA!",16);
  706.                 OLED_ShowString(0,30,"Heart Rate:",12);   
  707.                 OLED_Refresh_Gram();//更新顯示到OLED
  708.         }        
  709. }

  710. void test_max30100_fun(void)
  711. {
  712.         u16 temp_num=0;
  713.         u16 fifo_word_buff[15][2];
  714.         u16 Heart_Rate=0;
  715.         u16 s1_max_index=0;
  716.         u16 s2_max_index=0;
  717.         
  718. ……………………

  719. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
0.png
所有資料51hei提供下載:
血氧心率.7z (4.33 MB, 下載次數(shù): 1349)


評分

參與人數(shù) 7黑幣 +52 收起 理由
wait_wait_ + 12 很給力!
mettie + 5 很給力!
lqzhappy + 5 很給力!
kat5566 + 5
蘭木滄溟 + 5 很給力!
fhx97 + 15 很給力!
hei1043218814 + 5 很給力!

查看全部評分

回復(fù)

使用道具 舉報

ID:246166 發(fā)表于 2017-11-8 18:39 | 顯示全部樓層
樓主太強了,學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報

ID:249501 發(fā)表于 2017-11-14 22:52 | 顯示全部樓層
不錯啊  學(xué)習(xí)一個
回復(fù)

使用道具 舉報

ID:249504 發(fā)表于 2017-11-15 10:45 | 顯示全部樓層
樓主,你有兩個I2C函數(shù),都用了 PB6和PB7引腳,一個是復(fù)用開漏,一個是復(fù)用推挽,請問為什么這樣寫呢?謝謝
回復(fù)

使用道具 舉報

ID:245513 發(fā)表于 2017-11-18 16:48 來自觸屏版 | 顯示全部樓層
伊森一亨特 發(fā)表于 2017-11-15 10:45
樓主,你有兩個I2C函數(shù),都用了 PB6和PB7引腳,一個是復(fù)用開漏,一個是復(fù)用推挽,請問為什么這樣寫呢?謝謝

模擬iic的。應(yīng)該是sclk和sda。肯定要用不同gpio配置方式。自己看看iic協(xié)議吧。
回復(fù)

使用道具 舉報

ID:252080 發(fā)表于 2017-11-22 16:17 | 顯示全部樓層
學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報

ID:254920 發(fā)表于 2017-11-28 21:36 | 顯示全部樓層
厲害厲害
回復(fù)

使用道具 舉報

ID:249501 發(fā)表于 2017-12-21 10:02 | 顯示全部樓層
請問讀FIFO是怎么讀?讀到中斷標(biāo)志位就一直讀嗎?還是讀到中斷就只讀4個樣本?
回復(fù)

使用道具 舉報

ID:180844 發(fā)表于 2018-1-15 16:37 | 顯示全部樓層
請問數(shù)據(jù)處理方面的算法在哪部分
回復(fù)

使用道具 舉報

ID:284715 發(fā)表于 2018-2-22 10:56 | 顯示全部樓層
學(xué)習(xí)了~
回復(fù)

使用道具 舉報

ID:284715 發(fā)表于 2018-2-22 14:07 | 顯示全部樓層
求教樓主,為什么我采集到的數(shù)據(jù)是這樣的,數(shù)據(jù)值一直在變小啊
1519279446(1).png
回復(fù)

使用道具 舉報

ID:288809 發(fā)表于 2018-3-8 10:05 | 顯示全部樓層
想學(xué)習(xí)一下,分不夠了
回復(fù)

使用道具 舉報

ID:292418 發(fā)表于 2018-3-15 18:18 來自觸屏版 | 顯示全部樓層
樓主流弊,學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報

ID:239244 發(fā)表于 2018-3-19 21:12 | 顯示全部樓層
helloapy 發(fā)表于 2018-2-22 14:07
求教樓主,為什么我采集到的數(shù)據(jù)是這樣的,數(shù)據(jù)值一直在變小啊

兄弟,咱倆遇到的問題一樣啊,不知道你解決了沒有
回復(fù)

使用道具 舉報

ID:296605 發(fā)表于 2018-3-25 09:23 | 顯示全部樓層
你好,請問你所用的iic-max30100模塊可以發(fā)我一下淘寶鏈接嗎?找不到帶LCD顯示屏的30100模塊,麻煩了。
回復(fù)

使用道具 舉報

ID:289262 發(fā)表于 2018-3-29 09:44 | 顯示全部樓層
好東西,學(xué)習(xí)下。
回復(fù)

使用道具 舉報

ID:299299 發(fā)表于 2018-4-3 23:36 | 顯示全部樓層
請問樓主這個算法有一些資料文檔嗎,可以分享一下嗎,謝謝
回復(fù)

使用道具 舉報

ID:299299 發(fā)表于 2018-4-5 09:49 | 顯示全部樓層
請問樓主這個可以用來放在手腕上測量嗎,我調(diào)試了你的代碼發(fā)現(xiàn)在手指測量可以得出想要得到的波形,但手腕上卻不太一樣
回復(fù)

使用道具 舉報

ID:273296 發(fā)表于 2018-4-13 11:03 | 顯示全部樓層
學(xué)習(xí)了
回復(fù)

使用道具 舉報

ID:198849 發(fā)表于 2018-4-13 15:53 | 顯示全部樓層
樓主,我參考你的移植到F4上,接上線沒反應(yīng)怎么回事?燈都不亮
回復(fù)

使用道具 舉報

ID:198849 發(fā)表于 2018-4-14 09:54 | 顯示全部樓層
我一直測出來心率為29
回復(fù)

使用道具 舉報

ID:314754 發(fā)表于 2018-4-23 19:39 | 顯示全部樓層
學(xué)習(xí)了
回復(fù)

使用道具 舉報

ID:314857 發(fā)表于 2018-4-23 21:38 | 顯示全部樓層
樓主厲害
回復(fù)

使用道具 舉報

ID:315693 發(fā)表于 2018-4-24 20:45 | 顯示全部樓層

樓主太給力啦
回復(fù)

使用道具 舉報

ID:317239 發(fā)表于 2018-4-27 11:36 | 顯示全部樓層
附件掛了,樓主能在傳一份嗎
回復(fù)

使用道具 舉報

ID:319881 發(fā)表于 2018-5-1 15:24 | 顯示全部樓層
樓主很強
回復(fù)

使用道具 舉報

ID:319881 發(fā)表于 2018-5-1 15:29 | 顯示全部樓層
樓主很強
回復(fù)

使用道具 舉報

ID:195609 發(fā)表于 2018-5-2 10:22 | 顯示全部樓層
請問樓主用的MAX30100長什么樣子 有鏈接嗎
回復(fù)

使用道具 舉報

ID:313051 發(fā)表于 2018-5-2 19:26 | 顯示全部樓層
學(xué)習(xí)了
回復(fù)

使用道具 舉報

ID:321333 發(fā)表于 2018-5-3 16:18 | 顯示全部樓層
厲害厲害 學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報

ID:321333 發(fā)表于 2018-5-3 16:56 | 顯示全部樓層
樓主用的是什么采集軟件
回復(fù)

使用道具 舉報

ID:280272 發(fā)表于 2018-5-3 21:29 | 顯示全部樓層
厲害厲害 學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報

ID:322057 發(fā)表于 2018-5-4 15:28 | 顯示全部樓層
資料下載了不能用,是什么原因?
回復(fù)

使用道具 舉報

ID:322057 發(fā)表于 2018-5-4 15:29 | 顯示全部樓層
nandyku 發(fā)表于 2018-4-13 15:53
樓主,我參考你的移植到F4上,接上線沒反應(yīng)怎么回事?燈都不亮

請問,你的問題解決了嗎?
回復(fù)

使用道具 舉報

ID:322057 發(fā)表于 2018-5-4 16:49 | 顯示全部樓層
有可以用的代碼嗎?可以發(fā)一下嗎?
回復(fù)

使用道具 舉報

ID:334304 發(fā)表于 2018-5-20 16:56 | 顯示全部樓層
分不夠下載啊
回復(fù)

使用道具 舉報

ID:337583 發(fā)表于 2018-5-25 11:13 | 顯示全部樓層
樓主,為什么我下載不了這個壓縮包?按下載顯示服務(wù)器錯誤?
回復(fù)

使用道具 舉報

ID:117866 發(fā)表于 2018-6-3 23:58 | 顯示全部樓層
謝謝樓主!
回復(fù)

使用道具 舉報

ID:344516 發(fā)表于 2018-6-4 11:17 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報

ID:345398 發(fā)表于 2018-6-5 14:30 | 顯示全部樓層
謝謝樓主分享,樓主制作和上傳辛苦了
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
日av中文字幕| 一区二区三区四区在线不卡高清| 欧美黄网在线观看| 国产成人精品综合久久久| 欧美精品777| 国产亚洲视频系列| 亚洲激情社区| 日韩三级视频| 91精品论坛| 美州a亚洲一视本频v色道| 日日爱夜夜操| 香蕉国产在线视频| 日韩免费不卡视频| 国产乱了高清露脸对白| 精品国产一区三区| 久久手机视频| 国产精品爽爽爽| 久久深夜福利免费观看| 日韩免费电影一区| 欧美性猛交xxxx免费看久久久| 99久久精品费精品国产一区二区| 亚洲视频1区| 成人激情电影在线| 136福利精品导航| 亚洲欧洲美洲av| 免费大片黄在线| 在线免费色视频| 天干夜天天夜天干天ww| 人xxxx性xxxxx欧美| 国产按摩一区二区三区| 久久精品视频1| 777777国产7777777| 强迫凌虐淫辱の牝奴在线观看| 浮妇高潮喷白浆视频| 亚洲人成网站在线观看播放| 国产欧美日韩伦理| 91精品久久久久久久| 性欧美在线看片a免费观看| 亚洲亚裔videos黑人hd| 精品国产成人系列| 欧美精品日韩精品| 色屁屁一区二区| 亚洲成a人片综合在线| 亚洲欧美一区二区在线观看| 久久影音资源网| 成人免费看黄yyy456| 精品无人码麻豆乱码1区2区 | 免费黄网站在线| 精品国产一区二区三区四区阿崩| 2021av网| a级免费视频| 免费a漫导航| 夜先锋资源网| 91国内精品久久久久| 九九99精品| 日韩8x8x| 韩国日本一区二区三区| 亚洲国产精品区| 日韩综合另类| 国产一级免费黄色片| 影音先锋中文字幕在线播放| 亚洲第一香蕉视频| 一区三区三区不卡| 久草视频免费看| 日韩黄色成人| 天堂视频在线| 美女被搞网站| av免费在线电影| 制服丝袜影音| 理论片鲁丝二区爱情网| av在线电影网站| 日产精品久久久久久久性色| 男人的天堂在线视频| 你懂的在线观看| 国产高清免费在线播放| 黄网站app在线观看| 黄色网址在线免费播放| а_天堂中文在线| 美女av在线免费看| av成人在线播放| 88久久精品| 精品国产精品| 国内揄拍国内精品久久| 玖玖精品视频| 国产成都精品91一区二区三| 久久综合久色欧美综合狠狠| 中文字幕一区二区三| 亚洲成人一二三| 欧美在线影院一区二区| 精品第一国产综合精品aⅴ| 国产一区二区三区视频| 欧美激情伊人电影| 成人在线观看视频网站| 日韩福利二区| 日韩精品xxxx| 色悠悠在线视频| 日韩欧美视频免费观看| 欧美三级午夜理伦| 亚洲AV无码一区二区三区少妇| 亚洲欧美综合乱码精品成人网| 日本性生活网站| 九色在线网站| 青春草在线视频| 91麻豆精品国产综合久久久| 精品国产一区二区三区久久久蜜臀| 亚洲精品国产首次亮相| 蜜臀99久久精品久久久久久软件| 99久久久无码国产精品| 亚洲视频一区二区在线观看| 在线一区二区三区| 亚洲免费电影一区| 欧美专区在线播放| 麻豆av一区二区三区久久| 国产女主播自拍| 成人三级做爰av| 亚洲人与黑人屁股眼交| 中文字幕二区三区| 中文字幕国产视频| 69国产精品| 中文av资源在线| 97品白浆高清久久久久久| 欧美日韩国产一区精品一区| 国产91色综合久久免费分享| 亚洲国产精品一区二区久久| 精品国产乱码久久久久久牛牛 | 日本中文字幕观看| 国产在视频线精品视频| 狠狠狠狠狠狠狠| 最新国产热播激情视频| 116美女写真午夜一级久久| 欧美6一10sex性hd| 日韩欧美黄色| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产精品国产自产拍高清av| 91精品国产一区二区三区香蕉| 精品中文字幕在线| 蜜桃麻豆91| 午夜一区二区视频| 日本va欧美va国产激情| 迷人的保姆韩国| 国产在线91| 亚洲一区二区电影| 日韩成人伦理电影在线观看| 亚洲女人的天堂| 日韩成人中文字幕| 91在线免费网站| 国语对白做受xxxxx在线中国 | 裸体免费网站| 国产成人精品123区免费视频| 成人3d动漫在线观看| 成人黄页在线观看| 欧美日韩1234| 国产成人精品免高潮费视频| 91免费国产精品| 免费网站在线高清观看| 免费国产精品视频| 亚洲欧美日本免费| 日韩第一区第二区| 国内精品久久久久影院薰衣草 | 成人av网站在线观看免费| 精品1区2区3区| 欧美一级免费看| 成人污网站在线观看| 久久中文字幕精品| 亚洲大肥女ass| 美丽的姑娘在线观看免费动漫| 欧美视频二区欧美影视| 极品销魂美女一区二区三区| 欧美性猛交xxxx乱大交退制版| 97香蕉超级碰碰久久免费的优势| 国产青草视频在线观看| 国内毛片毛片毛片毛片毛片| 欧美高清videosex极品| 天堂av最新在线| 在线高清一区| 欧美日韩人人澡狠狠躁视频| 久久人人爽人人爽人人片av高清| 精品成在人线av无码免费看| 久草成人在线视频| 日日夜夜网站| 日本欧美不卡| 国产在线观看免费一区| 欧美一级日韩免费不卡| 99国产视频在线| 女同性αv亚洲女同志| 国产18精品乱码免费看| 亚洲欧美视频一区二区| 亚洲v在线看| 亚洲高清视频在线| 国产成人久久久| 欧美xxxxxbbbbb| 午夜视频在线播放| 国产成人午夜| 性久久久久久| 欧美一级在线观看| 日本亚洲自拍| 国产无码精品在线播放| 成人精品3d动漫| 亚洲电影一级片| 亚洲精品综合在线| 国产91精品久| 亚洲在线观看网站| a中文字幕www| 麻豆免费在线| 国产成人午夜电影网| 亚洲色图狂野欧美| 成人av在线播放观看| 可以免费看的av毛片| 日日噜噜噜夜夜爽爽狠狠| 国产乱码精品一区二区亚洲| 一区二区在线电影| 国产精品入口免费视频一| 美女黄色一级视频| 国产视频网站在线观看| 亚洲成人a级片| 久久久久久综合| 97久久国产精品| 曰本三级日本三级日本三级| 欧美色图色就是色| 天天综合91| 国产精品灌醉下药二区| 45www国产精品网站| 丰满人妻一区二区三区免费视频棣| 色av中文字幕| 日韩大陆av| 国产精品久久三| 国产精品看片资源| 日韩影视一区二区三区| av日韩在线免费| 三上亚洲一区二区| 欧美日韩国产经典色站一区二区三区| 麻豆亚洲一区| 黄色在线观看国产| 日本中文字幕伦在线观看| 蜜桃视频一区二区三区在线观看 | 最新亚洲伊人网| 99热精品久久| 91精品国产福利| 男人添女荫道口女人有什么感觉| aaa一区二区三区| 国产精欧美一区二区三区蓝颜男同| 91影院在线观看| 国产高清在线不卡| 少妇高潮惨叫久久久久| 在线看片你懂的| 日韩高清一区在线| 久久久国产精品一区| 99国产精品免费视频| 免费观看成年人视频在线观看| 国产精品亚洲人成在99www| 欧洲av一区二区嗯嗯嗯啊| 在线观看成人av| 欧日韩在线视频| 国产一区二区三区| 午夜私人影院久久久久| 亚洲高清在线观看一区| av免费观看在线| 91精品麻豆| 欧美日韩中文在线| 潘金莲一级淫片aaaaa免费看| 国产www免费观看| 亚洲精品一区av| 欧美日韩亚洲成人| 玖玖精品在线视频| 天天综合网色中文字幕| 欧美日韩直播| 日韩你懂的在线播放| 蜜臀av免费观看| 天天操夜夜操免费视频| 国产欧美大片| 欧美精品999| 天天做夜夜爱爱爱| 免费高清在线观看| 国产欧美精品一区二区三区四区| 国产精品伊人日日| www.久久伊人| 噜噜噜天天躁狠狠躁夜夜精品| 欧美日韩高清一区二区三区| 99精品视频播放| 好看的av网站| 日本不卡一区二区| 日本亚洲欧洲色| 久久99国产综合精品免费| 日本久久免费| 日韩欧美极品在线观看| 国内精品视频一区二区三区| 国产成人亚洲精品播放器下载 | 国产午夜精品视频| av小说在线观看| 日本亚洲精品| 专区另类欧美日韩| 中文字幕在线乱| 高清国语自产拍免费视频国产 | 亚洲欧美www| 久久丫精品国产亚洲av不卡| 番号在线播放| 亚洲国产精品成人久久综合一区| 欧美人与性禽动交精品| 亚洲精品手机在线| 欧美在线视屏| 久久久久久久久久久人体 | 色综合久久精品| 欧美一级黄色片视频| www 四虎| 99久久亚洲一区二区三区青草| 激情视频一区二区| 久久人体做爰大胆| 亚洲黄色高清| 国产精品福利在线观看| 国产婷婷在线视频| 日韩一级毛片| 欧美精品videos| 中文字幕一区二区人妻电影| 日韩欧美久久| 亚洲男人的天堂网站| 国产精品国产三级国产传播| 亚洲女同av| 欧美一区二区高清| 欧美做受xxxxxⅹ性视频| 丝袜美女在线观看| 在线这里只有精品| 久草免费资源站| 欧美日韩经典丝袜| 欧美日韩亚洲丝袜制服| 久久久久国产免费| 国产美女一区视频| 欧美挠脚心视频网站| 中国av免费看| 日本蜜桃在线观看视频| 欧美一区二区日韩| xxxxx99| 精品176极品一区| 亚洲欧美精品一区| 在线观看 中文字幕| 精品三级在线观看视频| 久久高清视频免费| 一区二区三区免费在线视频| 欧美日韩精品在线一区| 国产91ⅴ在线精品免费观看| 黄色av小说在线观看| 国产日韩欧美一区在线| 国产精品av一区| 美女做爰内谢全过程视频| 久久综合丝袜日本网| 国产超级av在线| 理论在线观看| 日韩欧美中文字幕在线观看| 久久久久亚洲AV成人无码国产| 久草免费在线视频| 在线观看91av| 内射一区二区三区| 超碰成人在线观看| 性日韩欧美在线视频| 亚洲国产精品一| 亚洲在线国产日韩欧美| 韩国精品一区二区三区六区色诱| 美女免费视频网站| 国产精品人成在线观看免费 | 91免费版黄色| 日日操夜夜爽| 亚洲国产精品成人综合 | www操com| 国产精品美女久久久久aⅴ | 99视频入口| 亚洲四区在线观看| 992kp免费看片| 少妇一区视频| 久久久精品电影| 天堂在线视频免费观看| 久久精品久久99精品久久| 最新中文字幕久久| 粉嫩一区二区三区国产精品| 这里只有精品电影| 国产精品久久久久久99| 亚洲网站在线| 视频在线99| 日本福利在线观看| 欧美一区二区观看视频| 天堂中文字幕在线观看| 伊人成人在线视频| 伊人久久大香线蕉综合75| 精品欧美不卡一区二区在线观看 | 亚洲精品免费电影| 精品成人av一区二区三区| 久久精品福利| 成人福利网站在线观看| 蜜桃av网站| 色综合天天在线| 精品处破女学生| 国产综合色产| 在线播放 亚洲| 欧美性天天影视| 亚洲色图国产精品| 色窝窝无码一区二区三区成人网站| 国产一区二区日韩精品| 9久久婷婷国产综合精品性色| 日韩av超清在线观看| 欧美与黑人午夜性猛交久久久| 青青色青青操| 丁香五六月婷婷久久激情|