?? ad_contrl.c
字號:
/******************************************************************************
*
** 函數(shù)原型:unsigned int ADS7841_Read_Data(unsigned char Channel);
** 功 能:SPI總線的A/D ADS7841 驅動程序
** 入口參數(shù):unsigned char Channel 表示選擇讀取通道
** 出口參數(shù):unsigned int 返回所讀取得12位數(shù)據(jù)。
** 說 明:ADS7841為12位A/D,先對其進行設置:數(shù)據(jù)位D0---D7,其中D0---D1是
** 設置ADC的功耗模式,D2是模擬輸入通道設置,H為4個單通道,L為兩個
** 差分輸入,D3為mode,當mode(pin)接地時為12位采樣方式,接高電平時
** mode為1時8位采集,為0時12位采集,D4---D6為輸入通道選擇,D7為起始位
*
*******************************************************************************/
#include "SPCE061A.h"
#include "AD_Contrl.h"
void Init_IOA_IOB(void)
{
*P_IOA_Dir|=0xe400; //設置IOA15(DCLK)=(1,1,0),IOA14(CS)=(1,1,1)
*P_IOA_Dir&=0xe7ff; //IOA13(DIN)=(1,1,0)IOA12(BUSY)=(0,0,0)
//IOA11(DOUT)=(0,0,0),IOA10(MODE)=(1,1,0)
*P_IOA_Attrib|=0xe400; //其他位不變
*P_IOA_Attrib|=0xe7ff;
*P_IOA_Data|=0x4000;
*P_IOA_Data&=0x41ff;
*P_IOB_Dir=0xffff; //設置IOB口為同相低電平輸出口
*P_IOB_Attrib=0xffff;
*P_IOB_Data=0x0000;
}
unsigned int AD7841_Read_Data(void)
{
unsigned int AD_Result=0,a=0,b;
unsigned char i,DataInput=0;
*P_IOA_Dir |= 0x2000; //DIN(IOA13)為帶數(shù)據(jù)緩存器的低電平輸出。
*P_IOA_Attrib |= 0x2000;
*P_IOA_Data &= 0xdfff;
DataInput=0x0094; //S=1;A2A1A0=001(CH1);MODE=0(12位采集);SGL/DIF=1(4個單通道);PD1PD0=00
DataInput=DataInput<<6;
*P_IOA_Data &= 0xbfff; // CS(IOA14)為低電平
delay(1);
*P_IOA_Data &= 0x5fff; // DCLK(IOA15)為低電平 DIN(IOA13)為低電平
delay(3);
for(i=0; i<8; i++)
{
a = DataInput;
a &= 0x2000; //保留DataInput的13位,其他的全為零
*P_IOA_Data &= 0xdfff; // IOA13 = 0,其他的不變。
*P_IOA_Data |= a; //將DataInput的13位送給IOA13,并不影響IOA的其他位。
*P_IOA_Data &= 0x7fff; // clk low 產生高電平寬度為delay(3)的脈沖,供CLK(8次)。
delay(3); //延遲,清看門狗???
*P_IOA_Data |= 0x8000; // clk high
DataInput = DataInput << 1;
}
delay(1);
*P_IOA_Data &= 0x7fff; // clk low
while(*P_IOA_Data&0x1000)
{
delay(1);
*P_IOA_Data |= 0x8000; // clk high
delay(1);
*P_IOA_Data &= 0x7fff; // clk low 產生高電平寬度為delay(3)的脈沖。
*P_Watchdog_Clear = 0x0001;
} //當BUSY腳由高變?yōu)榈蜁r,則開始數(shù)據(jù)輸出
delay(1);
for(i=0;i<12;i++) //讀取12位AD轉換值
{
*P_IOA_Data |= 0x8000; // clk high
delay(1);
b=0x0800;
b &= *P_IOA_Data; //取出DOUT (IOA11)的數(shù)據(jù)。
b=b>>11;
a |= b;
AD_Result=a;
a=a<<1;
*P_IOA_Data &= 0x7fff; // clk low
}
for(i=0;i<4;i++) //濾掉多余的4個時鐘
{
*P_IOA_Data |= 0x8000; // clk high將CLK置1。且不影響其他位,
delay(1);
*P_IOA_Data &= 0x7fff; // clk low
delay(1);
}
*P_IOA_Data |= 0x4000; // CS(IOA14)為高電平,禁止芯片
AD_Result&=0x0fff; //屏蔽高4 位
return AD_Result;
}
void delay(unsigned int i)
{
for(;i>0;i--);
}
/*
unsigned int ADS7841_Read_Data(unsigned char Channel) //Channel=0:CH0;1:CH1;2:CH2;3:CH3;
{
unsigned int ADCResult=0;
unsigned char DataInput=0;
unsigned char i,ADS7841_CHANNEL;
switch (Channel)
{
case 0:ADS7841_CHANNEL=0x10;break;
case 1:ADS7841_CHANNEL=0x50;break;
case 2:ADS7841_CHANNEL=0x20;break;
case 3:ADS7841_CHANNEL=0x60;break;
default:ADS7841_CHANNEL=0x10;break;
}
DataInput=ADS7841_S|ADS7841_CHANNEL|ADS7841_MODE|ADS7841_SGL_DIF|ADS7841_POWER_DOWN;
DCLK=0;
DIN=0;
CS=VALID;
for(i=0; i<8; i++)
{
DIN=DataInput&0x80;
DataInput=DataInput<<1;
DCLK=0;
NOP;
DCLK=1; //模擬SPI串行接口 發(fā)送數(shù)據(jù)
}
NOP;
DCLK=0;
while(BUSY)
{
NOP;
DCLK=1;
NOP;
DCLK=0;
} //當BUSY腳由高變?yōu)榈蜁r,則開始數(shù)據(jù)輸出//
NOP;
for(i=0;i<12;i++)
{
DCLK=1;
ADCResult=(ADCResult<<1)|DOUT; //模擬SPI串行接口 接收數(shù)據(jù)
DCLK=0;
NOP;
}
for(i=0;i<4;i++)
{
DCLK=1;
NOP;
DCLK=0;
NOP;
}
CS=INVALID;
return ADCResult;
}
#include <Reg52.h>
#include <Intrins.h>
#include <AbsAcc.h>
#include "meter.h"
////////////////////////////////////
uint ADS7841_READ(uchar CH)
{
uchar i, dt;
uint AD_RESULT=0;
CS7841=0; // 芯片允許
_nop_();
SCK=0;
SDI=0;
dt=CH;
i=0;
while(i<8) //寫入8位控制字
{
if(dt>=0x80)
SDI=1; //時鐘上升沿鎖存SDI
else
SDI=0;
_nop_();
SCK=1; //開始發(fā)送命令字
_nop_();
dt<<=1;
SCK=0; //時鐘脈沖,一共24個
i++;
}
//等待轉換完成(20us)
for(i=0;i<20;i++) { _nop_(); }
SCK=1;
i=0;
while(i<12) //讀取12位AD轉換值
{
AD_RESULT<<=1; _nop_();
SCK=0;
if(SDO)
AD_RESULT|=0x0001; //用時鐘的下降沿讀取
if(i==7) { _nop_(); _nop_(); }
SCK=1;
i++;
}
i=0;
while(i<4) //濾掉多余的4個時鐘
{
_nop_();
SCK=0; _nop_();
SCK=1;
i++;
}
SDI=1;
CS7841=1; //禁止芯片
AD_RESULT&=0x0fff; //屏蔽高4 bit
return AD_RESULT;
}
///////////////////////////////////////////////////
uint ADS7841_READ(uchar CH)
{
uchar i;
uchar dt;
uint AD_RESULT=0;
SCK=0;
SDI=0;
CS7841=0; // 芯片允許
_nop_();
dt=CH;
i=0;
while(i<8) //寫入8位控制字
{
if(dt>=0x80) SDI=1; //時鐘上升沿鎖存SDI
else SDI=0;
SCK=1; //開始發(fā)送命令字
SCK=0; //時鐘脈沖,一共24個
dt<<=1;
i++;
}
SDI=0;
//等待轉換完成(20us)
for(i=0;i<20;i++) { _nop_(); }
i=0;
SCK=1;
while(i<12) //讀取12位AD轉換值
{
AD_RESULT<<=1;
SCK=0;
if(SDO) AD_RESULT|=0x0001; //用時鐘的下降沿讀取
if(i==7) { _nop_(); _nop_(); }
_nop_();
SCK=1;
i++;
}
i=0;
while(i<4) //濾掉多余的4個時鐘
{
SCK=0;
SCK=1;
i++;
}
SCK=0;
CS7841=1; //禁止芯片
AD_RESULT&=0x0fff; //屏蔽高4 bit
return AD_RESULT;
}
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -