基于STC89C52单片机的多功能脉搏测量仪设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于STC89C52单片机的多功能脉搏测量仪设计的详情介绍,如果对您有帮助的话,还请关注一下哦,如果有资源方面的需要可以联系我。

下方是资源的下载链接(如果打开不显示就是资源在审核中,如果着急需要的话可以私信我获取)

基于STC89C52单片机的多功能脉搏测量仪设计资源-CSDN文库

摘要

脉搏测量仪在我们的日常生活中已经得到了非常广泛的应用,通过观测脉搏信号,可以对人体的健康进行检查,通常被用于保健中心和医院。为了提高脉搏测量仪的简便性和精确度,本课题设计了一种基于51单片机的脉搏测量仪。系统以STC89C52单片机为核心,以光电传感器利用单片机系统内部定时器来计算时间,由光电传感器感应产生信号,单片机通过对信号累加得到脉搏跳动次数,时间由定时器定时而得。系统运行中可以通过观察指示灯闪烁,若均匀闪烁说明测量值准确。系统停止运行时,能够显示总的脉搏次数,此外我们也加了温度传感器DS18B20来检测人体温。经测试,系统工作正常,达到设计要求。

本设计利用红外光电传感器产生脉冲信号,经过放大整形后,输入单片机内进行相应的控制,从而测量出一分钟内的脉搏跳动次数,快捷方便。系统可以供用户测量当时的脉搏次数,同时还可以设定上限次数和下限次数,当测量的范围超过设定的范围则驱动蜂鸣器报警提醒,当检测的体温超过设置的温度上下限也会蜂鸣器报警提醒,结果最终可以把采集到的脉搏信号显示在LCD1602上。

**关键词:**STC89C52;脉搏测量仪;LCD显示器;光电传感器;DS18B20

PCB图


仿真图


实物图


原理图


代码


#include <reg52.h>	         //调用单片机头文件
#define uchar unsigned char  //无符号字符型 宏定义	变量范围0~255
#define uint  unsigned int	 //无符号整型 宏定义	变量范围0~65535
#include<DS18N02.h>
#include <intrins.h>
#include "eeprom52.h"


#define DBPort P0		

unsigned char i=0,timecount=0,displayOK=0,rate=0,rate1=0,aa=0,time1=0,flat300ms=0;
unsigned int time[6]={0};
unsigned int oneminte=0;
unsigned int ReadTempDate;
unsigned char S_temp_H,S_temp_L,S_heart_H,S_heart_L;
unsigned char yemian=0,biaozhi=0;


sbit K1 = P1^0; //菜单
sbit K2 = P1^1;  //加
sbit K3 = P1^2;  //减
sbit Buzzer= P1^7;  //控制


sbit rs = P2^5 ; 
sbit rw = P2^6 ;
sbit ep = P2^7 ;


bit flag=1;
 

/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{
	SectorErase(0x2000);
	byte_write(0x2000, S_heart_H);
	byte_write(0x2001, S_heart_L);
	byte_write(0x2002, S_temp_H);
	byte_write(0x2003, S_temp_L);
	
	
    byte_write(0x2060, a_a);	
}

/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
	S_heart_H = byte_read(0x2000);
	S_heart_L = byte_read(0x2001);
	S_temp_H = byte_read(0x2002);
	S_temp_L = byte_read(0x2003);
    a_a      = byte_read(0x2060);
}

/**************开机自检eeprom初始化*****************/
void init_eeprom()
{
	read_eeprom();		//先读
	if(a_a != 2)		//新的单片机初始单片机内问eeprom
	{
		S_heart_H = 120;
	    S_heart_L = 60;
	    S_temp_H = 38;
	    S_temp_L = 5;
		a_a = 2;
		write_eeprom();
	}	
}

/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
	uint i,j;
	for(i=0;i<q;i++)
		for(j=0;j<110;j++);
}


/********************************************************************
* 名称 : delay_uint()
* 功能 : 小延时。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay_uint(uint q)
{
	while(q--);
}


typedef bit BOOL  ; 


uchar data_byte;

void delay(uchar ms)
{       // 延时子程序
	 uchar i ;
	 while(ms--)
	 {
	  	for(i = 0 ; i<250;i++) ;
	 }
}

void delay1()//延时10us
{
	uchar i;
	i--;
	i--;
	i--;
	i--;
	i--;
	i--;
}
void longdelay(uchar s) //长延时
{
	 while(s--)
	 {
	  	delay(10) ;
	 }
}


/************************LCD模块******************************************/

BOOL lcd_bz()//测试LCD忙碌状态
{      
	 BOOL result ;
	 rs = 0 ;
	 rw = 1 ;
	 ep = 1 ;
	 result = (BOOL)(P0 & 0x80) ;
	 ep = 0 ;
	 return result ; 
}

void write_cmd(uchar cmd)// 写指令
{       
 	while(lcd_bz()) ;
    P0 = cmd ;
	ep = 1 ;
	ep = 0 ;  
}

void write_addr(uchar addr)//写地址
{       
 	write_cmd(addr|0x80) ;
}

void write_byte(uchar dat)//写字节
{      
 	while(lcd_bz()) ;
  	rs = 1 ;
  	rw = 0 ;
  	ep = 0 ;
  	P0 = dat ;
  	ep = 1 ;
  	ep = 0 ; 
}

void lcd_init()// 初始化
{       
	 write_cmd(0x38) ; 
	 delay(1);
	 write_cmd(0x08) ;  
	 delay(1);
	 write_cmd(0x01) ; 
	 delay(1);
	 write_cmd(0x06) ;
	 delay(1);
	 write_cmd(0x0c) ; 
	 delay(1);
}

 display(uchar addr, uchar q)//在某一地址上显示一字节
{ 	 
	 delay(1) ;
	 write_addr(addr) ;
   write_byte(q) ;
	// longdelay(1) ;
	 
}


void show1()
{     
	     lcd_init();// 初始化   
	     //  Welcome
         
		
		 display(0x05,'W');
         display(0x06,'e');
		 display(0x07,'l');
		 display(0x08,'c');
		 display(0x09,'o');
		 display(0x0a,'m');
         display(0x0b,'e');
	     longdelay(50);//短暂延时
		
  
		 display(0x42,' ');
         display(0x43,' '); 
		 display(0x44,' ');
		 display(0x45,' ');
		 display(0x46,' ');
		 display(0x48,' ');
	     display(0x49,' ');
	     display(0x4a,' ');
		 display(0x4b,' ');
	     longdelay(50);//短暂延时
	

}


void key() //按键程序 选择菜单模式
{
     
	  if(!K1)
		   {  
			   delay_1ms(20);
			    if(!K1)
		         {   
					 while(!K1)
				           ;
						  yemian++;
						  if(yemian>=5) { yemian=0; } 
								
             }
		   }
}




void shezhi()  //对里面的数值进行修改
{
   if(!K2)            //按下按键
  	  {
	   delay_1ms(20);
		if(!K2)
		  { 
            if(yemian==1) 
              {								
				S_heart_H+=1;       //没按下一次,数值加1
				if(S_heart_H>=200)  {S_heart_H=200;}
                write_eeprom();       //保存数据
				 
                 display(0x46,S_heart_H/100+'0');
	             display(0x47,S_heart_H%100/10+'0');
                 display(0x48,S_heart_H%100%10+'0');				
              }
							
           if(yemian==2) 
              {								
				S_heart_L+=1;       //没按下一次,数值加1
				if(S_heart_L>=200)  {S_heart_L=200;}
                write_eeprom();       //保存数据
				 
                 display(0x46,S_heart_L/100+'0');
	             display(0x47,S_heart_L%100/10+'0');
                 display(0x48,S_heart_L%100%10+'0');				
              }
							
			if(yemian==3) 
              {								
			    S_temp_H+=1;       //没按下一次,数值加1
				if(S_temp_H>=125)  {S_temp_H=125;}
                write_eeprom();       //保存数据
				   
				   display(0x46,S_temp_H/100+'0');
	               display(0x47,S_temp_H%100/10+'0');
                   display(0x48,S_temp_H%100%10+'0');
             }
			 
			if(yemian==4) 
              {								
			    S_temp_L+=1;       //没按下一次,数值加1
				if(S_temp_L>=125)  {S_temp_L=125;}
                write_eeprom();       //保存数据
				   
				   display(0x46,S_temp_L/100+'0');
	               display(0x47,S_temp_L%100/10+'0');
                   display(0x48,S_temp_L%100%10+'0');
             }	
			 	
           }
				  // while(!K2);      //等待按键 弹起  屏蔽此句,可以实现按键按下不放开时,连加技术功能,
					                  //   不过需要将上面延时去抖时间延长效果才好。建议改为: delay_LCD(50);  
      }
			 
			 
   if(!K3)            //按下按键
  	 {
	  delay_1ms(20);
		if(!K3)
		  { 
           if(yemian==1) 
             {								
			    
				if(S_heart_H<=1)  {S_heart_H=1;}
				S_heart_H-=1;       //没按下一次,数值加1
                write_eeprom();       //保存数据
				
				 display(0x46,S_heart_H/100+'0');
	             display(0x47,S_heart_H%100/10+'0');
                 display(0x48,S_heart_H%100%10+'0');				

			 }

			 if(yemian==2) 
             {								
			    
				if(S_heart_L<=1)  {S_heart_L=1;}
				S_heart_L-=1;       //没按下一次,数值加1
                write_eeprom();       //保存数据
				
				 display(0x46,S_heart_L/100+'0');
	             display(0x47,S_heart_L%100/10+'0');
                 display(0x48,S_heart_L%100%10+'0');				

			 }
							
			if(yemian==3) 
              {	
			    if(S_temp_H<=1)  {S_temp_H=1;}							
			    S_temp_H-=1;       //没按下一次,数值加1
                write_eeprom();       //保存数据

			    display(0x46,S_temp_H/100+'0');
	            display(0x47,S_temp_H%100/10+'0');
                display(0x48,S_temp_H%100%10+'0');

			
			 }
			 
		   if(yemian==4) 
              {	
			    if(S_temp_L<=1)  {S_temp_L=1;}							
			    S_temp_L-=1;       //没按下一次,数值加1
                write_eeprom();       //保存数据

			    display(0x46,S_temp_L/100+'0');
	            display(0x47,S_temp_L%100/10+'0');
                display(0x48,S_temp_L%100%10+'0');

			
			 }		
           }
				//   while(!K3);      //等待按键 弹起  //等待按键 弹起  屏蔽此句,可以实现按键按下不放开时,连加技术功能,
					                  //   不过需要将上面延时去抖时间延长效果才好。建议改为: delay_LCD(50);  
	  }

		
} 

void wendumaibo()
{

 	if(displayOK==0)//如果显示关
		{
		    display(0x06,'W');
            display(0x07,'a');
		    display(0x08,'i');
			display(0x09,'t');
			display(0x0a,'i');
			display(0x0b,'n');
			display(0x0c,'g');
			flag=1;
			oneminte=0;//加上这个,当displayOK标志位没有置1时,都清零计数,等待重新检测中计数。
		}
		
		if(displayOK==1 && oneminte<=200)//如果显示开
		{
			flag=0;
		    display(0x06,'T');
            display(0x07,'e');
		    display(0x08,'s');
			display(0x09,'t');
			display(0x0a,'i');
			display(0x0b,'n');
			display(0x0c,'g');
		}
	 
	    ReadTempDate=ReadTemperature();
        display(0x46,ReadTempDate/100+'0');
	    display(0x47,ReadTempDate%100/10+'0');
      	display(0x48,'.');
	    display(0x49,ReadTempDate%100%10+'0');
		display(0x4a,0xdf);
		display(0x4b,'C');		
}


void baojin()
{
  if(  ( (rate*6<S_heart_L  ||  rate*6>S_heart_H) &&  oneminte>200 )  ||  ReadTempDate>=S_temp_H*10 ||  ReadTempDate<=S_temp_L*10 )		{  Buzzer=0; }

  if(    oneminte>=0  &&  oneminte<200  &&    ReadTempDate<S_temp_H*10  &&  ReadTempDate>S_temp_L*10  )	    {  Buzzer=1; }
}

