打印

我的ad7705程序不好使,大家帮忙看看怎么回事

[复制链接]
3994|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ymcprophet|  楼主 | 2008-3-27 13:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*TI=1时,申请中断,CPU响应中断后,发送数据
  RI=1时,申请中断,要求CPU取走数据*/
#include "reg51.h"
#include "stdio.h"
#include "intrins.h"
#define  CTH1 0xfd    
#define  CTL1 0xfd
sbit   cs=P3^1;
sbit   reset=P3^2;
sbit   drdy=P3^3;
sbit   sclk=P3^4;
sbit   din=P3^6;
sbit   dout=P3^5;
unsigned char idata send_letter;
unsigned char LSB,MSB;
void serial_init(void); 
void serial_send(void);
void ad7705_init(void);
void writead7705(unsigned char);
void resetad7705(void) ;
unsigned char  readad7705(unsigned char);
unsigned char exchange(unsigned char a);
void serial_init()
  {
     TMOD=0x21;
     TH1=CTH1;
     TL1=CTL1;
     SCON=0x50;
     PCON=0;
     TR1=1;
     TR0=1;
     ET0=1;     
     ES=1;       
     EA=1;
   }
void ad7705_init()
   {
     cs=0; 
     writead7705(0x20);//写通信寄存器,找时钟寄存器
     writead7705(0x55);//写时钟寄存器
     writead7705(0x10);//写通信寄存器,找设置寄存器
     writead7705(0x40);//写设置寄存器
     
     
   }
void serial_send()
   {
       unsigned char data tmp=0;
       tmp=send_letter;
       TI=0;
       SBUF=tmp;
       while(!TI);
       TI=0;
   }
void resetad7705(void) 
   {
       int tim;
       unsigned char j;
       tim=1000;
       reset=0;
       while(tim--);
       reset=1;
       cs=0;
       sclk=1;
       for(j=0;j<40;j++) //*多于连续32个 din=1 使串口复位
             { 
                sclk=0; 
                din =1; 
                sclk=1; 
             }


    }
unsigned char  readad7705(unsigned char readata)
  {
     int AD_result; 
     unsigned char LSB,MSB;
     unsigned char comm;
     cs=0;
     comm=exchange(readata);
     while(drdy==1);
     SCON=0;
     SBUF=comm;  
     while(TI==0);
     TI=0;
     SCON=0x10;
     while(RI==0);
     RI=0;
     MSB=SBUF;
     SCON=0x10;
     while(RI==0);
     RI=0;
     LSB=SBUF;
     MSB=exchange(MSB);
     LSB=exchange(LSB); 
     AD_result=(int)MSB; //以下为高低字节合并 
     AD_result=AD_result<<8; 
     AD_result=AD_result|(int)LSB;
     return AD_result; //返回读取的数据 
   }
void writead7705( unsigned char byteword)
  {
     
      unsigned i;
      // sclk=1;
      for(i=0;i<8;i++)
             {
                din=(bit)(byteword&0x80);
                sclk=1;
                sclk=0;
                sclk=1;
                byteword<<=1;
              }
       // sclk=1;//程序执行完后sclk仍为高电平
       din=1; //为保证不乱写程序

   }
unsigned char exchange(unsigned char a) /*将8位数据a的顺序颠倒后赋给b。
                                          因为串口发送顺序和ad7705的接收顺序刚好相反*/
 {
      unsigned char i,b;
      b=a&0x01;
      for(i=1; i<8; i++)
         {
           b=b<<1;
           a=a>>1;
           b=b+(a&0x01);
         }
    return(b);
   }
/*void writead7705( unsigned char byteword) //通过串口给ad7705发送命令字a
   {  unsigned char comm;
      SCON=0;
      TI=0;
      comm=exchange(byteword);
      SBUF=comm;
      while(!TI);
      TI=0;
   }*/

void main(void)
  {  int result;
     serial_init();
     resetad7705();
     ad7705_init();
     result=readad7705(0x38);
     send_letter=result;
     serial_send();
     
  }

相关帖子

沙发
ymcprophet|  楼主 | 2008-3-28 10:46 | 只看该作者

我不加串口,只控制AD,可是好像还是不对,大家帮忙看看

/*TI=1时,申请中断,CPU响应中断后,发送数据,硬件控制TI
  RI=1时,申请中断,要求CPU取走数据*/
#include "reg51.h"
#include "stdio.h"
#include "intrins.h"
#include "string.h"
void Reset7705(void);
unsigned int read7705(void);            //返回一次采样值
void ad7705Init(unsigned char range);
void Write(unsigned char dat);
sbit   cs=P3^1;
sbit   reset=P3^2;
sbit   drdy=P3^3;
sbit   sclk=P3^4;
sbit   din=P3^6;//此为din  dout 实际联接
sbit   dout=P3^5; 
void Reset7705(void) 
  {
       int tim,j;
       cs=0;
       tim=1000;
       reset=0;
      // while(tim--);
       reset=1;
       sclk=1;
       for(j=0;j<1;j++) //*多于连续32个 din=1 使串口复位
             { 
                sclk=0;
                 //Delay();
                din =1; 
                 sclk=1; 
                 //Delay();
             }
        drdy=0;
   }

//写入寄存器8位数据
void Write(unsigned char dat) 
   {

      unsigned i;
      for(i=0;i<8;i++)
       {//sclk=1;
         //Delay();
         sclk=0;
         //din=(bit)(dat&0x80);//AD7705希望MSB在前,所以总是取最高位与,然后左移,把第二高位变成第一高位,再与
         if(dat&0x80)
           din=1;
         else din=0;
         //Delay();
         sclk=1;
         dat=dat<<1;//保证t13延时
        }
      //din=1; //为保证不乱写程序,此语句非常重要,否则试验表明很不稳定
    }

void ad7705Init(void)
  {
      Reset7705(); 
      Write(0x20); 
      Write(0x55); 
      Write(0x10); 
      Write(0x40); 
  }


//返回一次采样值
unsigned int read7705(void) 
  {
     unsigned rtval=0;
     unsigned i;
     //dout=0;
     //din=1;
     while(drdy==1);
     Write(0x38); //0x38:00111000 下一个16位数据寄存器;读;正常工作模式;通道AN1
     sclk=1;
     for(i=0;i<16;i++)
       {
         //sclk=1;
        // Delay();
         rtval<<=1;
         sclk=1;
         rtval+=(0x01&(unsigned)dout);//保证t5
         sclk=0; //程序执行完后sclk仍为高电平
       }
     //sclk=1;
     //din=1;//程序没走到这
     return rtval;
}
void main()

ad7705Init();
while(1)
  {
  //cs=0; 
  //ad7705Init();
  read7705();
 
  }
}

使用特权

评论回复
板凳
yczhang| | 2008-3-28 10:50 | 只看该作者

怎么个不好使啊

使用特权

评论回复
地板
ymcprophet|  楼主 | 2008-3-28 13:25 | 只看该作者

drdy和dout总为高电平输出,din总为低电平状态

使用特权

评论回复
5
Wxy8030| | 2008-3-28 20:44 | 只看该作者

为什么只看到CS=0?

CS=1呢?

使用特权

评论回复
6
ymcprophet|  楼主 | 2008-4-2 08:48 | 只看该作者

CS我总让它保持低电平了,这有什么关系吗谢谢

使用特权

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

本版积分规则

4

主题

10

帖子

0

粉丝