51单片机 STC单片机 IAP(EEPROM)的使用
#include<stc12c5410ad.h>//到宏晶网站下载头文件或自己在现有的头文件上加上相应的寄存器定义即可。
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/****************uart init***********/
void UART_inti(void)
{
AUXR=0x40;//定时器1速度是普通8051的12倍,不分频
TMOD=0x20;//定时器1工作在方式2,用来产生波特率
SCON=0x50;//串口工作在方式1,允许接收
TL1=0xF7;//波特率为38400;FB为115200
TH1=0xF7;
PCON=0x00;//SMOD=0
TR1=1; //产生波特率
}
void ISP_write(uint ISP_addr,uchar ISP_data)//stc12c5404启始地址2800h ;IAP_CMD 1读,2写,3擦除
{
ISP_DATA=ISP_data; //送数据
ISP_ADDRL=ISP_addr%256;
ISP_ADDRH=ISP_addr/256;//送高低地址
ISP_CONTR=0x83;//IAP ENABLE ,SET CPU WAIT TIME
ISP_CMD=2;//写字节模式
ISP_TRIG=0x46;
ISP_TRIG=0xB9;//触发启动ISP
_nop_();//等待写入
ISP_CONTR=0x00;//禁止ISP/IAp操作
ISP_CMD=0;
ISP_TRIG=0x00;
}
uchar ISP_read(uint ISP_addr)//stc12c5404启始地址2800h ;IAP_CMD 1读,2写,3擦除
{uchar recivedata;
ISP_ADDRL=ISP_addr%256;
ISP_ADDRH=ISP_addr/256;//送高低地址
ISP_CONTR=0x83;//IAP ENABLE ,SET CPU WAIT TIME
ISP_CMD=1;//写字节模式
ISP_TRIG=0x46;
ISP_TRIG=0xB9;//触发启动ISP
_nop_();//等待读
recivedata=ISP_DATA;
ISP_CONTR=0x00;//禁止ISP/IAp操作
ISP_CMD=0;
ISP_TRIG=0x00;
return recivedata;
}
void ISP_erase(uint ISP_addr)//stc12c5404启始地址2800h ;IAP_CMD 1读,2写,3擦除
{ISP_ADDRL=ISP_addr%256;
ISP_ADDRH=ISP_addr/256;//送高低地址
ISP_CONTR=0x83;//IAP ENABLE ,SET CPU WAIT TIME
ISP_CMD=3;//写字节模式
ISP_TRIG=0x46;
ISP_TRIG=0xB9;//触发启动ISP
_nop_();//等待擦除
ISP_CONTR=0x00;//禁止ISP/IAp操作
ISP_CMD=0;
ISP_TRIG=0x00;
}
//主程序只为测试时随意编写的,可以根据需要做相应的修改即可。
void main(void)
{
uchar returndata;
uint textdata=0x2660;
UART_inti();
while(1)
{SBUF=5;
while(!TI);
TI=0;
while(!RI);
RI=0;
ISP_erase(0x2800);
ISP_write(0x2800,textdata%256);
ISP_write(0x2801,textdata/256);
returndata=ISP_read(0x2800);
SBUF=returndata;
while(!TI);
TI=0;
returndata=ISP_read(0x2801);
SBUF=returndata;
while(!TI);
TI=0;
}
}
//声明下这是应用在STC的单片机中的。不同的型号地址不一样,改下IAP的地址即可。新出的产品像STC12C5A60S2等,触发的命令也不一样ISP_TRIG=0x46;ISP_TRIG=0xB9;也就是这两条要根据手册修改下即可。。
|