#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
sbit SCL=P3^4; //定义串行时钟线
sbit SDA=P3^5; //定义串行应答线
void delay(int ms)
{
while(ms--);
}
void init_24C02() //初始化24C02
{
SCL=1;
_nop_(); //延时一个机器周期
SDA=1;
_nop_();
}
void start()
{
SDA=1;
_nop_();
SCL=1;
_nop_();
SDA=0; //当时钟线为高电平时数据线拉低,AT24C02开始工作
_nop_();
SCL=0; //时钟线清零便于后续操作
_nop_();
}
void stop() //停止信号
{
SDA=0;
_nop_();
SCL=1;
_nop_();
SDA=1; //当时钟线为高电平时,数据线拉高AT24C02停止
_nop_();
}
void Write_Byte_24C02(uchar date) //写一个字节的数据
{
uchar i;
for(i=0;i<8;i++) //传送八位数据
{
date=date<<1; //每次传送一位
SCL=0;
_nop_();
SDA=CY;
_nop_();
SCL=1;
_nop_();
//左移一位,将发送的最高位舍弃
}
SCL=0;
_nop_();
SDA=1;
_nop_(); //等待AT24C02的应答信号
}
uchar Read_Byte_24C02() //读取一个字节数据
{
uchar i,j,result;
SCL=0;
_nop_();
SDA=1;
for(i=0;i<8;i++) //每次读取一位
{
_nop_();
SCL=1;
_nop_();
if(SDA==1) //读出高电平
j=1;
else //读出低电平
j=0;
result=(result<<1)|j; //将读出来的数值放在最低位
SCL=0;
}
_nop_();
return result; //返回读出来的数值
}
void clock() //等待AT24C02的应答
{
uchar i=0;
SCL=1;
_nop_();
while((SDA==1)&&(i<255)) //等待拉低做出应答(如果不应答则在一定时间之后跳出,避免程序死在此处)
i++;
SCL=0;
_nop_();
}
uchar Read_24C02(uchar address)
{
uchar ReadData;
start();
Write_Byte_24C02(0xa0); //写入写数据的命令
clock();
Write_Byte_24C02(address); //写入地址
clock();
start(); //将数据线和时钟线拉低
Write_Byte_24C02(0xa1); //写入读数据命令
clock();
ReadData=Read_Byte_24C02();
stop();
delay(50);
return ReadData;
}
void Write_24C02(uchar address,uchar date) //在指定地址处写入数据
{
start(); //开始AT24C02
Write_Byte_24C02(0xa0); //写入写数据的命令
clock();
Write_Byte_24C02(address); //写入地址
clock();
Write_Byte_24C02(date); //写入读数据的命令
clock();
stop(); //停止24C02
delay(50);
}
void main()
{
uchar i;
init_24C02();
Write_24C02(0x00,0x00); //将数据0写到AT24C02的0x00地址上面
delay(500);
i=Read_24C02(0);
while(1);
}
file:///C:UserssamsungAppDataRoamingTencentUsers549816749QQWinTempRichOle6`5G)`KGJ~SHV%%7UUF3SY0.jpg
file:///C:UserssamsungAppDataRoamingTencentUsers549816749QQWinTempRichOle6`5G)`KGJ~SHV%%7UUF3SY0.jpg
-
一周热门 更多>