关于断电延时和EEPROM数据保存(申酷!!) EEPROM, 申酷, 数据, 延时, 断电 原来想用AD检测断电的,做出来测试几遍不行,听了各位的意见。 就花了一个下午完成用一个 I/O断电检测电路。把法拉电容改小了,节约开支,一个 2200uf的普通电容就足够了。经测试能正常保存数据到 EEPROM。 电路见下面的图片链接。 该解决方案的程序: #include #include //汇编头文件 #define uchar unsigned char #define uint unsigned int sbit p12 = P1^2; uchar i; void delay(uint z) //延时ms { uint x,y; for(x=112;x>0;x--) for(y=z;y>0;y--); } void init_232(void) //串口初始化 { SCON = 0x50; TMOD |= 0x20; TH1 = 0xfa; //波特率 9600 TL1 = 0xfa; PCON |= 0x80; EA = 1; ES = 1; TR1 = 1; } void send_char(uchar w) //串口发送一个字符 { SBUF = w; while(TI == 0); TI = 0; } void send_string(uchar *s,uint string_length) //串口发送一个字符串 { uint i = 0; do { send_char(*(s + i)); i++; } while(i < string_length); } /*EEPROM字符读取*/ uchar eeprom_read(uchar x,y) { ISP_ADDRH = x; ISP_ADDRL = y; ISP_CONTR = 0x9b; ISP_CMD = 0x01; ISP_TRIG = 0x46; ISP_TRIG = 0xb9; _nop_(); ISP_CONTR=0; ISP_CMD=0; ISP_TRIG=0; return(ISP_DATA); } /*EEPROM字符写入*/ void eeprom_write(uchar x,y,z) { ISP_DATA = z; ISP_ADDRH = x; ISP_ADDRL = y; ISP_CONTR = 0x9b; ISP_CMD = 0x02; ISP_TRIG = 0x46; ISP_TRIG = 0xb9; _nop_(); ISP_CONTR=0; ISP_CMD=0; ISP_TRIG=0; } /*EEPROM扇区擦除*/ void eeprom_erase(uchar x,y) { ISP_ADDRH = x; ISP_ADDRL = y; ISP_CONTR = 0x9b; ISP_CMD = 0x03; ISP_TRIG = 0x46; ISP_TRIG = 0xb9; _nop_(); ISP_CONTR=0; ISP_CMD=0; ISP_TRIG=0; } void main() { init_232(); i = 0; delay(10); while(1) { if((p12 == 0) && (i == 0)) { eeprom_erase(0x10,0x00); //擦除第一扇区 delay(1); eeprom_write(0x10,0x00,0x88); //在第一扇区写入 88 delay(1); i = 1; } } } /*串口接收中断函数*/ void RS232() interrupt 4 { u...