基于51单片机的心率脉搏计检测系统

1.功能原理
脉搏传感器采样脉搏信号,采用STC89C51单片机作为控制器,脉搏传感器输出方波传入单片机,触发单片机进去外部中断函数,每接收一个脉冲波形,显示屏就计数一次。如果脉搏次数超过设定值是,用蜂鸣器报警提示。

2.硬件设计
(1)总体硬件框图
在这里插入图片描述
(2)心率检测电路原理
心率检测电路是以红外反射式传感器ST188为检测原件,并利用单片机系统内部定时器来计算时间。
在这里插入图片描述
心率检测处理电路

此电路采用两级运算放大电路,一级放大倍数为可调,二级放大倍数固定为2。当红外反射式传感器ST188感应到一个完整的脉搏,便产生一个脉冲,单片机通过对脉冲累加得到脉搏心率跳动次数,并使用定时器计数脉搏的频率。系统运行中能显示脉搏心率次数和时间,系统停止运行时,能够显示总的脉搏心率次数和时间。
(3)其他硬件电路
除了主要的心率检测电路外,还包括单片机最小系统、LCD1602显示屏电路、蜂鸣器报警电路。因为这几个电路比较常用,就省略不介绍了。

3.程序设计
(1)LCD1602驱动程序

sbit RS = P2^5;//Pin4
sbit RW = P2^6; //Pin5
sbit E  = P2^7;//Pin6
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long 

uchar data TimeNum[]="                ";
uchar data Test1[]="                  ";

 void DelayUs(unsigned char us)//delay us
{
 unsigned char uscnt;
 uscnt=us>>1;/* Crystal frequency in 12MHz*/
 while(--uscnt);
}
  

/******************************************************************/
void DelayMs(unsigned char ms)//delay Ms
{
 while(--ms)
   {
     DelayUs(250);
     DelayUs(250);
	 DelayUs(250);
	 DelayUs(250);
   }
}
void WriteCommand(unsigned char c)
{
 DelayMs(5);//short delay before operation
 E=0;
 RS=0;
 RW=0;
 _nop_();
 E=1;
 P1=c;
 E=0;
}
/****************************************************************/
void WriteData(unsigned char c)
{
 DelayMs(5);   //short delay before operation
 E=0;
 RS=1;
 RW=0;
 _nop_();
 E=1;
 P1=c;
 E=0;
 RS=0;
}
/*********************************************************************/
void ShowChar(unsigned char pos,unsigned char c)
{
 unsigned char p;
 if (pos>=0x10)
    p=pos+0xb0; //是第二行则命令代码高4位为0xc
 else 
    p=pos+0x80; //是第二行则命令代码高4位为0x8
 WriteCommand (p);//write command
 WriteData (c);   //write data
}
/*************************************************************************/
void ShowString (unsigned char line,char *ptr)
{
 unsigned char l,i;
 l=line<<4;
 for (i=0;i<16;i++)
  ShowChar (l++,*(ptr+i));//循环显示16个字符
}
/*********************************************************************/
void InitLcd()
{
 DelayMs(15);
 WriteCommand(0x38); //display mode
 WriteCommand(0x38); //display mode
 WriteCommand(0x38); //display mode
 WriteCommand(0x06); //显示光标移动位置
 WriteCommand(0x0c); //显示开及光标设置
 WriteCommand(0x01); //显示清屏

}

(2)脉搏检测处理程序

unsigned int i,n,ci,dd[11],jj,j,k,tmp;
bit w=0;
uchar bh;
ulong time;
sbit spd = P2^0;


external0() interrupt 0//外部中断服务程序
{ 
  	w=~w;
	if(w==0)
	{
	  EX0=0; 
	  ET0=1;
	  TH0=0x0;
    TL0=0x0;
	  n=0;
	}
	else 
	{
		time=n*65536+TH0*256+TL0;
		dd[jj]=30000000/time;        //计算脉搏时间
		jj++;
		if(jj>10)
		{
		   jj=0;
		   for(j=0;j<11;j++)
		      for(k=0;k<11-j;k++)
			     {
				     if(dd[k]>dd[k+1])
					  {
					  	 tmp=dd[k];
					 	 dd[k]=dd[k+1];
						 dd[k+1]=tmp;
					 
					  }
				 	  

				 
				 }
		   if(dd[5]>50&&dd[5]<200)ci=((dd[4]+dd[5]+dd[6])/3)+11;
	
		}
		TH0=0x0;
        TL0=0x0;
		n=0;
	
	}
}
void timer0(void) interrupt 1
{
 n++;

}

(3)主函数

void main(void)
{
	InitLcd();//
	DelayMs(15);
	IT0=1;     //INT0下降沿中断
	EX0=1;     //允许INT1中断
	TMOD=0x1;
	TH0=0x0;
	TL0=0x0; 
	TR0=1;
	ET0=1;
	EA=1;

	while(1)
	{
		 if(n>10)
		 {
			 n=0;	 
			 jj=0;
			 ci=0;
					 TimeNum[0]='N'; 
					 TimeNum[1]='O' ;
				 TimeNum[2]=' ' ;
				 TimeNum[3]='I' ;	
				 TimeNum[4]='N' ;
			 TimeNum[5]='P' ;
			 TimeNum[6]='U' ;
			 TimeNum[7]='T' ;
			 TimeNum[8]=' ' ;
			 ShowString(0,TimeNum);
				 ShowString(1,Test1);
			}
			else	
			{
				if(w==0&&EX0==0)
				{
					delay();
					EX0=1;
				}  

				TimeNum[0]=' '; 
				TimeNum[1]=' ' ;
				TimeNum[2]=' ' ;
				TimeNum[3]=' ' ;	
				TimeNum[4]=' ' ;	 
				TimeNum[5]=' ' ; 
				
				if(ci/100>0)TimeNum[6]=ci/100+'0' ; else TimeNum[6]=' ' ; 
				if(ci/100==0&&ci%100/10>0)TimeNum[7]=ci%100/10+'0' ; else TimeNum[7]=' ' ; 
				TimeNum[8]=ci%10+'0' ;
				ShowString(0,TimeNum);
				ShowString(1,Test1);
				if(ci>100)spd=0;else spd=1;
			}
		
		}
	;
}

源码+AD电路图 下载:关注公众号,首页回复“心率脉搏计”获取资料
在这里插入图片描述

  • 24
    点赞
  • 286
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值