/*************定时器0初始化程序***************/
void time_init()	  
{
	EA   = 1;	 	  //开总中断
	TMOD = 0X01;	  //定时器0、定时器1工作方式1
	ET0  = 1;		  //开定时器0中断 
	TR0  = 1;		  //允许定时器0定时
}


/***********外部中断0初始化程序****************/
void init_int0()	  //外部中断0初始化程序
{
	EX0=1;			  //允许外部中断0中断
	EA=1;	 		  //开总中断
	IT0 = 1; 		  //外部中断0负跳变中断
}

/****************主函数***************/
void main()
{	
    ReadTemperature();
    show1();//显示问候语和其他信息
	time_init(); //初始化定时器 
	init_int0(); //外部中断0初始化程序
    init_eeprom();      			//读eeprom数据
	while(1)
	{	
      key(); //按键扫描
      if(flat300ms>=4)	//200ms
	   {
	    flat300ms=0;
//==================主界面===================
		  if(yemian==0)  
			{
			  if(biaozhi==0)
				 {
                   biaozhi=1;

				   lcd_init();// 初始化
				   display(0x00,'H');
				   display(0x01,'e');
				   display(0x02,'a');
				   display(0x03,'r');
				   display(0x04,'t');
				   display(0x05,':');

				   display(0x40,'T');
				   display(0x41,'e');
				   display(0x42,'m');
				   display(0x43,'p');
				   display(0x44,':');
                 }
               wendumaibo();
			   baojin();
	       }

//==================脉搏报警上限 设置===================
		  if(yemian==1)  
			{
			  if(biaozhi==1)
				 {
                   biaozhi=2;
				   Buzzer=1;
				   lcd_init();// 初始化
				   display(0x04,'H');
				   display(0x05,'e');
				   display(0x06,'a');
				   display(0x07,'r');
				   display(0x08,'t');
				   display(0x09,'-');
				   display(0x0a,'H');

				 display(0x46,S_heart_H/100+'0');
	             display(0x47,S_heart_H%100/10+'0');
                 display(0x48,S_heart_H%100%10+'0');				  
               }
                shezhi();
	       }

//==================脉搏报警下限 设置===================
		  if(yemian==2)  
			{
			  if(biaozhi==2)
				 {
                   biaozhi=3;
				   Buzzer=1;
				   lcd_init();// 初始化
				   display(0x04,'H');
				   display(0x05,'e');
				   display(0x06,'a');
				   display(0x07,'r');
				   display(0x08,'t');
				   display(0x09,'-');
				   display(0x0a,'L');

				 display(0x46,S_heart_L/100+'0');
	             display(0x47,S_heart_L%100/10+'0');
                 display(0x48,S_heart_L%100%10+'0');				  
               }
                shezhi();
	       }
		   		   
//==================温度报警 上限设置===================
		  if(yemian==3)  
			{
			  if(biaozhi==3)
				 {
                   biaozhi=4;
				   Buzzer=1;
				   lcd_init();// 初始化
				  
				   display(0x05,'T');
				   display(0x06,'e');
				   display(0x07,'m');
				   display(0x08,'p');
				   display(0x09,'-');
				   display(0x0a,'H');

				   display(0x46,S_temp_H/100+'0');
	               display(0x47,S_temp_H%100/10+'0');
                   display(0x48,S_temp_H%100%10+'0');				  
                }
                shezhi();
	       }	  	    

//==================温度报警 下限设置===================
		  if(yemian==4)  
			{
			  if(biaozhi==4)
				 {
                   biaozhi=0;
				   Buzzer=1;
				   lcd_init();// 初始化
				  
				   display(0x05,'T');
				   display(0x06,'e');
				   display(0x07,'m');
				   display(0x08,'p');
				   display(0x09,'-');
				   display(0x0a,'L');

				   display(0x46,S_temp_L/100+'0');
	               display(0x47,S_temp_L%100/10+'0');
                   display(0x48,S_temp_L%100%10+'0');				  
                }
                shezhi();
	       }	  	    
      
	        
	   }
    }
 }


