目录
- 快速使用
- 硬知识
-
- 串行口相关寄存器
-
- 串行口控制寄存器SCON和PCON
- 串行口数据缓冲寄存器SBUF
- 从机地址控制寄存器SADEN和SADDR
- 与串行口中断相关的寄存器IE和IPH、IP
- 串行口工作模式
-
- 串行口工作模式0:同步移位寄存器
- 串行口工作模式1:8位UART,波特率可变
- 串行口工作模式2:9位UART,波特率固定
- 串行口工作模式3:9位UART,波特率可变
- 串行通信中波特率的设置
- 示例程序
-
- USART.c
- USART.h
- 定时器2作为波特率发生器实验
-
- main.c
- 实验现象
- 定时器1作为波特率发生器仿真实验
-
- main.c
- 实验现象
- 串行口工作模式0发送实验
-
- main.c
- 实验现象
普中51-单核-A2
STC89C52
Keil uVision V5.29.0.0
PK51 Prof.Developers Kit Version:9.60.0.0
快速使用
可通过STC-ISP的波特率计算器直接生成初始化函数
硬知识
摘自《STC89C52系列单片机器件手册》
中断知识见【51单片机快速入门指南】3:中断系统
STC89C52系列单片机内部集成有一个功能很强的全双工串行通信口,与传统8051单片机
的串口完全兼容。设有 2 个互相独立的接收、发送缓冲器,可以同时发送和接收数据。发送缓
冲器只能写入而不能读出,接收缓冲器只能读出而不能写入,因而两个缓冲器可以共用一个
地址码( 99H )。两个缓冲器统称串行通信特殊功能寄存器 SBUF 。
串行通信设有4种工作方式,其中两种方式的波特率是可变的,另两种是固定的,以供不同应用场合选用。波特率由内部定时器/计数器产生,用软件设置不同的波特率和选择不同的工作方式。主机可通过查询或中断方式对接收/发送进行程序处理,使用十分灵活。
STC89C52系列单片机串行口对应的硬件部分对应的管脚是P3.0/RxD和P3.1/TxD。
STC89C52系列单片机的串行通信口,除用于数据通信外,还可方便地构成一个或多个并行I/O口,或作串 — 并转换,或用于扩展串行外设等。
串行口相关寄存器
串行口数据缓冲寄存器SBUF
STC89C52系列单片机的串行口缓冲寄存器(SBUF)的地址是99H,实际是2个缓冲器,写SBUF的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。两个操作分别对应两个不同的寄存器,1个是只写寄存器,1个是只读寄存器。
串行通道内设有数据寄存器。在所有的串行通信方式中,在写入SBUF信 的控制下,把数据装入相同的9位移位寄存器,前面8位为数据字节,其最低位为移位寄存器的输出位。根据不同的工作方式会自动将“1”或TB8的值装入移位寄存器的第9位,并进行发送。
串行通道的接收寄存器是一个输入移位寄存器。在方式0时它的字长为8位,其他方式时为 9位。当一帧接收完毕,移位寄存器中的数据字节装入串行数据缓冲器SBUF中,其第9位则装入SCON寄存器中的RB8位。如果由于SM2使得已接收到的数据无效时,RB8和SBUF中内容不变。
由于接收通道内设有输入移位寄存器和SBUF缓冲器,从而能使一帧接收完将数据由移位寄存器装入SBUF后,可立即开始接收下一帧信息,主机应在该帧接收结束前从SBUF缓冲器中
将数据取走,否则前一帧数据将丢失。SBUF以并行方式送往内部数据总线。
从机地址控制寄存器SADEN和SADDR
为了方便多机通信,STC89C52系列单片机设置了从机地址控制寄存器SADEN和SADDR。其中SADEN是从机地址掩模寄存器(地址为B9H,复位值为00H),SADDR是从机地址寄存器(地址为A9H,复位值为00H)。
与串行口中断相关的寄存器IE和IPH、IP
串行口中断允许位ES位于中断允许寄存器IE中,中断允许寄存器的格式如下:
IE : 中断允许寄存器 (可位寻址)
示例程序
stdint.h见【51单片机快速入门指南】1:基础知识和工程创建
由于STC单片机的定时器2才有波特率发生器,因此本示例中使用STC的头文件。
USART.c
#include "USART.h"char RxBuffer[RxBuffer_Len] = {0};bit USART_Busy;void String_Analysis(){}void USART_Init(uint8_t USART_Mode, bit Rx_Flag, uint8_t Priority, uint32_t SYSclk, uint32_t Baud_Rate, bit Double_Baud_Flag, bit USART_Timer){ uint16_t THLx; Priority &= 3; USART_Mode &= 3; PCON = 0; PCON |= (uint8_t)Double_Baud_Flag 7; //波特率倍速控制 SCON = 0; SCON |= (USART_Mode 6); //设置工作模式 REN = Rx_Flag; //允许/禁止串行接收控制位 IPH &= ~(1 4); //设置中断优先级 IPH |= ((2 & Priority) 3); //设置中断优先级 PS = (1 & Priority); //设置中断优先级 if (USART_Mode 声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!