复习单片机:串口通信(内含:1.代码部分+2.串口内部结构+3.串口控制寄存器 SCON+4.电源控制寄存器 PCON+5. 串口的使用方法+6.硬件设计+7.实验现象)

简介: 复习单片机:串口通信(内含:1.代码部分+2.串口内部结构+3.串口控制寄存器 SCON+4.电源控制寄存器 PCON+5. 串口的使用方法+6.硬件设计+7.实验现象)

此章内容知识顺序改变,先理解和确定代码

1.代码部分如下:


#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
//串口通信中断配置函数,通过设置TH和TL即可
//确定定时时间
//baud是波特率的意思
void uart_init(u8 baud)
{
    //TMOD计数器配置0X20为0000 0010为方式1(0010)
    //且为M1=1,M0=0;(参见定时器原理TMPD寄存器处)
    TMOD=0X20;//设置计数器工作方式2
    //串口寄存器SCON,0X50表示0101 0000(可使用计算器计算)
    //0101 0000的第一个01表示SM0=0,SM1=1,方式1
    //第三位的0表示SM2=0(多机控制位不使用就是0);
    //第四位的1表示REN=1,启动串行口接收数据;
    //第五位的0表示TB8=0,方式1不使用
    //第六位的0表示RB8=0,方式1不使用
    //第六位的0表示TI=0,此处软件必须置0
    //第七位的0表示RI=0,此处软件必须置0
    SCON=0X50;//设置为工作方式1
    //串口通信的电源控制寄存器PCON
    //0X80=1000 0000
    //第一位的1表示SMOD=1,波特率提高一位
    //其他位的0固定不变
    PCON=0X80;//波特率加倍
    TH1=baud;//计数器初始值设置
    TL1=baud;
    ES=1;//打开接收中断
    EA=1;//打开总中断
    TR1=1;//打开计数器
}
void main()
{
    uart_init(0XFA);//波特率为9600
    while(1)
    {
    }
}
void uart()interrupt 4//串口通信中断函数,串口中断号是4
{
    u8 rec_data;
    RI=0;//清除接收中断标志位
    //可查询串口通信内部简介
    rec_data=SBUF;    //存储接收到的数据
    SBUF=rec_data;    //将接收到的数据放入到发送寄存器
    //注:串口使用方法中介绍,结束时TI=1,所以用TI是否等于1判断结束
    while(!TI);        //等待发送数据完成
    TI=0;            //清除发送完成标志位
}

f8f64c523d13443f927eee53a75eff54.png

2.串口内部结构:


1396e1c15dc9412996a93bd0e1adbf85.png


上图中右边的 TXD 和 RXD 为单片机 IO 口,TXD 对应的是 P3.1 管脚,RXD 对

应的是 P3.0 管脚。

串口相关寄存器:

3.串口控制寄存器 SCON


3092b5fb5ef34ac7982d13e13658b065.png


SM0 和 SM1 为工作方式选择位:


2b6bd6c0ca5a44ccb05d6f31faddd215.png


SM2:多机通信控制位,主要用于方式 2 和方式 3。当 SM2=1 时可以利用收到 的 RB8 来控制是否激活 RI(RB8=0 时不激活 RI,收到的信息丢弃;RB8=1 时收 到的数据进入 SBUF,并激活 RI,进而在中断服务中将数据从 SBUF 读走)。当 SM2=0 时,不论收到的 RB8 为 0 和 1,均可以使收到的数据进入 SBUF,并激活 RI (即此时 RB8 不具有控制 RI 激活的功能)。通过控制 SM2,可以实现多机通信。


REN:允许串行接收位。由软件置 REN=1,则启动串行口接收数据;若软件置 REN=0,则禁止接收。


TB8:在方式 2 或方式 3 中,是发送数据的第 9 位,可以用软件规定其作用。

可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。

在方式 0 和方式 1 中,该位未用到。

RB8:在方式 2 或方式 3 中,是接收到数据的第 9 位,作为奇偶校验位或地

址帧/数据帧的标志位。在方式 1 时,若 SM2=0,则 RB8 是接收到的停止位。

TI:发送中断标志位。在方式 0 时,当串行发送第 8 位数据结束时,或在其

它方式,串行发送停止位的开始时,由内部硬件使 TI 置 1,向 CPU 发中断申请。

