| 
 
| 本帖最后由 黑小子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;
 }
 
 | 
 |