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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6992|回復: 4
收起左側

基于STM32F103的心率傳感器源代碼

[復制鏈接]
ID:301268 發表于 2019-5-10 18:26 | 顯示全部樓層 |閱讀模式
基于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)


回復

使用道具 舉報

ID:1 發表于 2019-5-11 03:56 | 顯示全部樓層
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

ID:189285 發表于 2019-5-11 11:24 | 顯示全部樓層
這個東西好
回復

使用道具 舉報

ID:248814 發表于 2019-11-14 16:43 | 顯示全部樓層
好東西,學習了
回復

使用道具 舉報

ID:644582 發表于 2019-11-18 22:26 | 顯示全部樓層
求分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费天天干 | 国产在线视频一区 | 久久亚洲精品久久国产一区二区 | 国产精品久久亚洲7777 | 国产亚洲精品久久情网 | 久久精彩视频 | 日韩在线观看中文字幕 | 午夜手机在线视频 | 成人在线观看免费 | 久草视频网站 | 在线视频一区二区三区 | 久操伊人 | 亚洲一区二区三区在线视频 | 国产91久久久久久 | 美女久久 | 国产精品99久久久久久www | 亚洲综合在线网 | 欧美日韩高清免费 | 欧美激情综合网 | 久久久久国产一区二区三区四区 | 日韩中文在线视频 | 欧美一级淫片007 | 天天插天天干 | 成人精品 | 国产精品区二区三区日本 | 男女免费网站 | 久久精品一区 | av在线免费观看网站 | 成人免费观看男女羞羞视频 | 久久久青草婷婷精品综合日韩 | 永久看片| a级毛片国产 | 久久精品亚洲成在人线av网址 | 日韩视频在线一区二区 | 在线中文字幕国产 | 国产情侣一区 | 一区二区三区视频在线免费观看 | 久久亚洲高清 | 91影视| 欧美一区二区三区,视频 | 久在线观看 |