开发板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