心电信号的存储回放.docx
- 文档编号:24059207
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:31
- 大小:21.73KB
心电信号的存储回放.docx
《心电信号的存储回放.docx》由会员分享,可在线阅读,更多相关《心电信号的存储回放.docx(31页珍藏版)》请在冰豆网上搜索。
心电信号的存储回放
#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;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电信号 存储 回放