51单片机入门学习 第八天

提示:今天是学习51单片机的第八天,以下就是今天的笔记(我买的是普中的开发板,学习笔记是根据普中的视频进行学习)今天学习的内容是中断和串口通信。


目录

中断系统

1.中断

1.1中断介绍

1.2中断结构及相关寄存

2.外部中断

2.1 外部中断介绍

2.2 外部中断配置

2.3 硬件设计

2.4 软件设计

3.定时器中断 

3.1 定时器介绍

3.2 定时器配置

3.3 硬件设计 

3.4 软件设计

串口通信实验

1.通信的基本概念

2.单片机串口介绍

2.1 串口通信简介

2.2 串口相关寄存器

2.3 串口工作方式

2.4 串口的使用方法

3.硬件设计

4.软件设计


中断系统

我们通过介绍 51 单片机 IO 口学习了很多相关的实验。从最简单的 LED 到数码管动态扫描再到 LED 点阵体现学习 51 单片 机 IO 口操作的重要性。学习 51 单片机的重点及难点主要有中断、定时器、串口等内容。

1.中断

  • 1.1中断介绍

  • 1.2中断结构及相关寄存

2.外部中断

  • 2.1 外部中断介绍
  • 2.2 外部中断配置
  • 2.3 硬件设计
  • 2.4 软件设计 

3.定时器中断

  • 3.1 定时器介绍
  • 3.2 定时器配置
  • 3.3 硬件设计
  • 3.4 软件设计

1.中断

1.1中断介绍

中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的, 中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。它也是 单片机最重要的功能之一。对于单片机来讲,中断是指 CPU 在处理某一事件 A 时,发生了另一事件 B, 请求 CPU 迅速去处理(中断发生);CPU 暂时停止当前的工作(中断响应), 转去 处理事件 B(中断服务);待 CPU 将事件 B 处理完毕后,再回到原来事件 A 被 中断的地方继续处理事件 A(中断返回),这一过程称为中断。

 引起 CPU 中断的根源称为中断源。中断源向 CPU 提出中断请求,CPU 暂时 中断原来的事务 A,转去处理事件 B,对事件 B 处理完毕后,再回到原来被中断 的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断 机构)。 当中央处理机 CPU 正在处理某件事的时候外界发生了紧急事件请求,要求 CPU 暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中 断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中 断系统,请示 CPU 中断的请求源称为中断源。微型机的中断系统一般允许多个 中断源,当几个中断源同时向 CPU 请求中断,要求为它服务的时候,这就存在 CPU 优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先 处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU 总是 先响应优先级别最高的中断请求。 当 CPU 正在处理一个中断源请求的时候(执行相应的中断服务程序),发生 了另外一个优先级比它还高的中断源请求。如果 CPU 能够暂停对原来中断源的 服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中 断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没 有中断嵌套功能的中断系统称为单级中断系统。

人们发现中断技术不仅解决了快速主机与慢速 I/O 设备的数据传送问题,而且还具有如下优点: ①分时操作。CPU 可以分时为多个 I/O 设备服务,提高了计算机的利用率; ②实时响应。CPU 能够及时处理应用系统的随机事件,系统的实时性大大增 强; ③可靠性高。CPU 具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高。

1.2中断结构及相关寄存

STC89C5X 系列单片机提供了 8 个中断请求源,它们分别是:外部中断 O(INTO)、外部中断 1(INT1)、外部中断 2(INT2)、外部中断 3(INT3)、定时器 0 中断、定时器 1 中断、定时器 2 中断、串口(UART)中断。(注意:51 系列单片 机一定有基本的 5 个中断,但不全有 8 个中断,需要查看芯片手册,通常我 们使用的都是基本的 5 个中断:INT0、INT1、定时器 0/1,串口中断)。所有的 中断都具有四个中断优先级(基本型只有两个)。用户可以用关总中断允许位 (EA/IE.7)或相应中断的允许位来屏蔽所有的中断请求,也可以用打开相应的中 断允许位来使 CPU 响应相应的中断申请。其中有些中断源可以用软件独立地控 制为开中断或关中断状态。每一个中断的优先级别均可用软件设置。高优先级的 中断请求可以打断低优先级的中断,反之,低优先级的中断请求不可以打断高优 先级及同优先级的中断。当两个相同优先级的中断同时产生时,将由查询次序来 决定系统先响应哪个中断。

 ①INT0 对应的是 P3.2 口的附加功能,可由 IT0(TCON.0)选择其为低电平有 效还是下降沿有效。当 CPU 检测到 P3.2 引脚上出现有效的中断信号时,中断标 志 IE0(TCON.1)置 1,向 CPU 申请中断。

②INT1 对应的是 P3.3 口的附加功能,可由 IT1(TCON.2)选择其为低电平有 效还是下降沿有效。当 CPU 检测到 P3.3 引脚上出现有效的中断信号时,中断标 志 IE1(TCON.3)置 1,向 CPU 申请中断。

③T0 对应的是 P3.4 口的附加功能,TF0(TCON.5),片内定时/计数器 T0 溢 出中断请求标志。当定时/计数器 T0 发生溢出时,置位 TF0,并向 CPU 申请中断。

④T1 对应的是 P3.5 口的附加功能,TF1(TCON.7),片内定时/计数器 T1 溢出中断请求标志。当定时/计数器 T1 发生溢出时,置位 TF1,并向 CPU 申请中 断。

⑤RXD 和 TXD 对应的是 P3.0 和 P3.1 口的附加功能,RI(SCON.0)或 TI (SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位 RI 或 当串行口发送完一帧串行数据时置位 TI,向 CPU 申请中断。

1.2. 1中断相关寄存器

(1)中断允许控制 CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器 IE 控制的。

  • EX0(IE.0),外部中断 0 允许位;
  • ET0(IE.1),定时/计数器 T0 中断允许位;
  • EX1(IE.2),外部中断 0 允许位;
  • ET1(IE.3),定时/计数器 T1 中断允许位;
  • ES(IE.4),串行口中断允许位;
  • EA (IE.7), CPU 中断允许(总允许)位。

(2)中断请求标志

TCON IT0(TCON.0),外部中断 0 触发方式控制位。 当 IT0=0 时,为电平触发方式。 当 IT0=1 时,为边沿触发方式(下降沿有效)。

  • IE0(TCON.1),外部中断 0 中断请求标志位。(当 IT0=0 时,为电平触发方式。 当 IT0=1 时,为边沿触发方式(下降沿有效))
  • IT1(TCON.2),外部中断 1 触发方式控制位。
  • IE1(TCON.3),外部中断 1 中断请求标志位。
  • TF0(TCON.5),定时/计数器 T0 溢出中断请求标志位。
  • TF1(TCON.7),定时/计数器 T1 溢出中断请求标志位。

(3)中断优先级 同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先 级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示:

 (4)中断号

 (5)中断响应条件 ①中断源有中断请求; ②此中断源的中断允许位为 1; ③CPU 开中断。

2.外部中断

2.1 外部中断介绍

51 单片机外部中断有 2 个,外部中断 0 和 外部中断 1,它们的使用方法是一样的,所以只要学会一个即可掌握所有外部中 断使用。 

STC89C5X 系列单片机提供了 4 个外部中断:外部中断 O(INTO)、外部中断 1(INT1)、外部中断 2(INT2)、外部中断 3(INT3)。(注意:51 系列单片机一定 有基本的 2 个外部中断,但不全有 4 个中断,需要查看芯片手册,通常我们 都是使用基本的 2 个外部中断:INT0 和 INT1)。 下面我们来看下外部中断结构图,如下所示:

图中 INT0 和 INT1 即为外部中断 0 和外部中断 1 输入口。 ①INT0 对应的是 P3.2 口的附加功能,可由 IT0(TCON.0)选择其为低电平有 效还是下降沿有效。当 CPU 检测到 P3.2 引脚上出现有效的中断信号时,中断标 志 IE0(TCON.1)置 1,向 CPU 申请中断。 ②INT1 对应的是 P3.3 口的附加功能,可由 IT1(TCON.2)选择其为低电平有 效还是下降沿有效。当 CPU 检测到 P3.3 引脚上出现有效的中断信号时,中断标 志 IE1(TCON.3)置 1,向 CPU 申请中断。

(1)中断允许控制 CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器 IE 控制的。

EX0(IE.0),外部中断 0 允许位; ET0(IE.1),定时/计数器 T0 中断允许位; EX1(IE.2),外部中断 0 允许位; ET1(IE.3),定时/计数器 T1 中断允许位; ES(IE.4),串行口中断允许位; EA (IE.7), CPU 中断允许(总允许)位。

(2)中断请求标志 TCON 224 IT0(TCON.0),外部中断 0 触发方式控制位。

当 IT0=0 时,为电平触发方式。 当 IT0=1 时,为边沿触发方式(下降沿有效)。 IE0(TCON.1),外部中断 0 中断请求标志位。 IT1(TCON.2),外部中断 1 触发方式控制位。 IE1(TCON.3),外部中断 1 中断请求标志位。 TF0(TCON.5),定时/计数器 T0 溢出中断请求标志位。 TF1(TCON.7),定时/计数器 T1 溢出中断请求标志位 。

2.2 外部中断配置

 51 单片机发生中断必须要满足以下 3 个条件,这 3 个条件的 顺序可以任意:

①中断源有中断请求; ②此中断源的中断允许位为 1; ③CPU 开中断(即 EA=1)。

比如我们配置外部中断 0,对应的配置程序如下:

EA=1;//打开总中断开关

EX0=1;//开外部中断 0

IT0=0/1;//设置外部中断的触发方式

当触发中断后即会进入中断服务函数,外部中断 0 中断服务函数如:

void exti0() interrupt 0 //外部中断 0 中断函数
{
//执行所需的功能
}

2.3 硬件设计

本实验使用到硬件资源如下: (1)独立按键模块(K3) (2)LED 模块 

2.4 软件设计

使用独立按键 K3 控制 LED

#include "reg52.h"
typedef unsigned int u16;//对系统默认数据类型进行重定义
typedef unsigned char u8;
//定义 LED1 管脚
sbit LED1=P2^0;
//定义独立按键 K3 控制脚
sbit KEY3=P3^2;

void delay_10us(u16 ten_us)
{
while(ten_us--);
}

void exti0_init(void)
{
IT0=1;//跳变沿触发方式(下降沿)
EX0=1;//打开 INT0 的中断允许
EA=1;//打开总中断
}

void main()
{
exti0_init();//外部中断 0 配置
while(1)
{
}
}
void exti0() interrupt 0 //外部中断 0 中断函数
{
delay_10us(1000);//消斗
if(KEY3==0)//再次判断 K3 键是否按下
LED1=!LED1;//LED1 状态翻转
}

3.定时器中断 

1,CPU 时序的有关知识

①振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡 周期)。 ②状态周期:2 个振荡周期为 1 个状态周期,用 S 表示。振荡周期又称 S 周 期或时钟周期。 ③机器周期:1 个机器周期含 6 个状态周期,12 个振荡周期。 ④指令周期:完成 1 条指令所占用的全部时间,它以机器周期为单位。

