本帖最后由 黑小子mxx 于 2014-3-23 18:45 编辑
由于51的串口有他用,所以只能用别的I/O口读取16位串行AD的数据,不知道怎么实现啊?哪位大神给点儿提示,有源程序就更好了,谢谢了先~~~~
下面是我从网上找的程序,但是不全,前面蓝色部分是我自己加的,注释差不多也是,不知道我的理解对不对?
还有:标记红色的3行代码我看的不是很明白,希望各位帮忙分析一下。看要怎么改改才可行。
ad7705 数据采集处理源代码
#define SpiCS_0 P1^0 = 0
#define SpiCS_1 P1^0 = 1
#define SpiDo_0 P1^1 = 0
#define SpiDo_1 P1^1 = 1
#define SpiCL_0 P1^2 = 0
#define SpiCL_1 P1^2 = 1
#define RESET_0 P1^3 = 0
#define RESET_1 P1^3 = 1
sbit IN = P1^4;
sbit DRDY = P3^2;
#define spiDA_IN IN & 0x01
void Press_Init(void) //ad7705初始化测压channel 00
{
SpiCS_0;//使能AD7705,低有效
Delay(50);
RESET_0; //防止接口迷失,复位AD7705
Delay(150);
RESET_1; //
MSP430_WriteSPI0(0x20); // 写0x21通信寄存器,测温channel 01 ,下一个写设置寄存器
MSP430_WriteSPI0(0x04); // 写0xc0时钟寄存器内部频率50HZ
MSP430_WriteSPI0(0x10); // 写0x11通信寄存器,测温channel 01 ,下一个写时钟寄存器
MSP430_WriteSPI0(0x40); // 写0x46设置寄存器,设置成单极性、无缓冲、增益为1、滤波器工作、自校准
}
void MSP430_WriteSPI0(char a) //向AD7705写入一个字节的函数
{
char j,temp=0x80;
for (j=0; j<8; j++)
{
SpiCL_0; //串行时钟为低电平时钟
if (temp & a)
{
SpiDo_1; //向AD7705发送高电平
}
else
{
SpiDo_0; //向AD7705发送低电平
}
SpiCL_1; //串行时钟为高电平
temp = temp>>1;
}
}
int Read7705(void)
{
unsigned char i;
unsigned char TempBit = 0;
int TempData = 0;
SpiCL_0; //串行时钟为低电平
spiDIR_IN; //输入模式????
for (i=0; i<16; i++)
{
SpiCL_1; //串行时钟为高电平
if (SpiDA_IN == 0x01 )
{
TempBit = 1; //读取一个高电平
}
else
{
TempBit = 0; //读取一个低电平
}
SpiCL_0; //串行时钟为低电平
TempData = (TempData << 1) | TempBit;
}
spiDIR_OUT; //输出模式?????
SpiDi_1; //??????
return TempData;
}
int get_ad7705(char channel) //读温度channel=0x01或差压数据 channel=0x00
{
if(channel==0x00)
{
MSP430_WriteSPI0(0x38);//写通信寄存器设置读当前通道数据 0x38|channel=0x00
}
else
{
MSP430_WriteSPI0(0x39);//0x38|channel=0x01//8785413
}
while (DRDY==1);//DRDY为高不能进行读操作
kb[30] = Read7705();//RXBUF0
if(kb[30]<0)
kb[30]=kb[30]+32768;
else
kb[30]=kb[30]-32767;
return(kb[30]); //接收到的数据为AD16bit
}
int adave(char n,char channel) //求n次A/D转换的平均值
{
volatile char i,pit;
for(ue=0;ue<n;ue++)
{
ADC_temp[ue]=get_ad7705(channel); //读走温度数据
}
ADC_tem=0;
for(pit=4;pit<n;pit++)
{
ADC_tem+=ADC_temp[pit]; //求和
}
max=ADC_temp[4];
min=ADC_temp[4];
for(i=4;i<n;i++)
{
if(ADC_temp>max)
max=ADC_temp;
if(ADC_temp<min)
min=ADC_temp;
}
ADC_tem=(ADC_tem-max-min)/(n-6);//去掉最大最小值然后求平均值
return ADC_tem;
}
|