采用STC12C5A60S2单片机。使用单片机带的硬件SPI口与MAX1270连接。使用MAX1270的内部时钟模式。程序大体如下:
void startAD(uchar idata adCh,uchar idata scale,uint idata *x){//adCh选择通道,scale选择输入电压范围:0:0~5V 1:-5~+5V 2:0~10V 3:-10~+10V
uchar temp1,temp2;
uchar controlByte = 0x80 +(adCh << 4)+(scale << 2);//internal clock
AD_CS;//片选下降沿
send_SPI(controlByte);//设置控制字
P2_Reset;//片选置高,阻止数据被锁存到DOUT
delayUs(10);//等待转换完毕最多15us
AD_CS;//片选下降
read_SPI(&temp1);//读高8位数据
read_SPI(&temp2);//读低4位数据
P2_Reset;//CS上升
*x = (temp1 << 4) | (temp2 >> 4);
}
void send_SPI(uchar ch){//向从机发送数据
SPDAT = ch;
while(!(SPSTAT&0x80));//等待发送完毕
SPSTAT = 0xc0;//软件向SPIF、WCOL写“1”清零
}
void read_SPI(uchar *ch){//读取从机的数据
SPDAT = 0x00;
while(!(SPSTAT&0x80));//等待接收到数据
SPSTAT = 0xc0;//软件向SPIF、WCOL写“1”清零
*ch = SPDAT;
}
但是,这样测出来的值变动很大,范围跳动在在5mv左右,很不稳定。按说12位AD不会这样波动啊。不知道是程序的事,还是电路的事。望高手赐教。 |