两个单片机iic通讯程序_怎样从零学单片机?
时间: 2023-09-25 22:06:39 浏览: 177
### 回答1:
IIC通讯是一种常用的数字通信协议,用于在单片机之间或单片机与外围设备之间进行通讯。下面是一个简单的两个单片机IIC通讯程序的示例:
主控单片机代码:
```c
#include <reg51.h>
#define SDA P2_1
#define SCL P2_0
void delay_us(unsigned int us)
{
while(us--);
}
void IIC_Start()
{
SDA = 1;
SCL = 1;
delay_us(4);
SDA = 0;
delay_us(4);
SCL = 0;
}
void IIC_Stop()
{
SDA = 0;
SCL = 1;
delay_us(4);
SDA = 1;
delay_us(4);
}
void IIC_SendByte(unsigned char dat)
{
unsigned char i;
for(i=0; i<8; i++)
{
SDA = (dat & 0x80) >> 7;
dat <<= 1;
SCL = 1;
delay_us(4);
SCL = 0;
delay_us(4);
}
SDA = 1;
SCL = 1;
delay_us(4);
SCL = 0;
delay_us(4);
}
unsigned char IIC_ReceiveByte()
{
unsigned char i, dat = 0;
SDA = 1;
for(i=0; i<8; i++)
{
SCL = 1;
delay_us(4);
dat = (dat << 1) | SDA;
SCL = 0;
delay_us(4);
}
return dat;
}
void IIC_SendAck(bit ack)
{
SDA = ack;
SCL = 1;
delay_us(4);
SCL = 0;
delay_us(4);
}
bit IIC_ReceiveAck()
{
bit ack;
SCL = 1;
delay_us(4);
ack = SDA;
SCL = 0;
delay_us(4);
return ack;
}
void main()
{
unsigned char dat;
IIC_Start();
IIC_SendByte(0xA0);
IIC_ReceiveAck();
IIC_SendByte(0x00);
IIC_ReceiveAck();
IIC_Stop();
delay_ms(10);
IIC_Start();
IIC_SendByte(0xA1);
IIC_ReceiveAck();
dat = IIC_ReceiveByte();
IIC_SendAck(1);
IIC_Stop();
while(1);
}
```
从控单片机代码:
```c
#include <reg51.h>
#define SDA P2_1
#define SCL P2_0
void delay_us(unsigned int us)
{
while(us--);
}
void IIC_Start()
{
SDA = 1;
SCL = 1;
delay_us(4);
SDA = 0;
delay_us(4);
SCL = 0;
}
void IIC_Stop()
{
SDA = 0;
SCL = 1;
delay_us(4);
SDA = 1;
delay_us(4);
}
void IIC_SendByte(unsigned char dat)
{
unsigned char i;
for(i=0; i<8; i++)
{
SDA = (dat & 0x80) >> 7;
dat <<= 1;
SCL = 1;
delay_us(4);
SCL = 0;
delay_us(4);
}
SDA = 1;
SCL = 1;
delay_us(4);
SCL = 0;
delay_us(4);
}
unsigned char IIC_ReceiveByte()
{
unsigned char i, dat = 0;
SDA = 1;
for(i=0; i<8; i++)
{
SCL = 1;
delay_us(4);
dat = (dat << 1) | SDA;
SCL = 0;
delay_us(4);
}
return dat;
}
void IIC_SendAck(bit ack)
{
SDA = ack;
SCL = 1;
delay_us(4);
SCL = 0;
delay_us(4);
}
bit IIC_ReceiveAck()
{
bit ack;
SCL = 1;
delay_us(4);
ack = SDA;
SCL = 0;
delay_us(4);
return ack;
}
void main()
{
unsigned char dat = 0x55;
IIC_Start();
IIC_SendByte(0xA0);
IIC_ReceiveAck();
IIC_SendByte(0x00);
IIC_ReceiveAck();
IIC_SendByte(dat);
IIC_ReceiveAck();
IIC_Stop();
while(1);
}
```
这里的主控单片机向从控单片机发送一个字节,并且从从控单片机接收一个字节。程序中的函数和宏定义都是通用的,可以用于其他的IIC通讯。
### 回答2:
学习单片机需要掌握一定的电子基础知识和编程能力。具体来说,从零学习单片机包括以下几个步骤:
1. 学习电子基础知识:了解基本的电路知识,掌握电子元器件的基本原理和使用方法。
2. 学习编程知识:单片机的程序通常使用C语言或汇编语言编写,学习这两种语言,熟悉编程基本概念和语法。
3. 选择单片机型号:根据需求选择适合的单片机型号。常见的单片机有Arduino、STM32等,选择一个适合自己的型号。
4. 学习单片机原理:了解单片机的工作原理、寄存器、时钟等重要概念。可以通过参考书籍、网络教程等途径进行学习。
5. 学习编写程序:通过各种学习资源,学习如何编写单片机程序。可以从简单的LED控制开始,逐渐扩展到更复杂的功能。
6. 实践项目:通过实践项目来巩固所学知识。可以选择一些简单的实验或小项目,逐渐增加难度和复杂度。
关于两个单片机之间的IIC通信程序,可以按照以下步骤进行:
1. 配置IIC总线:根据所选单片机的手册,配置IIC总线的参数和初始化寄存器。
2. 主从模式选择:确定通信中主从设备的角色,并相应配置各自的模式。
3. 发送数据:主设备将要发送的数据写入发送缓冲区,通过IIC总线发送给从设备。
4. 接收数据:从设备接收到主设备发送的数据,将其写入接收缓冲区,供主设备读取。
5. 完成通信:主设备通过判断从设备的应答信号,确认通信成功。
6. 错误处理:在通信过程中,根据错误码或标志位处理错误信息。
通过以上步骤并结合实际需求,可以编写两个单片机之间的IIC通信程序。刚开始可能会遇到一些困难,但通过坚持学习和实践,逐渐掌握单片机的基本原理和编程技巧。
### 回答3:
要学习单片机,首先需要了解单片机的基本原理和基本知识。可以开始学习单片机的原理和基本知识,学习单片机的工作原理、结构、寄存器、指令等。
在学习过程中,可以选择一款具有良好支持和丰富资料的单片机产品,比如常用的STC系列单片机。可以通过阅读相关的文档和资料,了解该单片机的特性和参数,以及使用该单片机进行开发的相关知识。
学习单片机的编程语言,如C语言,可以通过学习C语言的基本语法和编程方法来理解单片机的编程。可以选择一些经典的单片机编程案例进行实践,不断积累编程经验和技巧。
了解并学习单片机的开发环境,如Keil、IAR等集成开发环境。了解如何配置开发环境、创建工程、进行编译和调试等。
选择一个具体的项目或应用来实践单片机的学习,通过实践中不断遇到的问题、解决的方法等,进一步加深对单片机的理解和掌握。
在学习的过程中,可以参考相关的教材、网络教程和视频教程,结合实践和理论相结合,加深对单片机的认识和应用。
总之,从零开始学习单片机,需要了解单片机的基本原理和知识,并通过实践和学习不断加深对单片机的理解和掌握。通过不断学习和实践,逐步提高自己的单片机应用能力。
阅读全文