網上研究了關天,各種STC12C的EEPROM使用,最后都沒成功,都沒辦法了,想起STC89C52兼容舊8051,那STC12C2052會兼容STC89C52嗎?
因為之前測試過STC89C52的掉電存儲,成功了,所以有現成的資源 ,
親測可用,STC12C2052可以套用STC89C52的EEPROM,但在寫程序后,要重新開啟EA,原程序在使用時關閉了。
以下附年STC89C52的EEPROM代碼,直接套用到STC12C2052就行。
單片機源程序如下:
- #include <STC89C52RC.H>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit LED1 = P1^1;
- sbit led=P3^3;
- sbit LED2 = P1^2;
- sbit K1 = P3^2; //按鈕1
- sbit K2 = P3^3; //按鈕2
- void cc(uint addr);
- void xcx(uint addr,uchar dat);
- uchar dcx(uint addr);
- void Q0();
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函數:主程序
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void main(void)
- {
- led=0;
- // uchar V;
- P1= dcx(0x2000); // 開機讀取EEPROM區2002h數據,還原關電前LED的亮滅狀況
- while(1)
- {
- if(!K1)
- {
- while(!K1);
- // LED1=0;LED2=1;
- cc(0x2000); // 擦除第1個扇區(2000h~21FFh)
- xcx(0x2000,4); // 對EEPROM區2002h寫入2
- }
- }
- }
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函數:擦除某一扇區(每個扇區512字節)
- 入口:addr = 某一扇區首地址
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void cc(uint addr)
- {
- // 0x83(晶振<5M) 0x82(晶振<10M) 0x81(晶振<20M) 0x80(晶振<40M)
- ISP_CONTR = 0x81; // 打開 IAP 功能(ISPEN(ISP_CONTR.7)=1:允許編程改變Flash, 設置 Flash 操作等待時間。
- ISP_CMD = 0x03; // 用戶可以對"Data Flash/EEPROM區"進行扇區擦除
- ISP_ADDRL = addr; // ISP/IAP操作時的地址寄存器低八位,
- ISP_ADDRH = addr>>8; // ISP/IAP操作時的地址寄存器高八位。
- EA =0;
- ISP_TRIG = 0x46; // 在ISPEN(ISP_CONTR.7)=1時,對ISP_TRIG先寫入46h,
- ISP_TRIG = 0xB9; // 再寫入B9h,ISP/IAP命令才會生效。
- _nop_();
- Q0(); // 關閉ISP/IAP
- }
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函數:寫一字節
- 入口:addr = 扇區單元地址 , dat = 待寫入數據
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void xcx(uint addr,uchar dat)
- {
- ISP_CONTR = 0x81;
- ISP_CMD = 0x02; // 用戶可以對"Data Flash/EEPROM區"進行字節編程
- ISP_ADDRL = addr;
- ISP_ADDRH = addr>>8;
- ISP_DATA = dat; // 數據進ISP_DATA
- EA = 0;
- ISP_TRIG = 0x46;
- ISP_TRIG = 0xB9;
- _nop_();
- Q0(); // 關閉ISP/IAP
- }
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函數:讀一字節
- 入口:addr = 扇區單元地址
- 出口:dat = 讀出的數據
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- uchar dcx(uint addr)
- {
- uchar dat;
- ISP_CONTR = 0x81;
- ISP_CMD = 0x01; // 用戶可以對"Data Flash/EEPROM區"進行字節讀
- ISP_ADDRL = addr;
- ISP_ADDRH = addr>>8;
- EA = 0;
- ISP_TRIG = 0x46;
- ISP_TRIG = 0xB9;
- _nop_();
- dat = ISP_DATA; // 取出數據
- Q0(); // 關閉ISP/IAP
- return dat;
- }
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函數:關閉ISP/IAP操作
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void Q0()
- {
- ISP_CONTR = 0; // 關閉IAP功能
- ISP_CMD = 0; // 待機模式,無ISP操作
- ISP_TRIG = 0; // 關閉IAP功能, 清與ISP有關的特殊功能寄存器
- }
復制代碼
|