|
基于STM32F103的心率傳感器相關(guān)程序
單片機(jī)源程序如下:
- #include "led.h"
- #include "lcd.h"
- #include "key.h"
- #include "adc.h"
- #include "timer.h"
- #include "common.h"
- #include "timer.h"
- #include "led.h"
- #include "beep.h"
- u8 q,i=0;
- u8 ave[50]={0};
- float ave_heart_rate=0;
- u8 sum(u8 m)
- {
- ave[2]=ave[1];
- ave[1]=ave[0];
- ave[0]=m;
- return ave[0]+ave[1]+ave[2];
- }
- //****************************************************************************
- //* 名 稱: u8 8Average(u8 ch,u8 times)
- //* 功 能:取times次,然后平均
- //* 入口參數(shù):ch: 采集每次i的值
- //* times:獲取次數(shù)
- //* 返回參數(shù):通道ch的times次轉(zhuǎn)換結(jié)果平均值
- //* 說 明:
- //****************************************************************************/
- u16 Average(u8 ch,u8 times)
- {
- if(ave[2] == 0)
- {
- if (ave[1] == 0)
- {return ch/1;}
- else
- {return ch/2;}
- }
- return ch/3;
- }
- /****************************************************************************
- * 名 稱: TIM2_Init(u16 auto_data,u16 fractional)
- * 功 能:定時(shí)器2初始化
- * 入口參數(shù):auto_data: 自動(dòng)重裝值
- * fractional: 時(shí)鐘預(yù)分頻數(shù)
- * 返回參數(shù):無
- * 說 明:定時(shí)器溢出時(shí)間計(jì)算方法:Tout=((auto_data+1)*(fractional+1))/Ft(us) Ft定時(shí)器時(shí)鐘
- ****************************************************************************/
- void TIM2_Init(u16 auto_data,u16 fractional)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //時(shí)鐘使能
-
- //定時(shí)器TIM2初始化
- TIM_TimeBaseStructure.TIM_Period = auto_data; //設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值
- TIM_TimeBaseStructure.TIM_Prescaler = fractional; //設(shè)置用來作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計(jì)數(shù)模式
- TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根據(jù)指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位
-
- TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM2中斷,允許更新中斷
- //中斷優(yōu)先級(jí)NVIC設(shè)置
- NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2中斷
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占優(yōu)先級(jí)2級(jí)
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //從優(yōu)先級(jí)3級(jí)
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
- NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
- TIM_Cmd(TIM2, ENABLE); //使能TIMx
- }
- //定時(shí)器2中斷服務(wù)程序
- void TIM2_IRQHandler(void) //TIM2中斷
- {
- if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //檢查TIM3更新中斷發(fā)生與否
- {
- q++; //沒經(jīng)過1s,記一次數(shù)
- while(q == 60) //每一分鐘重復(fù)一次
- {
- LCD_DisplayNum(120,80,i*2/3,3,16,0);
- //BEEP=!BEEP;
- ave_heart_rate=Average(sum(i*2/3),3); //取3次心率的平均值
- LCD_DisplayNum(150,110,ave_heart_rate,3,16,0);
- LED1=!LED1;
- q=0;
- i=0;
- }
- }
- TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIMx更新中斷標(biāo)志
- }
- int main(void)
- {
- u8 w=0,k=0;
- int n=0,x=0;
- float mov=0;
- float qua;
- u16 adc_data;
- float temp;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級(jí)分組2
- delay_init(); //初始化延時(shí)函數(shù)
- LED_Init(); //初始化LED
- LCD_Init(); //初始化LCD接口
- TIM2_Init(10000,7199); //定時(shí)器2時(shí)鐘72M,分頻系數(shù)7200,72M/7200=10K 所以計(jì)數(shù)10000次為1000ms,函數(shù)內(nèi)部定時(shí)1min
- ADC1_Init(); //初始化ADC
- KEY_Init(); //按鍵初始化
- LCD_Display_Dir(1); //橫屏
- while(1)
- {
-
- if(n==0)
- {
- BRUSH_COLOR=BLUE;//設(shè)置字體為藍(lán)色
- LCD_DisplayString(30,20,16,"heart_rate_VOL:");
- //LCD_DisplayString(30,150,16,"ADC1_CH1_VOL:0.000V");
- LCD_DisplayString(45,50,16,"."); //先在固定位置顯示小數(shù)點(diǎn)
- LCD_DisplayString(30,80,16,"heart_rate:");
- LCD_DisplayString(30,110,16,"AVE.heart rate:");
-
- adc_data=Get_Adc_Average(ADC_Channel_1,10);//獲取通道1的轉(zhuǎn)換值,10次取平均
- temp=(float)adc_data*(3.3/4096); //獲取計(jì)算后的帶小數(shù)的實(shí)際電壓值,比如5.1141
- if(temp>=1.7)
- { i++;
- }
- adc_data=temp; //賦值整數(shù)部分給adc_data變量,因?yàn)閍dc_data為u16整形
- LCD_DisplayNum(35,50,adc_data,1,16,0); //顯示電壓值的整數(shù)部分,5.1141的話,這里就是顯示5
- temp-=adc_data; //把已經(jīng)顯示的整數(shù)部分去掉,留下小數(shù)部分,比如5.1141-5=0.1141
- temp*=1000; //小數(shù)部分乘以1000,例如:0.1141就轉(zhuǎn)換為114.1,相當(dāng)于保留三位小數(shù)。
- LCD_DisplayNum(55,50,temp,3,16,0X80); //顯示小數(shù)部分(前面轉(zhuǎn)換為了整形顯示),這里顯示的就是114.
- delay_ms(50);
- key_scan(0);
- // if(keydown_data==KEY0_DATA) //key0按下后馬上執(zhí)行相應(yīng)代碼
- // {
- // w++;
- // LCD_DisplayString(30,150,16,"Movement:"); //移動(dòng)次數(shù)輸入個(gè)位
- // mov=10*k+w;
- // LCD_DisplayNum(110,150,mov,4,16,0);
- // }
- // if(keydown_data==KEY1_DATA) //key1按下后馬上執(zhí)行相應(yīng)代碼
- // {
- // k++;
- // LCD_DisplayString(30,150,16,"Movement:"); //移動(dòng)次數(shù)輸入十位
- // mov=10*k+w;
- // LCD_DisplayNum(110,150,mov,4,16,0);
- // }
- if(keydown_data==KEY2_DATA)
- {
- LCD_DisplayString(30,200,16,"Sleep Quality: %");
- if(ave_heart_rate<=150&&ave_heart_rate>=50) //心率在50~150之間時(shí)
- qua=(float)(((1-mov/140)/2+(-0.006*ave_heart_rate+1.1)/2)*100);
- if(ave_heart_rate>150) //心率大于150
- qua=(float)(((1-mov/140)/2+(0.2)/2)*100);
- LCD_DisplayNum(150,200,qua,4,16,0);
- }
- delay_ms(50);
- if(keydown_data==KEY3_DATA)
- {
- n++;
- }
- }
- if(n==1)
- {
- LCD_Clear(WHITE);//清屏
- n++;
- }
- if(n==2)
- {
- adc_data=Get_Adc_Average(ADC_Channel_1,10);
- //獲取通道1的轉(zhuǎn)換值,10次取平均
- temp=50*(float)adc_data*(3.3/4096);
- //獲取計(jì)算后的帶小數(shù)的實(shí)際電壓值,比如5.1141
- LCD_Color_DrawPoint(x,temp,RED);
- x++;
- if(x==320)
- {
- LCD_Clear(WHITE);//清屏
- x=0;
- }
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
程序.7z
(530.45 KB, 下載次數(shù): 190)
2019-5-11 03:56 上傳
點(diǎn)擊文件名下載附件
|
|