心跳代码c语言

心跳代码c语言,第1张

心跳代码谨李铅C语言:while(1) {

printf("心跳")

delay(1000)

}网名:心跳之旅

拓展:记录我的每一扰磨段心跳,踏上祥好旅程去寻找美丽的未来。

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

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


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

原文地址: http://outofmemory.cn/yw/12527313.html

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

发表评论

登录后才能评论

评论列表(0条)

保存