I2C 总线 I2C 总线是由 PHILIPS 公司开发的两线式串行总线,多用于连接微处理器 及其外围芯片。 主要特点:两条线可以挂多个参与通信的器件, 即多机模式,而且任何一个器件都可以作为主机,当然同一时刻只能有一个主机。原理: 属于同步通信,SCL时钟线负责收发双方的时钟节拍,SDA数据线负责传输数据。I2C 的发送方和接收方都以 SCL这个时钟 节拍为基准进行数据的发送和接收。应用: 多用于板内通信, 多用于连接微处理器 及其外围芯片。硬件电路: file:///C:/Users/dell/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg在硬件上,I2C 总线是由时钟总线 SCL 和数据总线 SDA 两条线构成,连接到总线上的所 有器件的 SCL 都连到一起,所有 SDA 都连到一起因此可以做到任何一个器件都可以拉低电平, 也就是任何一个器件都可以作为主机, 图 14-1 I2C 总线的上拉电阻 虽然说任何一个设备都可以作为主机,但绝大多数情况下我们都是用单片机来做主机, I2C 时序初步认识:在 I2C 中也有起始信号、数据传输和停止信号,如图 14-2 所示。 file:///C:/Users/dell/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg 图 14-2 I2C 时序流程图 起始信号:SCL 为高电平期间,SDA 由高电平向低电平变化产生一个下降沿,表 示起始信号,如图14-3 中的 Start 部分所示。 数据传输:I2C 没有固定波特率,但是有时序的要求,发送方必须先保持 SCL 是低电平,才可以改变数据线 SDA,输出要发送的当前 数据的一位;而当SCL 在高电平的时候,SDA 绝对不可以变化,因为这个时候,接收方要 来读取当前 SDA 的电平信号是 0 还是 1,因此要保证 SDA 的稳定, 停止信号: 是 SCL 为高电平期间,SDA 由低电平向高电平变化产生一个上升沿,表示结束信号,如图 14-3 中的 Stop 部分所示。 I2C 寻址模式I2C 通信在字节级的传输中(即数据传输),也有固定 的时序要求。首先要发送一个从机的地址,这个地址一共有 7 位,紧跟着的第 8 位是数据方向位(R/W),“0”表示接下来要发送数据(写),‘“1”表示接 下来是请求数据(读)。如果发送的这个地址确实存在,那么这个地址的器件应该回应一个 ACK(拉低 SDA 即输出“0”),如果不存在,就没“人”回应 ACK(SDA 将保持高电平即“1”)。
UART 异步串行通信串行通信,就如同一条车道,一次只能一辆车过去 主要特点:两条线可以挂多个参与通信的器件, 即多机模式,而且任何一个器件都可以作为主机,当然同一时刻只能有一个主机。原理:UART 属于异步通信,比如电脑发送给单片机,电脑只负责把数据通过 TXD 发送出来即可,接收数据是单片机自己的事情。 应用: UART 通信多用于板间通信,比如单片机和电脑,这个设备和另外一个 设备之间的通信。硬件电路:两个引脚是专门用来做 UART 串行通信的,一个是 P3.0 一个是 P3.1,它们 还分别有另外的名字叫做 RXD 和 TXD,由它们组成的通信接口就叫做串行接口,简称串口。TXD (Transmit Data)是串行发送引脚,RXD (Receive Data)是串行接收引 脚。 时序认识:规定当没有通信信号发生时,通信线路保持高电平,当要发送数据之前,先发一位 0 表示起始位,然后发送 8 位数据位,数据位是先低后高的顺序,数据位发完后再发一位 1 表示停止位。其中一位起始位,一位停止位。而接收方呢,原本一直保持的高电平,一旦检测到了一位低电平,那就知道了要开始准备接收数据了,接收到 8 位数据位后,然后检测到停止位,再准备下一个数据的接收。 软件设计UART 模块介绍51 单片机的UART 串口的结构由串行口控制寄存器 SCON、发送和接收电路三部分构成, 先来了解一下串口控制寄存器 SCON。如表 11-1 表 11-2 所示。 表 11-1 SCON——串行控制寄存器的位分配(地址 0x98、可位寻址) 表 11-2 —串行控制寄存器的位描述 位 | | | | | 这两位共同决定了串口通信的模式 0~模式 3 共 4 种模式。我们最常用的 就是模式 1,也就是 SM0=0,SM1=1,下边我们重点就讲模式 1,其它模 式从略。 | | | | | | | | 使能串行接收。,由软件置位使能接收,软件清零则禁止接收(REN=0,不接收只发送。) | | | 模式 2 和 3 中要发送的第 9 位数据(很少用)。 | | | 模式 2 和 3 中接收到的第 9 位数据(很少用),模式 1 用来接收停止位。 | | | 发送中断标志位,当发送电路发送到停止位的中间位置时,TI 由硬件置 1, 必须通过软件清零。定时器中断不一样,定时器中断由硬件清零. | | | 接收中断标志位,当接收电路接收到停止位的中间位置时,RI 由硬件置 1, 必须通过软件清零。 |
对于串口的四种模式,模式 1 是最常用的,就是我们前边提到的 1 位起始位,8 位数据位和 1 位停止位。下面我们就详细介绍模式 1 的工作细节和使用方法,至于其它 3 种模式与此也是大同小异,真正遇到需要使用的时候大家再去查 阅相关资料就行了。 在我们使用IO 口模拟串口通信的时候,串口的波特率是使用定时器 T0 的中断体现出来 的。在硬件串口模块中,有一个专门的波特率发生器用来控制发送和接收数据的速度。对于 STC89C52 单片机来讲,这个波特率发生器只能由定时器 T1 或定时器 T2 产生,而不能由定 时器 T0 产生。如果用定时器 2,需要配置额外的寄存器,默认是使用定时器 1 的。 就使用定时器 T1 作为波特率发生器来讲解, 方式 1 下的波特率发生器必须使用定时器 T1 的 模式 2,也就是自动重装载模式,定时器的重载值计算公式为: TH1 = TL1 = 256 - 晶振值/12 /2/16 /波特率 和波特率有关的还有一个寄存器,是一个电源管理寄存器 PCON,他的最高位可以把波特率提高一倍,也就是如果写 PCON |= 0x80 以后,计算公式就成了: TH1 = TL1 = 256 - 晶振值/12 /16 /波特率 公式中数字的含义这里解释一下,256 是 8 位定时器的溢出值,也就是 TL1 的溢出值, 晶振值在我们的开发板上就是 11059200,12 是说 1 个机器周期等于 12 个时钟周期, 串口通信的发送和接收电路在物理上有 2 个名字相同的 SBUF 寄存器,它们的地址也都 是 0x99,但是一个用来做发送缓冲,一个用来做接收缓冲。 流程: 串行口工作之前需对相关寄存器进行配置,设定其工作模式。 1.设置T1的工作方式2(编程TMOD寄存器);
2.计算T1的初值,装载TH1、TL1;
3.启动T1(编程TCON中的TR1位);
4.确定串行口控制(编程SCON寄存器);
如需串行口在中断方式工作时,要进行中断设置编程IE寄存器
|