在中断服务程序中,必须用软件将其清 0,取消此中断申请。

RI:接收中断标志位。在方式 0 时,当串行接收第 8 位数据结束时,或在其

它方式,串行接收停止位的中间时,由内部硬件使 RI 置 1,向 CPU 发中断申请。

也必须在中断服务程序中,用软件将其清 0,取消此中断申请。

注:默认为SMOD|=XX01 0000


4.电源控制寄存器 PCON


1ce83ddb48bd4ab5b0fb95ef85ec9fb8.png


SMOD:波特率倍增位。在串口方式 1、方式 2、方式 3 时,波特率与 SMOD 有

关,当 SMOD=1 时,波特率提高一倍。复位时,SMOD=0。

注:其他位默认为0,即为PCON=x000 0000

串口工作方式:此处不是重点,篇幅过长,不再赘述,可自行搜索理解


5. 串口的使用方法


( 1)如何计算波特率

在学习 51 单片机串口时,非常重要的一点是学会如何计算波特率。以下列

出了几种方式下波特率的计算公式:

方式 0 的波特率 = fosc/12

方式 2 的波特率 =(2SMOD /64)· fosc

方式 1 的波特率 =(2SMOD /32)·(T1 溢出率)

方式 3 的波特率 =(2SMOD /32)·(T1 溢出率)

注:还可使用工具来使用波特处置计算工具计算,使用方法放在下一篇文章

( 2)串口初始化步骤

①确定 T1 的工作方式(TMOD 寄存器);

②确定串口工作方式(SCON 寄存器);

③计算 T1 的初值(设定波特率),装载 TH1、TL1;

④启动 T1(TCON 中的 TR1 位);

⑤如果使用中断,需开启串口中断控制位(IE 寄存器)。

例如:设置串口为工作方式 1、波特率为 9600、波特率加倍、使用中断。其

配置程序如下:


void uart_init ( u8 baud )
{
TMOD |= 0X20 ; //设置计数器工作方式 2
SCON = 0X50 ;
//设置为工作方式 1
PCON = 0X80 ;
//波特率加倍
TH1 = baud ;
//计数器初始值设置
TL1 = baud ;
ES = 1 ;
//打开接收中断
EA = 1 ;
//打开总中断
TR1 = 1 ;
//打开计数器
}

在主函数中调用该函数并传入 OXFA 值即可,如下:


uart_init(0XFA);//波特率为 9600


6.硬件设计

开发板上板载一个 USB 转串口模块。其硬件电路如下所示:


2cc0d353a36d4ec292842ac01ffab48f.png


7.实验现象:


5bc75ad619f8468d9b0f82715b60f8ff.png



相关文章
|
1月前
|
存储 算法 编译器
如何优化单片机程序里面的C代码方法
如何优化单片机程序里面的C代码方法
20 0
|
4月前
|
物联网
STC51单片机-实验开发装置仿真-物联网应用系统设计
STC51单片机-实验开发装置仿真-物联网应用系统设计
53 0
|
7月前
|
内存技术
单片机(MCU)如何才能不死机之串口Overrun
单片机(MCU)如何才能不死机之串口Overrun
|
7月前
单片机实验:外部中断系统实验 如何1357,2468灯交替亮
单片机实验:外部中断系统实验 如何1357,2468灯交替亮
116 0
|
7月前
单片机实验:兰花草
单片机实验:兰花草
52 0
|
7月前
单片机实验:外部中断系统实验 如何1357,2468灯交替亮
单片机实验:外部中断系统实验 如何1357,2468灯交替亮
303 0
|
3月前
|
网络协议 Linux
嵌入式单片机开源的串口示波器实现方法
嵌入式单片机开源的串口示波器实现方法
23 0
|
9月前
【单片机】简易计算器完整代码带电路图
【单片机】简易计算器完整代码带电路图
230 0
【单片机】简易计算器完整代码带电路图
|
7月前
STM32F0单片机快速入门七 串口(UART)操作从轮询到中断
STM32F0单片机快速入门七 串口(UART)操作从轮询到中断
STM32F0单片机快速入门七 串口(UART)操作从轮询到中断
|
7月前
|
芯片
STM32F0单片机快速入门六 用库操作串口(UART)原来如此简单
STM32F0单片机快速入门六 用库操作串口(UART)原来如此简单