Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 12

/

*----------------------------------------------------------------------------------------------------------------------------------------
--*/
/*--************************* ADS1115 ********************--*/
/*--*************************CPU STC12C5A60S2*******************************--*/
/*--*************************ADC ADS11152 4 ***********--*/
/*--************************* LCD1602************************************--*/
/*--*************************ADC SCL:P1.0 , SDA:P1.1*******************--*/
/*--*************************0.004.99V*********************************--*/
/
*----------------------------------------------------------------------------------------------------------------------------------------
*/
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define _Nop() _nop_()

/*------------------------ LCD1602 -----------------------*/


sbit lcd_rs_port = P1^7; /* LCD */
sbit lcd_rw_port = P1^6;
sbit lcd_en_port = P2^4;
#define lcd_data_port P0

unsigned char num_char_table[] = {"0123456789ABCDEF"};


unsigned char Lcd_Dis1_table[] = {"Volt: V "}; //
unsigned char pos_char_table[] = {" 67.9AB V "}; //

void lcd_delay(uchar ms); //LCD1602


void lcd_busy_wait(); //LCD1602
void lcd_command_write(uchar command); //LCD1602
void lcd_system_reset(); //LCD1602
void lcd_char_write(uchar x_pos,y_pos,lcd_dat); //LCD1602
void lcd_bad_check(); //LCD1602
void Num_to_Disp(uint Num); //LCD1602
void LcdDisp(uint num); //LCD1602
void delay_1ms(uchar x); //LCD1602 1ms

/*------------------------ ADS1115 --------------------------*/

sbit SCL = P1^0;


sbit SDA = P1^1;

#define TRUE 1
#define FALSE 0

unsigned int Config;


unsigned char Writebuff[4],Readbuff[3];
unsigned int Result[2];
int D_ADS; //
#define Accuracy 32768 // ADC ADS1115 15
char VCC = 4.78; //VCC

#define ADDRESS_0 0x90 //ADDR PIN ->GND


#define ADDRESS_1 0x92 //ADDR PIN ->VDD
#define ADDRESS_2 0x94 //ADDR PIN ->SDA
#define ADDRESS_3 0x96 //ADDR PIN ->SCL

/************POINTER REGISTER*****************/
#define Pointer_0 0x00 //Convertion register
#define Pointer_1 0x01 //Config register
#define Pointer_2 0x02 //Lo_thresh register
#define Pointer_3 0x03 //Hi_thresh register

/************CONFIG REGISTER*****************/
#define OS_0 0x0000
#define OS_1 0x8000

#define MUX_0 0x0000 //AINp=AIN0, AINn=AIN1


#define MUX_1 0x1000 //AINp=AIN0, AINn=AIN3
#define MUX_2 0x2000 //AINp=AIN1, AINn=AIN3
#define MUX_3 0x3000 //AINp=AIN2, AINn=AIN3
#define MUX_4 0x4000 //AINp=AIN0, AINn=GND
#define MUX_5 0x5000 //AINp=AIN1, AINn=GND
#define MUX_6 0x6000 //AINp=AIN2, AINn=GND
#define MUX_7 0x7000 //AINp=AIN3, AINn=GND

#define PGA_0 0x0000 //FS=6.144V


#define PGA_1 0x0200 //FS=4.096V
#define PGA_2 0x0400 //FS=2.048V
#define PGA_3 0x0600 //FS=1.024V
#define PGA_4 0x0800 //FS=0.512V
#define PGA_5 0x0A00 //FS=0.256V
#define PGA_6 0x0C00 //FS=0.256V
#define PGA_7 0x0E00 //FS=0.256V

#define MODE_0 0x0000


#define MODE_1 0x0100

#define DR_0 0x0000 //Data Rate = 8


#define DR_1 0x0020 //Data Rate = 16
#define DR_2 0x0040 //Data Rate = 32
#define DR_3 0x0060 //Data Rate = 64
#define DR_4 0x0080 //Data Rate = 128
#define DR_5 0x00A0 //Data Rate = 250
#define DR_6 0x00C0 //Data Rate = 475
#define DR_7 0x00E0 //Data Rate = 860
#define COMP_MODE_0 0x0000
#define COMP_MODE_1 0x0010

#define COMP_POL_0 0x0000


#define COMP_POL_1 0x0008

#define COMP_LAT_0 0x0000


#define COMP_LAT_1 0x0040

#define COMP_QUE_0 0x0000


