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

📄 at93c46.c

📁 93c46的驱动程序,C51代码
💻 C
字号:
/**********************************************
*工程名称:eeprom AT93C46 读写
*工作模式:8位字节模式(ORG=GND),IO口模拟时序,mega16使用内部 8Mhz RC
*作    者:朱海峰
*邮    箱:ntzhf@163.com       QQ:543376422
*创建日期:2007.10.26
*修改日期:2007.10.30
************************************************/

#include <iom16v.h>
#include <macros.h>

#define uint8_t	   unsigned char
#define uint16_t   unsigned int
#define nop		   NOP()

//op code
#define READ	   0X80		   //只包括前3个控制BIT--下同
#define EWEN	   0X00
#define ERASE	   0Xc0
#define WRITE	   0X40
#define ERAL	   0X00
#define WRAL	   0X00
#define EWDS	   0X00

#define DI		   5
#define DO		   6
#define CS		   4
#define SK		   7
#define ORG		   0	 	   //0=接地(8位模式);1=接VCC(16位模式)
#define DDR_DI	   DDRB
#define DDR_DO	   DDRB
#define DDR_CS	   DDRB
#define DDR_SK	   DDRB

#define PORT_DI	   PORTB
#define PORT_DO	   PORTB
#define PORT_CS	   PORTB
#define PORT_SK	   PORTB

#define PIN_DI	   PINB
#define PIN_DO	   PINB
#define PIN_CS	   PINB
#define PIN_SK	   PINB

#define set_di()   PORT_DI |= (1<<DI)
#define clr_di()   PORT_DI &= ~(1<<DI)
#define set_cs()   PORT_CS |= (1<<CS)
#define clr_cs()   PORT_CS &= ~(1<<CS)
#define set_sk()   PORT_SK |= (1<<SK)
#define clr_sk()   PORT_SK &= ~(1<<SK)


#define buzzer_on()    DDRD |= (1<<2);PORTD |= (1<<2)
#define buzzer_off()   DDRD |= (1<<2);PORTD &= ~(1<<2)

#define Green_off()	   DDRB |= (1<<0);PORTB |= (1<<0)
#define Green_on()	   DDRB |= (1<<0);PORTB &= ~(1<<0)
#define Red_off()	   DDRB |= (1<<1);PORTB |= (1<<1)
#define Red_on()	   DDRB |= (1<<1);PORTB &= ~(1<<1)

