UART串口通信的基本应用
单工通信:值允许一方向另一方传送星系,另一方不能回传信息例:电视遥控器、收音机广播
半双工通信:数据可在双方之间相互传播,但同一时刻只能一方传给另一方例:对讲机
全双工通信:發送数据的同时也可接收数据,两者同步进行例:电话
通常情况下,我们关心的是通信的结果而非过程51单片机内部存在UART模块,可自动接收数据接收完毕,会发出通知信号要使用这个模块,需要配置对应的具有特殊功能的寄存器
51单片机的UART串口结构由串行口控制寄存器SCON、发送和接收电路三部分构成。
先来了解串口控制寄存器SCON
SCON——串行控制寄存器的位分配(地址0X98、可位寻址)
0 | |||||||
---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
SCON——串行控制寄存器的位描述
SM0和SM1两位共同决定了串口通信的模式0~模式3共4种模式最常用的是模式1,即SM0=0SM1=1。下面重点讲模式1其他模式从略。 | |
SM0和SM1两位共同决定了串口通信的模式0~模式3共4种模式最常用的是模式1,即SM0=0SM1=1。下面重点讲模式1其他模式从略。 | |
多机通信控制位(极少用)模式1直接清零。 | |
使能串ロ接收由软件置位使能接收,软件清零则禁止接收 | |
模式2和3中要发送的第9位数据(很少用)。 | |
模式2和3中要接收的第9位数据(很少用)模式1用来接收停止位。 | |
发送中断标志位当发送电路发送到停止位的中间位置时,TI由硬件置1必须通过软件清零。 | |
0 | 接收中断标志位当接收电路接收到停止位的中间位置时,RI由硬件置1必须通过软件清零。 |
对于串口的四种模式模式1是最常用的,就是前面提到的1位起始位8位数据位和1位停止位。 下面讲详细介绍模式1的工作细节和使用方法(其他3种模式与模式1大同小异要用的时候自行查阅资料既可)。
在硬件模块中有一个专门的波特率发生器用来控制发送和接收数据的速度。对于STC89C52单片机来说这个波特率只能由定时器T1或定时器T2产生。这与模拟的通信概念完全不同默认使用定时器T1(定时器T2需要额外配置的寄存器)。
下面主要就使用T1作为波特率发生器来讲解方式1下的波特率发生器必须使用T1的模式2,也就是自动重装载模式
这里介绍一个与波特率有关的另一个计算器:电源管理寄存器PCON,他的最高位可以把波特率提高一倍也就是如果写PCON |= 0X80以后,计算公式就成了:TH1 = TL1 = 256-晶振值/12/16/波特率
公式中数字的含义解释如下:
256——8位定时器的溢出值1TL1的溢出值。
晶振值——在开发板上是
12——1个机器周期等于12个时钟周期
16——将一位信号采集16次(IO口模拟串口通信接收数据时采集的是这位数据的中间位置而实际串口模块比模拟的要复杂和精确一些。它采取的方式是把一位信号采集16次其中7,89次取出来,如果这三次中有两次是高电平僦认为这个数据是1,如果有两次是低电平就认为这个数据是0,这样即使是受到干扰导致数据读错仍可保证最终数据的正确性)
了解了串口采集模式,这里可以思考一个问题“晶振值/12/2/16/波特率”计算出的值有没有可能是小数?把这里理解了也就解释了晶振为何使用 因为鈳以被常见的波特率整除。
串口通信的发送和接收电路在物理上有两个名字相同的SBUF寄存器它们的地址相同都是0X99。 这两个寄存器一个用来發送缓冲一个用来接收缓冲,实现了UART的全双工通信互相不干扰。操作SBUF单片机会自动判断并决定选择接收SBUF还是发送SBUF。
一般情况下串ロ通信程序的编写步骤如下:
2)配置定时器T1为模式2(自动重装模式)
3)根据波特率计算TH1和TL1的初值,如果有需要可以使用PCON进行波特率加倍
4)打开定时器控制寄存器TR1,让定时器跑起来
注意:使用T1时,即在使用T1做波特率发生器千万不能再使能T1中断。
注意:实际工程开发中並不会这样编写这段代码,因为这段代码在主循环里等待接收中断标志位和发送中断标志位占据了大量程序内存。实际使用串口时常用箌串口中断
以下是串口中断的演示代码