void int0() interrupt 0
{
	if(time1>=8)
	 {
		  time1=0;
          if(i==3)//记录到超过等于3次时间
			{
				i=1;//计数从1开始
				displayOK=1;    //测得3次开始显示
            }	
			
		
			if( oneminte>200 && flag==0 && yemian==0) 
               { 
				 flag=1;
				 rate1=rate*6;
                
				 display(0x09,'/');
		         display(0x0a,'m');
  	             display(0x0b,'i');
                 display(0x0c,'n');
				 
                  display(0x06,rate1/100+'0');
			      display(0x07,rate1%100/10+'0');
			      display(0x08,rate1%100%10+'0');
              }
     	
		}
	
}


/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{	
	TH0 = 0x3c;
	TL0 = 0xb0;     // 50ms	 12M
	timecount++;//每50ms一次计数
    oneminte++;
	flat300ms++;
	if(timecount>50 &&yemian==0 )     //当超过50*50ms=2.5s左右没有检测到信号停止显示
	{
			i=0;//数据个数清零
			timecount=0;//50ms计数清零
			displayOK=0;//显示关
		    oneminte=0;
		    rate=0; 
		    display(0x06,'W');
            display(0x07,'a');
		    display(0x08,'i');
			display(0x09,'t');
			display(0x0a,'i');
			display(0x0b,'n');
			display(0x0c,'g');
		
		
  }
}

系统论文


目 录

摘要

Abstract

