心电信号的存储回放.docx

上传人:b****0 文档编号:10137855 上传时间:2023-05-23 格式:DOCX 页数:31 大小:21.73KB
下载 相关 举报
心电信号的存储回放.docx_第1页
第1页 / 共31页
心电信号的存储回放.docx_第2页
第2页 / 共31页
心电信号的存储回放.docx_第3页
第3页 / 共31页
心电信号的存储回放.docx_第4页
第4页 / 共31页
心电信号的存储回放.docx_第5页
第5页 / 共31页
心电信号的存储回放.docx_第6页
第6页 / 共31页
心电信号的存储回放.docx_第7页
第7页 / 共31页
心电信号的存储回放.docx_第8页
第8页 / 共31页
心电信号的存储回放.docx_第9页
第9页 / 共31页
心电信号的存储回放.docx_第10页
第10页 / 共31页
心电信号的存储回放.docx_第11页
第11页 / 共31页
心电信号的存储回放.docx_第12页
第12页 / 共31页
心电信号的存储回放.docx_第13页
第13页 / 共31页
心电信号的存储回放.docx_第14页
第14页 / 共31页
心电信号的存储回放.docx_第15页
第15页 / 共31页
心电信号的存储回放.docx_第16页
第16页 / 共31页
心电信号的存储回放.docx_第17页
第17页 / 共31页
心电信号的存储回放.docx_第18页
第18页 / 共31页
心电信号的存储回放.docx_第19页
第19页 / 共31页
心电信号的存储回放.docx_第20页
第20页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

心电信号的存储回放.docx

《心电信号的存储回放.docx》由会员分享,可在线阅读,更多相关《心电信号的存储回放.docx(31页珍藏版)》请在冰点文库上搜索。

心电信号的存储回放.docx

心电信号的存储回放

#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(ENDADDR

ENDADDR++;

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;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2