心电信号的存储回放.docx
《心电信号的存储回放.docx》由会员分享,可在线阅读,更多相关《心电信号的存储回放.docx(31页珍藏版)》请在冰点文库上搜索。
![心电信号的存储回放.docx](https://file1.bingdoc.com/fileroot1/2023-5/23/4eee3525-4b0c-4fec-8adc-52f33f1b64bb/4eee3525-4b0c-4fec-8adc-52f33f1b64bb1.gif)
心电信号的存储回放
#include
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineKEYNUM6//按键AD入口
uchardisflag=0;//采集一个屏幕的标志
ucharcollflag=0,Freq=0,mode=0;//存储标志,采集频率选择,波形播放模式
ucharflag_end=0;//采集结束标志。
ucharxdatastr[30]="SPS:
";
ucharxdatawave[129];//绘图缓存区
ucharxdatadat_buf[129];//正常采集缓存区
ucharxdataad_result[129];//回放采集缓存区
uintad_n=0;
doubleKEY_n=1.0;//按键倍率
ucharAD_key,xn;//按键值
uchark,m;
uintPage=0,DRAW_NUM=0;//页面总数
uintENDADDR=0;
////////////////////////////////////////////////
ucharcodeFQH[5]={0x90,0x7d,0x63,0x3C,0x20};//采集频率选择
ucharcodeFQL[5]={0x64,0xca,0xc0,0xb0,0xc8};
ucharcodeFQ[5]={70,60,50,40,35};//采样的频率
///////////////////////////////////////////////
/***************************************************/
voidDatachange(uchart,uchar*str);//信号变换,把256-->64
voiddelay1s(void);//回放延时
voidTimer0_Init();//定时采集初始化
voidbutton(ucharkey);//按键处理
voidKey();//按键扫描
/****************************************************/
voiddelay1s(void)//误差-0.000000000056us
{
unsignedchara,b,c,n;
for(c=142;c>0;c--)
for(b=168;b>0;b--)
for(a=250;a>0;a--);
for(n=2;n>0;n--);
_nop_();//ifKeil,requireuseintrins.h
}
//////////////////////////////////////////////
voidTimer0_Init()
{
TMOD|=0x01;//定时器设置16位
AUXR&=0x7f;//定时器012分频;
TH0=0x63;
TL0=0x0a0;
ET0=1;
TR0=1;
EA=1;
}
/********************数据清除*********************/
voidclear()
{
for(xn=0;xn<128;xn++)
{
wave[xn]=0;
}
}
/********************数据操作******************************/
////////////////////////////////////////////////////////////////
voidDatachange(uchart,uchar*str)
{
str[t]=63-str[t]/4;
}
/////////////////////////////////////////////////
/******************采样频率*************************/
voidSampling()
{
str[4]=FQ[Freq]/10+0x30;
str[5]=FQ[Freq]%10+0x30;
str[6]='H';
str[7]='Z';
LcmPrint(3,0,str);
}
/////////////////////////////////////////////////////////
/******************按键处理****************************/
voidbutton(ucharkey)
{
uchari=0;
if(key==1)
{
if(collflag==0)
{
ad_n=0;//初始化
DRAW_NUM=0;
}
else//采集期间回放中断采集
{
DRAW_NUM=0;
clear();
flag_end=1;
ENDADDR=ad_n;//初始化页地址
Page=ENDADDR/128+1;//记录最终的地址
ad_n=0;//初始化地址
collflag=0;//关闭采集
}
mode=(mode+1)%2;//changemodemode0:
normalwavemode1:
replay
}
if(key==2)//recollect
{
if(!
mode)
{
if(collflag)
{
flag_end=1;
ENDADDR=ad_n;
Page=ENDADDR/128+1;//中断采集的时候记录最后的采集地址
ad_n=0;//初始化地址
collflag=0;//关闭采集
}
else
{
ad_n=0;
collflag=1;
}
}
}//changefreq
if(key==3)
{
Freq=(Freq+1)%4;//采集频率变换
}
}
////////////////////////////////////////////////////////////////
/******************AD做键盘**********************************/
voidKey()
{
AD_key=Get_Adc(KEYNUM);//获取按键值
if(abs(AD_key)<240)//判断是否按键
{
AD_key=Get_Adc(KEYNUM);
if(abs(AD_key)<240)//获取稳定的按键值
{
KEY_n=(255)/(254-AD_key);//获取倍率,方便处理
if((KEY_n>1.5)&&(KEY_n<=2.5))
button
(1);
elseif((KEY_n>2.5)&&(KEY_n<=3.5))
button
(2);
elseif((KEY_n>3.5)&&(KEY_n<=4.5))
button(3);
else
button('4');
}
while(Get_Adc(KEYNUM)<240);//释放按键
}
}
////////////////////////////////////////////
/*************定时器定时采集波形***********************/
voidtimer0_int()interrupt1
{
TH0=FQH[Freq];//填初值,去掉处理的时间
TL0=FQL[Freq];
Key();//按键扫描
if(collflag)//判断是否需要存储
{
if(ad_n<32)
{
Write_1Byte(W_AT24C256,0xff,ad_n);//对采集的信号进行存储
}
else
{
ad_result[ad_n%128]=Get_Adc(NUM);//正常采集
dat_buf[ad_n%128]=ad_result[ad_n%128];//放入采集缓存
Write_1Byte(W_AT24C256,ad_result[ad_n%128],ad_n);//对采集的信号进行存储
}
ad_n++;
if(((ad_n%128)==0)&&(disflag==0))//采集完后通知主程序进行绘图
{
disflag=1;
for(xn=0;xn<128;xn++)//放入绘图缓存
wave[xn]=dat_buf[xn];
}
if(ad_n==0x7f7f)
{
ENDADDR=ad_n;
collflag=0;//退出存储
flag_end=1;
ad_n=0;//初始化,方便下一次采集
Page=ENDADDR/128+1;
}
}
if(collflag==0)//正常采集模式
{
if(flag_end)
{
Write_1Byte(W_AT24C256,0x00,ENDADDR);
if(ENDADDRENDADDR++;
else
flag_end=0;
}
if(ad_n<128)
{
dat_buf[ad_n]=Get_Adc(NUM);//采集数据
ad_n++;
}
if((ad_n>=128)&&(disflag==0))
{
for(xn=0;xn<128;xn++)
wave[xn]=dat_buf[xn];
disflag=1;//通知主程序进行绘图
ad_n=0;
}
}
}
/////////////////////////////////////////////////////////////////////
main()
{
LCD_Init();
Adc_Init();
Sampling();
Timer0_Init();
while
(1)
{
Sampling();
if(mode==1)//是否进入回放模式
{
if(Read_nByte(W_AT24C256,0x80*DRAW_NUM,wave,128))//读取数据
{
for(k=0;k<128;k++)
Datachange(k,wave);//数据变换
LCD_Clr();//清除图形
DrawWave(wave);//回放
}
DRAW_NUM=(DRAW_NUM+1)%Page;
delay1s();
}
elseif(mode==0)//实时采集模式
{
if(disflag)//绘图标志
{
for(k=0;k<128;k++)
Datachange(k,wave);//数据变换
LCD_Clr();//清除图形
DrawWave(wave);//绘图
disflag=0;
}
}
}
}
//////////////////////////////////////////////////////////////////////
#ifndef_LCM12864_H_
#define_LCM12864_H_
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineLCD_dataP2//定义数据口
//基本指令集预定义
#defineLCD_CLEAR_SCREEN0x01//清屏
#defineLCD_ADDRESS_RESET0x02//地址归零
#defineLCD_BASIC_FUNCTION0x30//基本指令集
#defineLCD_EXTEND_FUNCTION0x34//扩充指令集
//扩展指令集预定义
#defineLCD_AWAIT_MODE0x01//待命模式
#defineLCD_ROLLADDRESS_ON0x03//允许输入垂直卷动地址
#defineLCD_IRAMADDRESS_ON0x02//允许输入IRAM地址
#defineLCD_SLEEP_MODE0x08//进入睡眠模式
#defineLCD_NO_SLEEP_MODE0x0c//脱离睡眠模式
#defineLCD_GRAPH_ON0x36//打开绘图模式
#defineLCD_GRAPH_OFF0x34//关闭绘图模式
/***********定义信号线***********************/
sbitrs=P1^1;
sbitrw=P1^0;
sbiten=P3^7;
/******************************************/
///////////////////////////////////////////////////
voidDelayms(uintn);//延时n毫秒
voidCheckBusy(void);//检查是否忙
voidWriteCommand(ucharcmd);//写指令
voidWriteData(ucharadata);//写数据
ucharReadData(void);//读数据
voidLCD_Clr(void);//清屏
voidLCD_Init(void);//初始化
voidDrawCollumLine(ucharx0,uchary0,uchary1,ucharcolor);//画竖直线
voidDrawPoint(ucharx,uchary,ucharcolor);//画点
voidLcmPrint(ucharx,uchary,uchar*adata);//写字符串
////////////////////////////////////////////////////
voiddelayms(uintn)
{
uchari;
for(;n>0;n--)
for(i=0;i<100;i++);
}
/////////////////////////////////////////////////
voidCheckBusy(void)
{
rs=0;
rw=1;
en=1;
LCD_data=0xff;
while(LCD_data&0x80);//判断busy线,最高位
en=0;
}
///////////////////////////////////////////////////
voidWriteCommand(ucharcmd)
{
CheckBusy();
rs=0;
rw=0;
en=1;
LCD_data=cmd;
Delayms
(1);
en=0;
}
//////////////////////////////////////////////////
voidWriteData(ucharadata)
{
CheckBusy();
rs=1;
rw=0;
en=1;
LCD_data=adata;
Delayms
(1);
en=0;
}
///////////////////////////////////////////////////
ucharReadData(void)
{
ucharRData;
LCD_data=0xff;
CheckBusy();
rs=1;
rw=1;
en=0;
en=1;
RData=LCD_data;
en=0;
returnRData;
}
////////////////////////////////////////////////////
voidLCD_Clr(void)
{
ucharx,y;
for(y=0;y<64;y++)
for(x=0;x<16;x++)
{
WriteCommand(LCD_GRAPH_OFF);//关闭绘图
WriteCommand(y+0x80);//行地址
WriteCommand(x+0x80);//列地址
WriteCommand(LCD_BASIC_FUNCTION);//基本指令集操作
WriteData(0x00);//清除数据
WriteData(0x00);
}
WriteCommand(LCD_BASIC_FUNCTION);
}
////////////////////////////////////////////////////////
voidLCD_Init(void)
{
WriteCommand(LCD_BASIC_FUNCTION);
Delayms(50);
WriteCommand(LCD_AWAIT_MODE);//待命模式
Delayms(50);
WriteCommand(0x06);
Delayms(50);
WriteCommand(LCD_NO_SLEEP_MODE);//唤醒睡眠
LCD_Clr();
}
////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
//在坐标(x,y)处显示字符串
voidLcmPrint(ucharx,uchary,uchar*adata)
{
ucharaddress;
uchari=0;
switch(y)//行地址选择
{
case0:
address=0x80+x;break;
case1:
address=0x90+x;break;
case2:
address=0x88+x;break;
case3:
address=0x98+x;break;
default:
break;
}
WriteCommand(address);
while(*(adata+i))
{
WriteData(*(adata+i));
i++;
}
}
//**********************************************************
/***********************************************************
函数名:
drawCollumLine
函数说明:
画竖直线
传入参数:
(x0,y0),竖直线的起点;(x1,y0)竖直线的终点;
color=1,点亮;color=0,擦除
传出参数:
无
返回值:
无
************************************************************/
voidDrawCollumLine(ucharx0,uchary0,uchary1,ucharcolor)
{
uchartemp;
if(y0>y1)//从低地址到高地址绘图
{
temp=y0;
y0=y1;
y1=temp;
}
while(y0<=y1)
{
DrawPoint(x0,y0,color);
y0++;
}
}
//////////////////////////////////////////////////////////////
/***********************************************************
函数名:
DrawPoint
函数说明:
画点
传入参数:
打点位置(x0,y0);color=1,点亮;color=0,擦除
传出参数:
无
返回值:
无
**********************************************************/
voidDrawPoint(ucharx,uchary,ucharcolor)
{
ucharrow,collum,cbite;
uchartempH,tempL;
WriteCommand(LCD_GRAPH_OFF);
WriteCommand(LCD_GRAPH_ON);
collum=x>>4;
cbite=x&0x0f;
if(y<32)
row=y;