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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)