今天做了一点关于用51系列单片机进行数模转换的东西,一点点收获记录下来。
用以下代码在从ADS7841中读取数据时(12位数据,根据需求有8位和十二位可选,参见datasheet),读取的数据比实际数据范围增加一倍。
typedef struct Conversion
{
uint uConversion:1; //占有一位的存储空间
}sConversion;
typedef union
{
uint uConversion; //占有two个字节
sConversion suConversion; //占有一位
}unConversion;
uint AD7841(uchar start)
{
uchar i;
unConversion unData; //******************
EA = 0; //关总中断 防止数据接受中断
CS = 0; //选中芯片ADS7841,处于工作状态
DCLK = 0; //ADS7841工作数据转换频率,处于低电平
DIN = 0; //串行数据输入,果如CS处于低电平时,数据在DLCK上升沿锁存
CY = 0;
unData.uConversion = 0;
for(i = 0; i < 8; i ++)
{
start<<=1;
DIN = CY;
_Nop();
_Nop();
_Nop();
DCLK = 1;
_Nop();
_Nop();
_Nop();
DCLK = 0;
_Nop();
_Nop();
}
DOUT = 1;
DCLK = 1;
_Nop();
_Nop();
_Nop();
DCLK = 0;
_Nop();
_Nop();
for(i = 0; i < 12; i ++)
{
unData.suConversion.uConversion = DOUT;
unData.uConversion<<=1;
DCLK = 1;
_Nop();
_Nop();
_Nop();
DCLK = 0;
_Nop();
_Nop();
_Nop();
}
CS = 1;
EA = 1;
return unData.uConversion;
}
原因在于从DOUT读取数据后移位,最低位会自动补0,最终返回的有效值为13位,且最后一位一定为0。