【51单片机快速入门指南】3.3:USART 串口通信

目录

  • 快速使用
  • 硬知识
    • 串行口相关寄存器
      • 串行口控制寄存器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进行处理,非常感谢!

上一篇 2021年10月18日
下一篇 2021年10月18日

相关推荐