原来想用AD检测断电的,做出来测试几遍不行,听了各位的意见。 就花了一个下午完成用一个I/O断电检测电路。把法拉电容改小了,节约开支,一个2200uf的普通电容就足够了。经测试能正常保存数据到EEPROM。
电路见下面的图片链接。
该解决方案的程序: #include <stc12c2052ad.H> #include <intrins.h> //汇编头文件 #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 { uchar ch = 0; if(RI) { ch = SBUF; RI = 0; send_char(ch); } switch(ch) { case 1: send_char(eeprom_read(0x10,0x00)); //串口助手输入16进制1,读EEPROM第一扇区 break; case 2: send_char(eeprom_read(0x12,0x00)); //串口助手输入16进制2,读EEPROM第2扇区 break; case 3: eeprom_write(0x10,0x00,0x55); //串口助手输入16进制3,写EEPROM第一扇区55 break; case 4: eeprom_write(0x12,0x00,0x66); //串口助手输入16进制4,写EEPROM第2扇区66 break; case 5: eeprom_erase(0x10,0x00); //串口助手输入16进制5,擦除EEPROM第一扇区 break; case 6: eeprom_erase(0x12,0x00); //串口助手输入16进制6,擦除EEPROM第2扇区 break;
default: break; } }
相关链接:http://p13.freep.cn/p.aspx?u=v20_p13_p_0902071545521220_0.jpg |