#define COMP_QUE_1 0x0001
#define COMP_QUE_2 0x0002
#define COMP_QUE_3 0x0003

//*************ADDR Initial********************/
#define ADDRESS ADDRESS_0 //ADDR PIN ->GND
#define ADDRESS_W ADDRESS|0x00 //
#define ADDRESS_R ADDRESS|0x01 //

/*************Config Initial*********************/
#define OS OS_1
#define MUX_A0 MUX_4 //AINp=AIN0, AINn=GND
#define MUX_A1 MUX_5 //AINp=AIN1, AINn=GND
#define MUX_A2 MUX_6 //AINp=AIN2, AINn=GND
#define MUX_A3 MUX_7 //AINp=AIN3, AINn=GND
#define PGA PGA_1 //FS=6.144V
#define MODE MODE_1 //Continuous conversion mode
#define DR DR_7 //Data Rate = 860
#define COMP_QUE COMP_QUE_3

void Delay_us_15 (void);


void Delay_ms_1 (void); //
void Start(void); // IIC
void Stop(void); // IIC
void ACK(void); // IIC
void NACK(void); // IIC
unsigned char Check(void);//
void Write_1_Byte(unsigned char DataByte); // 1
unsigned char Write_N_Byte(unsigned char *writebuffer,unsigned char n); // N
unsigned char Read_1_Byte(void); // 1
void Read_N_Byte(unsigned int *readbuff,unsigned char n); // N
void InitADS1115(bit S_MUX_0, bit S_MUX_1); //ADS1115
void WriteWord(void); //
void ReadWord(void); //
unsigned int ADS1115(bit S_MUX_0, bit S_MUX_1); //!!!ADS1115

/*--------------------------------------------------------------------------------------------------------------------------------*/
/*--********************************* *******************************--*/
/*-------------------------------------------------------------------------------------------------------------------------------*/
void main()
{
unsigned int result;

lcd_system_reset(); //LCD1602
lcd_bad_check(); //LCD1602

while(1)
{
result = ADS1115(0,0); //ADS1115 _AIN0
//result = ADS1115(0,1); //ADS1115 _AIN1
//result = ADS1115(1,0); //ADS1115 _AIN2
//result = ADS1115(1,1); //ADS1115 _AIN3

LcdDisp(result); //LCD1602
}
}
/*--------------------------------------------------------------------------------------------------------------------------------*/
/*--****************************************************************************--*/
/*-------------------------------------------------------------------------------------------------------------------------------*/

/*------------------------ LCD1602 -----------------------*/

void lcd_delay(uchar ms) /***********LCD1602 ***************/


{
uchar j;
while(ms--){
for(j=0;j<250;j++)
{;}
}
}

void lcd_busy_wait() /**********LCD1602 *************/


