最近在用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;
}
}
一周热门 更多>