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

📄 eeprom_24c02.c

📁 一些51单片机基础模块的程序
💻 C
字号:
/********************************************************************
* 文件名  : EEPROM_24C02.c
* 描述    :  该文件实现对24C02的操作。
		     确认试验是否成功:电源上电后,数码管的值在递增,观察值。关闭电源,待几秒后上电,
		     数码管显示的值会从断电钱的那个值开始显示。
* 创建人  : 东流,2009年4月9日
* 版本号  : 2.0
* 技术支持论坛:www.zidh.com/bbs(请进入“赞助商板块”中的“东流电子工作室”)
* 感谢“中国自动化资讯网”对本工作室的大力支持。
***********************************************************************/
#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int

sbit scl=P3^6;  //24c08 SCL
sbit sda=P3^7;  //24c08 SDA

uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09}; 
uchar sec;      //定义计数值,每过1秒,sec加1 
uint write;		//写标志位

/********************************************************************
* 名称 : delay1()
* 功能 : 短暂延时
* 输入 : x
* 输出 : 无
***********************************************************************/
void delay1(uchar x)
{  
	uint i;
	for(i=0; i<x; i++)
	;
}

/********************************************************************
* 名称 : flash()
* 功能 : 延时,时间为2个NOP,大概为2US
* 输入 : 无
* 输出 : 无
***********************************************************************/
void flash(void) 
{
	_nop_();
	_nop_();
}

/********************************************************************
* 名称 : x24c02_init()
* 功能 : 24c02初始化子程序
* 输入 : 无
* 输出 : 无
***********************************************************************/
void x24c02_init(void) 
{
	scl = 1;
	flash();
	sda = 1;
	flash();
}

/********************************************************************
* 名称 : start(void)
* 功能 : 启动I2C总线
* 输入 : 无
* 输出 : 无
***********************************************************************/
void start(void)
{
	sda = 1;
	flash(); 
	scl = 1; 
	flash(); 
	sda = 0; 
	flash(); 
	scl = 0; 
	flash();
}

/********************************************************************
* 名称 : stop()
* 功能 : 停止I2C总线
* 输入 : 无
* 输出 : 无
***********************************************************************/
void stop() 
{
	sda = 0; 
	flash();
	scl = 1;
	flash();
	sda = 1;
	flash();
}

/********************************************************************
* 名称 : writex()
* 功能 : 写一个字节
* 输入 : j(需要写入的值)
* 输出 : 无
***********************************************************************/
void writex(uchar j)
{  
	uchar i,temp;
	temp = j;
	for(i=0; i<8; i++)
	{
		temp = temp << 1; 
		scl = 0; 
		flash(); 
		sda = CY; 
		flash();
		scl = 1; 
		flash();
	}
	scl = 0;
	flash(); 
	sda = 1;
	flash();
}

/********************************************************************
* 名称 : readx()
* 功能 : 读一个字节
* 输入 : 无
* 输出 : 读出的值
***********************************************************************/
uchar readx(void)
{
	uchar i, j, k = 0;
	scl = 0;
	flash();
	sda = 1;
	for(i=0; i<8; i++)
	{  
		flash();
		scl = 1;
		flash();
		if(sda == 1)
		{
			j = 1;
		}
		else j = 0;
		k = (k << 1) | j; 
		scl = 0;
	}
	flash(); 
	return(k);
}

/********************************************************************
* 名称 : clock()
* 功能 : I2C总线时钟
* 输入 : 无
* 输出 : 无
***********************************************************************/
void clock(void)
{
	uchar i = 0;
	scl = 1;
	flash();
	while((sda == 1) && (i < 255)) 
	{
		i++;
	}
	scl = 0;
	flash();
}

/********************************************************************
* 名称 : x24c02_read()
* 功能 : 从24c02中读出值
* 输入 : address(要在这个地址读取值)
* 输出 : 从24c02中读出的值
***********************************************************************/
uchar x24c02_read(uchar address)
{
	uchar i;
	start();
	writex(0xa0);
	clock();
	writex(address);
	clock();
	start();
	writex(0xa1);
	clock();
	i = readx();
	stop();
	delay1(10);
	return(i);
}

/********************************************************************
* 名称 : x24c02_write()
* 功能 : 想24c02中写入数据
* 输入 : address(地址) , info(值)
* 输出 : 无
***********************************************************************/
void x24c02_write(uchar address, uchar info)
{
	EA = 0;
	start();
	writex(0xa0);
	clock();
	writex(address);
	clock();
	writex(info);
	clock();
	stop();
	EA = 1;
	delay1(50);
}

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

/********************************************************************
* 名称 : LED()
* 功能 : 显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void LED()                  //LED显示函数
{
	P2 = 0x02; 
	P0 = table[sec / 10]; 
	Delay_1ms(5);
	P2 = 0x01;
	P0 = table[sec % 10];
	Delay_1ms(5);
}

/********************************************************************
* 名称 : time0()
* 功能 : 定时中断函数,每秒中sec加一,并且写标识write使能
* 输入 : del
* 输出 : 无
***********************************************************************/
void time0(void) interrupt 1 using 3  //定时中断服务函数
{
	static uchar Count = 0; 
	TH0 = (65536 - 50000) / 256; //对TH0 TL0赋值
	TL0 = (65536 - 50000) % 256; //重装计数初值
	Count++;        //每过250ust tcnt加一
	if(Count == 20)  //计满20次(1秒)时
	{ 
		Count = 0;   //重新再计
		sec++;
		write = 1;  //1秒写一次24C08
		if(sec == 100) //定时100秒,在从零开始计时
		{
			sec = 0;
		} 
	} 
}

/********************************************************************
* 名称 : Time0_Init()
* 功能 : 定时器0的初始化
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Time0_Init(void)
{
	TMOD = 0x01;  			//定时器工作在方式1
	ET0 = 1;
	EA = 1; 
	TH0 = (65536 - 50000) / 256; 	//对TH0 TL0赋值
	TL0 = (65536 - 50000) % 256; 	//使定时器0.05秒中断一次
	TR0 = 1;           				//开始计时
}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void) 
{
	P2 = 0x00; 
	x24c02_init();        	//初始化24C02
	Time0_Init();
	sec = x24c02_read(2);	//读出保存的数据赋于sec
	while(1) 
	{
 		LED();
		if(write == 1) 				//判断计时器是否计时一秒
    	{
			write =0 ;              //清零 
			x24c02_write(2,sec);  	//在24c08的地址2中写入数据sec
		}
	}
}

⌨️ 快捷键说明

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