0
点赞
收藏
分享

微信扫一扫

单片机:STC89C52RC FLASH读程序 未验证

stc89c52RC 内部flash读写 测试程序(转) (2013-01-13 00:38:52)转载▼
标签: 歌力思正品代购 娱乐
stc89c52RC <wbr>内部flash读写 <wbr>测试程序(转)


stc89c52RC <wbr>内部flash读写 <wbr>测试程序(转)


我要啦免费统计


http://blog.sina.com.cn/s/blog_b71e3b980101g1f7.html
style="font-size:14px;">
stc89c52RC 内部flash读写 测试程序
2009-08-12 21:45
#include
#include
#include

#define ERROR 0
#define OK 1

#define WAIT_TIME 0x00 //mcu clock 40mhz
//#define WAIT_TIME 0x01 //mcu clock 20mhz
//#define WAIT_TIME 0x02 //mcu clock 10mhc
//#define WAIT_TIME 0x03 //mcu clock 5mhz


#define ALEON AUXR&=0X8E //一般单片机模式、一直有ALE输出 这样会产生EMI(电磁干扰)
#define ALEOFF AUXR|=0X01 //关闭后只在调用总线后才有输出

void ISP_EN(void) //写内部flash使能,该flash与程序存储器是分开的
0x80; // 1000,0000

void ISP_DI(void)

ISP_CONTR &=0x7f; // 0111,1111
ISP_TRIG = 0x00;
EA = 1; // 开中断


unsigned char Byte_read(unsigned int byte_addr) //扇区字节读取

ISP_ADDRH = (unsigned char)(byte_addr >> 8);
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; // 1111,1000
ISP_CMD = ISP_CMD


void Sector_erase(unsigned int Sector_addr) //扇区擦除 本函数只要输入一闪去中的任意地址就可将该区擦除
0x03; // 0000,0011 扇区擦除数据存储区

ISP_EN();

ISP_TRIG = 0x46; // 触发ISP_IAP命令
ISP_TRIG = 0xb9; // 触发ISP_IAP命令
_nop_();
_nop_();
ISP_DI();

void Byte_program(unsigned int byte_addr, unsigned char DataBuf) //字节编程,在整个扇区擦除完后才可以写入
0x02; // 0000,0010 字节编程数据存储区
ISP_DATA = DataBuf;
ISP_EN();

ISP_TRIG = 0x46; // 触发ISP_IAP命令
ISP_TRIG = 0xb9; // 触发ISP_IAP命令
_nop_();


ISP_DI();

unsigned char ByteProgramVerify(unsigned int byte_addr, unsigned char DataBuf)
0x02; // 0000,0010 字节编程数据存储区
ISP_DATA = DataBuf;
ISP_EN();
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
_nop_();
ISP_DATA = 0x00;
ISP_CMD = ISP_CMD & 0xf8; // 1111,1000
ISP_CMD = ISP_CMD


void test() //测试成功2009.8.12
{
addr=0x2e00;

//Sector_erase(addr); //先擦除然后再写入


for(i=0;i<100;i++)

dat=Byte_read(addr+i);
sendnews(dat);

for(i=0;i<100;i++)

Byte_program(addr+i, 200-i);

sendnews(0x69);
sendnews(0x69);
sendnews(0x69);
for(i=0;i<100;i++)

dat=Byte_read(addr+i);
sendnews(dat);

}


void main()
{
cominit();
ALEOFF;


while(1)
shujudeal();



}

//---------------------------------------串口调试使用com.c--------------------------
#define uchar unsigned char
#define uint unsigned int

unsigned char Byte_read(unsigned int byte_addr);
void Sector_erase(unsigned int Sector_addr) ;
void Byte_program(unsigned int byte_addr, unsigned char DataBuf) ;
unsigned char ByteProgramVerify(unsigned int byte_addr, unsigned char DataBuf);


uchar dealon=0;
uchar get[8]=0;
uchar count=0;


uint addr;
uchar dat;
uchar i;

void delay(uint t)
while(t--);

void sendnews(uchar temp) //串行发送
SBUF=temp;delay(500);

void ser() interrupt 4
//串行中断服务程序
{ if(RI) {RI=0; get[count]=SBUF;count++;
if(count>3)
count=0;
if(get[0]==0x5a) dealon=1;

}

if(TI) TI=0;

}


void cominit()
TMOD=0x20;//设置定时器1为方式2
TH1=0xfd; //11.0592MHz------9600波特率
TL1=0xfd; //自动重装
TR1=1; //定时器启动
REN=1; // 串行允许接收
SM1=1; //工作方式1
EA=1; //开中断
RI=0;
ES=1; //开串口
count-=1;

void shujudeal() //对接收到的数据分类存储
{

if(dealon)
dealon=0;
sendnews(0x69);
addr=get[1];
addr<<=8;
addr+=get[2];
dat=0;
dat=Byte_read(addr);
sendnews(dat);

dat=0;
Byte_program(addr, get[3]);
dat=Byte_read(addr);
sendnews(dat);



}





举报

相关推荐

0 条评论