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

標題: 基于STM32F103的心率傳感器源代碼 [打印本頁]

作者: jokergcl    時間: 2019-5-10 18:26
標題: 基于STM32F103的心率傳感器源代碼
基于STM32F103的心率傳感器相關程序

單片機源程序如下:
  1. #include "led.h"
  2. #include "lcd.h"
  3. #include "key.h"
  4. #include "adc.h"         
  5. #include "timer.h"
  6. #include "common.h"
  7. #include "timer.h"
  8. #include "led.h"
  9. #include "beep.h"


  10. u8 q,i=0;
  11. u8 ave[50]={0};
  12. float ave_heart_rate=0;
  13. u8 sum(u8 m)
  14. {
  15.         ave[2]=ave[1];
  16.         ave[1]=ave[0];
  17.         ave[0]=m;
  18.         return ave[0]+ave[1]+ave[2];
  19. }
  20. //****************************************************************************
  21. //* 名    稱: u8 8Average(u8 ch,u8 times)
  22. //* 功    能:取times次,然后平均
  23. //* 入口參數:ch: 采集每次i的值
  24. //*           times:獲取次數
  25. //* 返回參數:通道ch的times次轉換結果平均值
  26. //* 說    明:      
  27. //****************************************************************************/
  28. u16 Average(u8 ch,u8 times)
  29. {
  30.         if(ave[2] == 0)
  31.         {
  32.                 if (ave[1] == 0)
  33.                 {return ch/1;}
  34.                 else
  35.                 {return ch/2;}
  36.         }
  37.                 return ch/3;
  38. }          
  39. /****************************************************************************
  40. * 名    稱: TIM2_Init(u16 auto_data,u16 fractional)
  41. * 功    能:定時器2初始化
  42. * 入口參數:auto_data: 自動重裝值
  43. *           fractional: 時鐘預分頻數
  44. * 返回參數:無
  45. * 說    明:定時器溢出時間計算方法:Tout=((auto_data+1)*(fractional+1))/Ft(us)  Ft定時器時鐘     
  46. ****************************************************************************/
  47. void TIM2_Init(u16 auto_data,u16 fractional)
  48. {
  49.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  50.         NVIC_InitTypeDef NVIC_InitStructure;

  51.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //時鐘使能
  52.        
  53.         //定時器TIM2初始化
  54.         TIM_TimeBaseStructure.TIM_Period = auto_data; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值       
  55.         TIM_TimeBaseStructure.TIM_Prescaler = fractional; //設置用來作為TIMx時鐘頻率除數的預分頻值
  56.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設置時鐘分割:TDTS = Tck_tim
  57.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數模式
  58.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根據指定的參數初始化TIMx的時間基數單位

  59.         TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM2中斷,允許更新中斷

  60.         //中斷優先級NVIC設置
  61.         NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2中斷
  62.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占優先級2級
  63.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //從優先級3級
  64.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  65.         NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器

  66.         TIM_Cmd(TIM2, ENABLE);  //使能TIMx                                         
  67. }
  68. //定時器2中斷服務程序
  69. void TIM2_IRQHandler(void)   //TIM2中斷
  70. {
  71.         if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //檢查TIM3更新中斷發生與否
  72.                 {               
  73.                         q++;                  //沒經過1s,記一次數
  74.                         while(q == 60)        //每一分鐘重復一次
  75.                   {
  76.                                 LCD_DisplayNum(120,80,i*2/3,3,16,0);
  77.                         //BEEP=!BEEP;
  78.                                 ave_heart_rate=Average(sum(i*2/3),3);       //取3次心率的平均值

  79.                                 LCD_DisplayNum(150,110,ave_heart_rate,3,16,0);
  80.                                 LED1=!LED1;
  81.                                 q=0;
  82.                                 i=0;
  83.                         }
  84.                 }
  85.                 TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );    //清除TIMx更新中斷標志
  86. }

  87. int main(void)
  88. {
  89.         u8 w=0,k=0;
  90.         int n=0,x=0;
  91.         float mov=0;
  92.         float qua;
  93.         u16 adc_data;
  94.         float temp;
  95.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2
  96.         delay_init();       //初始化延時函數
  97.         LED_Init();                                        //初始化LED
  98.         LCD_Init();         //初始化LCD接口
  99.         TIM2_Init(10000,7199); //定時器2時鐘72M,分頻系數7200,72M/7200=10K 所以計數10000次為1000ms,函數內部定時1min
  100.         ADC1_Init();        //初始化ADC
  101.         KEY_Init();       //按鍵初始化
  102.         LCD_Display_Dir(1);   //橫屏

  103.         while(1)
  104.         {
  105.                
  106.                 if(n==0)
  107.                 {
  108.                         BRUSH_COLOR=BLUE;//設置字體為藍色
  109.                         LCD_DisplayString(30,20,16,"heart_rate_VOL:");             
  110.                         //LCD_DisplayString(30,150,16,"ADC1_CH1_VOL:0.000V");         
  111.                         LCD_DisplayString(45,50,16,".");                       //先在固定位置顯示小數點  
  112.                         LCD_DisplayString(30,80,16,"heart_rate:");
  113.                         LCD_DisplayString(30,110,16,"AVE.heart rate:");
  114.                        
  115.                         adc_data=Get_Adc_Average(ADC_Channel_1,10);//獲取通道1的轉換值,10次取平均
  116.                         temp=(float)adc_data*(3.3/4096);            //獲取計算后的帶小數的實際電壓值,比如5.1141
  117.                         if(temp>=1.7)
  118.                         {        i++;
  119.                         }
  120.                         adc_data=temp;                              //賦值整數部分給adc_data變量,因為adc_data為u16整形
  121.                         LCD_DisplayNum(35,50,adc_data,1,16,0);    //顯示電壓值的整數部分,5.1141的話,這里就是顯示5
  122.                         temp-=adc_data;                             //把已經顯示的整數部分去掉,留下小數部分,比如5.1141-5=0.1141
  123.                         temp*=1000;                                 //小數部分乘以1000,例如:0.1141就轉換為114.1,相當于保留三位小數。
  124.                         LCD_DisplayNum(55,50,temp,3,16,0X80);     //顯示小數部分(前面轉換為了整形顯示),這里顯示的就是114.
  125.                         delay_ms(50);       
  126.                         key_scan(0);       
  127. //                        if(keydown_data==KEY0_DATA)   //key0按下后馬上執行相應代碼
  128. //                        {
  129. //                                w++;
  130. //                                LCD_DisplayString(30,150,16,"Movement:");        //移動次數輸入個位
  131. //                                mov=10*k+w;
  132. //                                LCD_DisplayNum(110,150,mov,4,16,0);
  133. //                        }
  134. //                        if(keydown_data==KEY1_DATA)     //key1按下后馬上執行相應代碼
  135. //                        {
  136. //                                k++;
  137. //                                LCD_DisplayString(30,150,16,"Movement:");        //移動次數輸入十位
  138. //                                mov=10*k+w;
  139. //                                LCD_DisplayNum(110,150,mov,4,16,0);
  140. //                        }
  141.                         if(keydown_data==KEY2_DATA)  
  142.                         {
  143.                                 LCD_DisplayString(30,200,16,"Sleep Quality:     %");
  144.                                 if(ave_heart_rate<=150&&ave_heart_rate>=50)        //心率在50~150之間時
  145.                                 qua=(float)(((1-mov/140)/2+(-0.006*ave_heart_rate+1.1)/2)*100);
  146.                                 if(ave_heart_rate>150)                          //心率大于150
  147.                                         qua=(float)(((1-mov/140)/2+(0.2)/2)*100);
  148.                                 LCD_DisplayNum(150,200,qua,4,16,0);
  149.                         }
  150.                                 delay_ms(50);
  151.                                 if(keydown_data==KEY3_DATA)
  152.                         {
  153.                                 n++;
  154.                         }
  155.                 }
  156.                 if(n==1)
  157.                 {
  158.                         LCD_Clear(WHITE);//清屏
  159.                         n++;
  160.                 }
  161.                 if(n==2)
  162.                 {
  163.                 adc_data=Get_Adc_Average(ADC_Channel_1,10);
  164.                         //獲取通道1的轉換值,10次取平均
  165.                 temp=50*(float)adc_data*(3.3/4096);           
  166.                         //獲取計算后的帶小數的實際電壓值,比如5.1141
  167.                 LCD_Color_DrawPoint(x,temp,RED);
  168.                 x++;
  169.                         if(x==320)
  170.                         {
  171.                                 LCD_Clear(WHITE);//清屏
  172.                                 x=0;
  173.                         }
  174.                 }
  175.         }
  176. }
