提升PIC单片机AD转换数据存储及串口效率的设计

发布时间:2012-2-23 19:23    发布者:1770309616
关键词: AD转换 , PIC , 串口 , 单片机
 在由单片机和PC 机构成的检测系统中,通常会由多个单片机采集数据并将经过A/D 转换的数据通过串口送往上位PC 机进行数据处理。PIC 单片机A/D 转换后的结果大多是8 位或10位的,8 位的A/D转换不涉及该问题。以10 位的数据为例,在单片机内进行存储时需要占用2 个8 位的字节,低8 位和高2位分别存储在2 个字节中,但是用于存储高位数据的8 位宽的RAM 单元中仅有2 位是有效数据。
  单片机的存储空间有限,以单片机为例,RAM 数据存储器按功能分为通用寄存器和特殊功能寄存器两个部分,除去特殊功能寄存器外,仅有368个8 位宽的RAM 单元,单片机能够存储的数据量很有限。假设将每次A/D 转换的数据直接存储,每个数据都要占用2 个字节,理想状态下也只能存储184个数据; 假设需要存储100个A/D 转换的数据,就要占用200个字节的单元,这样的存储方式并未将单片机的存储空间充分利用,同时,如果将A/D 转换后的数据通过串口直接上传,串口就要向上传送200 帧的数据,有效传输速率比较低,没有充分利用数据帧中的数据位。为此,本文提出如下方法将A/D 转换后的数据先进行处理后再存储或上传。
  1 程序设计思路
  以10 位的A/D 转换为例,可以将A/D 转换的结果暂存在a[size] 中,然后把数组a 中的数据一位一位地取出,把低8 位和高8 位拆开分别存放,低8 位存放在数组b 中,高8 位存放在数组c 中,由于高8 位的数据中只有2 位是有效数据,我们可以把有效数据取出组合成一个新的数据存放,当上传数据后再用相反的方法解码,把数据恢复到原先的状态。这样对于10 位的A/D 转换来说可以节省3/8 的空间,需要向上位机传送的数据也会比较少,数据传输时间仅为原来的5/8。
  2 采用C 语言编写的程序
  本文采用PIC16F877单片机进行试验。其中定义i、h、j、n、m 为int8,a[size] 为int16 的数组,用于暂存A/D 转换的结果; b[number]、c[number]、d[number] 是int8 的数组。程序原文如下:

      11.jpg

  程序首先利用一个for 循环将A/D 转换后的数据拆开,将低8 位存放在数组b 中,高2 位暂时存放在数组c 中。由于数组c 中的8 位二进制数据都是仅有低2 位是有效数据,所以第二个for 循环将c[i]、c[i+1]、c[i+2]、c[i+3]中的2 位有效数据取出,按照由低到高的顺序重新组合成一个8 位的二进制数,放入数组d,构成一个新的数组。这样A/D 转换结果由原来用数组a 表示变成了由数组b 表示低8 位、数组d 表示高2 位的状态。
  程序中的h、j、n、m 用于记录最后转换的数据存储在数组的位置,在下一次转换的时候,数据可以接在上一次的数据后面,n 和j 在主程序中cONvert ( ) 被调用之前首先被赋值为0。
  3 结论
  根据以上程序,我们可以按照类似的方法把12位的A/D 转化结果进行组合,将12 位的A/D 转换结果拆成低8 位和高4 位,再将2 个高4 位重新组合成一个8 位的二进制数存储,这样对于12 位的A/D 转化结果可以节省1/4 存储空间,缩短1/4 传输时间。
  该程序的执行时间仅为990us,相对于数据的传输时间是很小的。在单片机空间小的情况下,以程序的执行时间来换取单片机的存储空间是值得的。同时又能有效地缩短数据的上传时间,提高有效数据的传输速率。但是在数据量较少的时候,比如只有1 个A/D 转换的数据,这样做反而会耗费时间、降低效率。

来源:电子工程网
本文地址:https://www.eechina.com/thread-86411-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

相关在线工具

相关视频

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表