//EEPROM.H文件部分
/******************** (C) 小雪工作室 ********************
* File Name : EEPROM.H
* Author : WYSDHL2005
* Version : V1.0.0
* Date : 12/21/2010
* Description : 该程序针对STC(宏晶)公司带EEPROM的51单片机而编写的单片机内部EEPROM
* 读写,扇区擦写的测试程序
********************************************************************************/
#ifndef __EEPROM_H__
#define __EEPROM_H__
#include<includes.h>
void EEPROM_Byte_Program(uchar,uchar,uchar);//EEPROM字节写程序
void EEPROM_Sector_Program(uchar,uchar); //EEPROM 扇区擦写程序
uchar EEPROM_Byte_Read(uchar,uchar); //EEPROM字节读程序
#endif
//EEPROM.C文件部分
/******************** (C) 小雪工作室 ********************
* File Name : EEPROM.C
* Author : WYSDHL2005
* Version : V1.0.0
* Date : 12/21/2010
* Description : 该程序针对STC(宏晶)公司带EEPROM的51单片机而编写的单片机内部EEPROM
* 读写,扇区擦写的测试程序
********************************************************************************/
#include<EEPROM.H>
sfr ISP_DATA=0xe2;//ISP/IAP操作寄存器-----------------------------------------
sfr ISP_ADDRH=0xe3;//ISP/IAP操作地址寄存器高位-----------------------------------------
sfr ISP_ADDRL=0xe4;//ISP/IAP操作地址寄存器低位-----------------------------------------
sfr ISP_CMD=0xe5;//ISP/IAP操作命令寄存器-----------------------------------------
sfr ISP_TRIG=0xe6;//ISP/IAP操作命令触发寄存器-----------------------------------------
sfr ISP_CONTRL=0xe7;//ISP/IAP操作控制寄存器-----------------------------------------
// |bit7 |bit6 |bit5 |bit4 |bit3 |bit2 |bit1 |bit0 |
// |ISPEN |SWBS |SWRST |-*- |-*- |WT2- |WT1- |WT0- |
#define ISP_BYTE_READ 1 //字节读
#define ISP_BYTE_PROGRAM 2 //字节写
#define ISP_SECTOR_ERASE 3 //扇区擦除
#define WAIT_TIME_40 0 //等待时间 40MHz以下是0;20MHz以下是1;10MHz以下是2;5MHz以下是3
#define WAIT_TIME_20 1 //等待时间 40MHz以下是0;20MHz以下是1;10MHz以下是2;5MHz以下是3
#define WAIT_TIME_10 2 //等待时间 40MHz以下是0;20MHz以下是1;10MHz以下是2;5MHz以下是3
#define WAIT_TIME_5 3 //等待时间 40MHz以下是0;20MHz以下是1;10MHz以下是2;5MHz以下是3
#define ISPEN 0X80
#define SWBS 0X40
#define SWRST 0X20
/*************************************************************************
** 函数名称: void EEPROM_Byte_Program(uchar str,uchar address_h,uchar address_l)
** 功能描述: EEPROM 字节写,如果写入地址的数据不是空(0xff),需要先经行扇区擦除
** 输 入: str 输入数据,address_h 写入地址高位,address_l 写入数据低位
** 输出 : 无
** 全局变量: 无
** 调用模块:
** 说明:
** 注意: 如果写入地址数据不为空(0xff),需要先经行扇区擦除
**************************************************************************/
void EEPROM_Byte_Program(uchar str,uchar address_h,uchar address_l)
{
ISP_DATA=str; //送入写入数据
ISP_ADDRH=address_h; //送入写入地址高位
ISP_ADDRL=address_l; //送入写入地址低位
EA=0; //希望在写入EEPROM过程中不允许外部中断
ISP_CONTRL=(WAIT_TIME_40|ISPEN);//使能ISP,同时设置等待时间
ISP_CMD=ISP_BYTE_PROGRAM; //写入字节写命令
ISP_TRIG=0X46; //先写0X46 ,然后写0xb9到ISP触发寄存器
ISP_TRIG=0XB9;
_nop_();
ISP_CONTRL=0X00; //禁止ISP操作
ISP_CMD =0X00; //去除ISP命令
ISP_TRIG=0X00; //防止ISP命令误触发
ISP_ADDRH=0X00; //让地址指向非EEPROM区,防止意外
ISP_ADDRL=0X00;
EA=1; //使能全局中断
}
/*************************************************************************
** 函数名称: void EEPROM_Sector_Program(uchar address_h,uchar address_l)
** 功能描述: EEPROM 扇区擦除,如果写入地址的数据不是空(0xff),需要先经行扇区擦除
** 输 入: address_h 擦除扇区起始地址高位,address_l 擦除扇区起始低位
** 输出 : 无
** 全局变量: 无
** 调用模块:
** 说明:
** 注意: 如果写入地址数据不为空(0xff),需要先经行扇区擦除
**************************************************************************/
void EEPROM_Sector_Program(uchar address_h,uchar address_l)
{
ISP_ADDRH=address_h; //送入擦除起始地址高位
ISP_ADDRL=address_l; //送入擦除起始地址低位
EA=0; //希望在写入EEPROM过程中不允许外部中断
ISP_CONTRL=(WAIT_TIME_40|ISPEN);//使能ISP,同时设置等待时间
ISP_CMD=ISP_SECTOR_ERASE; //写入擦除扇区命令
ISP_TRIG=0X46;
ISP_TRIG=0XB9;
_nop_();
ISP_CONTRL=0X00; //禁止ISP操作
ISP_CMD =0X00; //去除ISP命令
ISP_TRIG=0X00; //防止ISP命令误触发
ISP_ADDRH=0X00; //让地址指向非EEPROM区,防止意外
ISP_ADDRL=0X00;
EA=1; //使能全局中断
}
/*************************************************************************
** 函数名称: uchar EEPROM_Byte_Read(uchar address_h,uchar address_l)
** 功能描述: 读取EEPROM制定位置的数据
** 输 入: address_h 读取数据地址高位,address_l 读取数据低位
** 输出 : 读取位置的数据
** 全局变量: 无
** 调用模块:
** 说明:
** 注意:
**************************************************************************/
uchar EEPROM_Byte_Read(uchar address_h,uchar address_l)
{
uchar str;
ISP_DATA=0X00;
ISP_ADDRH=address_h;
ISP_ADDRL=address_l;
EA=0;
ISP_CONTRL=WAIT_TIME_40|ISPEN;
ISP_CMD=ISP_BYTE_READ;
ISP_TRIG=0X46;
ISP_TRIG=0XB9;
_nop_();
ISP_CONTRL=0X00;
ISP_CMD =0X00;
ISP_TRIG=0X00;
ISP_ADDRH=0X00;
ISP_ADDRL=0X00;
EA=1;
str=ISP_DATA;
return str;
}
- 1
- 2
前往页