两个单片机iic通讯程序_怎样从零学单片机?
时间: 2023-12-14 11:03:23 浏览: 64
学习单片机的过程中,IIC通讯是一个非常重要的知识点,也是很多应用场景中必备的通信方式之一。下面是一个基于两个单片机的IIC通讯程序示例,希望能帮到你。
首先,我们需要了解IIC通讯的原理。IIC通讯是一种串行通信协议,它只需要两根线来完成数据传输,即SDA(数据线)和SCL(时钟线)。其中,SDA线用于传输数据,SCL线用于同步时序。在IIC通讯中,每个设备都有一个唯一的地址,可以通过这个地址来进行通讯。
接下来,我们可以开始编写IIC通讯程序了。以下是两个单片机之间的IIC通讯程序:
主机程序:
```
#include <reg52.h>
sbit SCL = P1^0; // 定义 SCL 时钟线
sbit SDA = P1^1; // 定义 SDA 数据线
unsigned char SlaveAddr = 0x50; // 从机地址
// 延时函数
void Delay()
{
unsigned char i = 200;
while (i--);
}
// 发送 IIC 起始信号
void IIC_Start()
{
SDA = 1;
SCL = 1;
Delay();
SDA = 0;
Delay();
SCL = 0;
}
// 发送 IIC 停止信号
void IIC_Stop()
{
SDA = 0;
SCL = 1;
Delay();
SDA = 1;
Delay();
}
// 发送一个字节的数据
void IIC_SendByte(unsigned char dat)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
SDA = dat & 0x80;
SCL = 1;
Delay();
SCL = 0;
dat <<= 1;
}
}
// 接收一个字节的数据
unsigned char IIC_RecvByte()
{
unsigned char i, dat = 0;
SDA = 1;
for (i = 0; i < 8; i++)
{
dat <<= 1;
SCL = 1;
Delay();
dat |= SDA;
SCL = 0;
}
return dat;
}
// 发送 IIC 地址
void IIC_SendAddr(unsigned char addr, unsigned char dir)
{
IIC_SendByte((addr << 1) | dir);
}
// 初始化 IIC 总线
void IIC_Init()
{
SDA = 1;
SCL = 1;
}
// 主函数
void main()
{
unsigned char data;
IIC_Init(); // 初始化 IIC 总线
IIC_Start(); // 发送起始信号
IIC_SendAddr(SlaveAddr, 0); // 发送从机地址和写入标志
IIC_SendByte(0x00); // 发送要读取的寄存器地址
IIC_Stop(); // 发送停止信号
Delay(); // 延时一段时间
IIC_Start(); // 发送起始信号
IIC_SendAddr(SlaveAddr, 1); // 发送从机地址和读取标志
data = IIC_RecvByte(); // 接收数据
IIC_Stop(); // 发送停止信号
}
```
从机程序:
```
#include <reg52.h>
sbit SCL = P1^0; // 定义 SCL 时钟线
sbit SDA = P1^1; // 定义 SDA 数据线
unsigned char SlaveAddr = 0x50; // 从机地址
// 延时函数
void Delay()
{
unsigned char i = 200;
while (i--);
}
// 发送 IIC 起始信号
void IIC_Start()
{
SDA = 1;
SCL = 1;
Delay();
SDA = 0;
Delay();
SCL = 0;
}
// 发送 IIC 停止信号
void IIC_Stop()
{
SDA = 0;
SCL = 1;
Delay();
SDA = 1;
Delay();
}
// 发送一个字节的数据
void IIC_SendByte(unsigned char dat)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
SDA = dat & 0x80;
SCL = 1;
Delay();
SCL = 0;
dat <<= 1;
}
}
// 接收一个字节的数据
unsigned char IIC_RecvByte()
{
unsigned char i, dat = 0;
SDA = 1;
for (i = 0; i < 8; i++)
{
dat <<= 1;
SCL = 1;
Delay();
dat |= SDA;
SCL = 0;
}
return dat;
}
// 发送 IIC 地址
void IIC_SendAddr(unsigned char addr, unsigned char dir)
{
IIC_SendByte((addr << 1) | dir);
}
// 初始化 IIC 总线
void IIC_Init()
{
SDA = 1;
SCL = 1;
}
// 主函数
void main()
{
unsigned char data;
IIC_Init(); // 初始化 IIC 总线
while (1)
{
IIC_Start(); // 发送起始信号
IIC_SendAddr(SlaveAddr, 1); // 发送从机地址和读取标志
data = IIC_RecvByte(); // 接收数据
IIC_Stop(); // 发送停止信号
IIC_Start(); // 发送起始信号
IIC_SendAddr(SlaveAddr, 0); // 发送从机地址和写入标志
IIC_SendByte(data + 1); // 发送要写入的数据
IIC_Stop(); // 发送停止信号
}
}
```
在以上程序中,我们首先定义了两个单片机的SDA和SCL引脚,以及从机的地址。然后,我们分别编写了主机和从机的IIC通讯程序。主机程序通过发送起始信号、发送地址和写入标志、发送要读取的寄存器地址、发送停止信号等步骤来完成一次IIC通讯。从机程序则通过不断接收主机发送的数据,并将其加1后再发送回去的方式来完成一次IIC通讯。
以上是一个简单的IIC通讯程序示例,希望能帮到你。在学习单片机的过程中,需要不断积累经验和实践,才能更好地掌握单片机的知识。
阅读全文