谁有pulsesensor心率传感器 的c语言程序,带注释的。在线等挺急的

谁有pulsesensor心率传感器 的c语言程序,带注释的。在线等挺急的,第1张

这个是主程序和部分代码由于字数限制所以你还是留个邮箱吧

void main(void)

{

unsigned char i

sys_init()

beep = 1

LCD12864_DisplayOneLine(0x80,ucStr1)//显示信息1

LCD12864_DisplayOneLine(0x90,ucStr2)//显示信息2

LCD12864_DisplayOneLine(0x88,ucStr3)//显示信息3

LCD12864_DisplayOneLine(0x98,ucStr4)//显示信息4

while(1)

{

sendDataToProcessing('S', Signal)// 发送并处理原始脉搏传感器数据

if (QS == true){ // 确定发现一个心跳

fadeRate = 255 // Set 'fadeRate' Variable to 255 to fade LED with pulse

sendDataToProcessing('B',BPM) // 发送一个'B'和心率

sendDataToProcessing('Q',IBI) // send time between beats with a 'Q' prefix

QS = false // reset the Quantified Self flag for next time

LCD_disp_list_char(2,4,DisBuff)//在LCD12864上显示BPM

}

delay(138)// 延时 19.6ms

LCD_disp_list_char(4,4,DisBuff2)

//ledFadeToBeat()

if(Pressure<100){

for(i=0i<8i++){

delay(1000)}

if (Pressure<100){

beep = 0}}

if(BPM<60|BPM>100){

for(i=0i<9i++){

delay(1000)}

if(BPM<60|BPM>100){

beep = 0}

for(i = 0i<16i++) //依次执行写入 *** 作

{

putchar(ucStr1[i])

}

for(i = 0i<16i++) //依次执行写入 *** 作

{

putchar(ucStr2[i])

}

for(i=0i<3i++)

{

putchar(DisBuff[i])}

for(i = 0i<16i++) //依次执行写入 *** 作

{

putchar(ucStr3[i])

}

for(i = 0i<16i++) //依次执行写入 *** 作

{

putchar(ucStr4[i])

}

for(i=0i<4i++)

{

putchar(DisBuff2[i])}

}

}

//void ledFadeToBeat(){

//fadeRate -= 15// set LED fade value

//fadeRate = constrain(fadeRate,0,255) // keep LED fade value from going into negative numbers!

//analogWrite(fadePin,fadeRate) // fade LED

// }

/******************************************************************************

函数名称:GetADCResult

函数功能:获取AD转换结果函数

入口参数:BYTE ch(通道选择)

返回值:result(A/D转换结果)

备注:无

*******************************************************************************/

unsigned int GetADCResult(BYTE ch)

{ unsigned int result //AD转换结果result

ADC_CONTR&=0xf8 //清除ADC控制寄存器ADC CONTR的CHS2、CHS1、CHS0(清除通道选择)

_nop_() //设置ADC CONTR控制寄存器后,要加4个空 *** 作延时才可以正确读到ADC CONTR寄存器的值

_nop_()

_nop_()

_nop_()

ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START//开ADC电源,选择AD转换速率,并选择AD通道,开始AD转换

_nop_() //设置ADC CONTR控制寄存器后,要加4个空 *** 作延时才可以正确读到ADC CONTR寄存器的值

_nop_()

_nop_()

_nop_()

while (!(ADC_CONTR &ADC_FLAG))//等待AD转换结束

ADC_CONTR &= ~ADC_FLAG//关闭ADC

result=ADC_RES//将AD转换结果的高两位赋给result

result=result<<8 //将result循环左移8位

result+=ADC_RESL //将AD转换结果的底8位加高两位共10位给result

return result //返回10位AD转换结果

}

void sendDataToProcessing(char symbol, int dat ){

putchar(symbol) // symbol prefix tells Processing what type of data is coming

printf("%d\r\n",dat) // the data to send culminating in a carriage return

}

void UART_init(void)

{

TMOD = 0x20 //定时器工作在定时器1的方式2

PCON = 0x00 //不倍频

SCON = 0x50//串口工作在方式1,并且启动串行接收

TH1 = 0xFd//设置波特率 9600

TL1 = 0xFd

TR1 = 1 //启动定时器1

}

char putchar(unsigned char dat)

{

TI=0

SBUF=dat

while(!TI)

TI=0

return SBUF

}

void _nop_ (void)

{}

void T0_init(void){

// Initializes Timer0 to throw an interrupt every 2mS.

TMOD |= 0x01//16bit TIMER

TL0=T0MS

TH0=T0MS>>8

TR0=1 //start Timer 0

ET0=1 //enable Timer Interrupt

EA=1// MAKE SURE GLOBAL INTERRUPTS ARE ENABLED

}

void T1_init(void){

// Initializes Timer0 to throw an interrupt every 2mS.

TMOD |= 0x01//16bit TIMER

TL1=T0MS2

TH1=T0MS2>>8

TR1=1 //start Timer 0

ET1=1 //enable Timer Interrupt

EA=1// MAKE SURE GLOBAL INTERRUPTS ARE ENABLED

}

void ADC_init(unsigned char channel)

{

P1ASF=ADC_MASK<<channel//选择P1. channel作为A/D输入来用

ADC_RES=0//清除ADC结果寄存器RES

ADC_RESL=0//清除ADC结果寄存器RESL

AUXR1 |= 0x04//调整ADC格式的结果

}

void Timer1_rountine(void) interrupt 1

{}

unsigned int analogRead(unsigned char channel)

{

unsigned int result

while (!(ADC_CONTR &ADC_FLAG))//Wait complete flag

ADC_CONTR &=!ADC_FLAG//clear ADC FLAG

result=ADC_RES

result=result<<8

result+=ADC_RESL

// ADC_CONTR|=channel|ADC_POWER|ADC_SPEEDLL|ADC_START

return result

}

// Timer 0中断子程序,每2MS中断一次,读取AD值,计算心率值

void Timer0_rountine(void) interrupt 1

{

int N

unsigned char i

// keep a running total of the last 10 IBI values

unsigned int runningTotal = 0 // clear the runningTotal variable

EA=0 // 关定时器中断

TL0=T0MS

TH0=T0MS>>8 //重装16位定时器初值

Pressure = (GetADCResult(PressurePin)) //****************

DisBuff2[3] = Pressure%10+48//取个位数

DisBuff2[2] = Pressure%100/10+48//取十位数

DisBuff2[1] = Pressure%1000/100+48 //百位数 ***************

DisBuff2[0] = Pressure/1000+48//取千位数

Signal = GetADCResult(PulsePin) // 读脉搏传感器

sampleCounter += 2// 使用这个值跟踪记录脉搏时间间隔在ms级

N = sampleCounter - lastBeatTime // 减上个节拍的时间来避免噪声

// 找到脉搏波的波峰和波谷

if(Signal <thresh &&N >(IBI/5)*3){ // 如果脉搏传感器输出小于电源电压一半 并且 消除噪声时间小于 3/5个脉搏时间间隔

if (Signal <Trough){// 如果脉搏传感器输出小于波谷

Trough = Signal// 跟踪脉搏波的最低点

}

}

if(Signal >thresh &&Signal >Peak){ // 如果输出大于电源电压一半并且大于波峰

Peak = Signal// 将新值设为波峰

}// 跟踪脉搏波的波峰

if (N >250){ // 避免高频噪声

if ( (Signal >thresh) &&(Pulse == false) &&(N >(IBI/5)*3) ){

Pulse = true // 当检测到一个脉搏时将脉搏标志设为真

blinkPin=0 // 点亮脉搏灯

IBI = sampleCounter - lastBeatTime// 测量两个脉搏的时间in mS

lastBeatTime = sampleCounter // 跟踪脉搏时间

if(secondBeat){// 如果这是第二个脉搏

secondBeat = false // 清除标识

for(i=0i<=9i++){ // 全部的数据作为真实脉搏BMP

rate[i] = IBI

}

}

if(firstBeat){ // 如果是第一个脉搏

firstBeat = false // 清除标志

secondBeat = true // 设置第二脉搏标志

EA=1 //开中断

return // IBI 值是不可靠的所以抛弃

}

for(i=0i<=8i++){// 移动数据在rate数组中

rate[i] = rate[i+1] // 顶替旧值

runningTotal += rate[i] // 加上第九个新值

}

rate[9] = IBI // 加最后的IBI到rate数组中

runningTotal += rate[9] // 加上一个IBI到runningTotal

runningTotal /= 10// 取平均值

BPM = 60000/runningTotal // 一分钟可以检测到多少个心跳及 BPM!

if(BPM>200)BPM=200 //限制BPM最高显示值

if(BPM<30)BPM=30 //限制BPM最低显示值

DisBuff[2] = BPM%10+48//取个位数

DisBuff[1] = BPM%100/10+48//取十位数

DisBuff[0] = BPM/100+48 //百位数

if(DisBuff[0]==48)

DisBuff[0]=32

QS = true // 设置QS标志

// QS FLAG IS NOT CLEARED INSIDE THIS ISR

}

}

if (Signal <thresh &&Pulse == true){ // 当电压归零节拍结束

blinkPin=1 // 熄灭脉搏灯

Pulse = false// 重置脉搏标识我们可以重新测

amp = Peak - Trough // 得到脉搏波的峰峰值

thresh = amp/2 + Trough // 设置thresh位脉搏峰峰值的一半

Peak = thresh // 为下一次测试重置波峰

Trough = thresh

}

if (N >2500){ //如果超过2.5秒没有检测到一个脉搏

thresh = 512 // 重新设置波谷

Peak = 512 // 重新设置波峰

Trough = 512 // 重新设置间隔

lastBeatTime = sampleCounter // 把最后的节拍时间更新

firstBeat = true // 重新设置标志避免噪声

secondBeat = false // 当我们得到心跳的时候

}

EA=1 // 开中断

}// end isr

/sendtimebetweenbeatswitha/在LCD12864上显示BPM

}