[引 言](#引 言)

[第一章 概述](#第一章 概述)

[1.1 选题的背景和意义](#1.1 选题的背景和意义)

[1.2 脉搏测量仪的发展与应用](#1.2 脉搏测量仪的发展与应用)

[第二章 总体方案的论证与设计](#第二章 总体方案的论证与设计)

2.1主控模块的选型和论证

2.2显示模块的选型和论证

2.3脉搏检测传感器的选型和论证

2.4温度传感器的选型

2.5系统整体设计概述

[第三章 系统硬件电路设计](#第三章 系统硬件电路设计)

3.1主控模块

[3.1.1 STC89C52单片机主要特性](#3.1.1 STC89C52单片机主要特性)

[3.1.2 STC89C52单片机的中断系统](#3.1.2 STC89C52单片机的中断系统)

3.1.3单片机最小系统设计

[3.2 LCD液晶显示器简介](#3.2 LCD液晶显示器简介)

[3.2.1 液晶原理介绍](#3.2.1 液晶原理介绍)

3.2.2液晶模块简介

3.2.3液晶显示部分与STC89C52的接口

3.3信号采集电路设计

3.3.1传感器简介

3.3.2滤波电路

3.3.3放大整形电路

[3.4 数字温度传感器模块](#3.4 数字温度传感器模块)

[3.4.1 DS18B20性能](#3.4.1 DS18B20性能)

[3.4.2 DS18B20外形及引脚说明](#3.4.2 DS18B20外形及引脚说明)

[3.4.3 DS18B20接线原理图](#3.4.3 DS18B20接线原理图)

[3.4.4 DS18B20时序图](#3.4.4 DS18B20时序图)

[3.4.5 数据处理](#3.4.5 数据处理)

[第四章 系统软件设计](#第四章 系统软件设计)

4.1系统软件总体设计

4.2程序设计原理

[第五章 系统调试](#第五章 系统调试)

5.1软件调试

5.2硬件调试

5.3调试结果

5.4误差分析

[结 论](#结 论)

[致 谢](#致 谢)

参考文献


Design of pulse measuring instrument based on single chip

Abstract **:**Pulse measurement apparatus has been widely used in our daily life. In order to improve the measurement apparatus is simple and accuracy, this paper designs a pulse measuring instrument based on 51 single chip microcomputer. System to STC89C52 microcontroller as the core, with photoelectric sensor, and calculates the internal timer SCM system, the signal from the photoelectric sensor, microcontroller based on the accumulated pulse beat frequency signal, by the time the timer. In the running of the system can be observed through the indicator lights out, if even flicker that accurate measuring value. The system stops running, can display the total pulse number and time. After testing, the system works normally, meet the design requirements.

The design of the infrared photoelectric sensor generates a pulse signal, after plastic surgery to enlarge, the input of SCM within the corresponding control, which measured within a minute of the pulse beat frequency, fast and convenient. Through observing the pulse signal, can check the health of the body, usually used for health centres and hospitals. The system can be used for measuring the pulse number of users, but also can set the upper limit of the number of times and, when the range of the measurement range over the set of drive buzzer alarm, but users can also set the alarm clock to remind the daily measurement, time can be set, the results were finally able to pulse signal acquisition to display on the LCD1602.occurring.

**Keywords:**STC89C52; photosensor; LCD display; Pulse measuring instrument

引 言

脉搏测量在有脉搏时遮挡光线,无脉搏时透光强,所采用的传感器是红外接收二极管和红外发射二极管。通过观测脉搏信号,可以对人体的健康进行检查,通常被用于保健中心和医院。系统可以供用户测量当时的脉搏次数,同时还可以设定上限次数和下限次数,当测量的范围超过设定的范围则驱动蜂鸣器报警提醒,除此外用户还可以设定每天闹钟提醒测量,时间可以自行设定[1]。

从脉搏波中提取人体的生理病理信息作为临床诊断和治疗的依据,历来都受到中外医学界的重视。系统以STC89C52单片机为核心,以光电传感器利用单片机系统内部定时器来计算时间,由光电传感器感应产生信号,单片机通过对信号累加得到脉搏跳动次数,时间由定时器定时而得。系统运行中可以通过观察指示灯闪烁,若均匀闪烁说明测量值准确。几乎世界上所有的民族都用过"摸脉"作为诊断疾病的手段。脉搏波所呈现出的形态(波形)、强度(波幅)、速率(波速)和节律(周期)等方面的综合信息,在很大程度上反映出人体心血管系统中许多生理病理的血流特征,但人体的生物信号多属于强噪声背景下的低频的弱信号, 脉搏波信号更是低频微弱的非电生理信号, 必需经过放大和后级滤波以满足采集的要求。

第一章 概述

1.1 选题的背景和意义

脉搏携带有丰富的人体健康状况的信息,自公元三世纪我国最早的脉学专著《脉经》问世以来,脉学理论得到不断的发展和提高。在中医四诊(望、闻、问、切)中,脉诊占有非常重要的位置。脉诊是我国传统医学中最具特色的一项诊断方法,其历史悠久,内容丰富,是中医"整体观念"、"辨证论证"的基本精神的体现与应用。脉诊作为"绿色无创"诊断的手段和方法,得到了中外人士的关注。但由于中医是靠手指获取脉搏信息,虽然脉诊具有简便、无创、无痛的特点易为患者接受,然而在长期的医疗实践中也暴露出一些缺陷。首先,切脉单凭医生手指感觉辨别脉象的特征,受到感觉、经验和表述的限制,并且难免存在许多主观臆断因素,影响了对脉象判断的规范化;其次,这种用手指切脉的技巧很难掌握;再则,感知的脉象无法记录和保存影响了对脉象机理的研究。脉诊的这种定性化和主观性,大大影响了其精度与可行性,成为中医脉诊应用、发展和交流中的制约因素。为了将传统的中医药学发扬光大,促进脉诊的应用和发展,必须与现代科技相结合,实现更科学、客观的诊断[1]。

医院的护士每天都要给住院的病人把脉记录病人每分钟脉搏数,方法是用手按在病人腕部的动脉上,根据脉搏的跳动进行计数。

早在1860年Vierordt 创建了第一台杠杆式脉搏描记仪,国内20世纪50年代初朱颜将脉搏仪引用到中医脉诊的客观化研究方面。此后随着机械及电子技术的发展,国内外在研制中医脉象仪方面进展很快,尤其是70年代中期,国内天津、上海、江西等地相继成立了跨学科的脉象研究协作组,多学科共同合作促使中医脉象研究工作进入了一个新的境界。脉象探头式样很多,有单部、三部、单点、多点、刚性接触式、软性接触式、气压式、硅杯式、液态汞、液态水、子母式等组成,脉象探头的主要原件有应变片、压电晶体、单晶硅、光敏元件、PVDF压电薄膜等,其中以单部单点应变片式为最广泛,不过近年来正在向三部多点式方向设计[2]。

目前脉搏测量仪在多个领域被广泛应用,除了应用于医学领域,如无创心血管功能检测、妊高症检测、中医脉象、脉率检测等等,商业应用也不断拓展,如运动、健身器材中的心率测试都用到了技术先进的脉搏测量仪。

1.2 脉搏测量仪的发展与应用

随着科学技术的发展,脉搏测量技术也越来越先进,对脉搏的测量精度也越来越高,国内外先后研制了不同类型的脉搏测量仪,而其中关键是对脉搏传感器的研究。起初用于体育测量的脉搏测试集中在对接触式传感器的研究,利用此类传感器所研制的指脉、耳脉等测量仪各有其优缺点。指脉测量比较方便、简单,但因为手指上的汗腺较多,指夹常年使用,污染可能会使测量灵敏度下降:耳脉测量比较干净,传感器使用环境污染少,容易维护。但因耳脉较弱,尤其是当季节变化时,所测信号受环境温度影响明显,造成测量结果不准确。过去在医院临床监护和日常中老年保健中出现的日常监护仪器,如便携式电子血压计,可以完成脉搏的测量,但是这种便携式电子血压计利用微型气泵加压橡胶气囊,每次测量都需要一个加压和减压的过程,存在体积庞大、加减压过程会有不适、脉搏检测的精确度低等缺点。

近年来国内外致力于开发无创非接触式的传感器,这类传感器的重要特征是测量的探测部分不侵入机体,不造成机体创伤,能够自动消除仪表自身系统的误差,测量精度高,通常在体外,尤其是在体表间接测量人体的生理和生化参数。

其中光电式脉搏传感器是根据光电容积法制成的脉搏传感器,通过对手指末端透光度的监测,间接检测出脉搏信号。具有结构简单、无损伤、精度高、可重复使用等优点。通过光电式脉搏传感器所研制的脉搏测量仪已经应用到临床医学等各个方面并收到了理想效果。

人体心室周期性的收缩和舒张导致主动脉的收缩和舒张,是血流压力以波的形式从主动脉根部开始沿着整个动脉系统传播,这种波成为脉搏波。从脉搏波中提取人体的心理病理信息作为临床诊断和治疗的依据,历来都受到中外医学界的重视。脉搏波所呈现出的形态(波形)、强度(波幅)、速率(波速)和节律(周期)等方面的综合信息,在很大程度上反映出人体心血管系统中许多生理病理的血流特征,因此对脉搏波采集和处理具有很高的医学价值和应用前景。但人体的生物信号多属于强噪声背景下的低频的弱信号, 脉搏波信号更是低频微弱的非电生理信号,因此必需经过放大和后级滤波以满足采集的要求。

第二章 总体方案的论证与设计

2.1主控模块的选型和论证

方案一:

采用MSP430系列单片机,该单片机是TI公司1996年开始推向市场的一种16位超低功耗的混合信号处理器。其内部集成了很多模拟电路、数字电路和微处理器,提供强大的功能。不过该芯片昂贵不适合一般的设计开发[3]。

方案二

采用51系列的单片机,该单片机是一个高可靠性,超低价,无法解密,高性能的8位单片机,32个IO口,且STC系列的单片机可以在线编程、调试,方便地实现程序的下载与整机的调试。

因此选用方案二中的51系列单片机作为主控芯片。

2.2显示模块的选型和论证

方案一:

采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较合适,如采用在显示数字显得太浪费,且价格也相对较高,所以不用此种作为显示。

方案二:

采用LED数码管动态扫描,LED数码管价格虽适中,对于显示数字也最合适,而且采用动态扫描法与单片机连接时,占用单片机口线少。但是由于数码管动态扫描需要借助74LS164移位寄存器进行移位,该芯片在电路调试时往往有很多障碍,所以不采用LED数码管作为显示。

方案三:

采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见,对于本设计而言一个LCD1602的液晶屏即可,价格也还能接受,需要的接口线较多,但会给调试带来诸多方便。

所以本设计中方案三中的LCD1602液显示屏作为显示模块。

2.3脉搏检测传感器的选型和论证

方案一:

采用压电传感器用来提取人的脉搏信号,压电传感器是利用某些电介质受力后产生的压电效应制成的传感器。所谓压电效应是指某些电介质在受到某一方向的外力作用而发生形变(包括弯曲和伸缩形变)时,由于内部电荷的极化现象,会在其表面产生电荷的现象。通过此现象可以提取出人的脉搏信号。

方案二:

采用光电传感器提取人体脉搏信号,授予手指组织可以分成皮肤、肌肉、骨骼等非血液组织和血液组织,其中非血液组织的光吸收量是恒定的,而在血液中,静脉血的搏动相对动脉血是十分微弱的,可以忽略,因此可以认为光透过手指后的变化仅由动脉血的充盈而引起,那么在恒定波长的光源的照射下,通过检测透过手指的光强将可以间接测量到人体的脉搏信号[4]。

由于光电传感器较压电传感器容易在一般的地方可以买得到,因此这里选用光电传感器来提取人体脉搏信号。

2.4温度传感器的选型

方案一

由于本设计是测温电路,可以使用热敏电阻之类的器件,将随被测温度变化的电压或电流采样,进行A/D转换后就可以用单片机进行数据处理,实现温度显示。这种设计需要用到A/D转换电路,增大了电路的复杂性,而且要做到高精度也比较困难。

方案二

考虑到在单片机属于数字系统,容易想到数字温度传感器,可选用DS18B20数字温度传感器,此传感器为单总线数字温度传感器,起体积小、构成的系统结构简单,它可直接将温度转化成串行数字信号给单片机处理,即可实现温度显示。另外DS18B20具有3引脚的小体积封装,测温范围为-55~+125摄氏度,测温分辨率可达0.0625摄氏度,其测量范围与精度都能符合设计要求。

以上两种方案相比较,第二种方案的电路、软件设计更简单,此方案设计的系统在功耗、测量精度、范围等方面都能很好地达到要求,故本设计采用方案二。

2.5系统整体设计概述

系统总体设计由STC89C52、按键、LCD1602、光电传感器、时钟模块、运放等构成,如图2.1所示,系统设有四个按键,可以设置上下限脉搏数,当超过范围的时候单片机会驱动蜂鸣器发响,脉搏测量的时候需要人把手轻轻的按在光电传感器上面,由于人脉搏跳动的时候,血液的透光性不一样会导致接收器那边接收的信号强弱不一样,间接的把人脉搏信号传回,通过运放对其进行放大、整形后连接到单片机的IO口,单片机利用外部中断对其进行计数,最终换算成人一分钟脉搏的跳动次数,最终显示在液晶屏上。


资源下载


感谢阅读,你的点赞是我更新最大的动力!!!

如果有需要这个系统的源码、仿真、论文等资源的可以私信我。感谢你的阅读~

相关推荐
wenchm1 小时前
细说STM32单片机DMA中断收发RTC实时时间并改善其鲁棒性的另一种方法
stm32·单片机·嵌入式硬件
苹果酱05672 小时前
前端面试vue篇:Vue2 和 Vue3 在设计和性能上有显著区别
java·spring boot·毕业设计·layui·课程设计
编码追梦人2 小时前
如何实现单片机的安全启动和安全固件更新
单片机
电子工程师UP学堂2 小时前
电子应用设计方案-16:智能闹钟系统方案设计
单片机·嵌入式硬件
飞凌嵌入式3 小时前
飞凌嵌入式T113-i开发板RISC-V核的实时应用方案
人工智能·嵌入式硬件·嵌入式·risc-v·飞凌嵌入式
blessing。。4 小时前
I2C学习
linux·单片机·嵌入式硬件·嵌入式
嵌新程5 小时前
day03(单片机高级)RTOS
stm32·单片机·嵌入式硬件·freertos·rtos·u575
Lin2012306 小时前
STM32 Keil5 attribute 关键字的用法
stm32·单片机·嵌入式硬件
计算机毕设孵化场6 小时前
计算机毕设-基于springboot的高校网上缴费综合务系统视频的设计与实现(附源码+lw+ppt+开题报告)
java·spring boot·计算机外设·音视频·课程设计·高校网上缴费综合务系统视频·计算机毕设ppt
电工小王(全国可飞)6 小时前
STM32 RAM在Memory Map中被分为3个区域
stm32·单片机·嵌入式硬件