STC89C52RC内部EEPROM的读写

来源:互联网 发布:it运维软件 编辑:程序博客网 时间:2024/04/30 03:09

转自:http://cooldianzi.blog.163.com/blog/static/67111538200812464653659/


花了一两天的时间熟悉了下STC89C52RC内部EEPROM的读写,并且不断的改进能够通过串口来显示EEPROM地址空间的数据。我是用C语言编写的,把STC89C52RC内部EEPROM的读写编写成为了一个头文件“STC89C51RC_EEPROM.h”方便以后的应用。

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

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

/*实现功能:EPROM地址的读写,数据从串口中显示出来 08.2.14  **/
#include <reg52.h>              //调用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;i<count;i++)
 for(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 <intrins.h>
/*******************************************************/

/*****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

0 0
原创粉丝点击