📄 ad.c
字号:
/*****************************************************************
** 文件名:AD.c
** Copyright (c) 中国地质大学
** 创建人:赵帅
** 日 期:2007-8-24
** 描 述:AD7705 16位串行AD转换芯片,自带增益可调和校准
** 版 本:Version 1.00
*****************************************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//------------------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------------
sbit AdReady = P1^7;
sbit AdClk = P1^4;
sbit AdDin = P1^5;
sbit AdDout = P1^6;
//sbit AdCS = P2^6;//AD7705片选
//常数
#define CH1 1 //AD7705输入通道IN1
#define CH2 2 //AD7705输入通道IN2
#define BIPOLAR 0 //AD7705双极性输入
#define UNIPOLAR 1 //AD7705单极性输入
#define AD_CLK_WIDTH 10 //AD7705串口时钟脉冲宽度
//全局变量
uint g_iCurrADValue;
uchar DisData[8];
//-------------------------------------------------------------------------
//函数名称 :Wait
//功能描述 :Ad7705时钟延时
//输入参数 :t--单位时间个数
//输出参数 :无
//-------------------------------------------------------------------------
void AD_Wait(uint t)
{
for (; t > 0; t--)
;
}
//-------------------------------------------------------------------------
//函数名称 :WriteByte
//功能描述 :向AD7705写入一个字节
//输入参数 :x--要写入的数值
//输出参数 :无
//-------------------------------------------------------------------------
void AD_WriteByte(uchar x)
{
uchar i;
AdClk = 1;
for (i = 0; i < 8; i++)
{
AdClk = 0;
AD_Wait(AD_CLK_WIDTH);
AdDin = (bit)(x &0x80);
AD_Wait(AD_CLK_WIDTH);
AdClk = 1;
AD_Wait(AD_CLK_WIDTH);
x <<= 1;
}
}
//-------------------------------------------------------------------------
//函数名称 :ReadWord
//功能描述 :从AD7705读一个字
//输入参数 :无
//输出参数 :AD转换值(2字节)
//-------------------------------------------------------------------------
uint AD_ReadWord()
{
uchar i;
uint x;
AdClk = 1;
for (i = 0, x = 0; i < 16; i++)
{
AdClk = 0;
AD_Wait(AD_CLK_WIDTH);
x <<= 1;
if (AdDout)//输出为1
{
x |= 0x01;
}
AdClk = 1;
AD_Wait(AD_CLK_WIDTH);
}
return x;
}
//-------------------------------------------------------------------------
//函数名称 :Reset
//功能描述 :AD7705通信端口复位
//输入参数 :无
//输出参数 :无
//-------------------------------------------------------------------------
void AD_Reset()
{
uchar i;
AdCS = 0;
for (i = 0; i < 64; i++)
{
//多于连续32个 DIN=1 使串口复位
AdClk = 0;
AD_Wait(AD_CLK_WIDTH);
AdDin = 1;
AD_Wait(AD_CLK_WIDTH);
AdClk = 1;
AD_Wait(AD_CLK_WIDTH);
}
AdCS = 1;
}
//-------------------------------------------------------------------------
//函数名称 :Ad7705Init
//功能描述 :AD7705初始化(非缓冲模式)
//输入参数 :输入通道channel ----1=IN1,2=IN2;
// 输入极性polarity----0=双极性,1=单极性;
// 增益gain -----------[1,2,4,8,16,32,64,128]
//输出参数 :无
//-------------------------------------------------------------------------
void AD_Init(uchar channel, bit polarity, uchar gain)
{
uchar x;
AD_Reset(); //防止串口失步
AdCS = 0;
//AD_WriteByte(0x20); //写ch0 clock register
//AD_WriteByte(0x07); //2MHz时钟,500Hz数据更新速率
AD_WriteByte(0x21); //写CH1 clock register
AD_WriteByte(0x07); //1MHz时钟,500Hz数据更新速率
if (channel == 1) //com register ,选择下步操作 setup register
{
AD_WriteByte(0x10);
}
else
{
AD_WriteByte(0x11);
}
if (polarity)//单极性
{
x = 0x04;
}
else//双极性
{
x = 0x00;
}
switch (gain)
{
case 1:
x |= 0x40;
break;
case 2:
x |= 0x48;
break;
case 4:
x |= 0x50;
break;
case 8:
x |= 0x58;
break;
case 16:
x |= 0x60;
break;
case 32:
x |= 0x68;
break;
case 64:
x |= 0x70;
break;
case 128:
x |= 0x78;
break;
default:
x |= 0x40;
break;
}
AD_WriteByte(x);
AdCS = 1;
}
//-------------------------------------------------------------------------
//函数名称 :Ad7705GetData
//功能描述 :读AD7705转换数据
//输入参数 :输入通道channel ----1=IN1,2=IN2;
//输出参数 :无
//-------------------------------------------------------------------------
void AD_GetData(uchar channel)
{
uint timeout = 0;
AD_Init(channel,1,1);
while ( AdReady )
{timeout++; if(timeout>60000) {AD_Reset();return;}}
timeout = 0;
while ( AdReady==0 )
{timeout++; if(timeout>60000) {AD_Reset();return;}}
timeout = 0;
while ( AdReady )
{timeout++; if(timeout>60000) {AD_Reset();return;}}
AdCS=0;
if (channel == 1)
{
AD_WriteByte(0x38);
}
else
{
AD_WriteByte(0x39);
}
g_iCurrADValue = AD_ReadWord();
}
uint exchange(uint value)
{
uint tp;
uchar i;
for(i=0;i<16;i++)
{
tp<<=1;
if(value&0x0001==1)
tp=tp|0x0001;
else
tp=tp&0xfffe;
value>>=1;
}
return tp;
}
void DataConvert(uint value)
{
uchar i;
ulong temp;
temp=(ulong)value;
DisData[0]=temp/13107;
temp=temp%13107;
DisData[1]=0x2e;
for(i=2;i<8;i++)
{
temp=temp*10;
DisData[i]= temp/13107; // 13107=65535/5V
temp=temp%13107;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -