单片机: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);

  
  
}

 

posted @ 2021-08-13 07:09  myrj  阅读(163)  评论(0编辑  收藏  举报