STC12C5A60S2單片機(jī)的內(nèi)置EEPROM的使用
EEPROM可以用來(lái)存儲(chǔ)一些需要在掉電以后不丟失的數(shù)據(jù),STC12C5A60S2單片機(jī)內(nèi)部有1k byte的EEPROM,2個(gè)扇區(qū),在編程的時(shí)候注意,對(duì)于一個(gè)扇區(qū)的數(shù)據(jù)都要一起寫(xiě)進(jìn)去,即使不改也要重新寫(xiě)。
測(cè)試的代碼:
#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 //寫(xiě)入
#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) //延時(shí)函數(shù)
{
int i,j;
for(i=0; i<184; i++)
for(j=0; j<k; j++);
}
//使硬件或軟件操作停止
void iap_IDLE()
{
IAP_CONTR=0; //禁止IAP讀寫(xiě)擦除
IAP_CMD=0; //等待
IAP_TRIG=0; //命令未觸發(fā)
IAP_ADDRH=0x80; //高位數(shù)據(jù)地址
IAP_ADDRL=0; //低位
}
//從數(shù)據(jù)里面讀取數(shù)據(jù)
uchar iap_READ(uint addr)
{ uchar datas;
IAP_CONTR=IAP_EN; //控制允許位
IAP_CMD=CMD_READ; //寫(xiě)入讀命令
IAP_ADDRL=addr; //自定義地址
IAP_ADDRH=addr>>8;
IAP_TRIG=0x5a; //命令有效
IAP_TRIG=0xa5;
_nop_();
datas=IAP_DATA;
iap_IDLE();
return datas; //返回讀出的數(shù)據(jù)
}
//寫(xiě)一個(gè)比特ISP寫(xiě)到某個(gè)地方
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();
}
//擦掉某個(gè)區(qū)域
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,定時(shí)器/計(jì)數(shù)器1,工作方式2
TH1=0xfd;//設(shè)置波特率為9600
TL1=0xfd;
TR1=1;//啟動(dòng)定時(shí)器/計(jì)數(shù)器1
SCON=0x50; //0101 0000.串口工作方式1,允許串行控制
PCON=0x00;//設(shè)置SMOD=0
IE=0x90; //CPU允許中斷,串行允許中斷
TI=1;//直接使用printf必須加入此句才能實(shí)現(xiàn)發(fā)送
}
main()
{
int i;
iap_ERASE(iap_ADDRESS); //擦除扇區(qū)
for(i=0;i<10;i++)
{
iap_PROGRAM(iap_ADDRESS+i,td[i]);//向這個(gè)區(qū)間512字節(jié)里面寫(xiě)東西
}
uart_init(); //串口初始化
while(1)
{
for(i=0;i<10;i++)
{
printf("iap_READ[%d]=%c \n",i,iap_READ(iap_ADDRESS+i)); //在串口上輸出
delay(1000);
}
}
}