⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 宏晶eeprom.c

📁 一些51单片机基础模块的程序
💻 C
字号:
/********************************************************************
* 文件名  : 宏晶EEPROM.c
* 描述    :  该程序实现了对STC单片机的EEPROM的操作。每隔0.5秒钟,单片机对EEPROM进行一次
			 读、擦除和写操作,并把数值显示到数码管上。
			 确认试验是否成功:电源上电后,数码管的值在递增,观察值。关闭电源,待几秒后上电,
			 数码管显示的值会从断电钱的那个值开始显示。
* 创建人  : 东流,2009年4月9日
* 版本号  : 2.0
* 技术支持论坛:www.zidh.com/bbs(请进入“赞助商板块”中的“东流电子工作室”)
* 感谢“中国自动化资讯网”对本工作室的大力支持。
***********************************************************************/
#include<reg52.h>
#include<intrins.h>
/*以下是配置STC单片机的寄存器*/
/*相关资料在STC89C51RC的PDF的第35页开始*/
sfr ISP_DATA  = 0xE2;
sfr ISP_ADDRH = 0xE3;
sfr ISP_ADDRL = 0xE4;
sfr ISP_CMD   = 0xE5;
sfr ISP_TRIG  = 0xE6;
sfr ISP_CONTR = 0xE7;

#define uint  unsigned int
#define uchar unsigned char

#define ISP_BYTE_READ    1		//ISP字节读
#define ISP_BYTE_PROGRAM 2		//ISP直接编程
#define ISP_SECTOR_ERASE 3		//ISP扇区擦除

uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};

/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)
{
	uchar x,j;
	for(j=0;j<i;j++)
	for(x=0;x<=148;x++);	
}

/********************************************************************
* 名称 : ISP_ERASE()
* 功能 : EEPROM的扇区擦除
* 输入 : Address(擦除扇区的地址)
* 输出 : 无
***********************************************************************/
void ISP_ERASE(Address)
{
	ISP_ADDRL = Address;
	ISP_ADDRH = Address >> 8;
	ISP_CONTR = 0x81;				
	ISP_CMD = ISP_SECTOR_ERASE;	
	ISP_TRIG = 0x46;	//PDF手册中说先像 ISP_TRIG 中写入 0x46, 然后写入 0xb9
	ISP_TRIG = 0xb9;
	_nop_();
	_nop_();	
}

/********************************************************************
* 名称 : ISP_READ()
* 功能 : 从EEPROM相应的地址中读出值
* 输入 : Address(想要读取EEPROM的地址)
* 输出 : Read_Data(从EEPROM读出的值)
*********************************************************************/
uint ISP_READ(Address)
{
	uchar Read_Data;
	ISP_ADDRL = Address;
	ISP_ADDRH = Address >> 8;
	EA = 0;	
	ISP_CONTR = 0x81;
	ISP_CMD = ISP_BYTE_READ;
	ISP_TRIG = 0x46;
	ISP_TRIG = 0xb9;
	_nop_();
	_nop_();
	Read_Data = ISP_DATA;
	return Read_Data;	
}

/********************************************************************
* 名称 : ISP_PROGRAM()
* 功能 : 实现EEPROM的字节编程
* 输入 : Address为编程的地址,Data_temp为想要编程的值
* 输出 : 无
***********************************************************************/
void ISP_PROGRAM(Address, Data_temp)
{
	ISP_DATA = Data_temp;
	ISP_ADDRL = Address;
	ISP_ADDRH = Address >> 8;
	ISP_CONTR = 0x81;
	ISP_CMD = ISP_BYTE_PROGRAM;
	ISP_TRIG = 0x46;
	ISP_TRIG = 0xb9;
	_nop_();
	_nop_(); 	
}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
	uint i;
	uchar LED_Buffer = 0; 	
	while(1)
	{
		for(i=0; i<50; i++)
		{		
			LED_Buffer = ISP_READ(0x2c00);
			P0 = table[LED_Buffer % 10];
			P2 = 0x01;
			Delay_1ms(6);
			P0 = table[LED_Buffer / 10 % 10];
			P2 = 0x02;
			Delay_1ms(6);
		}
		LED_Buffer++;
		ISP_ERASE(0x2c00);		//注意:字节编程时必须要先要擦除整个扇区	
		ISP_PROGRAM(0x2c00, LED_Buffer);		
	} 					
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -