📄 at24c02.txt
字号:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define WRITE 0xA0 //器件地址和写命令
#define READ 0xA1 //器件地址和读命令
uchar code dis_code[8] = {0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e,0xff};
void delayms(int ms);
sbit SCL = P3^3 ;
sbit SDA = P3^4 ;
void I_Init(void);
void I_Start(void);
void I_Stop(void);
bit I_Clock(void);
bit I_Send(uchar I_Data);
uchar I_Receive(void);
void I_Ack(void);
//初始化函数
void I_Init(void)
{
SCL=0;
I_Stop();
}
//启动函数
void I_Start(void)
{
SDA = 1;
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
SDA = 0;
_nop_();
_nop_();
SCL = 0;
}
//停止函数
void I_Stop(void)
{
SDA = 0;
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
SDA = 1;
_nop_();
_nop_();
SCL = 0;
}
//时钟函数,读取时钟为高电平时总线上的data
bit I_Clock(void)
{
bit sample;
SCL = 1;
_nop_();
_nop_();
sample = SDA;
_nop_();
_nop_();
SCL = 0;
return (sample);
}
//CPU发送数据函数
bit I_Send(uchar I_Data)
{
uchar i;
for(i=0;i<8;i++)
{
SDA = (bit)(I_Data & 0x80);
I_Data <<= 1;
I_Clock();
}
SDA = 1;
return (~I_Clock());
}
//CPU接收数据函数
uchar I_Receive(void)
{
uchar I_Data = 0;
uchar i;
for(i=0;i<8;i++)
{
I_Data <<= 1;
I_Data |= (uchar)I_Clock();
}
return I_Data;
}
//应答函数
void I_Ack(void)
{
SDA = 0;
I_Clock();
SDA = 1;
}
//延时子程序
void delayms(int ms)
{
uchar j;
while(ms--)
for(j=0;j<125;j++)
;
}
main()
{
uchar i,j;
i=0;
I_Init(); //初始化
for(j=0;j<8;j++) //写数据到24c02的地址0--地址7中
{
I_Start();
if( I_Send(WRITE) ) //写器件地址
{
if( I_Send(j) ) //写片内指定地址
{
I_Send(dis_code[i++]); //写数据
delayms(5); //写完一字节数据后要延时5秒钟
}
else
{
I_Stop();
P0=0x00;
}
}
else
{
I_Stop();
P0=0x00;
}
I_Stop();}
delayms(20);
while(1) //循环读取24C02地址0--地址7中的数据,并讲数据传送至P0口
{
for(j=0;j<8;j++)
{I_Start();
if( I_Send(WRITE) ) //写器件地址
if(I_Send(j)) //写存储地址
{
I_Start(); //重新启动
if( I_Send(READ) ) //写读命令
{
P0 = I_Receive(); //读数据到P0口
delayms(1000);
if(j!=7)
I_Ack();
else
{
I_Clock();
I_Stop();
}
}
}
else
{
I_Stop();
P0=0x00;
}
else
{
I_Stop();
P0=0x00;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -