打印

我调的AD7705老是出问题。

[复制链接]
2021|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
czrecall|  楼主 | 2010-8-18 20:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用7705测电压,开始读出来的数还可以,但过了几秒读出来的数就固定了(而且是错误的)。
网上说要复位,我就加了复位程序,但是过了几分钟芯片就没中断了。
不知道是哪有问题?请各位给我一个源程序比较。
这是我的程序。
#include<stc12.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/******************ad7705  cmd*******************************************/
#define WR_REG 0x00
#define RD_REG 0x08
/******** reg adress*****************************/
#define CMD_REG 0x00
#define ST_REG 0x10
#define CLK_REG 0x20
#define DAT_REG 0x30
#define TS_REG 0x40
#define NO 0x50
#define OFFST_REG 0x60
#define GAIN_REG 0x70
//CLK P1.7  MISO P1.6 MOSI P1.5 CS P1.3
sbit CS=P1^3;
sbit DRDY=P1^4;
sbit RESET=P1^2;
uint rec_data=0x0000;
//sbit SCLK=P1^7;
//sbit DI=P1^5;
//sbit DO=P1^6;
uchar code seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay_ms(unsigned int x);
void ad7705_initial();
/*****************************************************************/
void SPI_WR_REG(uchar reg,uchar value )
{
  uchar adr;
  CS=1;
  adr=(reg|WR_REG);
  SPCTL=0xdf;
  SPSTAT=0xc0;
  CS=0;
  SPDAT=reg;
  while(!(SPSTAT&0x80));
  CS=1;
  SPCTL=0xdf;
  SPSTAT=0xc0;
  CS=0;
  SPDAT=value;
  while(!(SPSTAT&0x80));
  CS=1;
  SPCTL=0x9f;
}
/*******************************************************/
uint SPI_RD_DAT()
{
  uint dat=0x00;
  uchar dath,datl;
  CS=1;
  SPCTL=0xdf;
  SPSTAT=0xc0;
  CS=0;
  SPDAT=0x38;
  while(!(SPSTAT&0x80));
  CS=1;
  
   
  SPSTAT=0xc0;
  CS=0;
  _nop_();
  SPDAT=0x00;
  //SPCTL=0xdc;

  while(!(SPSTAT&0x80));
  //CS=1;
  dath=SPDAT;
  SPSTAT=0xc0;
  SPDAT=0x00;
  while(!(SPSTAT&0x80));
  datl=SPDAT;
  SPCTL=0x9f;
  dat=((uint)dath)&0x00ff;
  dat=dat<<8;
  dat=dat|datl;
  return(dat);
}

/**************************************************************/
void delay_ms(unsigned int x)
{
    unsigned int i,j;
    i=0;
    for(i=0;i<x;i++)
    {
       j=108;
           ;
       while(j--);
    }
}
/************************************************/
  void dis()
{
   uchar temp;
   //EA=0;
   temp=rec_data/10000;
   P0=seg[temp];
   P2=0xef;
   delay_ms(2);
   temp=(rec_data%10000)/1000;
   P0=seg[temp];
   P2=0xf7;
   delay_ms(2);
   temp=(rec_data%1000)/100;
   P0=seg[temp];
   P2=0xfb;
   delay_ms(2);
   temp=(rec_data%100)/10;
   P0=seg[temp];
   P2=0xfd;
   delay_ms(2);
   temp=rec_data%10;
   P0=seg[temp];
   P2=0xfe;
   delay_ms(2);
   //EA=1;
}
/*********************************************************/
void ad7705_initial()
{
   RESET=0;
   delay_ms(200);
   RESET=1;
   delay_ms(200);
   SPI_WR_REG(CLK_REG,0x0c);
   SPI_WR_REG(ST_REG,0x40);
}

void main()
{
   ad7705_initial();
   while(1)
   {
      dis();
   while(DRDY);
   rec_data=SPI_RD_DAT();
   
   }
}

相关帖子

沙发
czrecall|  楼主 | 2010-8-18 20:47 | 只看该作者
这是另外一种写法,也不行。
#include<reg52.h>
#include <intrins.h>
#include <lcd1602.h>
#define uchar unsigned char
#define uint unsigned int

/******************ad7705  cmd*******************************************/
#define WR_REG 0x00
#define RD_REG 0x08
/******** reg adress*****************************/
#define CMD_REG 0x00
#define ST_REG 0x10
#define CLK_REG 0x20
#define        DAT_REG 0x30
#define TS_REG 0x40
#define NO 0x50
#define OFFST_REG 0x60
#define GAIN_REG 0x70

/*****************************************/
sbit CS=P1^0;
sbit SCLK=P1^1;
sbit DI=P1^2;
sbit DO=P1^3;
sbit RESET=P1^4;
sbit DRDY=P1^5;
uchar data TimeNum[16]={48,48,48,48,48};
uchar data Test1[16]={"     zczjxz     "};
//sbit led0=P1^6;
//sbit led1=P1^7;

