PIC 单片机A/D 转化后的数据一般需求占用两个8 位宽的RAM 单元, 而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 的数组。程序原文如下:
vo idconvert ()
{
h= j;
for ( i= 0 ; i< size ; i+ + )
{
b[h+i]= a[i];
c[i] = (a[i]>> 8)&0x03;
j++ ;
}
m= n;
for ( i= 0 ; i< size/4 ; i+ + )
{
d[m+i]= (c[4*i]<< 2) |c[4*i+ 1 ];
d[m+i]= (d[m+i]<< 4) |(c[4*i+ 2 ]<< 2) ;
d[m+i]= d[m+i]|c[4*i+3];
n++ ;
}
}
程序首要使用一个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 转化的数据, 这样做反而会消耗时刻、下降功率。