51单片机实验12:EEPROM(IIC总线) 应用

开发板EEPROM模块电路图如下:

目的:实现单片机与开发板AT24C02芯片通信。

实验现象:下载程序后数码管后4位显示0,按K1保存显示的数据,按K2读取上次保存的数据,按K3显示数据加一,按K4显示数据清零。最大能写入的数据是255。

开发板独立按键的使用及原理图参考:https://blog.csdn.net/cax1165/article/details/86566884

开发板数码管的使用及原理图参考:https://blog.csdn.net/cax1165/article/details/86557551

EEPROM(IIC总线) 以及AT24C02工作原理参考:https://blog.csdn.net/cax1165/article/details/86755169 

EEPROM(IIC总线)驱动程序参考:https://blog.csdn.net/cax1165/article/details/86755412

使用多文件工程的方式编程:

主函数:

#include<reg52.h>
#include<i2c.h>
#define uc unsigned char
#define ui unsigned int

sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

uc code x[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uc disp[4];
char num=0;

void delay(uc x)
{
	uc i,j;
	for(i=1;i<=x;i++)
		for(j=1;j<=110;j++);
}

void keypros()
{
	if(k1==0)
	{
		delay(10);
		if(k1==0)
		{
			At24c02Write(1,num);
		}
		while(!k1);
	}
	if(k2==0)
	{
		delay(10);
		if(k2==0)
		{
			num=At24c02Read(1);
		}
		while(!k2);
	}
	if(k3==0)
	{
		delay(10);
		if(k3==0)
		{
			num++;
			if(num>255) num=0;
		}
		while(!k3);
	}
	if(k4==0)
	{
		delay(10);
		if(k4==0)
		{
			num=0;
		}
		while(!k4);
	}
}

void datapros()
{
	disp[0]=x[num/1000];
	disp[1]=x[num%1000/100];
	disp[2]=x[num%1000%100/10];
	disp[3]=x[num%1000%100%10];
}

void digdisplay()
{
	uc i;
	for(i=1;i<=4;i++)
	{
		switch(i)
		{
			case(1):
			LSA=0;LSB=0;LSC=0; break;
			case(2):
			LSA=1;LSB=0;LSC=0; break;
			case(3):
			LSA=0;LSB=1;LSC=0; break;
			case(4):
			LSA=1;LSB=1;LSC=0; break;
		}
		P0=disp[4-i];
		delay(1);
		P0=0x00;
	}
}
void main()
{
	while(1)
	{
		keypros();
		datapros();
		digdisplay();
	}
}

I2C总线驱动程序:

#include<i2c.h>
void Delay6us()
{
	unsigned char a,b;
	for(b=1;b>0;b--)
		for(a=2;a>0;a--);

}
void I2cStart()
{
	SDA=1;
	Delay6us();
	SCL=1;
	Delay6us();
	SDA=0;
	Delay6us();
	SCL=0;
	Delay6us();
}
void I2cStop()
{
	SDA=0;
	Delay6us();
	SCL=1;
	Delay6us();
	SDA=1;
	Delay6us();
}
unsigned char I2cSendbyte(unsigned char dat)
{
	unsigned char i=0,j=0;
	for(i=1;i<=8;i++)
	{
		SDA=dat>>7;
		dat<<=1;
		Delay6us();
		SCL=1;
		Delay6us();
		SCL=0;
		Delay6us();
	}
	SDA=1;
	Delay6us();
	SCL=1;
	Delay6us();
	while(SDA)
	{
		j++;
		if(j>200)
		{
			SCL=0;
			Delay6us();
			return 0;
		}
	}
	SCL=0;
	Delay6us();
	return 1;
}
unsigned char I2cReadbyte()
{
	unsigned char i,dat=0;
	SDA=1;
	Delay6us();
	for(i=1;i<=8;i++)
	{
		SCL=1;
		Delay6us();
		dat<<=1;
		dat|=SDA;
		Delay6us();
		SCL=0;
		Delay6us();
	}
	return dat;
}
void At24c02Write(unsigned char addr,unsigned char dat)
{
	I2cStart();
	I2cSendbyte(0xa0);
	I2cSendbyte(addr);
	I2cSendbyte(dat);
	I2cStop();
}
unsigned char At24c02Read(unsigned char addr)
{
	unsigned char num;
	I2cStart();
	I2cSendbyte(0xa0);
	I2cSendbyte(addr);
	I2cStart();
	I2cSendbyte(0xa1);
	num=I2cReadbyte();
	I2cStop();
	return num;
}

I2C驱动程序头文件:

#ifndef _I2C_H_
#define _I2C_H_

#include<reg52.h>

sbit SCL=P2^1;
sbit SDA=P2^0;

void I2cStart();
void I2cStop();
unsigned char I2cSendbyte(unsigned char dat);
unsigned char I2cReadbyte();
void At24c02Write(unsigned char addr,unsigned char dat);
unsigned char At24c02Read(unsigned char addr);

#endif 

 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值