|
51單片機(jī) STC單片機(jī) IAP(EEPROM)的使用
#include<stc12c5410ad.h>//到宏晶網(wǎng)站下載頭文件或自己在現(xiàn)有的頭文件上加上相應(yīng)的寄存器定義即可。
#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,用來產(chǎn)生波特率
SCON=0x50;//串口工作在方式1,允許接收
TL1=0xF7;//波特率為38400;FB為115200
TH1=0xF7;
PCON=0x00;//SMOD=0
TR1=1; //產(chǎn)生波特率
}
void ISP_write(uint ISP_addr,uchar ISP_data)//stc12c5404啟始地址2800h ;IAP_CMD 1讀,2寫,3擦除
{
ISP_DATA=ISP_data; //送數(shù)據(jù)
ISP_ADDRL=ISP_addr%256;
ISP_ADDRH=ISP_addr/256;//送高低地址
ISP_CONTR=0x83;//IAP ENABLE ,SET CPU WAIT TIME
ISP_CMD=2;//寫字節(jié)模式
ISP_TRIG=0x46;
ISP_TRIG=0xB9;//觸發(fā)啟動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;//寫字節(jié)模式
ISP_TRIG=0x46;
ISP_TRIG=0xB9;//觸發(fā)啟動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;//寫字節(jié)模式
ISP_TRIG=0x46;
ISP_TRIG=0xB9;//觸發(fā)啟動ISP
_nop_();//等待擦除
ISP_CONTR=0x00;//禁止ISP/IAp操作
ISP_CMD=0;
ISP_TRIG=0x00;
}
//主程序只為測試時隨意編寫的,可以根據(jù)需要做相應(yīng)的修改即可。
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;
}
}
//聲明下這是應(yīng)用在STC的單片機(jī)中的。不同的型號地址不一樣,改下IAP的地址即可。新出的產(chǎn)品像STC12C5A60S2等,觸發(fā)的命令也不一樣ISP_TRIG=0x46;ISP_TRIG=0xB9;也就是這兩條要根據(jù)手冊修改下即可。。
|
|