Red de conocimientos turísticos - Conocimientos sobre calendario chino - ¡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...

¡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...

Para su referencia

#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[])

{

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

}

}