PCF8591 AD/DA Converter Module
/*
* Project name:
PCF8591 AD/DA Converter Module
* Copyright
(c) Researchdesignlab.com
* Description:
* Test configuration:
MCU: AT89S52
Dev.Board: 8051
Oscillator: 11.0592 MHz
Software: Keil uVision3
*/
#include<reg51.h>
sbit SCL = P3^7;
sbit SDA = P3^6;
sbit switch1=P1^0;
sbit switch2=P1^1;
sbit switch3=P1^2;
sbit switch4=P1^3;
void TRANSMIT(unsigned char *);
void transmit_byte(unsigned char );
void CONVERT_DISPLAY(unsigned int );
void i2c_delay(void);
void i2c_start(void);
void i2c_stop(void);
void i2c_wbyte(char i2c_wb);
unsigned char i2c_rbyte(void);
char i2c_ack(void);
void i2c_nack(void);
void i2c_read(unsigned char id,unsigned char add,unsigned char d[]);
void DELAY();
void main()
{
unsigned char ADC0,ADC1,ADC2,ADC3;
unsigned char d[4];
TMOD=0X20;
TH1=0XFD;
SCON=0X50;
TR1=1;
while(1)
{
i2c_read(0x9E,0x41,&d[0]);
ADC0 = d[0];
TRANSMIT("AD0 = ");
CONVERT_DISPLAY(ADC0);
i2c_read(0x9E,0x42,&d[1]);
ADC1 = d[1];
TRANSMIT(", AD1 = ");
CONVERT_DISPLAY(ADC1);
i2c_read(0x9E,0x43,&d[2]);
ADC2 = d[2];
TRANSMIT(" AD2 = ");
CONVERT_DISPLAY(ADC2);
i2c_read(0x9E,0x44,&d[3]);
ADC3 = d[3];
TRANSMIT(" AD3 = ");
CONVERT_DISPLAY(ADC3);
transmit_byte(0X0A);
transmit_byte(0X0D);
DELAY();
}
}
void DELAY()
{
unsigned int X=80000,Y=90000;
while(X--);
while(Y--);
}
void transmit_byte(unsigned char byte)
{
DELAY();
TI=0;
SBUF=byte;
while(!TI);
TI=0;
}
void TRANSMIT(unsigned char *string)
{
while(*string)
transmit_byte(*string++);
}
void CONVERT_DISPLAY(unsigned int d)
{
unsigned char dig1,dig2,dig3,dig[3];
unsigned char x;
unsigned char temp;
temp=d;
temp=temp/10;
dig1=d%10;
dig2=temp%10;
dig3=temp/10;
dig[0]=dig3;
dig[1]=dig2;
dig[2]=dig1;
for(x=0;x<3;x++)
{
temp=dig[x]|0x30;
transmit_byte(temp);
}
}
void i2c_delay(void)
{
char a;
for(a=0;a<20;a++);
}
//------------------------------------------ I2C START --------------------------------------------//
void i2c_start(void)
{
SCL = 1;
i2c_delay();
SDA = 1;
i2c_delay();
SDA = 0;
i2c_delay();
SCL = 0;
i2c_delay();
}
//------------------------------------------- I2C STOP --------------------------------------------//
void i2c_stop(void)
{
SDA = 0;
i2c_delay();
SCL = 1;
i2c_delay();
SDA = 1;
i2c_delay();//
SCL = 0; //
}
//---------------------------------------- I2C WRITE BYTE -----------------------------------------//
void i2c_wbyte(unsigned char i2c_wb)
{
char a;
for(a=0;a<8;a++) // Send 8 bits
{
SCL = 0;
i2c_delay();
if(i2c_wb & (0x80 >> a))
{
SDA = 1;
}
else
{
SDA = 0;
}
i2c_delay();
SCL = 1;
i2c_delay();
}
}
//----------------------------------------- I2C READ BYTE -----------------------------------------//
unsigned char i2c_rbyte(void)
{
char a;
unsigned char b;
b=0;
for(a=0;a<8;a++)
{
SCL = 1;
i2c_delay();
if(SDA)
{
b |= (0x80 >> a);
}
i2c_delay();
SCL = 0;
i2c_delay();
}
return(b);
}
//-------------------------------------------- I2C ACK --------------------------------------------//
char i2c_ack(void)
{
char a;
i2c_delay();
SCL = 0;
i2c_delay();
SDA = 1;
i2c_delay();
SCL = 1;
i2c_delay();
i2c_delay();
a = SDA;
i2c_delay();
SCL = 0;
i2c_delay();
return(a);
}
//------------------------------------------- I2C NACK --------------------------------------------//
void i2c_nack(void)
{
SDA = 1;
i2c_delay();
SCL = 1;
i2c_delay();
SCL = 0;
i2c_delay();
}
//-------------------------------------------- I2C Read -------------------------------------------//
void i2c_read(unsigned char id,unsigned char add,unsigned char d[])
{
i2c_start();
i2c_wbyte(id);
i2c_ack();
i2c_wbyte(add);
i2c_ack();
i2c_start();
i2c_wbyte(id|0x01);
i2c_ack();
*d = i2c_rbyte();
//i2c_ack();
i2c_nack();
i2c_stop();
}

