📄 ecg_monitor.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 + -