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