STC12C5A60S2单片机的内置EEPROM的使用
扫描二维码
随时随地手机看文章
EEPROM可以用来存储一些需要在掉电以后不丢失的数据,STC12C5A60S2单片机内部有1k byte的EEPROM,2个扇区,在编程的时候注意,对于一个扇区的数据都要一起写进去,即使不改也要重新写。
测试的代码:
#include <STC12C5A.H>
#include"intrins.h"
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define ADC_POWER 0x80
#define ADC_FLAG 0x10
#define ADC_START 0x08
#define CMD_IDLE 0 //IAP等待
#define CMD_READ 1 //读flash
#define CMD_PROGRAM 2 //写入
#define CMD_ERASE 3 //擦除
#define IAP_EN 0x83
#define iap_ADDRESS 0x0000 //地址
char td[10]= {'a','b','c','d','e','f','g','h','j','k'};
void delay(int k) //延时函数
{
int i,j;
for(i=0; i<184; i++)
for(j=0; j<k; j++);
}
//使硬件或软件操作停止
void iap_IDLE()
{
IAP_CONTR=0; //禁止IAP读写擦除
IAP_CMD=0; //等待
IAP_TRIG=0; //命令未触发
IAP_ADDRH=0x80; //高位数据地址
IAP_ADDRL=0; //低位
}
//从数据里面读取数据
uchar iap_READ(uint addr)
{ uchar datas;
IAP_CONTR=IAP_EN; //控制允许位
IAP_CMD=CMD_READ; //写入读命令
IAP_ADDRL=addr; //自定义地址
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5a; //命令有效
IAP_TRIG=0xa5;
_nop_();
datas=IAP_DATA;
iap_IDLE();
return datas; //返回读出的数据
}
//写一个比特ISP写到某个地方
void iap_PROGRAM(uint addr,uchar datas)
{
IAP_CONTR=IAP_EN;
IAP_CMD=CMD_PROGRAM;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_DATA=datas;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
_nop_();
iap_IDLE();
}
//擦掉某个区域
void iap_ERASE(uint addr)
{
IAP_CONTR=IAP_EN;
IAP_CMD=CMD_ERASE;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5a;
IAP_TRIG=0xa5;
_nop_();
iap_IDLE();
}
void uart_init(void) //串口的初始化
{
TMOD=0x20;//即0010 0000,定时器/计数器1,工作方式2
TH1=0xfd;//设置波特率为9600
TL1=0xfd;
TR1=1;//启动定时器/计数器1
SCON=0x50; //0101 0000.串口工作方式1,允许串行控制
PCON=0x00;//设置SMOD=0
IE=0x90; //CPU允许中断,串行允许中断
TI=1;//直接使用printf必须加入此句才能实现发送
}
main()
{
int i;
iap_ERASE(iap_ADDRESS); //擦除扇区
for(i=0;i<10;i++)
{
iap_PROGRAM(iap_ADDRESS+i,td[i]);//向这个区间512字节里面写东西
}
uart_init(); //串口初始化
while(1)
{
for(i=0;i<10;i++)
{
printf("iap_READ[%d]=%c \n",i,iap_READ(iap_ADDRESS+i)); //在串口上输出
delay(1000);
}
}
}