丁丁

测试平台之16位ADC调试AD7705程序

0
阅读(4787)

AD7705的调试也比较简单,下面是51模拟spi的程序,只要读出数据,剩下的事情就比较好办了,根据项目需求,当AD电压高的时候就报警,低的时候也报警,并且显示,这里就不多叙述了。
#include"reg52..h"
#include"intrins.h"
#include"delay.h"

sbit sclk = P1^0;
sbit drdy = P1^1;
sbit din  = P1^2;
sbit dout = P1^3;
/**************函数声明**************************/
void Write(unsigned dat); //写入寄存器8位数据
unsigned int Read(void); //从数据寄存器中读出16位数据
void Adc7705Init(void);
unsigned int Adc7705(void); //返回一次采样值
void Reset7705(void);
unsigned Read8bit(void);  //测试函数从寄存器中读出8位数据
/* AD7705通信端口复位 */
void Reset7705(void)
{
    unsigned char i;
 sclk=1;
    for(i=0;i<40;i++) //*多于连续32个 din=1 使串口复位
    { 
        sclk=0;
        din =1;
        sclk=1;
    }
}
//写入寄存器8位数据
void Write(unsigned dat) 
{
 
 unsigned i;
// sclk=1;
 for(i=0;i<8;i++)
 {
  din=(bit)(dat&0x80);
  sclk=1;
  sclk=0;
  sclk=1;
  dat<<=1;//保证t13延时
 }
// sclk=1;//程序执行完后sclk仍为高电平
 din=1; //为保证不乱写程序,此语句非常重要,否则试验表明很不稳定
}
//从数据寄存器中读出16位数据
unsigned int Read(void)  
       //低电平拉下t5后出数据
{
 unsigned int rtval=0;
 unsigned i;
// sclk=1;
 for(i=0;i<16;i++)
 {
  sclk=0;
  rtval<<=1;//i=0时,此操作不妨碍
  rtval+=(0x0001&(unsigned int)dout);
  sclk=1; //程序执行完后sclk仍为高电平
 }
// sclk=1;
 din=1; //为保证不乱写程序,此语句非常重要,否则试验表明很不稳定
 return rtval;
}
/*****************************************************
此函数测试用,用于读8位的寄存器
通过修改Write();中的参数值可选择不同的寄存器
*****************************************************/
unsigned Read8bit(void)  //从寄存器中读出8位数据
       //低电平拉下t5后出数据
{
 unsigned rtval=0;
 unsigned i;
 while(drdy==1);
 Write(0x28);   //修改此处值可从不同寄存器中读数
 sclk=1;
 for(i=0;i<8;i++)
 {
  sclk=0;
  rtval<<=1;
  //if(dout)rtval|=0x01;
  rtval+=(0x01&(unsigned)dout);//保证t5
  sclk=1; //程序执行完后sclk仍为高电平
 }
  sclk=1;
  din=1;
 return rtval;
}
//7705初始化函数
void Adc7705Init(void)
{
 Reset7705();  //复位
 
 //写时钟寄存器
 Write(0x20); //0x20:00100000 下一个时钟寄存器;写;正常工作模式;通道AN1
 Write(0x07); //0x07:00000111 主时钟打开;晶振2M;不分频;500Hz;
 
 //写设置寄存器
 Write(0x10); //0x10:00010000 下一个设置寄存器;写;正常工作模式;通道AN1
 Write(0x46); //0x46:01000110 自校准;增益为1;单极性;接缓冲,允许处理高阻电源;非复位
 //delay_1ms(50);
}
//返回一次采样值
unsigned int Adc7705(void) 
{
 while(drdy==1);
 Write(0x38); //0x38:00111000 下一个16位数据寄存器;读;正常工作模式;通道AN1
 return Read();
}