uint rec_data=0x0000;
uchar code seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay_ms(unsigned int x);
void ad7705_initial();
/******************************chip function*****************************/
void ad7705wr_reg(uchar reg,uchar value)
{
  uchar adr,dat,i;
  CS=1;
  SCLK=1;
  CS=0;
  adr=WR_REG|reg;
  
  for(i=0;i<8;i++)
  {
           SCLK=0;
         DI= (adr&0x80);        /**************发送高位****************/
         SCLK=1;
         adr<<=1;
  
   }
   CS=1;
   dat=value;
   CS=0;
  for(i=0;i<8;i++)
  {
           SCLK=0;
         DI=(dat&0x80);        /**************发送高位****************/
         SCLK=1;
         dat<<=1;
  
  }

  CS=1;
}

/************************************/

uint ad7705rd_data()

{
  uchar adr,i;
  uint dat;
  CS=1;
  SCLK=1;
  CS=0;
  adr=0x38;
  
  for(i=0;i<8;i++)
   {
           SCLK=0;
         DI=(adr&0x80);        /**************发送高位****************/
         SCLK=1;
         adr<<=1;
    }
        DI=1;
   CS=1;
   dat=0x0000;
   CS=0;
   for(i=0;i<16;i++)

   {
      SCLK=0;
          dat<<=1;
          //DI=0;
          SCLK=1;
          dat=(dat|DO);   /****************低位采集数据向高位移位,移位15次将最低位从第一位移到第十六位******/
        }
       
   CS=1;
   return(dat);
}
/**************************************************************/
void ad7705_initial()
{         
       
   
     RESET=0;
    delay_ms(20);
        RESET=1;
        delay_ms(20); /****Active Channel is Ain1(+)/Ain1(-)****/
   ad7705wr_reg(CLK_REG,0x0c); /*****master clock enabled, 4.9512MHz Clock, set output rate to 50Hz*****/
   ad7705wr_reg(ST_REG,0x44);
   
}
/*************************************************************/
void init(void)                               
{
                               
TMOD=0x20;                               
TH1=0xfd;                               
TL1=0xfd;                               
SCON=0x50;                               
TR1=1;                       
//ES=1;                               
//EA=1;       
}               


/*************************************************************************/
void MCU_initial()

{

  EX0=1;
  IT0=1;
  //ES=1;
  EA=1;
}

/********************************************************/
void delay_ms(unsigned int x)
{
    unsigned int i,j;
    i=0;
    for(i=0;i<x;i++)
    {
       j=108;
           ;
       while(j--);
    }
}
/*******************************************
void dis()
{
   uchar j;
   uint temp;
  // EA=0;
   temp=rec_data/10000;
   P0=seg[temp];
   P2=0xef;
   for(j=0;j<10;j++)
   {
   _nop_();
   }
   
   temp=(rec_data%10000)/1000;
   P0=seg[temp];
   P2=0xf7;
   for(j=0;j<10;j++)
   {
   _nop_();
   }
   temp=(rec_data%1000)/100;
   P0=seg[temp];
   P2=0xfb;
  for(j=0;j<10;j++)
   {
   _nop_();
   }
   temp=(rec_data%100)/10;
   P0=seg[temp];
   P2=0xfd;
   for(j=0;j<10;j++)
   {
   _nop_();
   }
   temp=rec_data%10;
   P0=seg[temp];
   P2=0xfe;
for(j=0;j<10;j++)
   {
   _nop_();
   }
   //EA=1;

}



/*************************************************/

void main()
{
   uchar j=0;
  
  //MCU_initial();
   //init();
     
    InitLcd();
        DelayMs(15);
   ad7705_initial();        
   ShowString(0,Test1);
   //MCU_initial();
           
          while(1)
          
{
       

               
                //DelayMs(15);
                ShowString(1,TimeNum);
                if(!DRDY)
                {
                   rec_data=ad7705rd_data();
               TimeNum[0]=rec_data/10000+48;
               TimeNum[1]=(rec_data%10000)/1000+48;
               TimeNum[2]=(rec_data%1000)/100+48;
               TimeNum[3]=(rec_data%100)/10+48;
               TimeNum[4]=rec_data%10+48;
                   DelayMs(20);
                }
               

       
               
               
          
         
  }
                             
  
}

/*void data_receive () interrupt 0
{

        rec_data=ad7705rd_data();
        TimeNum[0]=rec_data/10000+48;
        TimeNum[1]=(rec_data%10000)/1000+48;
        TimeNum[2]=(rec_data%1000)/100+48;
        TimeNum[3]=(rec_data%100)/10+48;
        TimeNum[4]=rec_data%10+48;



}  */

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

2

帖子

1

粉丝