¡Acerca del uso del bus IIC del microcontrolador 51 y AT24C02! ¡Quiero escribir datos y luego leerlos! A continuación se muestra mi código y diagrama de simulación...
#include
#include
#define uchar unsigned char
sbit SCL=P2^0; //definir puerto
sbit SDA=P2^1;
//****************** ** *******************************
//Iniciar programa de autobús IIC
/ /************************************ ********* ***
void start(void)
{
SDA=1; //enviar señal de datos de condición de inicio
_nop_( );
SCL=1; //enviar señal de reloj de condición de inicio
_nop_();
_();
_nop_ ();
_nop_();
_nop_();
_nop_();
_nop_();
SDA=0 ;
_nop_();
_nop_();
_nop_();
_nop_( );
_nop _();
SCL=0;
_nop_();
}
//**** *******************************************
// Detener el programa de bus IIC //******** ************************* ********** *
void stop(void)
{ //Enviar señal de datos de la condición de parada
SDA=0;
_nop_() ;
_nop_();
SCL=1; //Enviar señal de reloj para condición de parada
_nop_(
_nop_ ();
_nop_()
_nop_()
_nop_();
_nop_();
_nop_();
_nop_();
SDA=1; //Enviar señal de parada de bus I2C
_ nop_();
_nop_();
_nop_();
_nop_();
_nop_ ();
_nop_();
_nop_();
}
//******** ********** ****************************<
// La estación esclava recibe una respuesta de datos 0
//************************************ ************
esclavo vacío_0(vacío)
{
SDA=0;
_nop_ ();
_nop_( );
_nop_
();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL= 0;
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
}
/*************************** * ******* *************
// La estación esclava recibió la última respuesta de datos 1
/*** ** *******************************************
void esclavo_1( void)
{
SDA =1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_( );
p>_nop_();
_nop_();
_nop_();
_ nop_();
SCL=0;
_nop_();
_nop_();
}
/** ****** *************************************
// Subrutina de retardo
/****************************************** *** **
retraso nulo(unsigned int N)
{
unsigned int i;
for(i = 0 ;i < N.i++);
}
//*************************** ***** *******************
//Subrutina de verificación de bits de respuesta de la estación esclava
//**** **** **************************** **********
// **********************************************
void write_byte (uchar ch)
{
uchar i, n=8; //enviar un byte de datos a SDA, 8 bits
for(i=0 ;i { if((ch&0x80)==0x80) { //Si el bit a enviar es 1, entonces SDA=1 SDA=1; SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; } else //Si el bit a enviar es 0, entonces SDA=0 { SDA=0; _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; } ch=ch& lt;<1; } } /*************** *** **************************** / Recibir subrutina de bytes / ************************ ********************** uchar read_byte(void) { uchar n=8; uchar recibir_data=0; while(n - -) { SDA=1; _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();< / p> _nop_(); _nop_(); _nop_(); recibir_datos=recibir_datos<<1; bit if(SDA==1) { recibir_data=receive_data|0x01 //si el bit recibido es 1, el último bit del data 1 } else { recibir_data=receive_data&0xfe //si el bit recibido es 0, el último el bit de los datos es 0 } SCL=0; } return (receive_data); } /*************************************** *** ******* //Escribir datos en AT24C1024 /********************* *** ********************** void write_1024(uchar enviar[]) { p > int i; start(); write_byte(0xa0); //Iniciar el bus check_ACK(); dirección del dispositivo write_byte(0x00); //enviar la dirección de 8 bits alta en el chip check_ACK() //comprobar si el esclavo está respondiendo > write_byte (0x00); //enviar la dirección de 8 bits baja del dispositivo en el chip check_ACK(); for(i=0;i<16;i++) // Escribe 16 números { //Escribe los datos en la matriz sind[] Ingrese AT24C1024 write_byte(send[i]); check_ACK(); } stop(); el autobús } //********************************* *** **************** *********** ************* ***** **************** void read_1024(uchar recibir_datos[]) { uchar i; start(); //iniciar bus write _byte(0xa0); //Enviar dirección del dispositivo check_ACK(); comprueba si el esclavo está respondiendo write_byte(0x00); //Envía la dirección alta de 8 bits del dispositivo en el chip check_ACK(); write_byte(0x00); //Envía la dirección baja de la dirección de 8 bits del dispositivo en el chip check_ACK(); start() //Inicia la estación maestra nuevamente. write_byte(0xa1); //Enviar comando de lectura check_ACK(); for(i=0;i<16;i++) //Leer 16 números { recibir_data[i]=read_byte(); //Los datos leídos se almacenan en la matrizceivedata[] if(i= =15) //Si se completó la lectura, si no se han leído todos los datos, entonces responda 0 slave_1(); else slave_0 (); }// Para el autobús stop(); } void main() { uchar send_data[16]={1, 9,8,8,0,5,2,3, 1,9,8,8,0,9,0,6} ; //Escribir datos AT24C1024 uchar recibir_data[16]= {0}; // Almacenar los datos leídos desde AT24C1024 while(1) { delay(300); // Retraso y espera para el reinicio del pistón write_1024(send_data); // Llama al programa de escritura AT24C1024 delay(1000) ; //Retraso de escritura AT24C1024 read_1024(receive_data); // Llamada a lectura del programa AT24C1024 } }