AD0832的51驅(qū)動(dòng)程序
/*
********************************************************************
********************************************************************
*/
#ifndef _ADC0832_H_
#define _ADC0832_H_
#include
#define uchar unsigned char
#define uint unsigned int
extern void _nop_ (void);
/*
********************************************************************
** 函數(shù)名 :ADC0832讀數(shù)據(jù)程序
** 入口 :需轉(zhuǎn)換通道channel [0:1]
** 返回 : 無(wú)符號(hào)字符型 uchar
** 例子 : Data_adc = ReadAdc0832( 0 ); //讀取adc0832芯片的0通道模擬電壓
** 說(shuō)明 : 使用時(shí)請(qǐng)?jiān)谛酒由暇珳?zhǔn)電壓源, 建議彩專(zhuān)用芯片
********************************************************************
*/
uchar ReadAdc0832( uchar channel );
//ADC0832端口定義
#define ADC0832_SCK_H P3_2 = 1
#define ADC0832_SCK_L P3_2 = 0
#define ADC0832_DIDO_H P3_3 = 1
#define ADC0832_DIDO_L P3_3 = 0
#define ADC0832_DIDO P3_3
#define ADC0832_CS_H P3_4 = 1
#define ADC0832_CS_L P3_4 = 0
//工作時(shí)序
//當(dāng)cs由高變低時(shí),選中ADC0832。在時(shí)鐘的上升沿,DI端的數(shù)據(jù)移入ADC0832內(nèi)部的多路地址移位寄存器。
//在第一個(gè)時(shí)鐘期間,Dl為高,表示啟動(dòng)位,緊接著輸入兩位配置位。當(dāng)輸入啟動(dòng)位和配置位后,選通輸入模擬通道,轉(zhuǎn)換開(kāi)始。
//轉(zhuǎn)換開(kāi)始后,經(jīng)過(guò)一個(gè)時(shí)鐘周期延遲,以使選定的通道穩(wěn)定。ADC0832接著在第4個(gè)時(shí)鐘下降沿輸出轉(zhuǎn)換數(shù)據(jù)。
//數(shù)據(jù)輸出時(shí)先輸出最高位(D7~DO);輸出完轉(zhuǎn)換結(jié)果后,又以最低位開(kāi)始重新輸出一遍數(shù)據(jù)(D7~DO),兩次發(fā)送的最低位共用。當(dāng)片選cS
//為高時(shí),內(nèi)部所有寄存器清0,輸出變?yōu)楦咦钁B(tài)。如果要再進(jìn)行一次模傲轉(zhuǎn)換,片選cs必須再次從高向低跳變,后面再輸入啟動(dòng)位和配置位
//adc0832讀數(shù)據(jù)
uchar ReadAdc0832( uchar channel )
{
uchar i = 0;
uchar outdata = 0;
//初始化: 選通 數(shù)據(jù)口保持高電平
//當(dāng)cs由高變低時(shí),選中ADC0832。在時(shí)鐘的上升沿,DI端的數(shù)據(jù)移入ADC0832內(nèi)部的多路地址移位寄存器
ADC0832_CS_L; // 使能
ADC0832_DIDO_H; //
ADC0832_SCK_L; //第一次觸發(fā)
_nop_();
_nop_();
ADC0832_SCK_H; //
_nop_();
_nop_();
//模擬通道的選擇及單端輸入和差分輸入的選擇
ADC0832_DIDO_H;
ADC0832_SCK_L; //第二次觸發(fā)
_nop_();
_nop_();
ADC0832_SCK_H;
_nop_();
_nop_();
if( channel == 1 )
{
ADC0832_DIDO_H;
}
else
{
ADC0832_DIDO_L;
}
ADC0832_SCK_L; //第三次觸發(fā)
_nop_();
_nop_();
ADC0832_SCK_H;
_nop_();
_nop_();
ADC0832_SCK_L;
_nop_();
_nop_();
ADC0832_DIDO_H; //置為輸入準(zhǔn)備讀數(shù)據(jù)
ADC0832_SCK_H;
_nop_();
_nop_();
outdata = 0; //初始化
//讀數(shù)據(jù)D7~D0
for( i = 1; i <= 8; i++ )
{
if( ADC0832_DIDO == 1 )
{
outdata |= 0x01;
}
ADC0832_SCK_H;
ADC0832_SCK_L;
outdata = outdata << 1; //左移一位
}
//此函數(shù)不再讀數(shù)據(jù)D0~D7 (注意D0位重疊)
ADC0832_CS_H; //禁止
return outdata;
}
#endif //