/****************************************************************** * * * ME850单片机开发系统扩展应用 - 读写 EEPROM 测试程序 * * * * P2 端口8位LED显示 * * * * MCU: STC90C52RC 晶振频率:11.0592MHz * * * * 版本: V1.0 (2010/02/09) * * 作者:gguoqing (Email: gguoqing@willar.com) * * 网站:www.sofi-tech.com (硕飞科技) * * www.mcusj.com (伟纳单片机世界) * * 邮箱:sofitech@tom.com * * * *【版权】Copyright(C) 深圳硕飞科技有限公司 All Rights Reserved * *【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! * * * ******************************************************************* * * * STC90C51RC的EEPROM地址: 2000H - 33FFH * * * * 共有10个扇区,每个扇区512字节。 * * * ******************************************************************/ #include "STC90C51RC_RD.h" #include <intrins.h> #define uchar unsigned char #define uint unsigned int #define RdCommand 0x01 #define PrgCommand 0x02 #define EraseCommand 0x03 #define WaitTime 0x01 sbit K1 = P1^4; /********************************************************** 延时子程序 **********************************************************/ void delayms(uint ms) { uint k; while(ms--) { for(k = 0; k < 114; k++); } } /********************************************************** ISP_IAP 使能子函数 **********************************************************/ void ISP_IAP_enable(void) { EA = 0; /* 关中断 */ ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */ ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */ ISP_CONTR = ISP_CONTR | 0x80; /* ISPEN=1 */ } /********************************************************** ISP_IAP 禁止子函数 **********************************************************/ void ISP_IAP_disable(void) { ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */ ISP_TRIG = 0x00; EA = 1; /* 开中断 */ } /********************************************************** ISP_IAP 触发子函数 **********************************************************/ void ISPgoon(void) { ISP_IAP_enable(); /* 打开 ISP,IAP 功能 */ ISP_TRIG = 0x46; /* 触发ISP_IAP命令字节1 */ ISP_TRIG = 0xb9; /* 触发ISP_IAP命令字节2 */ _nop_(); } /********************************************************** 字节读子函数 **********************************************************/ 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; /* 清除低3位 */ ISP_CMD = ISP_CMD | RdCommand; /* 写入读命令*/ ISPgoon(); /* 触发执行*/ ISP_IAP_disable(); /* 关闭ISP,IAP功能 */ return (ISP_DATA); /* 返回读到的数据 */ } /********************************************************** 扇区擦除子函数 **********************************************************/ void sectorerase(unsigned int sector_addr) { unsigned int iSectorAddr; iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */ ISP_ADDRH = (unsigned char)(iSectorAddr >> 8); ISP_ADDRL = 0x00; ISP_CMD = ISP_CMD & 0xf8; /* 清空低3位 */ ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3 */ ISPgoon(); /* 触发执行 */ ISP_IAP_disable(); /* 关闭ISP,IAP功能 */ } /********************************************************** 字节写子函数 **********************************************************/ void byte_write(unsigned int byte_addr, unsigned char original_data) { ISP_ADDRH = (unsigned char)(byte_addr >> 8); /* 取地址 */ ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 */ ISP_CMD = ISP_CMD | PrgCommand; /* 写命令2 */ ISP_DATA = original_data; /* 写入数据准备 */ ISPgoon(); /* 触发执行 */ ISP_IAP_disable(); /* 关闭IAP功能 */ } /********************************************************** 主函数 **********************************************************/ void main(void) { uchar num; uint addr,n; while(1) { if(K1 == 0) //K1键按下 { addr = 0x2000; //EEPROM首地址 sectorerase(addr); //一次擦除一个扇区(512B) addr = 0x2000; //EEPROM首地址 for(n=0; n<256; n++) //写入256个字节数据 { byte_write(addr,n); addr++; } addr = 0x3200; //EEPROM首地址 sectorerase(addr); //一次擦除一个扇区(512B) byte_write(0x33ff,0); //写入一个字节 } if(byte_read(0x33ff)==0) { addr = 0x2000; //EEPROM首地址 for(n=0; n<256; n++) //读出256个字节数据 { num = byte_read(addr); P2 = ~num; //送显示 addr++; delayms(200); } P2 = 0xff; //关闭LED显示 addr = 0x3200; sectorerase(addr); //一次擦除一个扇区(512B) byte_write(0x33ff,1); //写入一个字节 } } } /*********************************************************/ STC90C51RC_RD.H文件: [ 点击下载 ] 注意: 要将 STC90C51RC_RD.H 文件与源程序文件放在同一文件夹内。 ;******************************************************************* ;* * ;* ME850单片机开发系统扩展应用 - 读写 EEPROM 测试程序 * ;* * ;* P2 端口8位LED显示 * ;* * ;* MCU: STC90C52RC 晶振频率:11.0592MHz * ;* * ;* 版本: V1.0 (2010/02/09) * ;* 作者:gguoqing (Email: gguoqing@willar.com) * ;* 网站:www.sofi-tech.com (硕飞科技) * ;* www.mcusj.com (伟纳单片机世界) * ;* 邮箱:sofitech@tom.com * ;* * ;*【版权】Copyright(C) 深圳硕飞科技有限公司 All Rights Reserved * ;*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! * ;* * ;******************************************************************* ;* * ;* STC90C51RC的EEPROM地址: 2000H - 33FFH * ;* * ;* 共有10个扇区,每个扇区512字节。 * ;* * ;******************************************************************* ;声明与ISP/EEPROM有关的特殊功能寄存器的地址 ;********************************************************** ISP_DATA EQU 0E2H ISP_ADDRH EQU 0E3H ISP_ADDRL EQU 0E4H ISP_CMD EQU 0E5H ISP_TRIG EQU 0E6H ISP_CONTR EQU 0E7H ENABLE_ISP EQU 83H ;系统时钟<12MHz时,对IAP_CONTR寄存器设置此值 RdCommand EQU 0x01 ;读 PrgCommand EQU 0x02 ;编程(写) EraseCommand EQU 0x03 ;擦除 ;********************************************************** ORG 0000H LJMP MAIN ORG 0050H ;********************************************************** MAIN: MOV P0,#0FFH MOV P2,#0FFH MOV DPTR, #2000H ;将EEPROM起始地址送DPTR数据指针 ACALL Sector_Erase MOV DPTR, #2000H ;将EEPROM起始地址送DPTR数据指针 MOV R1,#0FFH MOV A,#00H WR_LOOP: ACALL Byte_Program INC A INC DPTR INC R1 CJNE R1,#0FFH,WR_LOOP RD_LOOP: MOV DPTR, #2000H ;将EEPROM起始地址送DPTR数据指针 MOV R1,#0FFH MOV A,#00H RD_LOOP1: ACALL Byte_Read CPL A MOV P2,A ACALL DELAY INC DPTR INC R1 CJNE R1,#0FFH,RD_LOOP1 MOV P2,#0FFH ACALL DELAY AJMP RD_LOOP RET ;********************************************************** ;读一字节子程序 ;入口:DPTR=字节地址,返回:A=读出字节数据 ;********************************************************** Byte_Read: MOV ISP_ADDRH,DPH ;设置目标单元地址的高8位地址 MOV ISP_ADDRL,DPL ;设置目标单元地址的低8位地址 MOV ISP_CMD,#RdCommand ;设置为IAP/ISP/EEPROM字节读模式命令 MOV ISP_CONTR,#ENABLE_ISP ;打开 ISP 功能, 设置 Flash 操作等待时间 MOV ISP_TRIG,#46H MOV ISP_TRIG,#0B9H ;送完0B9后,ISP命令立即被触发起动 NOP MOV A,ISP_DATA ;读出的数据在ISP_DATA单元中,送入累加器A ACALL ISP_Disable ;关闭 ISP 功能 RET ;********************************************************** ;字节编程子程序 ;入口:DPTR=字节地址, A=须编程字节的数据 ;********************************************************** Byte_Program: MOV ISP_ADDRH,DPH ;设置目标单元地址的高8位地址 MOV ISP_ADDRL,DPL ;设置目标单元地址的低8位地址 MOV ISP_CMD,#PrgCommand ;设置为ISP/EEPROM字节编程模式命令 MOV ISP_DATA, A ;要编程的数据先送进ISP_DATA寄存器 MOV ISP_CONTR,#ENABLE_ISP ;打开ISP功能, 设置Flash操作等待时间 MOV ISP_TRIG, #46H MOV ISP_TRIG, #0B9H ;命令立即被触发起动 NOP ACALL ISP_Disable ;关闭 ISP 功能, 清相关的特殊功能寄存器 RET ;********************************************************** ;擦除扇区子程序 ;入口: DPTR = 扇区地址 ;********************************************************** Sector_Erase: MOV ISP_ADDRH, DPH ;设置目标单元地址的高8位地址 MOV ISP_ADDRL, DPL ;设置目标单元地址的低8位地址 MOV ISP_CMD,#EraseCommand ;设置为ISP/EEPROM扇区擦除模式命令 MOV ISP_CONTR,#ENABLE_ISP ;打开ISP功能, 设置Flash操作等待时间 MOV ISP_TRIG, #46H MOV ISP_TRIG, #0B9H ;ISP命令立即被触发起动 NOP NOP RET ;********************************************************** ; 关闭ISP功能子程序 ;********************************************************** ISP_Disable: MOV ISP_CONTR,#00H ;关闭 ISP 功能 MOV ISP_CMD,#00H ;清命令寄存器 MOV ISP_TRIG,#00H RET ;********************************************************** ; 延时子程序 ;********************************************************** DELAY: MOV R6,#250 DEL1: MOV R7,#230 DEL2: DJNZ R7,DEL2 DJNZ R6,DEL1 RET ;********************************************************** STC90C51RC_RD.H /* After is STC additional SFR */ sfr P4 = 0xe8; sbit P43 = P4^3; sbit P42 = P4^2; sbit P41 = P4^1; sbit P40 = P4^0; sfr XICON = 0xc0; sfr WDT_CONTR = 0xe1; sfr ISP_DATA = 0xe2; sfr ISP_ADDRH = 0xe3; sfr ISP_ADDRL = 0xe4; sfr ISP_CMD = 0xe5; sfr ISP_TRIG = 0xe6; sfr ISP_CONTR = 0xe7; /* Above is STC additional SFR */ /*-------------------------------------------------------------------------- REG51F.H Header file for 8xC31/51, 80C51Fx, 80C51Rx+ Copyright (c) 1988-1999 Keil Elektronik GmbH and Keil Software, Inc. All rights reserved. Modification according to DataSheet from April 1999 - SFR's AUXR and AUXR1 added for 80C51Rx+ derivatives --------------------------------------------------------------------------*/ /* BYTE Registers */ sfr P0 = 0x80; sfr P1 = 0x90; sfr P2 = 0xA0; sfr P3 = 0xB0; sfr PSW = 0xD0; sfr ACC = 0xE0; sfr B = 0xF0; sfr SP = 0x81; sfr DPL = 0x82; sfr DPH = 0x83; sfr PCON = 0x87; sfr TCON = 0x88; sfr TMOD = 0x89; sfr TL0 = 0x8A; sfr TL1 = 0x8B; sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr IE = 0xA8; sfr IP = 0xB8; sfr SCON = 0x98; sfr SBUF = 0x99; /* 80C51Fx/Rx Extensions */ sfr AUXR = 0x8E; sfr AUXR1 = 0xA2; sfr SADDR = 0xA9; sfr IPH = 0xB7; sfr SADEN = 0xB9; sfr T2CON = 0xC8; sfr T2MOD = 0xC9; sfr RCAP2L = 0xCA; sfr RCAP2H = 0xCB; sfr TL2 = 0xCC; sfr TH2 = 0xCD; /* PCA SFR sfr CCON = 0xD8; sfr CMOD = 0xD9; sfr CCAPM0 = 0xDA; sfr CCAPM1 = 0xDB; sfr CCAPM2 = 0xDC; sfr CCAPM3 = 0xDD; sfr CCAPM4 = 0xDE; sfr CL = 0xE9; sfr CCAP0L = 0xEA; sfr CCAP1L = 0xEB; sfr CCAP2L = 0xEC; sfr CCAP3L = 0xED; sfr CCAP4L = 0xEE; sfr CH = 0xF9; sfr CCAP0H = 0xFA; sfr CCAP1H = 0xFB; sfr CCAP2H = 0xFC; sfr CCAP3H = 0xFD; sfr CCAP4H = 0xFE; */ /* BIT Registers */ /* PSW */ sbit CY = PSW^7; sbit AC = PSW^6; sbit F0 = PSW^5; sbit RS1 = PSW^4; sbit RS0 = PSW^3; sbit OV = PSW^2; sbit P = PSW^0; /* TCON */ sbit TF1 = TCON^7; sbit TR1 = TCON^6; sbit TF0 = TCON^5; sbit TR0 = TCON^4; sbit IE1 = TCON^3; sbit IT1 = TCON^2; sbit IE0 = TCON^1; sbit IT0 = TCON^0; /* IE */ sbit EA = IE^7; sbit EC = IE^6; sbit ET2 = IE^5; sbit ES = IE^4; sbit ET1 = IE^3; sbit EX1 = IE^2; sbit ET0 = IE^1; sbit EX0 = IE^0; /* IP */ /* sbit PPC = IP^6;*/ sbit PT2 = IP^5; sbit PS = IP^4; sbit PT1 = IP^3; sbit PX1 = IP^2; sbit PT0 = IP^1; sbit PX0 = IP^0; /* P3 */ sbit RD = P3^7; sbit WR = P3^6; sbit T1 = P3^5; sbit T0 = P3^4; sbit INT1 = P3^3; sbit INT0 = P3^2; sbit TXD = P3^1; sbit RXD = P3^0; /* SCON */ sbit SM0 = SCON^7; // alternatively "FE" sbit FE = SCON^7; sbit SM1 = SCON^6; sbit SM2 = SCON^5; sbit REN = SCON^4; sbit TB8 = SCON^3; sbit RB8 = SCON^2; sbit TI = SCON^1; sbit RI = SCON^0; /* P1 */ /* PCA sbit CEX4 = P1^7; sbit CEX3 = P1^6; sbit CEX2 = P1^5; sbit CEX1 = P1^4; sbit CEX0 = P1^3; sbit ECI = P1^2; */ sbit T2EX = P1^1; sbit T2 = P1^0; /* T2CON */ sbit TF2 = T2CON^7; sbit EXF2 = T2CON^6; sbit RCLK = T2CON^5; sbit TCLK = T2CON^4; sbit EXEN2 = T2CON^3; sbit TR2 = T2CON^2; sbit C_T2 = T2CON^1; sbit CP_RL2= T2CON^0; /* CCON */ /* PCA sbit CF = CCON^7; sbit CR = CCON^6; sbit CCF4 = CCON^4; sbit CCF3 = CCON^3; sbit CCF2 = CCON^2; sbit CCF1 = CCON^1; sbit CCF0 = CCON^0; */ 好吧,就这些应该是足够的了。找个机会把这个测试一下。一共就没有多少的参数,不要存储的七零八落的。在片内总要好于片外的。而且,注意把片外的ram也最好干掉。由于有片外的并口io,要有auxr的更改。 eprom xram eeprom STC90C52RC: 8K 512B 5K STC90C54RD+: 16K 1280B 45K 内部的xram使用dptr,auxr=0 外部的io使用r1,r0,auxr=2 如果原设计把并口通讯去掉的话,使用io就可以了。 | |