|
#include <reg52.h>
#include <string.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define DELAY_TIME 50
sbit OS0=P1^1;
sbit OS1=P1^2;
sbit OS2=P1^3;
sbit AD_DoutA=P1^4; //DB7,串行模式用到,输出数据Dout A
sbit AD_DoutB=P1^5; //DB8,串行模式用到,输出数据Dout B
sbit RD_SCK=P1^6;
sbit ADC_CS=P1^7;
sbit RANGE=P2^0;
sbit ADC_RST=P2^1;
sbit ConvstA=P2^2;
sbit ConvstB=P2^3;
sbit Busy=P3^2;
int i;
uint DoutA[4];
uint DoutB[4];
/* AD数据采集缓冲区 */
/* 供外部调用的函数声明 */
void ad7606_Reset(void);
void ad7606_StartConv(void);
void AD7606C(uchar acch);
void DELAY(uint t);
void init_serialcomm(void) ;
void AD7606_init();
void DELAY(uint t) /*延时函数*/
{
while(t!=0)
t--;
}
/*
*********************************************************************************************************
* 函 数 名: ad7606_Reset
* 功能说明: 硬件复位AD7606
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
/*
*****************************************************************************
* 函 数 名: ad7606_Reset
* 功能说明: 硬件复位AD7606
* 形 参:无
* 返 回 值: 无
*****************************************************************************
*/
void ad7606_Reset(void)
{
/* AD7606是高电平复位,要求最小脉宽50ns */
ADC_RST=0;
ADC_RST=1;
ADC_RST=1;
ADC_RST=1;
ADC_RST=1;
DELAY(2000);
// Delay1ms(1);
ADC_RST=0;
}
/*
*********************************************************************************************************
* 函 数 名: ad7606_StartConv
* 功能说明: 启动AD7606的ADC转换
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void ad7606_StartConv(void)
{
/* 上升沿开始转换,低电平持续时间至少25ns */
ConvstA=0;
ConvstB=0;
ConvstA=0;
ConvstB=0;
ConvstA=0; /* 连续执行2次,低电平约50ns */
ConvstB=0;
DELAY(20);
// Delayus(10);
ConvstA=1;
DELAY(20);
ConvstB=1;
DELAY(200);
DELAY(200);
// Delayus(100);
// Delayus(100);
}
//******************************************************************************//
void AD7606_init()
{
// Delay1ms(1);
DELAY(2000);
ad7606_Reset();
OS2=0;OS1=0;OS0=0; //设定过采样
ADC_CS=1;
RD_SCK=1;
ConvstA=1;
ConvstB=1;
RANGE=0; //选择+/- 5V 输入
// HBEN=0; //DB14,选择输出:1=先输出高8位,后输出低8位
}
//***************************************************************************
void AD7606C(uchar acch)//(unsigned int *adcdat)
{
uint i,n;
uchar TempAH,TempBH,TempAL,TempBL;
// OS2=1;OS1=1;OS0=0; //设定过采样
// RANGE=0; //选择+/- 5V 输入
if (acch==1) AD_DoutA=1;
else AD_DoutB=1;
// select_CH(acch );
// P51=1; P35=0;
// Delay1ms(50);
DELAY(2000);
// for(j=0;j<100;j++)
//{
ad7606_StartConv(); //启动AD7606的ADC转换
while(Busy){;}
ADC_CS=0;
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;
}
if(AD_DoutA) DoutA[n]=TempAH*256+TempAL; //
if(AD_DoutB)DoutB[n]=TempBH*256+TempBL;
}
//..............................................
ADC_CS=1;
// }
}
void init_serialcomm(void) /*初始化串口 */
{SCON = 0x50; /*SCON: serail mode 1, 8-bit UART, enable ucvr */
TMOD = 0x20; /*TMOD: timer 1, mode 2, 8-bit reload */
PCON = 0x00; /*SMOD=0; */
TH1 = 0xFd;
TL1 = 0xfd; /*Baud:9600 fosc=11.0592MHz */
TR1 = 1; /* timer 1 run */
// P3=0xff;
TL0=0X66;
TH0=0XFC;
TR0=1;
ET0=1;
ES=1;
// PT0=1;
t_disabled = 0;
en_r_flag=0;
EA=1;
enablebit=0;
}
main()
{
uchar ucRefresh = 0;
uchar ucFifoMode = 0;
init_serialcomm(); //初始化串口
AD7606_init();
DELAY(DELAY_TIME);
while(1)
{
if( t_disabled==1){
/* 处理数据 */
AD7606C(0);
AD7606C(1);
temp= DoutA[0];
if (temp>0 ){
sendadc[0]=temp/10000+0x30;
temp=temp%10000;
sendadc[1]=temp/1000+0x30;
temp=temp%1000;
sendadc[2]=temp/100+0x30;
temp=temp%100;
sendadc[3]=temp/10+0x30;
sendadc[4]=temp%10+0x30;
t_disabled =0;
DELAY(20000);
}
}
}
|
|