/*stc12c5a60s2单片机 33M晶振 QQ:910781261(有问题可以交流下,大家互相学习嘛)
知识要点:
1 单片机在运行时的数据都是存储于RAM(随机存储器当中),在掉电后数据无法保存。
为解决这个问题,就需要使用EEPROM或者是FlashROM等存储器来实现。
2 在传统的单片机系统中,一般是在片外扩展存储器,单片机与外部存储器是通过IIC
或者SPI进行通信,这样不光是增加了硬件的成本,同时在程序上也要花费更多的心思。
3 在STC单片机中内置了EEPROM(就是采用IAP技术读写内部Flash来实现EEPROM),这样就节
省了片外资源,使用起来也更加的方便*/
#include<stc12c5a60s2.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/***********ISP/IAP操作命令***************/
#define Iap_Idle 0
#define Iap_Read 1
#define Iap_Program 2
#define Iap_Erase 3
//===============串口初始化==================
void Uart_Init(void)//9600bps@33.000MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0x95; //设定定时初值
TH1 = 0x95; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
//======================ISP,IAP编程EEPROM=====================
void IAP_Write(uint addr,uchar dat)
{
IAP_DATA=dat; //送数据
IAP_ADDRL=addr%256;//送低8位地址
IAP_ADDRH=addr/256;//送高8位地址
IAP_CONTR=0x80; //IAP使能打开,设置系统等待时间
IAP_CMD=Iap_Program;//编程扇区模式
IAP_TRIG=0x5a;
IAP_TRIG=0xa5; //触发启动ISP
_nop_(); //等待写入
IAP_CONTR=0; //禁止ISP/IAp操作
IAP_CMD=0;
IAP_TRIG=0;
}
//=======================ISP,IAP读EEPROM====================
uchar IAP_Read(uint addr)
{
uchar recivedata;
IAP_ADDRL=addr%256;
IAP_ADDRH=addr/256;
IAP_CONTR=0x80;
IAP_CMD=Iap_Read;//读扇区模式
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
_nop_();
recivedata=IAP_DATA;
IAP_CONTR=0;//禁止ISP/IAp操作
IAP_CMD=0;
IAP_TRIG=0;
return recivedata;
}
//======================ISP,IAP擦除EEPROM=====================
void IAP_Erase(uint addr)
{
IAP_ADDRL=addr%256;
IAP_ADDRH=addr/256;
IAP_CONTR=0x80;
IAP_CMD=Iap_Erase;//擦除扇区
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
_nop_();
IAP_CONTR=0;
IAP_CMD=0;
IAP_TRIG=0;
}
//写入一个数据,保存在EEPROM中,在将EEPROM中的数据读出来,通过串口显示
void main(void)
{
uchar returndata;
uint testdata=0x2660;
Uart_Init();
while(1)
{
IAP_Erase(0x0000);
IAP_Erase(0x0001);
IAP_Write(0x0000,testdata/256);//编程存放数据的高8位
IAP_Write(0x0001,testdata%256);//编程存放数据的低8位
returndata=IAP_Read(0x0000);
SBUF=returndata;
while(!TI);
TI=0;
returndata=IAP_Read(0x0001);
SBUF=returndata;
while(!TI);
TI=0;
}
}