51单片机利用IIC实现多机通信代码
时间: 2023-10-26 07:17:46 浏览: 49
以下是一个简单的基于51单片机利用IIC实现多机通信的代码示例:
```c
#include <reg52.h>
#define SLAVE_ADDR 0x10 // 从机地址
sbit SDA = P2^0; // IIC 数据线
sbit SCL = P2^1; // IIC 时钟线
void iic_delay() // IIC 延时函数
{
unsigned char i = 10;
while (i--);
}
void iic_start() // IIC 启动信号
{
SDA = 1;
iic_delay();
SCL = 1;
iic_delay();
SDA = 0;
iic_delay();
SCL = 0;
iic_delay();
}
void iic_stop() // IIC 停止信号
{
SDA = 0;
iic_delay();
SCL = 1;
iic_delay();
SDA = 1;
iic_delay();
}
unsigned char iic_send_byte(unsigned char byte) // IIC 发送一个字节
{
unsigned char i, ack;
for (i = 0; i < 8; i++)
{
SDA = (byte & 0x80) ? 1 : 0;
byte <<= 1;
iic_delay();
SCL = 1;
iic_delay();
SCL = 0;
}
SDA = 1;
iic_delay();
SCL = 1;
iic_delay();
ack = SDA;
SCL = 0;
return ack;
}
unsigned char iic_receive_byte() // IIC 接收一个字节
{
unsigned char i, byte;
SDA = 1;
byte = 0;
for (i = 0; i < 8; i++)
{
byte <<= 1;
iic_delay();
SCL = 1;
iic_delay();
byte |= SDA;
SCL = 0;
}
return byte;
}
void iic_send_data(unsigned char addr, unsigned char *data, unsigned char len) // IIC 发送数据
{
unsigned char i;
iic_start();
iic_send_byte(addr << 1);
for (i = 0; i < len; i++)
{
iic_send_byte(data[i]);
}
iic_stop();
}
void iic_receive_data(unsigned char addr, unsigned char *data, unsigned char len) // IIC 接收数据
{
unsigned char i;
iic_start();
iic_send_byte((addr << 1) | 0x01);
for (i = 0; i < len; i++)
{
data[i] = iic_receive_byte();
}
iic_stop();
}
void main()
{
unsigned char data[] = "Hello, World!";
unsigned char buf[16];
iic_send_data(SLAVE_ADDR, data, sizeof(data));
iic_receive_data(SLAVE_ADDR, buf, sizeof(buf));
while (1);
}
```
其中,`iic_start` 和 `iic_stop` 分别用于发送 IIC 启动信号和停止信号,`iic_send_byte` 和 `iic_receive_byte` 分别用于发送一个字节和接收一个字节,`iic_send_data` 和 `iic_receive_data` 分别用于发送数据和接收数据。在主函数中,先发送数据到从机,然后从从机接收数据并存储在缓冲区中,最后进入死循环。