久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 541|回復: 0
打印 上一主題 下一主題
收起左側

STM32血氧程序無法編譯 求幫助

[復制鏈接]
跳轉到指定樓層
樓主
ID:673776 發表于 2021-12-31 11:22 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
STM32血氧程序
  1. #include "stm32f103c8t6.h"
  2. //#include "stm32f1xx_hal_gpio.h"
  3. #include "mbed.h"
  4. #include "algorithm.h"
  5. #include "MAX30102.h"
  6. //#include "lcd_5110.h"
  7. #include "ascii5x8.h"           //5x8ASCII字符集
  8. #include "charcode.h"           //12x16(14)漢字子集
  9. #include "asciicode.h"          //5x8(8)ASCII子集
  10. //#include "sys.h"

  11. /************ 定義LCD相關的管腳功能 ***********/

  12. #define LCD_RST_SET do{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_11,GPIO_PIN_SET);}while(0) //復位腳① PB11
  13. #define LCD_RST_RESET do{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_11,GPIO_PIN_RESET);}while(0)
  14. #define LCD_CE_SET do{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET);}while(0)  //片選腳②PB10
  15. #define LCD_CE_RESET do{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);}while(0)
  16. #define LCD_DC_SET do{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);}while(0)   //數據/命令選擇腳③PB0
  17. #define LCD_DC_RESET do{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);}while(0)
  18. #define LCD_DIN_SET do{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);}while(0)  //數據輸入④PB1
  19. #define LCD_DIN_RESET do{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);}while(0)
  20. #define LCD_CLK_SET do{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);}while(0)  //時鐘信號腳⑤PB5
  21. #define LCD_CLK_RESET do{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);}while(0)

  22. /************** 結束管腳定義 *****************/

  23. #define CLOCK 72/8 //時鐘=72M


  24. #define MAX_BRIGHTNESS 255

  25. uint32_t aun_ir_buffer[500]; //紅外LED傳感器數據
  26. int32_t n_ir_buffer_length;  //數據長度
  27. uint32_t aun_red_buffer[500];//紅色LED傳感器數據
  28. int32_t n_sp02;              //SPO2血氧值
  29. int8_t ch_spo2_valid;        //血氧值有效標志
  30. int32_t n_heart_rate;        //心率值
  31. int8_t  ch_hr_valid;         //心率值有效標志
  32. uint8_t uch_dummy;
  33. const uint8_t level[]={0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF};//波形
  34. //const uint8_t level[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//曲線
  35. uint8_t disp=1;              //動態顯示列

  36. Serial pc(SERIAL_TX, SERIAL_RX);//初始化串行端口, TX-PA2, RX-PA3

  37. PwmOut pwmled(PB_3);         //初始化連接到LED的PWM輸出PB3(亮度變化)
  38. DigitalIn INT(PB_7);         //PB7連接MAX30102的INT輸出引腳
  39. DigitalOut led(PC_13);       //PC13連接板載用戶LED

  40. void LCD_Config(void);       //LCD配置引腳
  41. void LCD_init(void);         //LCD初始化
  42. void LCD_write_byte(uint8_t dat,uint8_t dc);//LCD寫字節
  43. void LCD_set_XY(uint8_t X,uint8_t Y);//LCD設置坐標
  44. void LCD_clear(void);        //LCD清屏
  45. void LCD_write_ASCII(uint8_t X,uint8_t Y,uint8_t *stru);//LCD顯示5x7字符串
  46. void LCD_write_ASC_SIN(uint8_t X,uint8_t Y,uint8_t cid);//LCD顯示5x7字符
  47. void LCD_write_ASC7x12(uint8_t X,uint8_t Y,uint8_t cid);//LCD顯示7x12字符
  48. void LCD_write_char(uint8_t x,uint8_t y,uint8_t cid);   //LCD顯示12x14字符
  49. void LCD_write_value(uint8_t X,uint8_t Y,uint8_t L,uint8_t D,uint16_t val);//LCD顯示變量
  50. void LCD_write_string(uint8_t x,uint8_t y,uint8_t *stru);//LCD顯示12x14字符串

  51. void display_main(void);    //主屏幕顯示
  52. void display_erro(void);    //信號錯誤
  53. void display_wait(void);    //等待信號
  54. void display_ir(uint16_t ir);//動態顯示曲線

  55. /*------------------------------------------------------------
  56.                          us延時函數
  57. ------------------------------------------------------------*/
  58. void delay_us(uint16_t us)
  59. {
  60.     uint8_t n;                    
  61.     while(us--)for(n=0;n<CLOCK;n++);         
  62. }

  63. /*------------------------------------------------------------
  64.                          ms延時函數
  65. ------------------------------------------------------------*/
  66. void delay_ms(uint16_t ms)
  67. {
  68.     while(ms--)delay_us(1000);         
  69. }


  70. // 當您按重置時,設置程序運行一次。
  71. int main() {
  72.     uint32_t un_min, un_max, un_prev_data;//用于計算反映心跳的車載LED亮度的變量
  73.     int i;
  74.     int32_t n_brightness;
  75.     float f_temp;
  76.         uint8_t flag = 0;
  77.         
  78.     maxim_max30102_reset();  //重置MAX30102
  79.    
  80.         //初始化串行口波特率
  81.     pc.baud(115200);
  82.     pc.format(8,SerialBase::None,1);
  83.     wait(1);
  84.         
  85.         //初始化LCD5110
  86.     LCD_init();
  87.         display_main();
  88.         
  89.     //讀取和清除狀態寄存器
  90.     maxim_max30102_read_reg(0,&uch_dummy);
  91.    
  92.         maxim_max30102_init();   //初始化MAX30102
  93.         
  94.     n_brightness=0;
  95.     un_min=0x3FFFF;
  96.     un_max=0;
  97.   
  98.     n_ir_buffer_length=500;  //緩沖區長度100存儲以100sps運行的5秒樣本
  99.    
  100.     //讀取前500個樣本,確定信號范圍
  101.     for(i=0;i<n_ir_buffer_length;i++)
  102.     {
  103.         while(INT.read()==1);//等待直到中斷pin生效
  104.         
  105.         maxim_max30102_read_fifo((aun_red_buffer+i),(aun_ir_buffer+i));//從MAX30102的FIFO讀數據
  106.             
  107.         if(un_min>aun_red_buffer[i])
  108.             un_min=aun_red_buffer[i];//更新信號最小值
  109.         if(un_max<aun_red_buffer[i])
  110.             un_max=aun_red_buffer[i];//更新信號最大值
  111.         pc.printf("red=");
  112.         pc.printf("%i", aun_red_buffer[i]);
  113.         pc.printf(", ir=");
  114.         pc.printf("%i\n\r", aun_ir_buffer[i]);
  115.                
  116.     }
  117.     un_prev_data=aun_red_buffer[i];
  118.     //計算前500個樣本(前5秒樣本)后的心率和血氧數值。
  119.     maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &n_sp02, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid);
  120.     //從MAX31022連續取樣。每1秒計算一次心率和血氧飽和度。
  121.    
  122.         while(1)
  123.     {

  124.         i=0;
  125.         un_min=0x3FFFF;
  126.         un_max=0;
  127.         //將前100組樣本轉儲到內存中,并將最后400組樣本移到頂部
  128.         for(i=100;i<500;i++)
  129.         {
  130.             aun_red_buffer[i-100]=aun_red_buffer[i];
  131.             aun_ir_buffer[i-100]=aun_ir_buffer[i];
  132.             //更新信號最小值和最大值
  133.             if(un_min>aun_red_buffer[i])
  134.                 un_min=aun_red_buffer[i];
  135.             if(un_max<aun_red_buffer[i])
  136.                 un_max=aun_red_buffer[i];
  137.         }
  138.         //在計算心率前取100組樣本。
  139.         for(i=400;i<500;i++)
  140.         {
  141.             un_prev_data=aun_red_buffer[i-1];
  142.             while(INT.read()==1);              //等待傳感器信號
  143.             maxim_max30102_read_fifo((aun_red_buffer+i), (aun_ir_buffer+i));
  144.         
  145.             if(aun_red_buffer[i]>un_prev_data) //只是根據相鄰兩個AD數據的偏差來確定LED的亮度
  146.             {
  147.                 f_temp=aun_red_buffer[i]-un_prev_data;
  148.                 f_temp/=(un_max-un_min);
  149.                 f_temp*=MAX_BRIGHTNESS;
  150.                 n_brightness-=(int)f_temp;
  151.                 if(n_brightness<0)
  152.                     n_brightness=0;
  153.             }
  154.             else
  155.             {
  156.                 f_temp=un_prev_data-aun_red_buffer[i];
  157.                 f_temp/=(un_max-un_min);
  158.                 f_temp*=MAX_BRIGHTNESS;
  159.                 n_brightness+=(int)f_temp;
  160.                 if(n_brightness>MAX_BRIGHTNESS)
  161.                     n_brightness=MAX_BRIGHTNESS;
  162.             }
  163.                         
  164.                         if(flag==0)         //兩個循環顯示一次
  165.                         {
  166.                                 if(n_heart_rate>180)//脈搏過速
  167.                                     display_erro();
  168.                                 else
  169.                                 {
  170.                                     if(n_heart_rate<20)
  171.                                                 display_wait();
  172.                                         else
  173.                                         display_ir((float)n_brightness/5);
  174.                                 }
  175.                                 flag++;
  176.                         }
  177.                         else
  178.                                 flag = 0;
  179.                         
  180.             pwmled.write(1-(float)n_brightness/256);//PWM控制LED亮度
  181.                         if(n_brightness<120)
  182.                                 led=1;
  183.                         else
  184.                                 led=0;
  185.         }
  186.         maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &n_sp02, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid);
  187.         pc.printf("HR=%i, ", n_heart_rate);
  188.             pc.printf("SpO2=%i",n_sp02);
  189.                
  190.                    LCD_write_value(24,5,3,0,n_sp02);
  191.             LCD_write_value(67,5,3,0,n_heart_rate);
  192.                
  193.         }
  194. }

  195. /*********************************************
  196. * 函數名稱:LCD_Config
  197. * 函數功能:配置LCD引腳
  198. * 入口參數:無
  199. * 出口參數:無
  200. *********************************************/
  201. void LCD_Config(void)
  202. {
  203.     GPIO_InitTypeDef GPIO_InitTypeDef;             //定義結構體
  204.     GPIO_InitTypeDef.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_5 | GPIO_PIN_10 | GPIO_PIN_11; //配置LCD引腳
  205.     GPIO_InitTypeDef.Mode = GPIO_MODE_OUTPUT_PP;   //推挽輸出
  206.     GPIO_InitTypeDef.Speed = GPIO_SPEED_FREQ_HIGH; //速度
  207.     HAL_GPIO_Init(GPIOB, &GPIO_InitTypeDef);       //初始化GPIO
  208. }

  209. /*********************************************
  210. * 函數名稱:LCD_init
  211. * 函數功能:5110初始化
  212. * 入口參數:無
  213. * 出口參數:無
  214. * 備注:接通電源后需要一個RES低電平脈沖復位,當VDD變為高電平之后
  215. *       最多100ms,RST輸入低電平(<0.3VDD)
  216. *********************************************/
  217. void LCD_init(void)
  218. {
  219.     LCD_Config();                      //配置LCD連線

  220.     LCD_RST_RESET;                     //LCD_RST = 0 復位LCD5110
  221.         
  222.     delay_us(2);
  223.     LCD_RST_SET;                       //LCD_RST = 1;

  224.     LCD_CE_RESET;                      //LCD_CE = 0;  關閉LCD
  225.     delay_us(2);
  226.     LCD_CE_SET;                        //LCD_CE = 1;  關閉LCD

  227.     LCD_write_byte(0x21,0);            //使用擴展LCD令設置LCD模式
  228.     LCD_write_byte(0xc8,0);            //設置液晶偏置電壓
  229.     LCD_write_byte(0x06,0);            //溫度校正(溫度系數2)
  230.     LCD_write_byte(0x13,0);            //1:48
  231.     LCD_write_byte(0x20,0);            //使用基本命令,V=0,水平尋址
  232.     LCD_write_byte(0x0c,0);            //設定顯示模式,正常顯示
  233.     LCD_clear();                       //清屏

  234.     LCD_CE_SET;                        //LCD_CE = 1; //關閉LCD
  235. }


  236. /*********************************************
  237. * 函數名稱:LCD_write_byte
  238. * 函數功能:模擬SPI接口時序寫數據/命令LCD
  239. * 入口參數:data   :寫入的數據;
  240. *           dc        :寫數據1/命令0選擇
  241. * 出口參數:無
  242. * 備注:管腳D/C(LCD_DC)用于選擇寫的是命令(D/C=0)還是數據(D/C=1)
  243. *********************************************/
  244. void LCD_write_byte(uint8_t dat,uint8_t dc)
  245. {
  246.     uint8_t i;
  247.    
  248.     LCD_CLK_RESET;                            //先拉低時鐘CLK
  249.    
  250.     LCD_CE_RESET;                             //LCD_CE = 0; 選擇5110
  251.    
  252.     if (dc == 1)
  253.     {
  254.         LCD_DC_SET;                           //LCD_DC = dc; dc=0數據,dc=1命令
  255.     }
  256.     else {
  257.         LCD_DC_RESET;
  258.     }
  259.     for (i=0; i<8; i++)                      //發送8位
  260.     {
  261.         if (dat & 0x80)
  262.         {
  263.             LCD_DIN_SET;                     //LCD_DIN = 1;
  264.         }
  265.         else {
  266.             LCD_DIN_RESET;                   //LCD_DIN = 0;
  267.         }
  268.         LCD_CLK_SET;                         //LCD_CLK = 1;
  269.         delay_us(1);
  270.         dat = dat << 1;                             //移位,準備發送下一位
  271.         LCD_CLK_RESET;                       //LCD_CLK = 0; //發送同步時鐘
  272.     }
  273.    
  274.     LCD_CE_SET;                              //LCD_CE = 1;  //關閉5110
  275. }

  276. /*********************************************
  277. * 函數名稱:LCD_set_XY
  278. * 函數功能:設置LCD坐標函數
  279. * 入口參數:X      :0-83;
  280. *           Y         :0-5
  281. * 出口參數:無
  282. * 備注:
  283. *********************************************/
  284. void LCD_set_XY(uint8_t X,uint8_t Y)
  285. {
  286.     LCD_write_byte(0x40 | Y,0);              //column?
  287.     LCD_write_byte(0x80 | X,0);              //row?
  288. }


  289. /*********************************************
  290. * 函數名稱:LCD_clear
  291. * 函數功能:5110清屏(用空白寫滿屏幕)
  292. * 入口參數:無
  293. * 出口參數:無
  294. * 備注:
  295. *********************************************/
  296. void LCD_clear(void)
  297. {
  298.     uint8_t i,j;
  299.     LCD_set_XY(0,0);                             //定位左上角
  300.     for (i=0; i<6; i++)
  301.     {
  302.         for (j=0; j<84; j++)
  303.         {
  304.             LCD_write_byte(0x00,1);
  305.         }
  306.     }
  307. }


  308. /*********************************************
  309. * 函數名稱:LCD_write_ASCII
  310. * 函數功能:顯示字符串5*7(8)
  311. * 入口參數:x,y,cid   :顯示ASCII字符
  312. * 出口參數:無               編號(行號)32~127
  313. * 備注:ASCII碼表的數組ASC_5[95][8]來尋址
  314. *********************************************/
  315. void LCD_write_ASCII(uint8_t X,uint8_t Y,uint8_t *stru)
  316. {
  317.     uint8_t i;

  318.     LCD_set_XY(X,Y);                     //定位(左上角)
  319.     while (1)
  320.     {
  321.         for ( i=0; i<5; i++)        //輸出一個5*7字符
  322.         {
  323.             LCD_write_byte(ASC_5[*stru-32][i],1);
  324.         }
  325.         stru++;
  326.         
  327.         if(*stru == '\0') break;   //在每個字符串的最后,會有一個'\0'
  328.         LCD_write_byte(0x00,1);     //插入空列
  329.     }  
  330. }


  331. /*********************************************
  332. * 函數名稱:LCD_write_ASC_SIN
  333. * 函數功能:顯示單個字符5*7(8)
  334. * 入口參數:x,y,cid   :顯示ASCII字符
  335. * 出口參數:無               編號(行號)32~127
  336. * 備注:ASCII碼表的數組ASC_5[95][8]來尋址
  337. *********************************************/
  338. void LCD_write_ASC_SIN(uint8_t X,uint8_t Y,uint8_t cid)
  339. {
  340.     uint8_t i;
  341.     LCD_set_XY(X,Y);                   //定位(左上角)
  342.     for ( i=0; i<5; i++)           //輸出一個5*7字符
  343.     {
  344.         LCD_write_byte(ASC_5[cid-32][i],1);
  345.     }
  346. }


  347. /*********************************************
  348. * 函數名稱:LCD_write_ASC7x12
  349. * 函數功能:顯示自定義字符7*12(16)
  350. * 入口參數:x,y,cid   :顯示的字符  0 1 2 3 4 5 6 7 8 9  =  m  s
  351. * 出口參數:無               編號(行號)0,1,2,3,4,5,6,7,8,9,10,11,12
  352. * 備注:ASCII碼表的數組ASC_7[13][14]來尋址
  353. *********************************************/
  354. void LCD_write_ASC7x12(uint8_t X,uint8_t Y,uint8_t cid)
  355. {
  356.     uint8_t i;
  357.    
  358.     LCD_set_XY(X,Y);                   //定位{左上角)
  359.     for (i=0; i<7; i++)                //顯示字符的上半部分(7列)
  360.     {
  361.         LCD_write_byte(ASC_7[cid][i],1);
  362.     }
  363.    
  364.     LCD_set_XY(X,Y+1);                 //顯示字符的下半部分
  365.     for (i=7; i<14; i++)
  366.     {
  367.         LCD_write_byte(ASC_7[cid][i],1);
  368.     }
  369. }


  370. /*********************************************
  371. * 函數名稱:LCD_write_CHAR
  372. * 函數功能:顯示自定義字符12*14(16)
  373. * 入口參數:x,y,cid  :顯示的字符  電子點焊機接間隔毫秒時
  374. * 出口參數:無              編號(行號)0,1,2,3,4,5,6,7,8,9,10
  375. * 備注:CHAR字庫的數組CHAR_12[11][24]來尋址
  376. ***********************************************/

  377. void LCD_write_char(uint8_t x,uint8_t y,uint8_t cid)
  378. {
  379.     uint8_t i;
  380.    
  381.     LCD_set_XY(x,y);                   //定位(左上角)
  382.     for (i=0; i<12; i++)               //寫字符的上半部分(12列)
  383.     {
  384.         LCD_write_byte(CHAR_12[cid][i],1);
  385.     }
  386.    
  387.     LCD_set_XY(x,y+1);                 //寫字符的下半部分
  388.     for (i=12; i<24; i++)
  389.     {
  390.         LCD_write_byte(CHAR_12[cid][i],1);
  391.     }
  392. }

  393. /*********************************************
  394. * 函數名稱:LCD_write_value
  395. * 函數功能:顯示變量字符5*7(8)或7*12(16)
  396. * 入口參數:x,y,L,val :座標、長度、小數、變量
  397. * 出口參數:無                編號(行號)
  398. * 備注:ASCII碼表的數組ASC_5[95][8]來尋址
  399. *********************************************/
  400. void LCD_write_value(uint8_t X,uint8_t Y,uint8_t L,uint8_t D,uint16_t val)
  401. {
  402.     uint8_t i,j,f = 0;              //列循環、字循環、顯示標志
  403.     uint16_t n,t,cid;               //當前倍數、余數、當前數字

  404.     t = val;
  405.     n = 1;
  406.     for (j = 0; j < L; j++)
  407.       n = n * 10;
  408.    
  409.     LCD_set_XY(X,Y);                        //定位(左上角)

  410.     for (j = L; j > 0; j--)         //字符循環開始
  411.     {
  412.         n = j < 2 ? 1: n / 10;      //計算當前的倍數
  413.         cid = t / n;                //當前位數字
  414.         t = t - (cid * n);
  415.         if (cid > 0)
  416.                         f = 16;
  417.         for ( i=0; i<5; i++)        //寫一個5*7字符
  418.         {
  419.             LCD_write_byte(ASC_5[cid + f][i],1);
  420.         }
  421.         if ( D > 0 & D == (j - 1))
  422.         {
  423.             for ( i=0; i<5; i++)    //寫小數點
  424.             {
  425.                 LCD_write_byte(ASC_5[14][i],1);
  426.             }
  427.         }
  428.         else
  429.           if(j>1) LCD_write_byte(0x00,1);//插入空列
  430.     }
  431. }
  432. ……………………

  433. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


