- 如何学习单片机
- 学习什么单片机
- 如何学习单片机
- 单片机学习的准备工作
- 单片机开发环境搭建 - Keil uVision4 安装教程
- Keil uVision4 简单使用教程
- 第一章问题汇总
- 点亮你的 LED 灯
- 单片机内部资源(内部结构)
- 单片机最小系统 [配图] [超详细]
- 单片机上的发光二极管(LED 灯)
- 51 单片机特殊功能寄存器和位定义
- 使用 Keil uVision 新建一个工程
- 第一个单片机程序(C 语言编写)
- 将程序下载到单片机
- 单片机硬件基础知识学习
- 电磁干扰 EMI
- 单片机中去耦电容的应用
- 三极管的的概念及其工作原理
- 单片机中三极管的应用
- 单片机中 74HC138 三八译码器的应用
- 单片机 LED 灯闪烁程序
- C 语言基础及流水灯的实现
- 二进制、十进制和十六进制
- C 语言变量类型和范围
- C 语言基本运算符
- C 语言 for 循环语句
- C 语言 while 循环语句
- C 语言函数的简单介绍
- 单片机延时方法(Keil 软件延时)
- 单片机 LED 流水灯程序[详细]
- 单片机定时器与数码管基础
- 单片机逻辑电路与逻辑运算
- 单片机定时器介绍
- 单片机定时器的寄存器
- 单片机中定时器的应用
- 单片机中 LED 数码管的介绍
- 单片机数码管的真值表
- 单片机数码管的静态显示
- 单片机的中断与数码管动态显示
- C 语言数组
- C 语言 if 语句
- C 语言 switch 语句
- 单片机数码管动态显示程序[带解释]
- 单片机数码管显示消隐
- 单片机中断系统
- 单片机中断的优先级
- 变量进阶与点阵 LED
- C 语言变量的作用域
- C 语言变量的存储类别
- 单片机 LED 点阵的介绍
- 单片机 LED 点阵的图形显示
- 单片机 LED 点阵的纵向移动(动态显示)
- 单片机 LED 点阵的横向移动(动态显示)
- C 语言函数进阶与单片机按键
- 单片机最小系统解析(电源、晶振和复位电路)
- C 语言函数的调用
- C 语言函数的形参和实参
- 单片机按键(独立按键和矩阵按键)
- 单片机独立按键扫描程序
- 单片机按键消抖程序
- 单片机矩阵按键的扫描
- 单片机简易加法计算器程序
- 单片机中的步进电机与蜂鸣器
- 单片机 IO 口的结构
- 单片机上下拉电阻
- 电机的分类
- 28BYJ-48 步进电机原理
- 让 28BYJ-48 步进电机转起来
- 28BYJ-48 步进电机转动精度与深入分析
- 28BYJ-48 步进电机控制程序基础
- 实用的 28BYJ-48 步进电机控制程序
- 单片机蜂鸣器控制程序和驱动电路
- 单片机实例练习与经验积累
- 单片机数字秒表程序
- 单片机中 PWM 的原理与控制程序
- 单片机交通灯控制程序和设计原理
- 51 单片机 RAM 区域的划分
- 单片机长短按键的应用
- UART 串口通信
- 单片机串行通信介绍
- RS232 通信接口
- USB 转串口通信
- 单片机 IO 口模拟 UART 串口通信
- UART 串口通信的基本应用
- 单片机通信实例与 ASCII 码
- C 语言指针基础与 1602 液晶的初步认识
- C 语言变量的地址
- C 语言指针变量的声明
- C 语言指针的简单示例
- C 语言指向数组元素的指针
- C 语言字符数组和字符指针
- 1602 液晶介绍(电路和引脚图)
- 1602 液晶的读写时序介绍
- 1602 液晶指令介绍
- 1602 液晶简单显示程序
- 单片机 1602 液晶与串口的应用实例
- 单片机通信时序解析
- 1602 液晶整屏移动程序
- 多个.c 文件的初步认识
- 单片机计算器程序设计[详细]
- 单片机串口通信原理和控制程序
- 单片机 I2C 总线与 EEPROM
- 单片机 I2C 时序介绍
- 单片机 I2C 寻址模式
- 单片机 EEPROM 简介
- 单片机 EEPROM 单字节读写操作时序
- 单片机 EEPROM 多字节读写操作时序
- 单片机 EEPROM 的页写入
- 单片机 I2C 和 EEPROM 的综合编程
- 实时时钟 DS1302
- BCD 码介绍
- 单片机 SPI 通信接口
- 实时时钟芯片 DS1302 介绍
- DS1302 的硬件信息
- DS1302 寄存器介绍
- DS1302 通信时序介绍
- DS1302 的 BURST 模式
- C 语言复合数据类型(结构体,共用体,枚举类型)
- 单片机电子时钟程序设计
- 红外通信与 DS18B20 温度传感器
- 红外光的基本原理
- 红外遥控通信原理
- NEC 协议红外遥控器
- 温度传感器 DS18B20
- 模数转换 A/D 与数模转换 D/A
- A/D 和 D/A 的基本概念
- A/D(模数转换) 的主要指标
- PCF8591 硬件接口(电路图引脚图)
- PCF8591 应用程序
- A/D 差分输入信号
- D/A 输出
- 单片机信号发生器程序
- RS485 通信与 Modbus 协议
- 单片机 RS485 通信接口、控制线、原理图及程序实例
- Modbus 通信协议介绍
- 单片机 Modbus 多机通信程序设计
单片机串行通信介绍
通信按照基本类型可以分为并行通信和串行通信。并行通信时数据的各个位同时传送,可以实现字节为单位通信,但是通信线多占用资源多,成本高。比如我们前边用到的 P0 = 0xFE;一次给 P0 的 8 个 IO 口分别赋值,同时进行信号输出,类似于有 8 个车道同时可以过去 8 辆车一样,这种形式就是并行的,我们习惯上还称 P0、P1、P2 和 P3 为 51 单片机的 4 组并行总线。
而串行通信,就如同一条车道,一次只能一辆车过去,如果一个 0xFE 这样一个字节的数据要传输过去的话,假如低位在前高位在后的话,那发送方式就是 0-1-1-1-1-1-1-1-1,一位一位的发送出去的,要发送 8 次才能发送完一个字节。
STC89C52 有两个引脚是专门用来做 UART 串行通信的,一个是 P3.0 一个是 P3.1,它们还分别有另外的名字叫做 RXD 和 TXD,由它们组成的通信接口就叫做串行接口,简称串口。用两个单片机进行 UART 串口通信,基本的演示图如图 11-1 所示。
图 11-1 单片机之间 UART 通信示意图
图中,GND 表示单片机系统电源的参考地,TXD 是串行发送引脚,RXD 是串行接收引脚。两个单片机之间要通信,首先电源基准得一样,所以我们要把两个单片机的 GND 相互连接起来,然后单片机 1 的 TXD 引脚接到单片机 2 的 RXD 引脚上,即此路为单片机 1 发送而单片机 2 接收的通道,单片机 1 的 RXD 引脚接到单片机 2 的 TXD 引脚上,即此路为单片机 2 发送而单片机 1 接收的通道。这个示意图就体现了两个单片机相互收发信息的过程。
当单片机 1 想给单片机 2 发送数据时,比如发送一个 0xE4 这个数据,用二进制形式表示就是 0b11100100,在 UART 通信过程中,是低位先发,高位后发的原则,那么就让 TXD 首先拉低电平,持续一段时间,发送一位 0,然后继续拉低,再持续一段时间,又发送了一位 0,然后拉高电平,持续一段时间,发了一位 1„„一直到把 8 位二进制数字 0b11100100 全部发送完毕。这里就涉及到了一个问题,就是持续的这 一段时间
到底是多久?由此便引入了通信中的一个重要概念——波特率,也叫做比特率。
波特率就是发送二进制数据位的速率,习惯上用 baud 表示,即我们发送一位二进制数据的持续时间=1/baud。在通信之前,单片机 1 和单片机 2 首先都要明确的约定好它们之间的通信波特率,必须保持一致,收发双方才能正常实现通信,这一点大家一定要记清楚。
约定好速度后,我们还要考虑第二个问题,数据什么时候是起始,什么时候是结束呢?
不管是提前接收还是延迟接收,数据都会接收错误。在 UART 通信的时候,一个字节是 8 位,规定当没有通信信号发生时,通信线路保持高电平,当要发送数据之前,先发一位 0 表示起始位,然后发送 8 位数据位,数据位是先低后高的顺序,数据位发完后再发一位 1 表示停止位。这样本来要发送一个字节的 8 位数据,而实际上我们一共发送了 10 位,多出来的两位其中一位起始位,一位停止位。而接收方呢,原本一直保持的高电平,一旦检测到了一位低电平,那就知道了要开始准备接收数据了,接收到 8 位数据位后,然后检测到停止位,再准备下一个数据的接收。我们图示看一下,如图 11-2 所示。
图 11-2 串口数据发送示意图
图 11-2 串口数据发送示意图,实际上是一个时域示意图,就是信号随着时间变化的对应关系。比如在单片机的发送引脚上,左边的是先发生的,右边的是后发生的,数据位的切换时间就是波特率分之一秒,如果能够理解时域的概念,后边很多通信的时序图就很容易理解了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论