{
lcd_rs_port = 0;
lcd_rw_port = 1;
lcd_en_port = 1;
lcd_data_port = 0xff;
while (lcd_data_port&0x80);
lcd_en_port = 0;

void lcd_command_write(uchar command) /**********LCD1602 *************/


{
lcd_busy_wait();
lcd_rs_port = 0;
lcd_rw_port = 0;
lcd_en_port = 0;
lcd_data_port = command;
lcd_en_port = 1;
lcd_en_port = 0;
}

void lcd_system_reset() /**********LCD1602 **************/


{
lcd_delay(20);
lcd_command_write(0x38);
lcd_delay(100);
lcd_command_write(0x38);
lcd_delay(50);
lcd_command_write(0x38);
lcd_delay(10);
lcd_command_write(0x08);
lcd_command_write(0x01);
lcd_command_write(0x06);
lcd_command_write(0x0c);
}

void lcd_char_write(uchar x_pos,y_pos,lcd_dat) /******LCD1602 **********/


{
x_pos &= 0x0f; /* X 0~15 */
y_pos &= 0x01; /* Y 0~ 1 */
if(y_pos==1) x_pos += 0x40;
x_pos += 0x80;
lcd_command_write(x_pos);
lcd_busy_wait();
lcd_rs_port = 1;
lcd_rw_port = 0;
lcd_en_port = 0;
lcd_data_port = lcd_dat;
lcd_en_port = 1;
lcd_en_port = 0;
}

void lcd_bad_check() /******LCD1602 **********/


{
char i,j;
for(i=0;i<2;i++){
for(j=0;j<16;j++) {
lcd_char_write(j,i,0xff);
}
}
lcd_delay(200);
lcd_delay(200);
lcd_delay(200);
lcd_delay(100);
lcd_delay(200);
lcd_command_write(0x01); // clear lcd disp
}

void Num_to_Disp(uint Num) /******LCD *****/ //Start_1-Over_1:


Start_2-Over_2: ADS1115
{
float NUM; //Start_1
int xx, yy, zz, zzz;

NUM = (Num / (float)Accuracy) * VCC; //ADS1115 = Accuracy (Vin / VCC)


xx = (int)NUM;
yy = (int)((NUM - (float)(xx)) * 10);
zz = (int)((NUM - (float)(xx)) * 100)%10;
zzz = (int)((NUM - (float)(xx)) * 1000)%10;

pos_char_table[6] = num_char_table[xx / 10]; //


pos_char_table[7]= num_char_table[xx % 10]; //
pos_char_table[9]= num_char_table[yy]; //
pos_char_table[10]= num_char_table[zz]; //
pos_char_table[11]= num_char_table[zzz]; // //Over_1

/*
pos_char_table[6] = num_char_table[Num / 10000]; //Start_2
pos_char_table[7] = num_char_table[(Num % 10000) / 1000];
pos_char_table[8]= num_char_table[((Num % 10) % 1000) / 100];
pos_char_table[9]= num_char_table[(Num / 10) % 10];
pos_char_table[A]= num_char_table[Num % 10]; //Over_2
*/
}

void LcdDisp(uint num) /************LCD *************/


{
uint i=0;

for (i=0;i<16;i++)
{
lcd_char_write(i,0,Lcd_Dis1_table[i]); //
}
Num_to_Disp(num);
for(i = 6; i < 12; i++)
{
lcd_char_write(i,0,pos_char_table[i]); //, pos_char_table
}
delay_1ms(100);
}

void delay_1ms(uchar x) /*******1MS ******/


{
uchar j;
while(x--){
for(j=0;j<125;j++)
{;}
}
}

/*------------------------ 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_();
}
///*******************************************
//Start
// IIC
//
//
//********************************************/
void Start(void)
{
SCL=1;
SDA=1;
Delay_us_15 ();
SDA=0;
Delay_us_15 ();
SCL=0;
Delay_us_15 ();
}
//
///*******************************************
//Stop
// IIC
//
//
//********************************************/
void Stop(void)
{
SDA=0;
Delay_us_15 ();
SCL=1;
Delay_us_15 ();
SDA=1;
Delay_us_15 ();
}
///*******************************************
//ACK
// IIC
//
//
//********************************************/
void ACK(void)
{
SDA=0;
_nop_(); _nop_();
SCL=1;
Delay_us_15 ();
SCL=0;
_nop_(); _nop_();
SDA=1;
Delay_us_15 ();
}
//*******************************************
//NACK
// IIC
//
//
//********************************************/
void NACK(void)
{
SDA=1;
_nop_(); _nop_();
SCL=1;
Delay_us_15 ();
SCL=0;
_nop_(); _nop_();
SDA=0;
Delay_us_15 ();
}
//****************************/
///* 1 */
///*******************************************
//Check
//
//
// 1--0--
//********************************************/
unsigned char Check(void)
{
unsigned char slaveack;

SDA=1;
_nop_(); _nop_();
SCL=1;
_nop_(); _nop_();

_nop_(); _nop_();
slaveack = SDA; // SDA
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()) // Check(void)
{
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++) // n
{
readbuff[i]=Read_1_Byte(); // readbuff ,readbuff 0&1????
if(i==n-1)
NACK(); //
else
ACK(); //
}
Stop();

}
//***********************************/
void InitADS1115(bit S_MUX_0, bit S_MUX_1)
{

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%256;

Readbuff[0]=ADDRESS_W; // readbuff ?? Readbuff


Readbuff[1]=Pointer_0;

Readbuff[2]=ADDRESS_R;
}

//***************Write a Word***********************/
void WriteWord(void)
{
int t;
Start(); // 4
do
{
t=Write_N_Byte(Writebuff,4);
}while(t==0);
}
//***************Read Word***********************/
void ReadWord(void)
{
int t;
Start(); // 2
do
{
t=Write_N_Byte(Readbuff,2);
}while(t==0);

Start(); // 2
do
{
t=Write_N_Byte(&Readbuff[2],1);
}while(t==0);

Read_N_Byte(Result,2); // 2 Result->readbuff

}
//***************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]; //

return D_ADS;
}

You might also like