0
点赞
收藏
分享

微信扫一扫

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


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

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

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

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

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

主函数:

#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

 

举报

相关推荐

0 条评论