Programa de lectura y escritura EEPROM serie 24C04 o 24CXX para C51
El modelo EEPROM utilizado en el diseño de mi curso es X24C16P (2048 bytes), y el programa de lectura y escritura EEPROM X24C16P utilizado es una modificación de AT24C02C. Los principios de lectura y escritura de los dos son básicamente los mismos.
Primero pondré un programa que ha sido simulado por PROTEUS. Es utilizable. El programa de mi curso está en la computadora de un compañero y no se puede obtener en este momento: #includelt; //Un buen ejemplo de simulación de software. de IIC, simplemente comprenda la esencia
#includelt;intrins.hgt; // Aunque el programa es largo, no es muy complicado. La clave es comprender el mecanismo de funcionamiento de IIC.
#define uchar unsigned char
#define uint unsigned int
#define DELAY5US _nop_(); _nop_();
sbit VSDA = P1^0
sbit VSCL = P1^1
sbit LED = P1^7
uchar; SLAW;
void STA() / /Descubrir: 24C02C es un chip de memoria EEPROM serial de 256 bytes*8 bits. Tenga en cuenta que es ROM de solo lectura
{ //. Pero este ejemplo escribe los datos 0-255 en la ROM. ¿Cómo se graba lo que está escrito?
VSDA = 1 // Esto no es muy comprensible
VSCL = 1; ;
DELAY5US
VSDA = 0
DELAY5US
VSCL = 0
}
void STOP()
{
VSDA = 0
VSCL = 1
DELAY5US
;VSDA = 1;
VSCL = 1;
DELAY5US
}
void MACK()
{
VSDA = 0;
VSCL = 1
DELAY5US
VSCL = 0; >}
void MNACK()
{
VSDA = 1
VSCL = 1; DELAY5US
VSCL = 0
p>
}
void CACK()
{
VSDA = 1;
VSCL = 1;
F0 = 0;
si ( 1 == VSDA )
{
F0 = 1;
}
VSCL = 0;
}
void WRBYTE(uchar idata * p)
{
uchar idata n = 8, temp;
temp = *p;
while(n--)
{
if ( 0x80 = = (tempamp; 0x80) )
{
VSDA = 1; p> VSCL = 1;
DELAY5US
VSCL = 0
}
más
{
VSDA =
0;
VSCL = 1
DELAY5US
VSCL = 0
}
temp = plantilla; ;lt;1;
}
}
void RDBYTE(uchar idata *p)
{
uchar idata n = 8, temp = 0
while(n--)
{
VSDA = 1; VSCL = 1;
temp = templt;lt;1;
si ( 1 == VSDA )
temp = temp|0x01;
else
temp = tempamp;0xfe;
VSCL = 0;
}
*p = temp; p> p>
}
retraso nuloMásDe5ms()
{
uint i
for ( i = 0; i lt 1000; i )
{
DELAY5US
}
}
int principal() p>
{
uchar ch, *p;
uint i;
SLAW = 0xA2; //0xA0 es la dirección de escritura del esclavo. byte (escribir), A es 1010 es la dirección del dispositivo, determinada por el fabricante
para (i = 0; i lt; = 255; i) //1010 (A) es la dirección del dispositivo del serie a la que pertenece 24C02C
{//0000 lo decide usted mismo, los primeros 3 0 están determinados por A0A1A2 del chip 24C02C
STA(); escribir, 1 significa leer p>
p = amp //4 (dirección del dispositivo), 3 (dirección del pin), uno (bit de selección de lectura y escritura).
WRBYTE(p); //La señal de respuesta es la clave
CACK(); //El envío corresponde a la escritura, la recepción corresponde a la lectura
si ( 1 = = F0 )
{
LED = 0
mientras(1)
}
ch = i;
p = ch;
WRBYTE(p); /p>
si ( 1 == F0 )
{
LED = 0
mientras(1)
;
p>
}
WRBYTE(p);
CACK()
PARADA(); p>
demoraMásThan5ms() ;
}
mientras(1)
;
devuelve 0;
}