新闻中心

EEPW首页>嵌入式系统>设计应用> 基于MXT8051的便携式数字心电图示仪

基于MXT8051的便携式数字心电图示仪

作者:谢兴隆 大连理工大学电信学院 时间:2010-06-29 来源:电子产品世界 收藏

  软件设计

本文引用地址://m.amcfsurvey.com/article/110396.htm

  本系统软件设计的关键主要有以下三部分内容:

  1. ADC心电数据采集

  通过内部定时器0中断方式控制ADC采样率为1000Hz,其中每采集5个数据点做一次平均后,实际采样率为200Hz,然后在数组a[320]中存储320个心电波形数据。

  2. 从采用波形数据中检测心率

  将采集到的320个数据存储在一个数组a中,通过算法查找出数组最大值保存在max中,找一个值e=0.8*max,以e为数组的零点求出数组里值等于e项的数组索引数a1,a2,a3…….,根据得到的索引数求p=a3-a1,a3-a1即为两个R波之间的采样数据间隔数目,根据AD采样率为200Hz ,可得到两个心电R波波峰之间时间间隔T=p/200(s),由心率的计算公式(次/min) 即可计算出心率大小。

  3. 将采集的波形数据转换为显示数据

  LCD显示屏为320×240点阵的图形显示模块,内置RA8803 控制器。模块不仅可以显示单一的文本、图形,而且可以实现双图层的(“或”、“异或”、“同或”、“与”四种逻辑关系)合成显示。显示屏的地址结构如图10,由图可知对显示数据的操作最小单位为字节,因为的内嵌外部RAM为1K字节,显示波形的区域为180*320,显示一屏波形所需处理的数据为5.76K,故不可能同时处理一屏波形的全部数据,所以将一屏波形按字节分为40列,每次处理一列,处理完后直接显示,然后处理下一列。将AD转换所得的数据作为给LCD显示器写数据的列地址,因为一列数据为180字节,所以定义一个容量为180字节的数组lcd_buffer[180],lcd_buffer[]在初始时数据全为00H,因为每次对数据的操作至少是一个字节,而每次数据处理的是所显示一个点,所以对每列数据处理8次,定义一个变量m,在一列数据处理之前将其赋值为m=10000000B,处理该列第1个点时让该点垂直地址所对应的数组中的数据(00H)与m相或并将结果存入数组,再将变量m右移一位,即m=01000000B。让第2点垂直地址所对应的数组中的数据与m相或并将结果存入数组,再将变量m右移一位,即m=00100000B ……,这样直到一列数据中的8个点全处理完,重新给m赋值为m=10000000B,然后送显示。为了有较好的显示效果,将显示相邻的点用线连接起来,在处理第一个点时预读出第二个点的垂直坐标,与第一个点的垂直坐标进行比较,如果比第一个点的垂直坐标小则从第一个点向第二个点拉线,如果比第一个点的垂直坐标大则从第二个点向第一个点拉线。 程序如下。

  for(j=0;j<40;j++) //将一屏数据分为40列

  { m=0x80;

  for(i=j*8;i<(j+1)*8;i++)//处理每列中8个点

  { k=cdd[i]; // 读出采样数据作为垂直坐标

  lcd_buffer[k]=(lcd_buffer[k]|m);

  if(cdd[i+q]

  { for(k=cdd[i+q];k

  { lcd_buffer[k]=(lcd_buffer[k]|m); }

  }

  else

  {for(k=cdd[i+q];k>cdd[i+q+1];k--)

  { lcd_buffer[k]=(lcd_buffer[k]|m); } }

  m>>=1; //将m的值右移一位

  }

  for(h=0;h<180;h++)//送显示

  {

  SdCmd(0x60);SdCmd(j+5); //设置显示X坐标

  SdCmd(0x70);SdCmd(h); //设置显示Y坐标

  SdData(lcd_buffer[180-h]); //传送显示数据

  lcd_buffer[180-h]=0; //将已送出数据的存储器单元清零

  } }



评论


相关推荐

技术专区

关闭