stc89c52EEPROM读写

  • 格式:txt
  • 大小:6.30 KB
  • 文档页数:5

STC89C52RC内部EEPROM的读写

2008-02-24 18:46:53| 分类: 默认分类 |举报|字号 订阅
这个寒假学的东西不是很多,但是花了一两天的时间熟悉了下STC89C52RC内部EEPROM的读写,并且不断的改进能够通过串口来显示EEPROM地址空间的数据。我是用C语言编写的,把STC89C52RC内部EEPROM的读写编写成为了一个头文件“STC89C51RC_EEPROM.h”方便以后的应用。

具体电路我不上传了,很简单,就STC89C52RC+个串口通信,晶振选用的是11.0592M。以下是我编写的源程序,方便实用。与大家分享!

/**************************************************************************************/
/*模块名 :STC89C52RC 的EEPROM测试 **/
/*创建人 :郑 文(ClimberWin) **/
/*功能描述:读写内部的EEPROM 并且通过串口发送读出来的数据 **/
/*创建日期:2008-2-14 **/
/*版本 :V1.0 **/
/********************************************************************/

/*实现功能:EPROM地址的读写,数据从串口中显示出来 08.2.14 **/
#include //调用52头文件
#include "STC89C51RC_EEPROM.h" //调用STC89C51RC的EEPROM读写头文件

/*********串口初始化**************/
void init_rs232()
{
SCON=0x50;
PCON=0x00;
TH1=0xF4; //单片机晶振:11.0592M 波特率2400
TL1=0XF4;
TMOD=0X20;
TR1=1;
}
/***********************************/

/*********毫秒延时程序**************/
void Delay1ms(unsigned int count)
{
unsigned int i,j;
for(i=0;ifor(j=0;j<120;j++);
}
/***********************************/


/*******************主程序************************/
void main (void)
{

unsigned char temp;
Delay1ms(10); //开机延时
STC89CXX_EEPROM_Erase(0x20); //擦除整个扇区

STC89CXX_EEPROM_Char_Write(0x20,0x00,0x00); //指定EEPROM地址写数据
STC89CXX_EEPROM_Char_Write(0x20,0x01,0x11);
STC89CXX_EEPROM_Char_Write(0x20,0x02,0x22);
STC89CXX_EEPROM_Char_Write(0x20,0x03,0x33);
STC89CXX_EEPROM_Char_Write(0x20,0x04,0x44);
STC89CXX_EEPROM_Char_Write(0x20,0x05,0x55);
STC89CXX_EEPROM_Char_Write(0x20,0x06,0x66);

Delay1ms(100); //延时

while(1)
{
init_rs232(); //串口初始化

temp=STC89CXX_EEPROM_Char_Read(0x20,0x00);
SBUF=temp; //串口发送EEPROM的数据
Delay1ms(1000);

temp=STC89CXX_EEPROM_Char_Read(0x20,0x01);
SBUF=temp; //串口发送EEPROM的数据
Delay1ms(1000);


temp=STC89CXX_EEPROM_Char_Read(0x20,0x02);
SBUF=temp; //串口发送EEPROM的数据
Delay1ms(1000);
}

}

/**************************

***********************************/
/*****File Function : STC89C51RC_EEPROM Read and Write *****/
/*****Program Author : ZhengWen(ClimberWin) *****/
/*****Compile Date : 2008/2/14 *****/
/*****Edition Info : V1.0 *****/
/*****Amend Date : *****/
/*************************************************************/
#ifndef __STC89C51RC_EEPROM_CLIMBERWIN__
#define __STC89C51RC_EEPROM_CLIMBERWIN__
#define uchar unsigned char
#define uint unsigned int
#include
/*******************************************************/

/*****STC89C51RC特殊功能寄存器定义********/
sfr isp_wdt = 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;
/*****************************************/

/***************STC89CXX_EEPROM扇区擦除程序*************************/
void STC89CXX_EEPROM_Erase(unsigned char t_addr)
{
isp_addrh = t_addr; //可以不要 扇区里任意一个字节的地址都是扇区地址,无需求首地址,单片机会自己处理
isp_addrl = 0;
EA = 0; //关中断
isp_contr = 0x81;
isp_cmd = 3; //扇区擦除,要某字节为空,必须擦除1个扇区
isp_trig = 0x46; //先送0x46再送 0xb9 ISP/IAP 触发寄存器,每次都需要如此
isp_trig = 0xb9; //送完0xb9后 ISP/IAP 立即被触发启动
_nop_();
_nop_();
isp_contr = 0;
isp_cmd = 0;
isp_trig = 0;
isp_addrh = 0;
isp_addrl = 0;
EA = 1; // 开中断
}
/***********************************************/


/***************STC89CXX_EEPROM字节写程序*************************/
void STC89CXX_EEPROM_Char_Write(unsigned char Write_addr_h,unsigned char Write_addr_l ,unsigned char Write_data)
{

isp_data = Write_data;
isp_addrh = Write_addr_h; //送地址高位
isp_addrl = Write_addr_l; //地址低位
EA = 0; /* 关中断 */
isp_contr = 0x81;
isp_cmd = 2; //送扇区命令
isp_trig = 0x46;
isp_trig = 0xb9;
_nop_();
_nop_();
isp_contr = 0;
isp_cmd = 0;
isp_trig = 0;
isp_addrh = 0;
isp_addrl = 0;
EA = 1; /* 开中断 */

}
/**************************************************************/

/***************STC89CXX_EEPROM字节读程序*************************/
STC89CXX_EEPROM_Char_Read(unsigned char Read_addr_h,unsigned char Read_addr_l)
{

unsigned char Read_isp_data;

isp_addrh = Read_addr_h; //送地址高字节
isp_addrl = Read_addr_l; //送地址低字节(从0开始到num-1为止)
EA = 0;

/* 关中断 */
isp_contr = 0x81; /*20M,是0x80 orl 1 */
isp_cmd = 1; // 1表示字节读
isp_trig = 0x46; //先送0x46再送 0xb9 ISP/IAP 触发寄存器,每次都需要如此
isp_trig = 0xb9; //送完0xb9后 ISP/IAP 立即被触发启动
_nop_(); //空指令
_nop_(); //空指令
isp_contr = 0; //禁止ISP/IAP 操作
isp_cmd = 0; //去除ISP/IAP 命令
isp_trig = 0; //防止 ISP/IAP 命令误触发
isp_addrh = 0; //地址指向非EEPROM地址区,防止误操作
isp_addrl = 0;
EA = 1; /* 开中断 */
Read_isp_data=isp_data;
return(Read_isp_data);

}
/**************************************************************/

/*******************************************************************************/

#endif

下载文档原格式

  / 5
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。