网上研究了关天,各种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有关的特殊功能寄存器
- }
复制代码
|