优化PIC单片机AD转换数据存储及串口效率

2012年3月2日09:42:30 评论

PIC单片机A/D转换后的数据通常需要占用两个8位宽的RAM单元, 而PIC 单片机的存储单元有限,因此造成了单片机的存储单元不能被有效利用, 同时通过串口向上位机传送数据时也需要花费较多的时间。为此提出一种数据打包的方法, 使得相同的数据量占用较少的存储空间, 并可提高传输效率。

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的数组。程序原文如下:

优化PIC单片机AD转换数据存储及串口效率

程序首先利用一个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转换的数据, 这样做反而会耗费时间、降低效率。