目录

  • 1.中断系统的概念
    • 1.1中断的概念
    • 1.2中断系统的概念
    • 1.3中断系统的优点
    • 1.4我们要说的三种中断源
  • 2.外部中断
    • 2.1 外部中断0 代码示范
    • 2.2 外部中断 分析
  • 3.计数/定时器中断
    • 3.1 计数/定时器中断0 代码示范
    • 3.2 计数/定时器 分析
      • 3.2.1 计数/定时器的概念
      • 3.2.2 计数/定时器的工作原理
      • 3.2.3 计数/定时器的结构
      • 3.2.4 计数/定时器初值的设置
    • 3.3 小练笔
  • 4.串行口中断
    • 4.1串行口中断通信 代码示范
    • 4.2串行口中断通信分析
      • 4.2.1 80C51串行口的结构
      • 4.2.2 使用到的新寄存器
      • 4.2.3 波特率的设置
    • 4.3串口如何使用
  • 5.参考资料

1.中断系统的概念

1.1中断的概念

CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);

CPU暂时中断当前的工作,转去处理事件B(中断响应中断服务);

待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断

1.2中断系统的概念

引起CPU中断的根源,称为中断源

中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统

1.3中断系统的优点

  • 解决了快速主机与慢速I/O设备的数据传送问题
  • 分时操作。CPU可以分时为多个I/O设备服务,提高了计算机的利用率;
  • 实时响应。CPU能够及时处理应用系统的随机事件,系统的实时性大大增强;
  • 可靠性高。CPU具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高。

1.4我们要说的三种中断源

89C51/52的中断系统有5个中断源 ,2个优先级,可实现二级中断嵌套 。

分别是外部中断0、计数/定时器中断0、外部中断1、计数/定时器中断1、串行通信中断。

我们以外部中断0、计数/定时器中断0和串口通信中断来说说。

下面这张图很关键,无论是那个中断都要走这个流程

TCON 定时/计数器控制寄存器

  • 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溢出中断请求标志位

IE 中断允许控制寄存器,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中断允许(总允许)位。

IP 中断优先级控制寄存器
这个我们一般不改,用缺省值,
外部中断0 > 计数/定时器中断0 > 外部中断1 > 计数/定时器中断1 > 串行通信中断
为什么是这样的排序呢?因为在单片机的ROM他们的入口地址也是按照这个顺序排序的。

要记住的是中断号,这在后面很重要

所以如果要有一个中断产生,要符合这样的顺序,以下三条同时满足时,CPU才有可能响应中断。

51单片机的中断优先级有三条原则

  1. CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。
  2. 正在进行的中断过程不能被新的同级或低优先级的中断请求所中断
  3. 正在进行的低优先级中断服务,能被高优先级中断请求所中断

为了实现上述后两条原则,中断系统内部设有两个用户不能寻址的优先级状态触发器。其中一个置1,表示正在响应高优先级的中断,它将阻断后来所有的中断请求;另一个置1,表示正在响应低优先级中断,它将阻断后来所有的低优先级中断请求。

2.外部中断

2.1 外部中断0 代码示范

/* 用外部中断0来控制led灯闪烁 */
#include<reg51.h>typedef unsigned char u8;
typedef unsigned int u16;sbit led = P2^0;
sbit K3 = P3^2;void delay(u16 i)
{while(i--);
}void Int0Init() //初始化函数,你也可以写在主函数里面
{IT0 = 1; //TCON寄存器中,IT0是外部中断0 的触发方式控制位,ITO = 1,下降沿有效触发EX0 = 1; //IE寄存器中,外部中断0允许位置1EA = 1;  //IE寄存器中,CPU中断允许总开关
}void main()
{Int0Init();//初始化函数while(1); //在这里等待被外部中断0打断
}void Int0() interrupt 0   //外部中断0的中断函数,函数名可以定义,interrupt 后面的中断号不能出错
{delay(1000);//按键消抖if(K3==0)// k3被按下{led = ~led;}
}

2.2 外部中断 分析


可以看到,外部中断是非常符合上面这个中断流程的

打个比方,我要在床上吹风扇,我自己的电线不够长,我要用我室友的插排。首先我先要和室友请求,室友同意我就插上去了,最后需要室友把总开关打开,我才能吹到风扇。

3.计数/定时器中断

3.1 计数/定时器中断0 代码示范

