ADS1115 是具有16 位分辨率的高精度模數(shù)轉(zhuǎn)換器(ADC),采用超小型的無引線QFN-10 封裝或MSOP-10 封裝。以下將是基于51的ads1115詳細程序介紹:
void Delay_us_15 (void)
{
unsigned char i;
for(i = 0;i 《 15;i++)
_nop_();
}
void Delay_ms_1 (void)
{
unsigned char i;
for(i = 150;i 》 0;i--) _nop_();
}
///*******************************************
//函數(shù)名稱:Start
//功 能:完成IIC的起始條件操作
//參 數(shù):無
//返回值 :無
//********************************************/
void Start(void)
{
SCL=1;
SDA=1;
Delay_us_15 ();
SDA=0;
Delay_us_15 ();
SCL=0;
Delay_us_15 ();
}
//
///*******************************************
//函數(shù)名稱:Stop
//功 能:完成IIC的終止條件操作
//參 數(shù):無
//返回值 :無
//********************************************/
void Stop(void)
{
SDA=0;
Delay_us_15 ();
SCL=1;
Delay_us_15 ();
SDA=1;
Delay_us_15 ();
}
///*******************************************
//函數(shù)名稱:ACK
//功 能:完成IIC的主機應答操作
//參 數(shù):無
//返回值 :無
//********************************************/
void ACK(void)
{
SDA=0;
_nop_(); _nop_();
SCL=1;
Delay_us_15 ();
SCL=0;
_nop_(); _nop_();
SDA=1;
Delay_us_15 ();
}
//*******************************************
//函數(shù)名稱:NACK
//功 能:完成IIC的主機無應答操作
//參 數(shù):無
//返回值 :無
//********************************************/
void NACK(void)
{
SDA=1;
_nop_(); _nop_();
SCL=1;
Delay_us_15 ();
SCL=0;
_nop_(); _nop_();
SDA=0;
Delay_us_15 ();
}
//**********檢查應答信號函數(shù)******************/
///*如果返回值為1則證明有應答信號,反之沒有*/
///*******************************************
//函數(shù)名稱:Check
//功 能:檢查從機的應答操作
//參 數(shù):無
//返回值 :從機是否有應答:1--有,0--無
//********************************************/
unsigned char Check(void)
{
unsigned char slaveack;
SDA=1;
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
slaveack = SDA; //讀入SDA數(shù)值
SCL=0;
Delay_us_15 ();
if(slaveack) return FALSE;
else return TRUE;
}
/***************Write a Byte****************/
void Write_1_Byte(unsigned char DataByte)
{
int i;
for(i=0;i《8;i++)
{
if(DataByte&0x80) //if((DataByte《《i)&0x80)
SDA=1;
else
SDA=0;
Delay_us_15 ();
SCL=1;
Delay_us_15 ();
SCL=0;
Delay_us_15 ();
DataByte 《《= 1;
}
SDA=1;
_nop_();
}
/***************Write N Byte****************/
unsigned char Write_N_Byte(unsigned char *writebuffer,unsigned char n) {
int i;
for(i=0;i《n;i++)
{
Write_1_Byte(*writebuffer);
if(Check())
{
writebuffer ++;
}
else
{
Stop();
return FALSE;
}
Stop();
return TRUE;
}
//***************Read a Byte****************/ unsigned char Read_1_Byte(void)
{
unsigned char data_Value = 0, FLAG, i;
for(i=0;i《8;i++)
{
SDA=1;
Delay_us_15 ();
SCL=1;
Delay_us_15 ();
FLAG=SDA;
data_Value 《《= 1;
if( FLAG)
data_Value |= 0x01;
SCL=0;
Delay_us_15 ();
}
return data_Value;
}
//***************Read N Byte****************/
void Read_N_Byte(unsigned int*readbuff, unsigned char n) {
unsigned char i;
for(i=0;i《n;i++)
{
readbuff[i]=Read_1_Byte();
if(i==n-1)
NACK(); //不連續(xù)讀字節(jié)
else
ACK(); //連續(xù)讀字節(jié)
}
Stop();
}
//*****************初始化******************/ void InitADS1115(bit S_MUX_0, bit S_MUX_1)
{
if(S_MUX_0==0&&S_MUX_1==;Writebuff[0]=ADDRESS_W;W;Readbuff[0]=ADDRESS_W;Re;Readbuff[2]=ADDRESS_R;};//***************WriteaW;intt;;Start();//寫入4個字節(jié)do{;t=Write_N_Byte(Writebuff;//***
if (S_MUX_0 == 0 && S_MUX_1 == 0) //AIN0 Config = OS+MUX_A0+PGA+DR+COMP_QUE+MODE; if (S_MUX_0 == 0 && S_MUX_1 == 1) //AIN1 Config = OS+MUX_A1+PGA+DR+COMP_QUE+MODE; if (S_MUX_0 == 1 && S_MUX_1 == 0) //AIN2 Config = OS+MUX_A2+PGA+DR+COMP_QUE+MODE; if (S_MUX_0 == 1 && S_MUX_1 == 1) //AIN3 Config = OS+MUX_A3+PGA+DR+COMP_QUE+MODE;
Writebuff[0]=ADDRESS_W; Writebuff[1]=Pointer_1; Writebuff[2]=Config/256; Writebuff[3]=Config%6;
Readbuff[0]=ADDRESS_W; Readbuff[1]=Pointer_0;
Readbuff[2]=ADDRESS_R; }
//***************Write a Word***********************/ void WriteWord(void) {
int t;
Start(); //寫入4個字節(jié) do {
t=Write_N_Byte(Writebuff,4); }while(t==0); }
//***************Read Word***********************/ void ReadWord(void) {
int t;
Start(); //寫入2個字節(jié) do {
t=Write_N_Byte(Readbuff,2); }while(t==0);
Start(); //寫入2個字節(jié) do {
t=Write_N_Byte(&Readbuff[2],1); }while(t==0);
Read_N_Byte(Result,2); //讀出2個字節(jié)
}
//***************ADS1115********************/ unsigned int ADS1115(bit S_MUX_0, bit S_MUX_1) {
InitADS1115(S_MUX_0, S_MUX_1); WriteWord(); Delay_ms_1(); ReadWord(); D_ADS=Result[0]*256+Result[1]; //轉(zhuǎn)換的數(shù)字量
return D_ADS; }
評論
查看更多