uint8_t Read(uint8_t add);
void EW_enable(void);
void EW_disable(void);
void Erase(uint8_t add);
void Erase_all(void);
void Write(uint8_t add,uint8_t w_data);
void IO_init(void);
void Delay_ms(uint16_t ms);
void Send_str_op(uint8_t op);
void Send_bits(uint8_t s_data);
void delay_us(void);
/*********************************************/
void main(void)
{
 	uint8_t temp_1 = 0x00;
	nop;
	IO_init();
	while (2)
	{
	 	EW_enable(); 	  //读写使能
		//Erase(0x03);
		Write(0x01,0x28); //在地址为0X01的EEPROM中写入数据0x28
		nop;
		nop;
		//EW_disable();
		//Delay_ms(100);
		//EW_enable();
		temp_1 = Read(0x01); //读取地址为0X01的EEPROM中的数据
		nop;
		nop;
		EW_disable();
		if (temp_1 == 0x28)  //校验读取的数据是写入的
		{
		   	Green_on();		 //校验正确,绿色LED亮
			Red_off();
		}
		else
		{
		 	Green_off();	 //校验不正确,红色LED亮
			Red_on();
		}
		for(;;)
		nop;
	}
}
/*********************************************/
void IO_init(void)
{
 	 DDR_DI |= (1<<DI);
	 PORT_DI &= ~(1<<DI);
	 DDR_CS |= (1<<CS);
	 PORT_CS &= ~(1<<CS);
	 DDR_SK |= (1<<SK);
	 PORT_SK &= ~(1<<SK);
}
/*********************************************/
void delay_us(void)
{
 	 nop;
	 nop;
	 nop;
	 nop;
}
/*********************************************/
/*********************************************
函数功能:发送起始位和操作码 
描    述:一个BIT的起始位+两个BIT的操作码
入口参数:OP
出口参数:无
*********************************************/
void Send_str_op(uint8_t op)
{
 	uint8_t i;
//===========start bit=================//
	set_di();
	delay_us();
	set_sk();
	delay_us();
	clr_sk();
	delay_us();
//===========send op code================//
	for (i=0;i<2;i++,op <<=1)
	{
	 	if (op & 0x80)
	 	{
	  	   	set_di();
	 	}
	 	else
	 	{
	  	 	clr_di();
	 	}
	 	delay_us();
	 	set_sk();
	 	delay_us();
	 	clr_sk();
		delay_us();
		clr_di();
	}
}
/*********************************************
函数功能:发送7个BIT 
描    述:地址或其他
入口参数:s_data
出口参数:无
*********************************************/
void Send_bits(uint8_t s_data)
{
 	 uint8_t i,temp_data = 0;
	 for (i=0;i<7;i++,s_data <<=1)
	 {
	  	temp_data = s_data;
		if (temp_data & 0x40)	  //   xxxx'xxxx
	 	{  			  			  //  &0100'0000
	  	   	set_di();
	 	}
	 	else
	 	{
	  	 	clr_di();
	 	}
	 	delay_us();
	 	set_sk();
	 	delay_us();
	 	clr_sk();
		delay_us();
		clr_di();
	 }
}
/*********************************************
函数功能:从指定地址读出一个字节的数据 
描    述:从已add为地址的eeprom中读数据
入口参数:add
出口参数:read_data
*********************************************/
uint8_t Read(uint8_t add)
{
 	uint8_t	i,buffer = 0,read_data = 0;
	set_cs();
	delay_us();
	Send_str_op(READ);
	Send_bits(add);
	for (i=0;i<8;i++)
	{
		set_sk();
		delay_us();
		buffer |= (PIN_DO & 0X40);   	 //读取引脚电平
		buffer >>= DO;
		read_data <<=1;
		read_data |= buffer;
		delay_us();
		clr_sk();
	}
	delay_us();
	clr_cs();
	return read_data;
}
/*********************************************
函数功能:延时函数 
描    述:延时
入口参数:ms
出口参数:void
*********************************************/
void Delay_ms(uint16_t ms)
{
 	uint8_t i;
	for (;ms>0;ms--)
		for(i = 0;i<100;i++)
		;
}
/*********************************************
函数功能:读写禁止 
描    述:禁止读写功能
入口参数:void
出口参数:void
*********************************************/
void EW_disable(void)
{
	set_cs();
	delay_us();
	Send_str_op(EWDS);
	Send_bits(0x00);
	delay_us();
	clr_cs();
}
/*********************************************
函数功能:读写使能
描    述:使能读写功能
入口参数:void
出口参数:void
*********************************************/
void EW_enable(void)
{
	set_cs();
	delay_us();
	Send_str_op(EWEN);
	Send_bits(0x60);
	delay_us();
	clr_cs();
}
/*********************************************
函数功能:擦出指定地址的内容 
描    述:将指定地址的内容全部擦除
入口参数:add
出口参数:void
*********************************************/
void Erase(uint8_t add)
{
 	clr_cs();
	clr_sk();
	set_cs();
	delay_us();
	Send_str_op(ERASE);
	Send_bits(add);
	delay_us();
	clr_cs();
	delay_us();
	delay_us();
	set_cs();
	while (!(PIN_DO & (1<<DO)));	//check busy
	delay_us();
	clr_cs();
}
/*********************************************
函数功能:在指定的地址写一个字节的数据 
描    述:将一个字节的数据写入指定地址
入口参数:add,w_data
出口参数:void
*********************************************/
void Write(uint8_t add,uint8_t w_data)
{
 	uint8_t	i;
	set_cs();
	delay_us();
	Send_str_op(WRITE);
	Send_bits(add);
	for (i=0;i<8;i++,w_data <<=1)
	{
		delay_us();
		if (w_data & 0x80)
		{
			set_di();
		}
		else
		{
			clr_di();
		}
		delay_us();
		set_sk();
		delay_us();
		clr_sk();
		delay_us();
		clr_di();
	}
	delay_us();
	clr_cs();
	delay_us();
	delay_us();
	set_cs();
	while (!(PIN_DO & (1<<DO)));	//check busy
	delay_us();
	clr_cs();

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

⌨️ 快捷键说明

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