# include<reg52.h>
# define uchar unsigned char
# define uint unsigned int
sbit sda=P2^0;
sbit scl=P2^1;
sbit lsa=P2^2;
sbit lsb=P2^3;
sbit lsc=P2^4;
uint code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0到F
uint disp[3];
void delay(uchar t);
void delay_1(uchar x);
void at24c02_start();
void at24c02_stop();
void at24c02_ack();
void at24c02_init();
void at24c02_write_onebyte(uchar byte);
uchar at24c02_read_onebyte();
void byte_write(uchar slave_add,
uchar byte_add,
uchar write_add);
uchar random_read(uchar slave_add,
uchar byte_add);
void datepros(uchar w);
void display();
uchar k,n;
int main()
{
at24c02_init();
while(1)
{
random_read(0xa0,0);
k++;
if(k==50) //延时一段时间
{
k=0;
n++;
}
if(n==250)
{
n=0;
}
datepros(n); //数字处理
display(); //数码管显示
byte_write(0xa0,0,n);//字节写函数
delay(1);
}
}
/***************************************************************
1、 IIC延时函数
***************************************************************/
void delay(uchar t)
{
uchar x,y;
for(x=t;x>0;x--)
{
for(y=10;y>0;y--)
{}
}
}
/***************************************************************
数码管延时函数
***************************************************************/
void delay_1(uchar x)
{
uchar m,n;
for(n=x;n>0;n--)
{
for(m=120;m>0;m--)
{}
}
}
/***************************************************************
2、 起始函数
***************************************************************/
void at24c02_start()
{
scl=1;
delay(1);
sda=1;
delay(1);
sda=0; //SDA下降沿
delay(1);
}
/***************************************************************
3、停止函数
***************************************************************/
void at24c02_stop()
{
scl=1;
delay(1);
sda=0;
delay(1);
sda=1;//SDA上升沿
delay(1);
}
/***************************************************************
4、应答函数
***************************************************************/
void at24c02_ack()
{
uchar i;
scl=1;
delay(1);
while((sda==1)&&(i<250))//判断是否响应
{
i++;
}
scl=0;
delay(1);
}
/***************************************************************
5、初始化函数
***************************************************************/
void at24c02_init()
{
sda=1;
scl=1;
}
/***************************************************************
6、向at24c02里写入一个字节的函数
***************************************************************/
void at24c02_write_onebyte(uchar byte)
{
uchar i,temp;
temp=byte;
scl=0;
delay(1);
for(i=0;i<8;i++) //一位一位的写入字节
{
temp=temp<<1; //左移
sda=CY; //最高位移动到CY里面 再赋值给sda
delay(1);
scl=1; //scl变化时 sda才允许变化
delay(1);
scl=0;
delay(1);
}
sda=1; //释放sda
delay(1);
}
/***************************************************************
7、从at24c02读取一个字节的函数
***************************************************************/
uchar at24c02_read_onebyte()
{
uchar i,dat=0;
scl=0;
delay(1);
sda=1;
delay(1);
for(i=0;i<8;i++)
{
scl=1;
delay(1);
dat<<=1;
dat|=sda;
delay(1);
scl=0;
delay(1);
}
return dat;
}
/***************************************************************
8、定义一个字节写函数
***************************************************************/
void byte_write(uchar slave_add,
uchar byte_add,
uchar write_add)
{
at24c02_start();
at24c02_write_onebyte(slave_add);
at24c02_ack();
at24c02_write_onebyte(byte_add);
at24c02_ack();
at24c02_write_onebyte(write_add);
at24c02_stop();
}
/***************************************************************
9、选择地址函数
***************************************************************/
uchar random_read(uchar slave_add,
uchar byte_add)
{
uchar num;
at24c02_start();
at24c02_write_onebyte(slave_add);
at24c02_ack();
at24c02_write_onebyte(byte_add);
at24c02_ack();
at24c02_start();
at24c02_write_onebyte(slave_add+0x01);
at24c02_ack();
num = at24c02_read_onebyte();
return num;
at24c02_stop();
}
/***************************************************************
10、处理函数 分离出百 十 个 位
***************************************************************/
void datepros(uchar w)
{
uchar baiwei,shiwei,gewei;
baiwei=w/100;
shiwei=w%100/10;
gewei=w%10;
disp[0]=smgduan[baiwei];
disp[1]=smgduan[shiwei];
disp[2]=smgduan[gewei];
}
/***************************************************************
11、显示函数
***************************************************************/
void display()
{
uchar i;
for(i=0;i<3;i++)
{
switch(i)
{
case(0):lsa=0;lsb=0;lsc=0;break;
case(1):lsa=1;lsb=0;lsc=0;break;
case(2):lsa=0;lsb=1;lsc=0;break;
}
P0=disp[i];
delay_1(10);
P0=0x00;//消隐
}
}
EEPROM_IIC
最新推荐文章于 2024-06-23 15:21:39 发布