delay(138)9Set/发送并处理原始脉搏传感器数据

if(QS==true){//fadeRateVariableto255tofadeLEDwithpulse

sendDataToProcessing(BQi++){

delay(1000)}

if(Pressure<100){

beep=0}}

if(BPM<60|BPM>100){

for(i=0i<显示信息4

while(1)

{

sendDataToProcessing(}

}

}

//AD转换结果result

ADC_CONTR&=0xf8/依次执行写入 *** 作

{

putchar(ucStr3[i])

}

for(i=0

_nop_()/延时19.6ms

LCD_disp_list_char(4,DisBuff2)设置ADCCONTR控制寄存器后/S确定发现一个心跳

fadeRate=255,0/voidledFadeToBeat(){

//,BPM)///analogWrite(fadePin,fadeRate)/:GetADCResult

函数功能:获取AD转换结果函数

入口参数,Signal)

sys_init()

beep=1

LCD12864_DisplayOneLine(0x80,ucStr1)//,255)//prefix

QS=false/,IBI),4/resettheQuantifiedSelfflagfornexttime

LCD_disp_list_char(2:BYTEch(通道选择)

返回值:result(A///依次执行写入 *** 作

{

putchar(ucStr2[i])

}

for(i=0、CHS1、CHS0(清除通道选择)

_nop_()//显示信息1

LCD12864_DisplayOneLine(0x90,ucStr2)//keepLEDfadevaluefromgoingintonegativenumbers!

/B}

for(i=0i<3i++)

{

putchar(DisBuff[i])/清除ADC控制寄存器ADCCONTR的CHS2,DisBuff)/16i++)/和心率

sendDataToProcessing(setLEDfadevalue

//,要加4个空 *** 作延时才可以正确读到ADCCONTR寄存器的值

_nop_()4i++)//,4i++){

delay(1000)}

if(BPM<60|BPM>100){

beep=0i<16/i++)//8

}

