AD7606 C51程序

2020-01-16 18:27发布

      最近在用AD7606来做项目,感觉这块IC不错,资料齐全,很好用,速度快。在调试过程中间也碰到很多问题,但都一一解决了,下面是C51程序。
分享给大家,高手的请绕过。手下留情。


sbit OS0=P5^2;
sbit OS1=P0^4;
sbit OS2=P0^3;

sbit RANGE=P0^2;
sbit CONVST=P0^1;
sbit ADC_RST=P0^0;

sbit RD_SCK=P4^6; //SPI=SCLK
sbit ADC_CS1=P7^5;         //U19                               
sbit ADC_CS2=P4^5;         //U15                               

sbit FRSTDAT=P7^6; //指示何时读通道1(V1)数据=1;
sbit HBEN=P4^3;   //DB14,选择输出:1=先输出高8位,后输出低8位
sbit BUSY=P7^7;   //在高电平时读取数据

sbit AD_DoutA=P2^0;  //DB7,串行模式用到,输出数据Dout A
sbit AD_DoutB=P4^4;  //DB8,串行模式用到,输出数据Dout B

/*
*****************************************************************************
*        函 数 名: ad7606_Reset
*        功能说明: 硬件复位AD7606
*        形    参:无
*        返 回 值: 无
*****************************************************************************
*/
void ad7606_Reset(void)
{
        /* AD7606是高电平复位,要求最小脉宽50ns */
       
        ADC_RST=0;
       
        ADC_RST=1;
        ADC_RST=1;
        ADC_RST=1;
        ADC_RST=1;
        Delay1ms();
        ADC_RST=0;
}
/*
*********************************************************************************************************
*        函 数 名: ad7606_StartConv
*        功能说明: 启动AD7606的ADC转换
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
void ad7606_StartConv(void)
{
        /* 上升沿开始转换,低电平持续时间至少25ns  */
        CONVST=0;
        CONVST=0;
        CONVST=0;        /* 连续执行2次,低电平约50ns */
        Delay10us();
        CONVST=1;
        Delay100us();
        Delay100us();
//        Delay100us();
}
//******************************************************************************//
void AD7606_init()
{
        Delay1ms();

        ad7606_Reset();
        OS2=1;OS1=1;OS0=0;  //设定过采样
        ADC_CS1=1;
        ADC_CS2=1;
        P2=0x80;
        RD_SCK=1;
        CONVST=1;
        RANGE=0; //选择+/- 5V 输入         
        HBEN=0;   //DB14,选择输出:1=先输出高8位,后输出低8位
}

//***************************************************************************
void AD7606C(uchar acch)//(unsigned int *adcdat)
{
        uint DoutA[4],DoutB[4];
        uint i,j,n;
        uchar TempAH,TempBH,TempAL,TempBL;

        OS2=1;OS1=1;OS0=0;  //设定过采样
        RANGE=1; //选择+/- 10V 输入       
        select_CH(acch);
        P51=1; P35=0;
        delayms(50);

        for(j=0;j<100;j++)
        {
                  
                ad7606_StartConv();        //启动AD7606的ADC转换
                  while(BUSY){;}
                ADC_CS1=0;
                ADC_CS2=1;
                TempAH=0;  TempBH=0;
                TempAL=0;  TempBL=0;

                for(n=0;n<4;n++)
                {
                        TempAH=TempAH<<1;
                        TempBH=TempBH<<1;
                        RD_SCK=0;  
                        if(AD_DoutA)TempAH|=0x01;
                        if(AD_DoutB)TempBH|=0x01;                                 
                        RD_SCK=1;

                        for(i=0;i<7;i++)
                        {               
                                RD_SCK=0;          
                                RD_SCK=1;        
                                TempAH=TempAH<<1;
                                TempBH=TempBH<<1;
                                if(AD_DoutA)TempAH|=0x01;                               
                                if(AD_DoutB)TempBH|=0x01;                                                                                          
                        }
                        for(i=0;i<8;i++)
                        {               
                                RD_SCK=0;          
                                RD_SCK=1;        
                                TempAL=TempAL<<1;
                                TempBL=TempBL<<1;
                                if(AD_DoutA)TempAL|=0x01;                               
                                if(AD_DoutB)TempBL|=0x01;                                                                                          
                        }
                        DoutA[n]=MakeWord(TempAL,TempAH); //MakeWord(L,H);
                        DoutB[n]=MakeWord(TempBL,TempBH);
                }
                //..............................................
                ADC_CS1=1;         
        }

}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。