打印

ad7705没玩明白,大家帮忙看看吧,唉!

[复制链接]
1647|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ymcprophet|  楼主 | 2008-4-3 19:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "reg51.h"
#include "intrins.h"
#include "string.h"
void Reset7705(void);
void ad7705Init();
void Write(unsigned char dat);
unsigned read7705();
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;          //用示波器看reset位是频率很高的脉冲
            //reset不是应该恒为1吗?
       sclk=1;
       for(j=0;j<1;j++) //*多于连续32个 din=1 使串口复位
            //本应该是j<40;但如果<40程序就不对了,
            //这是怎么回事?
             { 
                sclk=0;
                 
       _nop_();
        _nop_();
                din =1;
        _nop_();
       _nop_();
                 sclk=1; 
                
             }
        //drdy=0;
   }



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

      unsigned i;
      for(i=0;i<8;i++)
       { sclk=0;
         _nop_();
         _nop_();
         if(dat&0x80)
           din=1;
         else din=0;
         _nop_();
         _nop_();
         sclk=1;
         dat=dat<<1;//保证t13延时
        }
      
    }

void ad7705Init()
  {
      
      
      Write(0x20); 
      Write(0x04); 
      Write(0x10); 
      Write(0x40);//40是增益为1
  }
unsigned read7705() 
  {
     unsigned result=0;
     unsigned i,dout;
     //dout=0;
     //din=1;
    while(drdy);//如果把本句屏蔽了,din dout用示波器看
        //都有输出,但似乎不对,如果不屏蔽根本没有输出
     
    Write(0x38); 
    sclk=1;
    for(i=0;i<16;i++)
       {
        
         result<<=1;
         sclk=1;
         _nop_();
         sclk=0; //程序执行完后sclk仍为高电平
         _nop_();
         _nop_();
         result+=(0x01&dout);//保证t5
         
         res=result;
        }
     //sclk=1;
     //din=1;//程序没走到这
     return result;
}
void main()
{   
  Reset7705(); 
   
    ad7705Init();
    
         read7705();//加while(1)似乎不对
     
}
/*****************************************
可能我发在这里很冒昧,但这个问题真是困扰我
很长时间了,我希望能有谁用过能指点一下.
非常感谢!
*****************************************/

相关帖子

沙发
iC921| | 2008-4-4 02:54 | 只看该作者

从哪来的?

使用特权

评论回复
板凳
ymcprophet|  楼主 | 2008-4-4 08:31 | 只看该作者

iC951,什么从哪来的?

使用特权

评论回复
地板
sdzhang1| | 2010-5-13 16:17 | 只看该作者
我用的c8051f340 已调试通过


/*****************************************
**函数名称:void WriteToReg(char writed_byte )
**函数功能:写一个字节到7705
**入口参数:无
**返 回 值:无
**说    明:
*****************************************/
void WriteToReg(uchar writed_byte)
{
   uchar i;
   SCK7705 = 1;
   _nop_();
   _nop_();
   for(i = 0; i < 8; i++)
   {
      DIN7705 = (bit)(writed_byte & 0x80);
      SCK7705 = 0;
      _nop_();
      _nop_();
      _nop_();
      SCK7705 = 1;
      writed_byte = writed_byte<<1;
   }
   _nop_();
   
}

/*****************************************
**函数名称:void ReadFromReg( )
**函数功能:写一个字节到7705
**入口参数:无
**返 回 值:无
**说    明:
*****************************************/
uint ReadFromReg(void) /*读一个字从7705*/
    {
    uchar i;
    uint readed_data;
    readed_data =0;
    for (i=1;i<=16;i++)
      {
       readed_data*=2;
       SCK7705 = 1;
           _nop_();
       SCK7705 = 0;
           _nop_();
       if (DOUT7705)
           {
              readed_data++;
                  _nop_();
          _nop_();
          _nop_();
           }
       SCK7705 = 1;
           }
    return(readed_data);
    }
/*****************************************
**函数名称:uint AD7705(uchar channel)
**函数功能:写一个字节到7705
**入口参数:无
**返 回 值:无
**说    明:
*****************************************/
uint AD7705(uchar channel)           /*选A/D通道,返回转换结果/通道号0/1*/
   {
    uint Ad_result,i;

        for (i = 0 ;i < 40 ;i++ )
        {
           SCK7705= 0 ;
           Delay(1);
           SCK7705= 1 ;
        }
          
    WriteToReg(0x20|(channel&0x01));/*首先写通讯寄存器,并约定下一个要写的寄存器是时钟寄存器
                                             并选中A/D通道0/1 */
    WriteToReg(0x0c) ;               /*0X09 使能振荡,4.9152MHZ的主频,A/D转换最快时间为4MS,
                                        滤波器稳定时间160MS,输出数据率500HZ,滤波器稳定时间8MS,
                                                                        即每次测量需10MS*/
                                            /*0x0c 使能振荡,4.9152MHZ的主频,A/D转换最快时间为20MS
                                            输出数据率50HZ,滤波器稳定时间80MS, 每次测量需100MS*/
        Delay(1);
    WriteToReg(0x10|(channel&0x01));/*写通讯寄存器,并约定下一个要写的寄存器是设置寄存器
                                             并选中A/D通道0/1 */
        Delay(1);
    WriteToReg(0x4e);               /*0x6e 通道0/1自校准,带输入缓冲器,增益为2,单极性,*/
    Delay(1);
        WriteToReg(0x38|(channel&0x01)); /*写/通讯寄存器,并约定下一个要读的寄存器是数据寄存器
                                              并选中A/D通道0/1 */
    while (DRDY7705);              /*等待通道0/1自校准完成,等待时间为9/输出数据率*/
   
    Ad_result=ReadFromReg();          /*读A/D转换高字节*/

    return(Ad_result);
   }

使用特权

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

本版积分规则

4

主题

10

帖子

0

粉丝