復制代碼

所有資料51hei提供下載:
程序.7z (530.45 KB, 下載次數: 190)



作者: admin    時間: 2019-5-11 03:56
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
作者: 22793088    時間: 2019-5-11 11:24
這個東西好
作者: 13574103468    時間: 2019-11-14 16:43
好東西,學習了
作者: sycsycsyc    時間: 2019-11-18 22:26
求分享




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲男人天堂 | 秋霞在线一区 | 国产精品a久久久久 | 久久99成人 | 天天操 夜夜操 | 亚洲一区二区免费视频 | jlzzjlzz国产精品久久 | 一级在线观看 | 91精品国产综合久久久动漫日韩 | 欧美成人精品一区二区男人看 | 久久久久久久91 | 国产精品久久久久久久久久久久久 | 网站国产 | 午夜精品三区 | 亚洲一区二区三区免费 | 国产粉嫩尤物极品99综合精品 | 韩日一区| 在线欧美一区 | 在线欧美小视频 | 国产精品视频免费观看 | 中文字幕一区在线观看视频 | 亚洲综合久久久 | 在线婷婷| 中文字幕一区二区三区精彩视频 | 久久久成人网 | 久久9久 | 一道本视频 | 成年人视频免费在线观看 | 国产精品国产三级国产aⅴ浪潮 | 国产综合视频 | 久久精品久久久久久 | 性高湖久久久久久久久3小时 | 成人精品一区二区 | 九九亚洲精品 | 精品欧美乱码久久久久久 | 999视频 | 久久亚洲精品久久国产一区二区 | 国产区在线观看 | 成人免费视频网站在线看 | 国产精品高潮呻吟久久 | 天天干天天谢 |