两个CA51F003单片机之间的IIC通讯完整代码
时间: 2024-05-16 19:16:52 浏览: 155
关于IIC通信的代码
以下是两个CA51F003单片机之间的IIC通讯完整代码,其中一个作为主机,另一个作为从机。
主机代码:
```
#include <REG52.H>
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define SDA P2_0
#define SCL P2_1
sbit SDA = P2^0;
sbit SCL = P2^1;
void delay(uint i)
{
while (i--);
}
void iicStart()
{
SDA = 1;
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0;
}
void iicStop()
{
SDA = 0;
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 1;
}
void iicAck()
{
SDA = 0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0;
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 1;
}
void iicSendByte(uchar dat)
{
uchar i;
for (i = 0; i < 8; i++)
{
SDA = dat & 0x80;
dat <<= 1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0;
}
iicAck();
}
uchar iicReadByte()
{
uchar i, dat = 0;
SDA = 1;
for (i = 0; i < 8; i++)
{
dat <<= 1;
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
dat |= SDA;
SCL = 0;
}
return dat;
}
void iicSend(uchar addr, uchar dat)
{
iicStart();
iicSendByte(addr);
iicSendByte(dat);
iicStop();
}
uchar iicRead(uchar addr)
{
uchar dat;
iicStart();
iicSendByte(addr);
SDA = 1;
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
dat = SDA;
SCL = 0;
iicStop();
return dat;
}
void main()
{
uchar dat = 0x55;
iicSend(0xA0, dat);
delay(1000);
dat = iicRead(0xA0);
while (1);
}
```
从机代码:
```
#include <REG52.H>
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define SDA P2_0
#define SCL P2_1
sbit SDA = P2^0;
sbit SCL = P2^1;
void delay(uint i)
{
while (i--);
}
void iicStart()
{
SDA = 1;
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0;
}
void iicStop()
{
SDA = 0;
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 1;
}
void iicAck()
{
SDA = 0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0;
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 1;
}
void iicSendByte(uchar dat)
{
uchar i;
for (i = 0; i < 8; i++)
{
SDA = dat & 0x80;
dat <<= 1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0;
}
iicAck();
}
uchar iicReadByte()
{
uchar i, dat = 0;
SDA = 1;
for (i = 0; i < 8; i++)
{
dat <<= 1;
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
dat |= SDA;
SCL = 0;
}
return dat;
}
void iicSlave()
{
uchar addr, dat;
while (1)
{
SDA = 1;
while (SDA);
SCL = 1;
addr = iicReadByte();
if (addr == 0xA0)
{
dat = iicReadByte();
P1 = dat;
}
else
{
iicStop();
}
SCL = 0;
}
}
void main()
{
iicSlave();
}
```
注意事项:
1. 两个单片机的硬件连线需要正确。
2. 主机与从机的IIC地址需要一致,这里的地址为0xA0。
3. 主机发送完数据后需要等待一段时间,以便从机接收并处理数据。
阅读全文