您的位置 首页 嵌入式

AT89S52单片机模仿I2C总线协议读写AT24C04

I2C总线是2条线总线.数据线SDA,时钟线SCL.结构简单.AT24C04是具有I2C总线接口的EEPROM.大小为512*8bit.单片机AT89S52本身不具有I2C…

I2C总线是2条线总线.数据线SDA,时钟线SCL.结构简略.

AT24C04是具有I2C总线接口的EEPROM.巨细为512*8bit.单片机AT89S52自身不具有I2C总线结口,所以可编写程序用并行端口模仿I2C总线协议读写AT24C04.

多个设备通讯的要点(1.电平的差异,如串口通讯中PC与单片机通讯,PC机串口电平值为+12V~-12V,单片机为TTL电平0V~+5V.,所以要用电平转化芯片转电平.2,通讯协议.(串口通讯协议))

详细的协议内容与数据格式可查材料.

代码如下:

#include

#define WriteDeviceAddress 0xa0
#define ReadDeviceAddress 0xa1

sbit SCL = P3^4;
sbit SDA = P3^5;
sbit DOG = P0^0;
sbit PP = P0^1;
sbit DOG1 = P0^7;

void DelayMs(unsigned int number)
{
unsigned char tmp;
for(;number!=0;number–,DOG1=!DOG1)
{
for(tmp=112;tmp!=0;tmp–)
{
}
}
}

void Start()
{
SDA = 1;
DelayMs(1);
SCL = 1;
DelayMs(1);
SDA = 0;
DelayMs(1);
SCL = 0;
DelayMs(1);
}

bit Write8bit(unsigned char input)
{
unsigned char tmp;
for(tmp =8;tmp!=0;tmp–)
{
SDA = (bit)(input&0x80);
DelayMs(1);
SCL = 1;
DelayMs(1);
SCL = 0;
DelayMs(1);
input = input << 1;
}
return 1;
}

bit TestAck()
{
bit ErrorBit;
SDA = 1;
DelayMs(1);
SCL = 1;
DelayMs(1);
ErrorBit = SDA;
DelayMs(1);
SCL = 0;
DelayMs(1);
return(ErrorBit);
}

void Stop()
{
SCL = 0;
DelayMs(1);
SDA = 0;
DelayMs(1);
SCL = 1;
DelayMs(1);
SDA = 1;
DelayMs(1);
}

void WriteI2C(unsigned char *Wdata, unsigned char RomAddress, unsigned char number)
{
Start();
Write8bit(WriteDeviceAddress);
TestAck();
Write8bit(RomAddress);
TestAck();
for(;number!=0;number–)
{
Write8bit(*Wdata);
TestAck();
Wdata++;
}
Stop();
DelayMs(1);
}

unsigned char Read8Bit()
{
unsigned char tmp,rbyte = 0;
for(tmp=8;tmp!=0;tmp–)
{
SCL = 1;
DelayMs(1);
rbyte = rbyte << 1;
DelayMs(1);
rbyte = rbyte|((unsigned char)(SDA));
SCL = 0;
DelayMs(1);
}
return(rbyte);
}

void Ack()
{
SDA = 0;
DelayMs(1);
SCL = 1;
DelayMs(1);
SCL = 0 ;
DelayMs(1);
SDA = 1;
DelayMs(1);
}

void NoAck()
{
SDA = 1;
DelayMs(1);
SCL = 1;
DelayMs(1);
SCL = 0 ;
DelayMs(1);
}
void ReadI2C(unsigned char* RamAddress,unsigned char RomAddress,unsigned char bytes)
{
Start();
Write8bit(WriteDeviceAddress);
TestAck();
Write8bit(RomAddress);
TestAck();
Start();
Write8bit(ReadDeviceAddress);
TestAck();
while(bytes != 1)
{
*RamAddress = Read8Bit();
Ack();
RamAddress++;
bytes–;
}
*RamAddress = Read8Bit();
NoAck();
Stop();
}

void main()
{
unsigned char writeByte[8] = {0xC0,0X34,0X12,0X22,0X11,0X01,0X00,0X00};

unsigned char readByte[8];

unsigned char *addw;
unsigned char *addr;

unsigned char i;
unsigned char ok = 0;

bit write = 1;
DOG = 1;

while(1)
{
if(write == 1)
{
addw = writeByte;
addr = readByte;
WriteI2C(addw,0x00,8);
ReadI2C(addr,0x00,8);
for(i=0;i<8;i++)
{
if(writeByte[i] == readByte[i])
{
ok++;
}
}
if(ok == 8)
{
DOG = 0; //相同P0.0亮

}
else
{
PP = 0; //不相同P0.1亮
}
write = 0;
}
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/266662.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部