⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ecg_monitor.h

📁 基于51单片机的心电监护仪程序
💻 H
字号:
#ifndef __ecg_monitor__
#define __ecg_monitor__
#include "ad.h"
//心电数据微分
unsigned char ECG_data_diff(){
    unsigned char k=0;
	if(i>4)
	    i=0;                      
	while(flag==0){}
	/*if(num>=499)
        num = 0;      
    else 
        ECG_data_temp[i]=ecgdata[num]; //AD的结果???*/
    ECG_data_temp[i]=AD_conversion();
    store_to_flash();
    //k2=abs(ECG_data_temp[i]);               
    //k1=at_read_byte(flash_add-1);
    //at_write_data(0X0F,2000);
    //sys_flag=!sys_flag;
    sendbyte(ECG_data_temp[i]);   
	ECG_data_dif[0] = abs(ECG_data_temp[i] - ECG_data_temp[(3 + i)%5]);   //|x(nT)-x((n-2)T)|
	ECG_data_dif[1] = abs(ECG_data_temp[i] - 2*ECG_data_temp[(3 + i)%5] + ECG_data_temp[(1+i)%5]); //|x(nT)-2x((n-2)T)+x((n-4)T)|
	ECG_data_dif[2] = 2*ECG_data_dif[0] + ECG_data_dif[1];
	num++;
    i++;
    T++; 
    //k1=at_read_byte(2000);//-ECG_data_temp[i]; 
    flag=0;
	return ECG_data_dif[2];	      
}

//R波检测函数
unsigned char R_detection(){
	unsigned char k,j=0;
    if((ECG_data_temp[(4+i)%5]-Rmin)<max_min*2)
        return 0;
    else
    {
	    for(k=0;k<4;k++)
        {   
        
	    	if(ECG_data_diff()>=ecgdatadif_threshold)
        {    //阈值判断
		    j++;
		}
        }
           

	if(j>=2)                      //说明开始是QRS波
		return 1;
	else
		return 0;			
	 }
}
//监护仪对病人心电的学习过程
void autoadapt()
{
	unsigned char k,m,m1=0;
	unsigned char xdata ecgdatadif_av1[2],ecgdatadif_av2[4],R_max[4]={0,0,0,0},R_min[4]={0,0,0,0};
	unsigned int sum_temp=0;
	unsigned int RRt_sum=0;
	unsigned int QRS_T_sum=0;
    unsigned int max_min_sum=0;
	unsigned int Rmin_sum=0;
	unsigned char xdata ecgdatadif[200];
	unsigned int RRt_temp[4]={0,0,0,0};
	unsigned char QRS_T_adapt[4]={0,0,0,0};
    for(i=0;i<5;i++)
    {
		ECG_data_temp[i]=AD_conversion();             //AD的结果???
	}
	i=0;
    num=5;
    

	for(k=0;k<4;k++)
	{
		for(m=0;m<200;m++)
		{
				ecgdatadif[m]=ECG_data_diff();
        R_max[k]=ECG_data_temp[(i+4)%5]>R_max[k]? ECG_data_temp[(i+4)%5]:R_max[k];
        R_min[k]=ECG_data_temp[(i+4)%5]<R_max[k]? ECG_data_temp[(i+4)%5]:R_min[k];       
				sum_temp+=ecgdatadif[m];
		}
        	
		ecgdatadif_av1[0]=sum_temp/200;
		sum_temp=0;
		for(m=0;m<200;m++)
		{
				if(ecgdatadif[m]>ecgdatadif_av1[1])
				{
					sum_temp+=ecgdatadif[m];
				  m1++;
				}
		}
		ecgdatadif_av1[1]=sum_temp/m1;
		ecgdatadif_av2[k]=(2*ecgdatadif_av1[1]+ecgdatadif_av1[0])/3;
		sum_temp=0;
		m1=0;
		
	}
    for(k=1;k<4;k++)
    {
        max_min_sum+=(R_max[k]-R_min[k]);
        Rmin_sum+=R_min[k];
	}
    max_min=max_min_sum/30;
    Rmin=Rmin_sum/3;
    m=0;
	for(k=0;k<4;k++)
	{
		m+=ecgdatadif_av2[k];	
	}
    ecgdatadif_threshold=m/4;
    for(k=0;k<4;k++)
    {
        while(ECG_data_diff()<ecgdatadif_threshold){}
        
	    //阈值判断
	    while(!R_detection()){}  
        QRS_T_adapt[k]=QRS_T_adapt[k]+5;
        			
			while(R_detection())
      {
		    QRS_T_adapt[k]=QRS_T_adapt[k]+5;
      }
      RRt_temp[k]=T;
			T=0;                      
	}
	for(k=1;k<4;k++)
    {
		RRt_sum+=RRt_temp[k];
		QRS_T_sum=QRS_T_sum+QRS_T_adapt[k];
	}
	RRt=RRt_sum/3;
	QRS_T=QRS_T_sum/3;
    
}  

unsigned char stopbeat(unsigned int t)
{
	if(t>=600)
		return 1;
	else 
		return 0;	
}
unsigned char overquick(unsigned char hr)
{
	if(hr>100)
		return 1;
	else
		return 0;	
}
unsigned char tooslow(unsigned hr)
{
	if(hr<50)
		return 1;
	else
		return 0;	
}
unsigned char miss(unsigned int t)
{
	if(abs(t-2*RRt)<10)
		return 1;
	else
		return 0;	
} 
unsigned char PVC(unsigned int t,unsigned char rt)
{
	unsigned int t1;
	t1=(unsigned int) 0.875*RRt;
	if(t<t1&&rt>24)
		return 1;
	else
		return 0;
}

void monitor()
{
    
  unsigned char heartrate_realtime,k,s1,s2,s3,s4,s5;
	unsigned char QRS_T_realtime;  
    
	LED_natural=1;
    while(ECG_data_diff()<ecgdatadif_threshold)
    {
        if(T>=600)
            break;
    }            
    while(R_detection()==0)
    {
        if(T>=600)
            break;
    }
    LED_natural=0;
    QRS_T_realtime=QRS_T_realtime+5;
    while(R_detection())
    { 
        QRS_T_realtime=QRS_T_realtime+5;
        LED_natural=0;    
    }
    sendbyte(QRS_T_realtime);
	heartrate_realtime=12000/T;
	
	LED_natural=1;
    LCD_write_cmd(0x8d);
    k=heartrate_realtime/100+0x30;
    if(k!=0x30)
        LCD_write_data(k);
    else
        LCD_write_data(' ');
    k=(heartrate_realtime%100)/10+0x30;
    LCD_write_data(k);
    k=(heartrate_realtime%100)%10+0x30;
    LCD_write_data(k);
    s1=stopbeat(T);
    s2=overquick(heartrate_realtime);
    s3=tooslow(heartrate_realtime);
    s4=miss(T);
    s5=PVC(T,QRS_T_realtime);
	if(s1==0&&s2==0&&s3==0&&s4==0&&s5==0)
    {	
        LED_abnormity=1;
        if(store_over==1)
            store_or_not=0;

		Buzzer=0; 
		LCD_write_cmd(0xc6);
		if(ECG_state!=1)
		{
			LCD_write_string("Regular   ");
		    ECG_state=1;
		}

		 
	}
    else if(s1==1)
    {
	    LED_abnormity=0;
		Buzzer=1;
		LCD_write_cmd(0xc6);
		if(ECG_state!=2)
		{
			LCD_write_string("Stopbeat  ");
		    ECG_state=2;
		}
		
     /*	if(store_over==0)
            store_or_not=0;
        else
        {
            store_or_not=1;
            num_of_abnormity++;
	    }                      */
		//LCD显示停搏信息
        if((store_over==1)||(store_or_not==0))
        {
          store_or_not=1;
          num_of_abnormity++;
          store_over=0;  
        }
	}

else if(s4==1)
    {
		LED_abnormity=0;
		Buzzer=1;
		LCD_write_cmd(0xc6);
		if(ECG_state!=5)
		{
			LCD_write_string("Lose a beat ");
		    ECG_state=5;
		}
        //LCD显示漏搏信息
		/*if(store_over==0)
            //store_or_not=0;
        else
        {
            store_or_not=1;
            num_of_abnormity++;
        }*/
        if((store_over==1)||(store_or_not==0))
        {
          store_or_not=1;
          num_of_abnormity++;
          store_over=0;  
        }	
	}
	else if(s5==1)
	{
		LED_abnormity=0;
		Buzzer=1;
		LCD_write_cmd(0xc6);
		if(ECG_state!=6)
		{
			LCD_write_string("PVC       ");
		    ECG_state=6;
		}
        //LCD显示室性早搏信息
		/*if(store_over==0)
            //store_or_not=0;
        else
        {
            store_or_not=1;
            num_of_abnormity++;
        }*/
        if((store_over==1)||(store_or_not==0))
        {
          store_or_not=1;
          num_of_abnormity++;
          store_over=0;  
        }
    }

	else if(s2==1)
    {
		LED_abnormity=0;
		Buzzer=1;
		LCD_write_cmd(0xc6);
		if(ECG_state!=3)
		{
			
			LCD_write_string("Overquick ");
		    ECG_state=3;
		}

		
	    //LCD显示心跳过速信息
       /*if(store_over==0)
            //store_or_not=0;     
        else
        {    
        		store_or_not=1;
        		num_of_abnormity++;
        }*/
        if((store_over==1)||(store_or_not==0))
        {
          store_or_not=1;
          num_of_abnormity++;
          store_over=0;  
        }		
	}
	else if(s3==1)
    {
		LED_abnormity=0;
		Buzzer=1;
		LCD_write_cmd(0xc6);
		if(ECG_state!=4)
		{
			LCD_write_string("Too slow  ");
		    ECG_state=4;
		}
         //LCD显示心跳过缓信息
		
	
      /*  if(store_over==0)
            //store_or_not=0;
        else
        {
            store_or_not=1;
            num_of_abnormity++;
        }*/
        if((store_over==1)||(store_or_not==0))
        {
          store_or_not=1;
          num_of_abnormity++;
          store_over=0;  
        }
	}    

    
    else
    {
		LCD_write_cmd(0xc6);
        if(store_over==1)
            store_or_not=0;
		LCD_write_string("Unknown   ");
    } 
	T=0;
    QRS_T_realtime=0;
    LED_natural=1; 
    
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -