PIC单片机PIC16F786编程之UART通讯——同步串口与异步串口区别
同步就是双方有一个共同的时钟,当发送时,接收方同时准备接收。
异步双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,结束时有停止位。
1.异步通信方式的特点:
异步通信是按字符传输的。每传输一个字符就用起始位来进来收、发双方的同步。不会因收发双方的时钟频率的小的偏差导致错误。
这种传输方式利用每一帧的起、止信号来建立发送与接收之间的同步。特点是:每帧内部各位均采用固定的时间间隔,而帧与帧之间的间隔时随即的。接收机完全靠每一帧的起始位和停止位来识别字符时正在进行传输还是传输结束。
(使用串口USART中的串行异步通信是一个代表)
2.同步通信方式的特点:
进行数据传输时,发送和接收双方要保持完全的同步,因此,要求接收和发送设备必须使用同一时钟。
优点是可以实现高速度、大容量的数据传送;缺点是要求发生时钟和接收时钟保持严格同步,同时硬件复杂。
(SPI总线是一个典型代表)
3.相似处:
可以这样说,不管是异步通信还是同步通信都需要进行同步,只是异步通信通过传送字符内的起始位来进行同步,而同步通信采用共用外部时钟来进行同步。所以,可以说前者是自同步,后者是外同步。
启动位和停止位
怎么区分现在是在发送数据还是在常态呢?所以在每次发送一个字节的数据之前TX脚都会先输出一小段的低电平。来告诉对方,我要发送数据了这一小段低电平便是启动位(起始位)。
如果我们发送的不仅仅只有一个字节,而是好几个字节,两个数据之间总要有个间隔吧!要不然分不清谁跟谁。所以每发送完一个字节的数据,TX脚就会输出一小段的高电平这便是停止位。
波特率
在数据发送中每个位的时间都要事先定好,而且发送和接收的双方都必须事先知道并设置好。那这个时间是怎么确定的呢?这就牵扯的一个东西波特率。在这里波特率=比特率。比特率也就是 一秒钟发送多少位的数据。如果要一秒钟发送为9600个位,我们将波特率设置为9600。1/9600约等于0.0001s 也就是每个位的发送时间。
小端发送
如果 发送大写字母“ A ”也就是发送二进制数 “01000100”,串行通信是从低位开始发送。
下图为字母”A”数据发送的时序图.
实例:我们可以利用PC机的串口和单片机进行异步串行通信,单片机接收到什么样的数据,就在给PC机发送数据,波特率为115200。不过单片机输出的TTL信号,需TTL转232.PC机才能接收。有关这方面的硬件设计网上很多故不赘述。
单片机学习:如何计算单片机串口通信的波特率
1. 什么是波特率
不管是什么单片机,在使用串口通信的时候,有一个非常重要的参数:波特率。什么是波特率:波特率就是每秒传送的字节数。双方在传输数据的过程中,波特率一致,这是通讯成功的基本保障。下面以STM32单片机为例,讲解一下串口波特率的计算方法。
2. STM32波特率相关的寄存器
STM32单片机设置波特率的寄存器只有一个:USART_BRR寄存器,如下图所示。
该寄存器的有效位数为16位,前4位用于存放小数部分,后12位用于存放整数部分。将波特率算出来后,数值填入这个波特率就可以了。下面介绍如何计算。
3. 波特率计算方法
STM32的数据手册给出了计算方法,有一个公式,如下图所示:
在这个公式上,共有三个变量,其中两个我们是知道的,Fck 和Tx/Rx波特率 这两个是已知的,USARTDIV 是未知的。
通过该公式的描述可以看出如果使用USART1的话,那Fck就是PCLK2=72MHz,否则就是PCLK1=36MHz,Tx/Rx波特率 这个参数是已知的。只需要计算出USARTDIV的值赋值给USART_BRR寄存器就可以了。
以115200为例,将公式变形后得到:
USARTDIV = 72×1000000/(16×115200) = 39.0625。即,将39.0625写入USART_BRR即可。
前文说过,USART_BRR的前4位存放小数部分,后12位存放整数部分。
那小数部分DIV_Fraction = 0.0625×16 = 1 = 0x01;
那整数部分DIV_Mantissa = 39 = 0x27;
那USART_BRR = 0X271;
数据手册给我们提供了一张数据表:
在这张数据表上,已经算出了常用的波特率值,我们可以拿来直接用。但是如果我们想把波特率的计算做成一个传参函数的方式,
如:USART_INIT(uint_t 16 Baud),在调用时只需要写USART_INIT(9600),USART_INIT(115200),那程序该怎么写呢?
4. 程序的实现
下面介绍的是寄存器版的程序。
程序第一步45行:先计算得到USART_DIV,这个就是前面公式的变形;
程序第二步46行:获得USART_DIV的整数部分;
程序第三步47行:获得USART_DIV的小数部分;
程序第四步48行:将整数部分左移4位,即存入BRR寄存器的后12位;
程序第五步49行:将整数和小数部分合在一起,即前4位和后12位重新组合;
程序第六步50行:将计算出来的数值赋给BRR寄存器。
这样一个将波特率作为形参的函数就完成了。从以上来看的话,波特率的计算好像也不是很难啊。
本订阅号致力于单片机、ARM等嵌入式软硬件的设计经验分享,秉承“人人都是电子设计经验的分享者”的理念,成功路上不孤单,我们一起努力。
公众号:玩转嵌入式 。嵌入式学习网振兴网 :www.picmcu.com
Altium Designer 专题:
Altium Designer 有批量自动分组摆放元器件的方法,点击查看。
Altium Designer PCB设计技巧之|如何根据电路板尺寸确定背景形状,点击查看。
PCB设计技巧|布板时如何批量隐藏/显示元器件标号,点击查看。
单片机学习:如何将GPIO口设置为上拉、下拉输入,点击查看。
相关问答
pic单片机 EEPROM肿么编写程序啊??-ZOL问答X:\ProgramFiles\HI-TECHSoftware\PICC\9.81\include目录下找,然后复制到自己项目文件夹下。对了,我用的是MPLabIDE,编译器使用的是PICC...
PIC单片机 OTP型怎么样才能烧写第2次?下载器,也叫编程器,也叫烧录器。是用来将编译好的程序,下载到单片机芯片中。仿真器是用来模拟仿真的,也就是说不用将程序下载到单片机中,而是在仿真器中模...
另外请推荐一款51 单片机 ,带有AD转换和 串口 。最好还支持SPI?用PIC16F876A吧,STC12C5602AD系列同51系列相同。用PIC16F876A吧,STC12C5602AD系列同51系列相同。
什么是 单片机 ?单片机不是执行特定逻辑功能的芯片,而是将计算机系统集成到芯片上的芯片。它等效于微型计算机。与计算机相比,单芯片计算机仅缺少I/O设备。简而言之:芯片变成...
怎样学习plc通讯?如上图(c)所示。其中A端和B端都可以一边发送数据,一边接收数据。4.串行通信接口标准(1)RS-232C串行接口标准。RS-232C是1969年由美国电子工业协会公布的串...
icsp是什么协议?ICSP:6pin接口,使用SPI协议通信。JTAG:是一种国际标准测试协议(IEEE1149.1兼容),主要用于芯片内部测试。它有多种接口定义10pin、14pin、16pin、20pin。.....
单片机 中 排阻肿么焊接-ZOL问答公共端连接单片机电源,其它引脚分别连接单片机IO口。具体焊接方法与焊接普通电阻一样,只是引脚多一点而已。可先焊接两端,定位后,再焊接中间引脚。如图:带点...
单片机 有几个输入输出接口?单片机通常具有多个输入输出接口,具体数量取决于单片机的型号和规格。常见的单片机如8051、AVR、PIC等,一般都具有多个通用输入输出引脚,可以用于连接外部设备...
D、地址/数据位5、 单片机 应用程序一般存放在( B ...[最佳回答]6B74529对题意解读不同时,有不同答案,可以是C或ACI2C串行总线的数据输入输出线只有一根,但还有一根时钟线,总共二根SPI串行总线有一根数据输...
1T和12T 单片机 的区别?所以如果计算指令时间可以这样算。而现在很多51核的单片机工艺质量上去后,频率大大提高,增强型51有6T的,如果接12M的话,一个nop就只需要0.51uS,如果是STC的...