MAX30102_uvision5_stm32f103c8.7z

678.56 KB, 下載次數: 2

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品欧美 | 亚洲日韩中文字幕一区 | 岛国毛片在线观看 | 日韩中文字幕视频在线观看 | 精品国产乱码久久久久久闺蜜 | 国产中文 | 麻豆av免费观看 | 精品99在线 | 97超碰人人 | 欧美成人激情 | 一区二区亚洲 | 女生羞羞视频 | 久久伊人亚洲 | 亚洲免费视频网址 | 亚洲精品一区二三区不卡 | 成人高清在线 | 国产丝袜一区二区三区免费视频 | 在线播放国产视频 | 久久99精品久久久97夜夜嗨 | 精品蜜桃一区二区三区 | 一区二区片 | 国产精品免费一区二区三区四区 | 亚洲精品国产精品国自产在线 | 蜜臀91视频| 成人深夜福利 | 性生活毛片 | 久久久久久久久久一区二区 | 亚洲精品视频久久 | 久久av一区 | 亚洲av毛片成人精品 | 欧美精品在线免费 | 国产精品视频久久久 | xxxxx黄色片 欧美一区免费 | 日韩在线第一 | 欧美精品片| av一区二区三区在线观看 | 欧美激情精品久久久久 | 日韩无 | 黄色片av | 在线免费观看色 | 成人动漫一区二区 |