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

📄 at93c46_16.c

📁 C51写的EEPROM at93c46的源程序
💻 C
字号:
//注意:该程序考虑的是16位数据的情况。
//通过DATASHEET发现,AT93C46的读操作每次只能读、写一个字节或者字。
#include"reg51.h"
#include"intrins.h"
#define uchar unsigned char
#define uint  unsigned int
sbit cs_93c46=P3^6;  		//高电平有效
sbit ck_93c46=P3^7;	//上升沿数据输入、输出
sbit di_93c46=P3^4;
sbit do_93c46=P3^5;
uchar code READ_93C46=0x06;
uchar code EWEN_93C46=0x04;
uchar code ERAL_93C46=0x04;
uchar code WRITE_93C46=0x05;
void wr_addr_93c46(uchar addr);
//uchar rd_byte_93c46(uchar addr);
void wr_code_93c46(uchar op_code);
uint rd_93c46(void);
void ewen(void);
void erase_all(void);
void wr_93c46(uint dat);
void delay_1ms(void);
void delay_nms(uint n);

uint buf_word[2]={0,0};


void main(void)
{
	uchar i;
	cs_93c46=1;  //向AT93C46输入起始位和操作码110
	di_93c46=0;
	do_93c46=0;
	_nop_();
	
	
	//ewen();
	/********************************
	cs_93c46=1;
	wr_code_93c46(WRITE_93C46);
	wr_addr_93c46(0x00);
	wr_93c46(0xaaaa);
	cs_93c46=0;
	delay_nms(10);  //注意:对AT93C46的写操作,写完所有的数据之后,片选清零,且持续至少10ms
	********************************************************************************************/
	
	//erase_all();
	
	
	
	//-----------------------------
	i=0;
	while(i<2)
	{
		cs_93c46=1;
		wr_code_93c46(READ_93C46);
		wr_addr_93c46(i);
		buf_word[i]=rd_93c46();
		cs_93c46=0;//取消片选
		i++;
	}
	
	//ewen();
	//erase_all();
	//cs_93c46=0;
	_nop_();
}
/**********************
//以下是子函数体
void delay_4us(void)
{
	_nop_();
	_nop_();
	_nop_();
	_nop_();
}
************************/

void wr_code_93c46(uchar op_code)
{
	uchar i=3;
	op_code<<=5;
	while(i>0)
	{
		ck_93c46=0;
		if((op_code&0x80)==0)
			di_93c46=0;
		else
			di_93c46=1;
		ck_93c46=1;
		op_code<<=1;
		i--;
	}	
}

//功能:向AT93C46写入任意存储字节的6位地址
void wr_addr_93c46(uchar addr)
{
	uchar i=6;
	addr<<=2;
	while(i>0)
	{
		ck_93c46=0;
		if((addr&0x80)==0)
			di_93c46=0;
		else
			di_93c46=1;
		ck_93c46=1;
		addr<<=1;
		i--;
	}	
}
//功能:从AT93C46读出一个字16位的数据,仅仅是读操作。
uint rd_93c46(void)
{
	uint temp=0;
	uchar i=16;
	while(i>0)
	{
		ck_93c46=0;
		temp<<=1;
		ck_93c46=1;
		_nop_();
		if(do_93c46==1)
			temp|=0x0001;
		i--;
	}
	return(temp);
}

//功能:从AT93C46读出一个字节的数据,包含了之前的写入起始位、操作码和地址。
/***********************************
uchar rd_byte_93c46(uchar addr)
{
	//下面三段程序完成写入起始位和操作码
	uchar i;
	uchar temp;
	cs_93c46=1;  //向AT93C46输入起始位和操作码110
	ck_93c46=0;
	di_93c46=0;
	do_93c46=0;
	_nop_();
	di_93c46=1;
	ck_93c46=1;
	_nop_();
	ck_93c46=0;
	di_93c46=1;
	ck_93c46=1;
	_nop_();
	ck_93c46=0;
	di_93c46=0;
	ck_93c46=1;
	_nop_();
	addr<<=1;
	i=7;
	while(i>0)
	{
		ck_93c46=0;
		if((addr&0x80)==0)
			di_93c46=0;
		else
			di_93c46=1;
		ck_93c46=1;
		_nop_();
		addr<<=1;
		i--;
	}	
	i=8;
	temp=0;
	while(i>0)
	{
		ck_93c46=0;
		temp<<=1;
		ck_93c46=1;
		_nop_();
		if(do_93c46==1)
			temp|=0x01;
		i--;
	}
	ck_93c46=0;
	_nop_();
	cs_93c46=0;
	return(temp);
}
***********************/
/*****************************************
原型:void wr_93c46(uchar dat)
行参:uchar dat
返回值:无
功能:向AT93c46写入一个字16位的数据,纯粹的写操作。
********************************************/

void wr_93c46(uint dat)
{
	uchar i=16;
	while(i>0)
	{
		ck_93c46=0;
		if((dat&0x8000)==0)
			di_93c46=0;
		else
			di_93c46=1;
		ck_93c46=1;
		dat<<=1;
		i--;
	}	
}

/*****************************************
原型:void erase_all(void)
行参:无
返回值:无
功能:擦除AT93C46的所有内容
********************************************/

void erase_all(void)
{
	cs_93c46=1;
	di_93c46=0;
	do_93c46=0;
	_nop_();
	wr_code_93c46(ERAL_93C46);
	wr_addr_93c46(0x20);
	cs_93c46=0;
}

/*****************************************
原型:void ewen(void)
行参:无
返回值:无
功能:向AT93C46写入擦写命令,使之可以写入新的内容	
注意:该函数包含了完整的开始和结束条件			
********************************************/
void ewen(void)
{
	cs_93c46=1;
	di_93c46=0;
	do_93c46=0;
	_nop_();
	wr_code_93c46(EWEN_93C46);
	wr_addr_93c46(0x30);
	cs_93c46=0;
}
/************************************************************
原型:void delay_1ms(void)
行参:无
返回值:无
功能:延时大约1ms
************************************************************/

void delay_1ms(void)
{
	  uchar i;
    for(i=125;i>0;i--);
}
/******************************
原型:void delay_nms(uint n)
行参:uint n
返回值:无
功能:延时n ms
*****************************/
void delay_nms(uint n)
{
	uchar i;
	for(;n>0;n--)
	{
		for(i=125;i>0;i--)
		{
			;
		}
	}
}

⌨️ 快捷键说明

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