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 está disponible en este momento: #include
#include #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 = = (temp&0x80) ) { VSDA = 1; VSCL = 1; DELAY5US VSCL = 0; } else { VSDA = 0; VSCL = 1; DELAY5US VSCL = 0 } temp =; temperatura< <1; } } void RDBYTE(uchar idata *p) { uchar idata n = 8, temp = 0; while(n--) { VSDA = 1; VSCL = 1; temp = temp<<1; si ( 1 == VSDA ) temp = temp|0x01; else temp = temp&0xfe; VSCL = 0; } *p = temp; } retraso nuloMásThan5ms() { uint i; for ( i = 0; i < 1000; i++ ) { DELAY5US } } int main() { uchar ch, *p; uint i; SLAW = 0xA2; //0xA0 es el byte de la dirección de escritura del esclavo (escritura), A es 1010 Es la dirección del dispositivo, determinada por el fabricante para ( i = 0; i <= 255; i++ ) //1010 (A) es la dirección del dispositivo de la serie a la que pertenece 24C02C { // 0000 lo decide usted mismo, los primeros 3 0 están determinados por A0A1A2 del chip 24C02C STA() // El último 0 significa escribir, 1 significa leer p = &SLAW; //4 (dirección del dispositivo), 3 (dirección del pin) y 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); CACK(); si ( 1 == F0 ) { LED = 0; mientras(1) ; } WRBYTE(p); CACK(); STOP(); retrasoMásDe5ms( ); } mientras(1) ; devuelve 0; }