?? 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 + -