例如:外接晶振为 12MHz 时,51 单片机相关周期的具体值为: 振荡周期=1/12us; 状态周期=1/6us; 机器周期=1us; 指令周期=1~4us;

2,学习定时器前需要明白的几点

①51 单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之 为定时器/计数器。 ②定时器/计数器和单片机的 CPU 是相互独立的。定时器/计数器工作的过程 是自动完成的,不需要 CPU 的参与。 ③51 单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信 号对寄存器中的数据加 1。 有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加 1 的 工作可以交给定时器/计数器处理。CPU 转而处理一些复杂的事情。同时可以实现精确定时作用。

3.1 定时器介绍

3.1.1单片机定时器原理

STC89C5X 单片机内有两个可编程的定时/计数器 T0、T1 和一个特殊功能定时器 T2。定时/计数器的实质是加 1 计数器(16 位),由高 8 位和低 8 位两个寄存器 THx 和 TLx 组成。它随着计数器的输入脉冲进行自加 1,也就是每来一个脉冲,计数器就自动加 1,当加到计数器为全 1 时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置 1,向 CPU 发出中断请求(定时 /计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到; 如果工作于计数模式,则表示计数值已满。可见,由溢出时计数器的值减去计数 初值才是加 1 计数器的计数值。

3.3.2单片机定时/计数器结构

51 单片机定时器/计数器内部结构如下所示:

  上图中的 T0 和 T1 引脚对应的是单片机 P3.4 和 P3.5 管脚。51 单片机定时/ 计数器的工作由两个特殊功能寄存器控制。TMOD 是定时/计数器的工作方式寄存 器,确定工作方式和功能;TCON 是控制寄存器,控制 T0、T1 的启动和停止及 设置溢出标志。

1,工作方式寄存器 TMOD

工作方式寄存器 TMOD 用于设置定时/计数器的工作方式,低四位用于 T0,高 四位用于 T1。其格式如下:

GATE 是门控位, GATE=0 时,用于控制定时器的启动是否受外部中断源信号 的影响。只要用软件使 TCON 中的 TR0 或 TR1 为 1,就可以启动定时/计数器工作; GATA=1 时,要用软件使 TR0 或 TR1 为 1,同时外部中断引脚 INT0/1 也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了 INT0/1 引脚 为高电平这一条件。 C/T :定时/计数模式选择位。C/T =0 为定时模式;C/T =1 为计数模式。

M1M0:工作方式设置位。定时/计数器有四种工作方式。

(1)方式 0 :方式 0 为 13 位计数,由 TL0 的低 5 位(高 3 位未用)和 TH0 的 8 位组成。 TL0 的低 5 位溢出时向 TH0 进位,TH0 溢出时,置位 TCON 中的 TF0 标志,向 CPU 发出中断请求。其结构图如下所示:

门控位 GATE 具有特殊的作用。当 GATE=0 时,经反相后使或门输出为 1,此 时仅由 TR0 控制与门的开启,与门输出 1 时,控制开关接通,计数开始;当 GATE=1 时,由外中断引脚信号控制或门的输出,此时控制与门的开启由外中断引脚信号 和 TR0 共同控制。当 TR0=1 时,外中断引脚信号引脚的高电平启动计数,外中断 引脚信号引脚的低电平停止计数。这种方式常用来测量外中断引脚上正脉冲的宽 度。计数模式时,计数脉冲是 T0 引脚上的外部脉冲。计数初值与计数个数的关 系为:X=2 13-N。

(2)方式 1 :方式 1 的计数位数是 16 位,由 TL0 作为低 8 位,TH0 作为高 8 位,组成了 16 位加 1 计数器。其结构图如下所示:

计数初值与计数个数的关系为:X=2 16-N。

2,控制寄存器  TCON

TCON 的低 4 位用于控制外部中断。TCON 的高 4 位用于控制定时/计数器的启动和中断申请。其格式如下:

TF1(TCON.7):T1 溢出中断请求标志位。T1 计数溢出时由硬件自动置 TF1 为 1。CPU 响应中断后 TF1 由硬件自动清 0。T1 工作时,CPU 可随时查询 TF1 的 状态。所以,TF1 可用作查询测试的标志。TF1 也可以用软件置 1 或清 0,同硬 件置 1 或清 0 的效果一样。

TR1(TCON.6):T1 运行控制位。TR1 置 1 时,T1 开始工作;TR1 置 0 时, T1 停止工作。TR1 由软件置 1 或清 0。所以,用软件可控制定时/计数器的启动与停止。使用时要打开。

TF0(TCON.5):T0 溢出中断请求标志位,其功能与 TF1 类同。 TR0(TCON.4):T0 运行控制位,其功能与 TR1 类同。

3.2 定时器配置

其步骤如下(各步骤顺序可任 意):

  • ①对 TMOD 赋值,以确定 T0 和 T1 的工作方式,如果使用定时器 0 即对 T0 配 置,如果使用定时器 1 即对 T1 配置。
  • ②根据所要定时的时间计算初值,并将其写入 TH0、TL0 或 TH1、TL1。
  • ③如果使用中断,则对 EA 赋值,开放定时器中断。
  • ④使 TR0 或TR1 置位,启动定时/计数器定时或计数。
void time0_init(void)
{
TMOD|=0X01;//选择为定时器 0 模式,工作方式 1
TH0=0XFC; //给定时器赋初值,定时 1ms
TL0=0X18;
ET0=1;//打开定时器 0 中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}

3.3 硬件设计 

本实验使用到硬件资源如下: (1)独立按键模块(K3) (2)LED 模块 

3.4 软件设计

通过定时器 0 中断控制 D1 指示

#include "reg52.h"
typedef unsigned int u16;//对系统默认数据类型进行重定义
typedef unsigned char u8;
//定义 LED1 管脚
sbit LED1=P2^0;

void delay_10us(u16 ten_us)
{
while(ten_us--);
}

void time0_init(void)
{
TMOD|=0X01;//选择为定时器 0 模式,工作方式 1
TH0=0XFC; //给定时器赋初值,定时 1ms
TL0=0X18;
ET0=1;//打开定时器 0 中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}

void main()
{
time0_init();//定时器 0 中断配置
while(1)
{
}
}
void time0() interrupt 1 //定时器 0 中断函数
{
static u16 i;//定义静态变量 i
TH0=0XFC; //给定时器赋初值,定时 1ms
TL0=0X18;
i++;
if(i==1000)
{
i=0;
LED1=!LED1;
}
}

串口通信实验

随着单片机系统的广泛应用和计算机网络技术的普及,单片机的通信功能愈 来愈显得重要。在 WIFI、蓝牙、GPS、GSM/GPRS 等应用的控制无不体现串口通信 的重要性。学习 51 单片机重点及难点内容主要有中断、 定时/计数器、串口通信,而定时/计数器在完成功能时要用到中断,串口通信使用时要用到定时器中断。 51 单片机的串口通信。开发板上集成了 1 个串口通信电路,是 USB 转串口模块,它既可下载程序也可实现串口通信功能。内容如下:

1.通信的基本概念

2.51 单片机串口介绍

3.硬件设计

4.软件设计

1.通信的基本概念

51 单片机不仅可以实现串口通信,还可以通过 IO 口模拟实现多种其他通信,比如 SPI、IIC 等,学习这些通信前,我们了解下通信的基本概念。通信的方式可以分为多种,按照数据传送方式可分为串行通信和并行通信。按照通信的数据同步方法,可分为异同通信和同步通信(时钟区别)。按照数据的传输方向又可分为单工、半双工和全双工通信。

通信速率

衡量通信性能的一个非常重要的参数就是通信速率,通常以比特率(Bitrate) 来表示。比特率是每秒钟传输二进制代码的位数,单位是:位/秒( bps)。

如每秒钟传送 240 个字符,而每个字符格式包含 10 位(1 个起始位、1 个停止位、 8 个数据位),这时的比特率为: 10 位×240 个/秒 = 2400 bps

“波特率”表示每秒钟传输了多少个码元。而码元是通信信号调制的概念,通信中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元。如常见的通信传输中,用 0V 表示数字 0,5V 表 示数字 1,那么一个码元可以表示两种状态 0 和 1,所以一个码元等于一个二 进制比特位,此时波特率的大小与比特率一致;如果在通信传输中,有 0V、 2V、 4V 以及 6V 分别表示二进制数 00、 01、 10、 11,那么每个码元可以表示四种状态,即两个二进制比特位,所以码元数是二进制比特位数的一半,这个时候 的波特率为比特率的一半。由于很多常见的通信中一个码元都是表示两种状态, 所以我们常常直接以波特率来表示比特率。

2.单片机串口介绍

2.1 串口通信简介

串口通信(Serial Communication),是指外设和计算机间通过数据信号线、 地线等按位进行传输数据的一种通信方式,属于串行通信方式。

串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。

(1)接口标准

串口通信的接口标准有很多,有 RS-232C、 RS-232、 RS-422A、 RS-485 等。 常用的是 RS-232 和 RS-485。RS-232 其实是 RS-232C 的改进,原理是一样的。

这里我们就以 RS-232C 接口进行实现。 RS-232C 是 EIA(美国电子工业协会)1969 年修订 RS-232C 标准。RS-232C 定义了数据终端设备(DTE)与数据通信设备(DCE)之间的物理接口标准。 RS-232C 接口规定使用 25 针连接器,简称 DB25,连接器的尺寸及每个插 针的排列位置都有明确的定义。RS-232C 还有一种 9 针的非标准连接器接口,简称 DB9。串口通信使用的大多都是 DB9 接口。DB25 和 DB9 接头有公头和母头之分,其中带针状的接头是 公头,而带孔状的接头是母头。两种接口如下图所示:

从上图中可以看到公头和母头的管脚定义顺序是不一样, 9 针串口和 25 针串口常用管脚的功能说明如下图所示:

 在串口通信中,通常我们只使用 2、3、5 三个管脚,即 TXD、RXD、SGND。

RS-232C 对逻辑电平也做了规定,如下:

在 TXD 和 RXD 数据线上:

1.逻辑 1 为-3~-15V 的电压   2.逻辑 0 为 3~15V 的电压

在 RTS、CTS、DSR、DTR 和 DCD 等控制线上: 1.信号有效( ON 状态) 为 3~15V 的电压 2.信号无效( OFF 状态) 为-3~-15V 的电压

由此可见,RS-232C 是用正负电压来表示逻辑状态,与晶体管-晶体管逻辑集成电路(TTL)以高低电平表示逻辑状态的规定正好相反。而我们 51 单片机使用 的就是 TTL 电平,所以要实现 51 单片机与计算机的串口通信,需要进行 TTL 与 RS-232C 电平转换,通常使用的电平转换芯片是 MAX232。

在串口通信中通常 PC 机的 DB9 为公头,单片机上使用的串口 DB9 为母头, 通过一根直通串口线进行相连。在 9 针串口线实物图即为直通型串口线,串口线 (COM)母头连接计算机 DB9 的公头,串口线公头连接单片机上使用的 DB9 母 头,这样就是将 2、3、5 管脚直接相连。如果你要实现两台计算机串口通信, 那么就需要一根交叉串口线,将 2 对 3、3 对 2、5 对 5 连接,交叉串口线一 般两头都是母头。

串口通信中还需要注意的是,串口数据收发线要交叉连接,计算机的 TXD 要对应单片机的 RXD,计算机的 RXD 要对应单片机的 TXD,并且共 GND,如下 图:

  (2)通信协议

RS232 的通信协议比较简单,通常遵循 96-N-8-1 格式。

“96”表示的是通信波特率为 9600。串口通信中通常使用的是异步串口通信,即没有时钟线,所以两个设备要通信,必须要保持一致的波特率,当然,波 247 特率常用值还有 4800、 115200 等。 “N”表示的是无校验位,由于串口通信相对更容易受到外部干扰导致传输 数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验 (odd)、偶校验(even)、0 校验(space)、1 校验(mark)以及无校验(noparity)。 “8”表示的是数据位数为 8 位,其数据格式在前面介绍异步通信中已讲过。 当然数据位数还可以为 5、6、7 位长度。 “1”表示的是 1 位停止位,串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑 0 的数据位表示,而数据包的停止信号可由 0.5、1、1.5 或 2 个逻辑 1 的数据位表示,只要双方约定一致即可。

(3)串口内部结构

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

2.2 串口相关寄存器

(1)串口控制寄存器 SCON

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

 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,取消此中断申请。

(2)电源控制寄存器 PCON

SMOD:波特率倍增位。在串口方式 1、方式 2、方式 3 时,波特率与 SMOD 有 关,当 SMOD=1 时,波特率提高一倍。复位时,SMOD=0。

2.3 串口工作方式

2.3.1 方式 0

方式 0 时,串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输入或输出口。数据由 RXD(P3.0)引脚输入或输出,同步移位脉冲由 TXD(P3.1) 引脚输出。发送和接收均为 8 位数据,低位在先,高位在后。波特率固定为 fosc/12。对应的输入输出时序图如下所示:

①方式 0 输出        <------方向

 

②方式 0 输入

 2.3.2 方式 1

方式 1 是 10 位数据的异步通信口。TXD 为数据发送引脚,RXD 为数据接收引 脚,传送一帧数据的格式如下所示。其中 1 位起始位,8 位数据位,1 位停止位。 对应的输入输出时序图如下所示:

①方式 1 输出

 ②方式 1 输入

 用软件置 REN 为 1 时,接收器以所选择波特率的 16 倍速率采样 RXD 引脚电 平,检测到 RXD 引脚输入电平发生负跳变时,则说明起始位有效,将其移入输入 移位寄存器,并开始接收这一帧信息的其余位。接收过程中,数据从输入移位寄 存器右边移入,起始位移至输入移位寄存器最左边时,控制电路进行最后一次移 位。当 RI=0,且 SM2=0(或接收到的停止位为 1)时,将接收到的 9 位数据的前 8 位数据装入接收 SBUF,第 9 位(停止位)进入 RB8,并置 RI=1,向 CPU 请求中断。

2.3.3 方式 2 和方式 3

方式 2 或方式 3 时为 11 位数据的异步通信口。TXD 为数据发送引脚,RXD 为 数据接收引脚。其数据格式如下所示:

 对应的输入输出时序图如下所示:

①方式 2、方式 3 输出

 发送开始时,先把起始位 0 输出到 TXD 引脚,然后发送移位寄存器的输出位 (D0)到 TXD 引脚。每一个移位脉冲都使输出移位寄存器的各位右移一位,并由 TXD 引脚输出。第一次移位时,停止位“1”移入输出移位寄存器的第 9 位上, 以后每次移位,左边都移入 0。当停止位移至输出位时,左边其余位全为 0,检 测电路检测到这一条件时,使控制电路进行最后一次移位,并置 TI=1,向 CPU 请求中断。

②方式 2、方式 3 输入

接收时,数据从右边移入输入移位寄存器,在起始位 0 移到最左边时,控制 电路进行最后一次移位。当 RI=0,且 SM2=0(或接收到的第 9 位数据为 1)时, 接收到的数据装入接收缓冲器 SBUF 和 RB8(接收数据的第 9 位),置 RI=1,向 CPU 请求中断。如果条件不满足,则数据丢失,且不置位 RI,继续搜索 RXD 引脚的负跳变。

2.4 串口的使用方法

(1)如何计算波特率 在学习 51 单片机串口时,非常重要的一点是学会如何计算波特率。以下列 出了几种方式下波特率的计算公式:

方式 0 的波特率 = fosc/12

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

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

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

其中 T1 溢出率 = fosc /{12×[256 -(TH1)]},

也可以使用  51波特率初值计算^__^

(2)串口初始化步骤 254 如何使用串口,大家可以按照以下几个步骤配置。 ①确定 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

3.硬件设计

 通过 CH340 芯片把 51 单片机的串口与 PC 机的 USB 口 进行连接,不仅可以实现程序的烧入,还可实现串口通信功能。根据前面介绍, 串口通信需将数据收发管脚交叉连接,所以可以看到在 CH340 芯片的 2 和 3 脚 已做处理。电路中其他部分是自动下载电路部分,目的是控制单片机的电源,无 需冷启动。使用 USB 转串口芯片,免去了一根串口线,使用普通 USB 数据线(支 持安卓手机数据线)就可以进行串口通信。 从上图中可以看到 CH340 的 2、3 脚串口并非直接连接到单片机串口,而是 连接在 P5 端子上,这样就把 CH340 的串口与单片机串口独立出来,不直接连接而要使用这个 P5 端子是方便用户可以使用开发板上的 USB 转 TTL 模块(也就是 CH340 转串口模块)做一些串口类模块的调试,比如:WIFI、蓝牙、 GPS、GPRS 等,直接利用 PC 上位机来调试模块。同时也方便用户使用板载 USB 转 TTL 模块给其它类型单片机下载程序。 如果使用黄色跳线帽将 P5 端子的 1、2 短接,3、4 短接,那么 CH340 串口与 单片机串口是连接一起的,此时即可实现程序的下载或串口通信。

4.软件设计

当串口助手发送数据给单片机,单片机原封不动转 发给串口助手显示。

#include "reg52.h"
typedef unsigned int u16;//对系统默认数据类型进行重定义
typedef unsigned char u8;

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

void main()
{
uart_init(0XFA);//波特率为 9600
while(1)
{
}
}
void uart() interrupt 4 //串口通信中断函数
{
u8 rec_data;
RI = 0; //清除接收中断标志位
rec_data=SBUF; //存储接收到的数据
SBUF=rec_data; //将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值