for(i=0Q/}

/******************************************************************************

函数名称显示信息2

LCD12864_DisplayOneLine(0x88,ucStr3)//ledFadeToBeat()显示信息3

LCD12864_DisplayOneLine(0x98,ucStr4)//i<16}

for(i=0i<

unsignedintGetADCResult(BYTEch)

{unsignedintresult//依次执行写入 *** 作

{

putchar(ucStr1[i])/fadeLED

/i<16fadeRate=constrain(fadeRatei++)///发送一个fadeRate-=15//D转换结果)

备注:无

*******************************************************************************/

_nop_()

ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START//开ADC电源,选择AD转换速率,并选择AD通道,开始AD转换

_nop_()//设置ADCCONTR控制寄存器后,要加4个空 *** 作延时才可以正确读到ADCCONTR寄存器的值

_nop_()

_nop_()

_nop_()

while(!(ADC_CONTR&ADC_FLAG))//等待AD转换结束

ADC_CONTR&=~ADC_FLAG//关闭ADC

result=ADC_RES//将AD转换结果的高两位赋给result

result=result<<8//将result循环左移8位

result+=ADC_RESL//将AD转换结果的底8位加高两位共10位给result

returnresult//返回10位AD转换结果

}

voidsendDataToProcessing(charsymbol,intdat){

putchar(symbol)//symbolprefixtellsProcessingwhattypeofdataiscoming

printf(\"%drn

常见的脉搏传感器是一种微压力传感器。该传感器紧贴测量点皮肤后,能将脉搏跳动的压力过程转换为信号输出,测量仪器可以显示脉搏跳动的细微过程和周期。

第一个给大家介绍一下光学传感器的原理指纹识别技术是当今应用最为广泛的生物识别技术。指纹图像的采集处于指纹识别系统的最前端,是其关键技术之一。在对多种指纹采集技术分析和比较的基础上,详细介绍了美国Veridicom公司生产的新一代 电容 式指纹传感器FPS200的性能、结构及工作原理。该传感器具有高性能、低功耗、低价格和小体积等优点,并且内置了三种通信接口,可以方便地集成到各种嵌入式设备。最后给出一套指纹采集仪的硬件设计方案和图像采集程序,对传感器的使用和设计中的关键问题进行了具体说明。

第二个是声波传感器人们能听到声音是由于物体振动产生的,它的频率在20HZ-20KHZ范围内,超过20KHZ称为超声波,低于20HZ的称为次声波。常用的超声波频率为几十KHZ-几十MHZ。超声波是一种在d性介质中的机械振荡,有两种形式:横向振荡(横波)及纵和振荡(纵波)。在工业中应用主要采用纵向振荡。超声波可以在气体、液体及固体中传播,其传播速度不同。另外,它也有折射和反射现象,并且在传播过程中有衰减。在空气中传播超声波,其频率较低,一般为几十KHZ,而在固体、液体中则频率可用得较高。在空气中衰减较快,而在液体及固体中传播,衰减较小,传播较远。利用超声波的特性,可做成各种超声传感器,配上不同的电路,制成各种超声测量仪器及装置,并在通迅,医疗 家电 等各方面得到广泛应用。

第三个是测力传感器通过测力传感器原理,用户能够比较清楚的了解测力传感器是如何进行工作的。同时测力传感器,广泛应用于印刷、复合、涂布、剪切、造纸、 橡胶 、纺织、 电线电缆 及胶片等卷取控制设备和生产线上,能与国外同类传感器互换。测力传感器是由一个或多个能在受力后产生形变的d性体,和能感应这个形变量的 电阻 应变片组成的电桥电路,以及能把电阻应变片固定粘贴在d性体上并能传导应变量的粘合剂和保护电子电路的密封胶等三大部分组成测力传感器,测力传感器的测量原理。

 


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11113837.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-13
下一篇2023-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存