?? ad.c
字號(hào):
/*****************************************************************
** 文件名:AD.c
** Copyright (c) 中國(guó)地質(zhì)大學(xué)
** 創(chuàng)建人:邵威
** 日 期:2007-12-01
** 描 述:AD7705 16位串行AD轉(zhuǎn)換芯片,自帶增益可調(diào)和校準(zhǔn)
** 版 本:Version 1.00
*****************************************************************/
#include "mb95100.h"
#define uchar unsigned char
#define uint unsigned int
//------------------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------------
/*
sbit AdReady = P0^7;
sbit AdClk = P0^4;
sbit AdDin = P0^6;
sbit AdDout = P0^5;
sbit AdCS = P2^6;//AD7705片選
*/
#define AdReady PDR0_P07
#define AdClk PDR6_P65
#define AdDin PDR6_P66
#define AdDout PDR6_P67
//常數(shù)
#define CH1 1 //AD7705輸入通道IN1
#define CH2 2 //AD7705輸入通道IN2
#define BIPOLAR 0 //AD7705雙極性輸入
#define UNIPOLAR 1 //AD7705單極性輸入
#define AD_CLK_WIDTH 10 //AD7705串口時(shí)鐘脈沖寬度
//全局變量
extern unsigned int g_iCurrADValue;
//-------------------------------------------------------------------------
//函數(shù)名稱 :Wait
//功能描述 :Ad7705時(shí)鐘延時(shí)
//輸入?yún)?shù) :t--單位時(shí)間個(gè)數(shù)
//輸出參數(shù) :無(wú)
//-------------------------------------------------------------------------
void AD_Wait(uint t)
{
for (; t > 0; t--)
;
}
//-------------------------------------------------------------------------
//函數(shù)名稱 :WriteByte
//功能描述 :向AD7705寫(xiě)入一個(gè)字節(jié)
//輸入?yún)?shù) :x--要寫(xiě)入的數(shù)值
//輸出參數(shù) :無(wú)
//-------------------------------------------------------------------------
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);
//////////////////////////////////////
if(x&0x80) AdDin=1;
else AdDin=0;
//////////////////////////////////////
AD_Wait(AD_CLK_WIDTH);
AdClk = 1;
AD_Wait(AD_CLK_WIDTH);
x <<= 1;
}
}
//-------------------------------------------------------------------------
//函數(shù)名稱 :ReadWord
//功能描述 :從AD7705讀一個(gè)字
//輸入?yún)?shù) :無(wú)
//輸出參數(shù) :AD轉(zhuǎn)換值(2字節(jié))
//-------------------------------------------------------------------------
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;
}
//-------------------------------------------------------------------------
//函數(shù)名稱 :Reset
//功能描述 :AD7705通信端口復(fù)位
//輸入?yún)?shù) :無(wú)
//輸出參數(shù) :無(wú)
//-------------------------------------------------------------------------
void AD_Reset()
{
uchar i;
// AdCS = 0;
for (i = 0; i < 64; i++)
{
//多于連續(xù)32個(gè) DIN=1 使串口復(fù)位
AdClk = 0;
AD_Wait(AD_CLK_WIDTH);
AdDin = 1;
AD_Wait(AD_CLK_WIDTH);
AdClk = 1;
AD_Wait(AD_CLK_WIDTH);
}
// AdCS = 1;
}
//-------------------------------------------------------------------------
//函數(shù)名稱 :Ad7705Init
//功能描述 :AD7705初始化(非緩沖模式)
//輸入?yún)?shù) :輸入通道channel ----1=IN1,2=IN2;
// 輸入極性polarity----0=雙極性,1=單極性;
// 增益gain -----------[1,2,4,8,16,32,64,128]
//輸出參數(shù) :無(wú)
//-------------------------------------------------------------------------
void AD_Init(uchar channel, uchar polarity, uchar gain)
{
uchar x;
AD_Reset(); //防止串口失步
// AdCS = 0;
AD_WriteByte(0x20); //寫(xiě)ch0 clock register
AD_WriteByte(0x07); //2MHz時(shí)鐘,500Hz數(shù)據(jù)更新速率
//WriteByte(0x21); //寫(xiě)CH1 clock register
//WriteByte(0x03); //1MHz時(shí)鐘,200Hz數(shù)據(jù)更新速率
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;
}
//-------------------------------------------------------------------------
//函數(shù)名稱 :Ad7705GetData
//功能描述 :讀AD7705轉(zhuǎn)換數(shù)據(jù)
//輸入?yún)?shù) :輸入通道channel ----1=IN1,2=IN2;
//輸出參數(shù) :無(wú)
//-------------------------------------------------------------------------
void AD_GetData(uchar channel,uchar adchannel)
{
uint timeout = 0;
_CD4051(adchannel);
AD_Init(1,2,1);
while ( AdReady )
{timeout++; if(timeout>6000) {AD_Reset();return;}}
timeout = 0;
while ( AdReady==0 )
{timeout++; if(timeout>6000) {AD_Reset();return;}}
timeout = 0;
while ( AdReady )
{timeout++; if(timeout>6000) {AD_Reset();return;}}
// AdCS=0;
if (channel == 1)
{
AD_WriteByte(0x38);
}
else
{
AD_WriteByte(0x39);
}
g_iCurrADValue = AD_ReadWord();
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -