系统功能:
系统上电后OLED显示“欢迎使用心率血压系统请稍后”后两秒后进入正常页面显示
第一行显示press1压力值
第二行显示press2压力值
第三行显示心率值
系统上电前把压力针头拔出到最大位置,系统上电后采集到的压力为4,推动针头
压力值会变大。
XL01心率传感器模块是光电型采集模块受光线干扰较大,使用时尽量避免强光干扰
将手指轻按在模块光电收发口上,待模块上的指示灯均匀闪动时即可测出心率值。
短按SW1按键后SU-03T离线语音模块会播报两个压力值和心率值
主要功能模块原理图:
单片机接口电路:
按键输入电路:
心率压力采集电路:
系统主要功能模块代码
系统初始化代码:
//P3.0,P3.1,P3.2,P3.3,P3.6,P3.7设置为准双向口
P3M1 &= 0x30;
P3M0 &= 0x30;
P5M1 &= 0xCF;
P5M0 &= 0xCF; //P5.4,P5.5设置为准双向口
InitVar();
InitADC();
InitUart1();
InitTimer0();
InitOled();
InitOledDisp();
EA = 1; //打开总中断
系统控制代码:
void SystemControl(void)
{
char textBuf[30];
unsigned char adVal = 0;
float volVal = 0;
float pressVal = 0;
unsigned int tempVal = 0;
adVal = GetADCResult(0);
volVal = adVal*0.01294;
pressVal = 48.41*volVal + 4.41;
if(pressVal>60000.0)
{
pressVal = 60000.0;
}
press1 = (unsigned int)pressVal;
sprintf(textBuf,"Press1:%5dkPa", press1);
OledShowString(0, 0, (uint8_t*)textBuf, OLED_FONT_8X16); //测试8*16字符
adVal = GetADCResult(1);
volVal = adVal*0.01294;
pressVal = 48.41*volVal + 4.41;
if(pressVal>60000.0)
{
pressVal = 60000.0;
}
press2 = (unsigned int)pressVal;
sprintf(textBuf,"Press2:%5dkPa", press2);
OledShowString(0, 2, (uint8_t*)textBuf, OLED_FONT_8X16); //测试8*16字符
sprintf(textBuf,"Rate:%3d", rateVal);
OledShowString(0, 4, (uint8_t*)textBuf, OLED_FONT_8X16); //测试8*16字符
}
计算心率代码:
//读心率
void CalculateRate(void)
{
switch(readRateIndex)
{
case READ_RATE_IDLE:
if(RATE_PIN==LOW_LEVEL)
{
readRateIndex = READ_RATE_LOW;
}
break;
case READ_RATE_LOW:
rateLowCnt++;
if(RATE_PIN==HIGH_LEVEL)
{
if(rateLowCnt>=60)
{
readRateIndex = READ_RATE_HIGH;
}
else
{
readRateIndex = READ_RATE_IDLE;
}
rateLowCnt = 0;
}
break;
case READ_RATE_HIGH:
rateHighCnt++;
if(RATE_PIN==LOW_LEVEL)
{
rateVal = 60000/rateHighCnt;
if(rateVal>150)
{
rateVal = 150;
}
else if(rateVal<70)
{
rateVal = 70;
}
rateHighCnt = 0;
readRateIndex = READ_RATE_IDLE;
}
break;
default:
break;
}
}//读心率
void CalculateRate(void)
{
switch(readRateIndex)
{
case READ_RATE_IDLE:
if(RATE_PIN==LOW_LEVEL)
{
readRateIndex = READ_RATE_LOW;
}
break;
case READ_RATE_LOW:
rateLowCnt++;
if(RATE_PIN==HIGH_LEVEL)
{
if(rateLowCnt>=60)
{
readRateIndex = READ_RATE_HIGH;
}
else
{
readRateIndex = READ_RATE_IDLE;
}
rateLowCnt = 0;
}
break;
case READ_RATE_HIGH:
rateHighCnt++;
if(RATE_PIN==LOW_LEVEL)
{
rateVal = 60000/rateHighCnt;
if(rateVal>150)
{
rateVal = 150;
}
else if(rateVal<70)
{
rateVal = 70;
}
rateHighCnt = 0;
readRateIndex = READ_RATE_IDLE;
}
break;
default:
break;
}
}
此设计提供的资料包含原理图PCB(包含PDF,AD,立创EDA三个版本),源代码,系统框图,主程序流程图,物料清单(包含使用到的器件手册),功能操作说明等。