#include<reg51.h>typedef unsigned char u8;
typedef unsigned int u16;sbit led = P2^0;
static u16 i;void Time0Init() //初始化函数,你也可以写在主函数里面
{TMOD|=0x01; //工作方式寄存器TMOD TH0 = 0xFC;  //给寄存器赋值 TL0 = 0x66;TR0 = 1;    //中断请求标志,置位1,启动定时/计数器工作 (控制寄存器TCON) ET0 = 1;    //计数器中断0允许控制位置1(中断允许寄存器IE) EA = 1;      //IE寄存器中,CPU中断允许总开关EA置1.} void main()
{Time0Init(); //初始化函数while(1){if(i == 1000)//每1000ms led状态翻转一次{i = 0;led = ~led;}}}void Time0() interrupt 1
{TH0 = 0xFC; //给寄存器赋值TL0 = 0x66;i++;  //每次加1,一次是 1ms
}

3.2 计数/定时器 分析

其实根据我们上面的分析,我们只要知道下面这段初始化代码的含义就可以了

TMOD|=0x01; //工作方式寄存器TMOD
TH0 = 0xFC;  //给寄存器赋值
TL0 = 0x66;

3.2.1 计数/定时器的概念

定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。

51单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据加1。

有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加1的工作可以交给定时器/计数器处理。CPU转而处理一些复杂的事情。同时可以实现精确定时作用。

3.2.2 计数/定时器的工作原理

定时/计数器实质上是一个加1计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动加1,,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置1,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。

可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。

这个原理决定了我们给计数/定时器的16位寄存器赋值的问题。

3.2.3 计数/定时器的结构

定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器THx和TLx组成。
TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;(这个前面没有)
TCON是定时/计数器的控制寄存器,控制T0、T1的启动和停止及设置溢出标志。(这个前面有)

TMOD 定时/计数器工作方式寄存器, 低四位用于T0,高四位用于T1.

GATE是门控位, 通常我们让GATE等于0,这样方便一些。

  • GATE=0时,用于控制定时器的启动是否受外部中断源信号的影响。只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;

  • GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚INT0/1也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了INT0/1引脚为高电平这一条件。

    C/T :定时/计数模式选择位。C/T =0为定时模式;C/T =1为计数模式。
    M1M0:工作方式设置位。定时/计数器有四种工作方式。

TIP:主要需要掌握方式1和方式2

  • 方式1一般是我们定时/计数器中断常用的。
  • 方式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类同。

这里主要说一下方式1和方式2
方式1
方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位,组成了16位加1计数器 。
TL0的8位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。


方式2
方式2为自动重装初值的8位计数方式。
计数个数与计数初值的关系为:X=2^8-N
工作方式2特别适合于用作较精确的脉冲信号发生器。

3.2.4 计数/定时器初值的设置

51单片机内部时钟频率是外部时钟的12分频。也就是说当外部晶振的频率输入到单片机里面的时候要进行12分频。比如说你用的是12MHZ的晶振,那么单片机内部的时钟频率就是12/12MHZ,当你使用12MHZ的外部晶振的时候。

机器周期=1/1M=1us。而我们定时1ms的初值是多少呢,1ms/1us=1000

也就是要计数1000个数,初值=65535-1000+1(因为实际上计数器计数到66636才溢出)=64536=FC18H

我们一般使用定时器工具,比较轻松就可以设置初值了。(需要这个工具的朋友可以在评论区留下邮箱)

3.3 小练笔

用 定时计数器中断 和 动态八段数码管 做一个两位秒表:https://blog.csdn.net/m0_50679156/article/details/120097808

4.串行口中断

4.1串行口中断通信 代码示范

/*pc连接51单片机,用串口助手发送一个数字会加1返回*/
#include<reg52.h>typedef unsigned char u8;
typedef unsigned int u16;void UstartInit()//串口初始化设置
{TMOD = 0x20; //确定T1的工作方式(设置GATE,C/T非,M1M0 = 10 方式2 ,高四位用于T1) TH1 = 0xF4;  //高8位 TL1 = 0xF4;  //低8位 PCON = 0x80; //PCON中只有一位SMOD(最高位)与串行口工作有关 ,SMOD为1是波特率提高一倍 TR1 = 1;     // 启动定时/计数器T1 定时或计数 SCON = 0x50; // 0101 0000 设置串行口工作方式,方式1(10位异步收发器(8位数据)) ES = 1;     // 串行口中断允许 (IE寄存器)EA = 1;     // CPU 中断总允许位 (IE寄存器)
}void main()
{UstartInit();while(1);
}void startInit() interrupt 4
{u8 ReceiveData;ReceiveData = SBUF;RI = 0; //准备下次接受 SBUF = ReceiveData + 1;while(!TI);TI = 0; //准备下次发送
}

4.2串行口中断通信分析

对于串口通信不是我们这篇博客分析的重点,主要说一下串行口中断

4.2.1 80C51串行口的结构

有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H
这个概念很重要,SBUF是像是李信,光信和暗信是一个英雄,但是有不同的技能和外观。

下面代码中的SBUF,一个是光信,一个是暗信,你懂了么?会心一笑的请点赞。

void startInit() interrupt 4
{u8 ReceiveData;ReceiveData = SBUF;RI = 0; //准备下次接受 SBUF = ReceiveData + 1;while(!TI);TI = 0; //准备下次发送
}

接收器是双缓冲结构 ;发送缓冲器,因为发送时CPU是主动的,不会产生重叠错误。

4.2.2 使用到的新寄存器

SCON(串行口控制寄存器) 是一个特殊功能寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志

这个寄存器完全为串行口服务

SM0SM1为工作方式选择位,可选择四种工作方式

  • 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,可以实现多机通信。
    在方式0时,SM2必须是0。在方式1时,如果SM2=1,则只有接收到有效停止位时,RI才置1。
  • REN允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。
  • TB8在方式2或方式3中,是发送数据的第九位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。
    在方式0和方式1中,该位未用。
  • RB8在方式2或方式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位在方式1时,若SM2=0,则RB8是接收到的停止位。
  • TI发送中断标志位在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请
  • RI接收中断标志位。在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请

PCON 电源控制寄存器,中只有一位SMOD与串行口工作有关


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


我们主要使用方式1来进行串口通信,所以我们就主要讲讲方式1

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


1、方式1输出:

2、方式1输入:


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

4.2.3 波特率的设置

在串行通信中,收发双方对发送或接收数据的速率要有约定。通过软件可对单片机串行口编程为四种工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率来决定。

串行口的四种工作方式对应三种波特率。由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。

方式0的波特率 = fosc/12
方式2的波特率 =(2SMOD/64)· fosc
方式1的波特率 =(2SMOD/32)·(T1溢出率)
方式3的波特率 =(2SMOD/32)·(T1溢出率)

当T1作为波特率发生器时,最典型的用法是使T1工作在自动再装入的8位定时器方式(即方式2,且TCON的TR1(定时/计数器1运行控制位)=1,以启动定时器)。
这时溢出率取决于TH1中的计数值。T1 溢出率 = fosc /{ 12×[256 -(TH1)]}
在单片机的应用中,常用的晶振频率为:12MHz和11.0592MHz。所以,选用的波特率也相对固定。常用的串行口波特率以及各参数的关系如表所示。

4.3串口如何使用

串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1串行口控制中断控制
具体步骤如下:

  1. 确定T1的工作方式(编程TMOD寄存器);
  2. 计算T1的初值,装载TH1、TL1;
  3. 启动T1(编程TCON中的TR1位);
  4. 确定串行口控制(编程SCON寄存器);
  5. 串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。

5.参考资料

  1. 普中科技A2开发板参考资料
  2. 《单片机原理及应用》(第四版)
  3. 《新概念51单片机C语言教程》郭天祥编著
  4. 单片机原理及应用课堂笔记

快速复习51单片机的外部中断、计数/定时器中断和串行口中断,加代码实现相关推荐

  1. 串行口中断服务函数的触发条件-------TI/RI 触发

    串行口中断服务函数和其他中断本质上是一样的,达到特定的条件,向CPU申请中断,进入中断服务函数: 我特意在郭天祥老师的书上找到了一句话:当数据被写入SBUF寄存器后,单片机自动开始从起始位发送数据,发 ...

  2. 51汇编——定时器中断、串行口中断

    定时1s亮灭10次 ORG 0000H LJMP MAIN ORG 000BH LJMP TIMER0 ORG 0030H MAIN: MOV R0,#10 ;循环10次,使定时100ms*10产生1 ...

  3. 51单片机—详细(存储器RAM/ROM、引脚、中断系统、定时/计数器、串行口通信)

    目录 一.数据存储器RAM 1.拓展RAM 2.片内256字节 1.高128位(80H~FFH) 2.低128位(00H~7FH) 二.程序存储器ROM 三.引脚 1.4组8位并行I/O口 2.其他引 ...

  4. 51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

    目录 1. 串口通信原理 2. 51单片机串口通信 2.1 串口简要模式图 2.2 相关寄存器 (1)PCON.SCON.SBUF (2)IE.IPH.IP (3)配置T1定时器 2.3 波特率和系统 ...

  5. 单片机学习笔记(四)——串行口

    51单片机内部有一个全双工的异步通信串行口,有四种工作方式波特率可由软件设置片内的定时器/计数器来控制.特殊功能寄存器SCON和PCON用来对串行口进行控制.下面先介绍这两个寄存器: 1.SCON 字 ...

  6. 51汇编练习——串行口的传输

    编写一个发送程序:采用串口工作方式1将8051单片机P1口采集的8位数据实时串行传输.无需奇偶校验,采用中断方式.波特率为9600波特(晶振频率为11.0592MHz). ORG 0000H LJMP ...

  7. 51单片机之外部中断拙见

    外部中断需要注意的点 1. 外部中断其实是包含在中断系统中的,STC89Cx系列单片机提供4个外部中断:外部中断0(INT0),外部中断1(INT1),外部中断2(INT2),外部中断3(INT3) ...

  8. 51单片机:外部中断实现流水灯

    51单片机:外部中断实现流水灯 作业要求: 按照给定的实验板电路图编程实现外部中断控制流水灯,初始上电时,实验板右下侧的流水灯区域只有最右侧LED灯亮,其他灯全都熄灭,每按下一次按键,流水灯从右向左流 ...

  9. 51单片机之外部引脚及总线接口

    51单片机之外部引脚及总线接口 MCS-51系列外部引脚 总线结构: 冯诺依曼结构: 哈弗结构: 寻址空间的区分: MCS-51系列外部引脚 记忆方法: 1.在前面的存储器和特殊功能寄存器篇讲过,标志 ...

最新文章

  1. 企业网络推广期间对于易流失用户群体企业网络推广有话说
  2. Unity技术专家:游戏最重要的是好玩而不是高画质...
  3. struts 模块化开发学习
  4. python适合什么样的人群_什么样的人比较适合选择Python开发+人工智能技术?
  5. 微信小程序错误 Cloud API isn‘t enabled, please call wx.cloud.init first 解决
  6. java 对象protected,Java对象类protected void finalize throws Throwable方法示例
  7. 一些老程序员不错的经验分享
  8. 我能想到最赛博朋克的事,就是为全世界的工程师雕刻一尊“虚拟分身”
  9. Himawari-8葵花8标准数据(HSD)文件命名规则
  10. jpg格式的矢量化arcgis_ArcGIS实践教程(11)图形的批量矢量化
  11. 串口调试助手fx2n_PLC串口调试软件(PLC串口通信调试)
  12. Android 获取地理位置的经度和纬度
  13. 2015~2020年中国房价走势
  14. 珀莱雅:融资净买入201.72万元,融资余额2.52亿元
  15. ROC曲线/AUC(全)
  16. 鲸探发布点评:9月21日发售高分一号、七号卫星数字藏品
  17. 为什么巡检在工业生产中如此重要?
  18. Python:tkinter Canvas 删除/清理元素方法
  19. c语言学习2(求矩形面积)
  20. 清华大学(深圳)吕帅课题组招收计算机领域博士后

热门文章

  1. C语言 | 拯救公主(源代码)
  2. ubuntu联网_高云半导体EDA开发工具增加了对Ubuntu的支持,集成人工智能和物联网开发工具链...
  3. SSH authorized_keys 无效问题
  4. autocad.net 画多段线_auto CAD 二次开发 c#.net 之JIG画多段线(polyline)
  5. 致联智能空调控制器,让传统空调秒变智能
  6. 篮球2022.4.3比赛总结
  7. AWStats+QQ纯真库IP解析插件安装
  8. SPSS + AMOS 结构方程模型(SEM)
  9. 怎么查看IP地址是否在同一网段
  10. bulk material