51单片机学习记录(三)中断系统

发布时间:2024-11-02 13:01

文章目录

  • 1、中断系统介绍
    • 1、中断概念
    • 2、中断相关寄存器
    • 3、中断服务函数
  • 2、定时器中断
    • 1、单片机中的时序
    • 2、51单片机的定时器
    • 3、相关的寄存器
    • 4、定时器配置
    • 5、定时器配置
  • 3、串口中断
    • 1、串口中断相关寄存器
    • 2、波特率计算

前面讲到了关于51单片机的中断,串口通信,但是他的中断系统没有详细介绍,因此这里就来把他的中断系统做一个理清。

注:下面内容参考普中科技51单片机教程

1、中断系统介绍

1、中断概念

首先还是中断系统的流程,就是发生中断后的处理过程:
\"51单片机学习记录(三)中断系统_第1张图片\"
相关概念,下面例举一些后面可能出现的概念,可能会在后面出现的:

  • 中断源:引起CPU中断的因素
  • 中断优先级:当同时有多个CPU发生中断的时候多个中断源根据中断优先级来排队(高优先级打断低优先级中断就会发生中断嵌套现象

51单片机上的中断系统可以总结为:

  • 外部中断O(INTO)
  • 外部中断 1(INT1)
  • 外部中断 2(INT2)
  • 外部中断 3(INT3)
  • 定时器 0中断
  • 定时器 1 中断
  • 定时器 2 中断
  • 串口(UART)中断

这里需要注意的就是外部中断2和3还有定时器2中断有些51不一定有,这里需要慎用,这里51一共有四个中断优先级(差一点的只有2个中断优先级)

普中这里还提供了相关的中断查询表

如果设定的中断优先级相同的话,中断执行的先后要按照下表中的相同优先级内的查询次序来决定:
\"51单片机学习记录(三)中断系统_第2张图片\"

2、中断相关寄存器

这里51单片机对中断的控制都在一个叫中断允许寄存器IE来进行控制的,这里也是用普中给的这个图来看
\"51单片机学习记录(三)中断系统_第3张图片\"
相关位的说明如下:

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

开启了中断之后获取中断请求需要读取中断请求标志,也是一个寄存器为TCON,如下所示:
\"51单片机学习记录(三)中断系统_第4张图片\"
相关位的说明如下:

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

下面就是中断优先级和中断号了:
\"51单片机学习记录(三)中断系统_第5张图片\"
中断号如下所示:
\"51单片机学习记录(三)中断系统_第6张图片\"
综上就是一个中断的所有过程了,那么我们要想自己的中断被响应,就需要:

  • 中断源设置了中断请求
  • 中断源中断允许被触发
  • 总中断开启(EA=1)

3、中断服务函数

如果我们编写一个外部中断的函数,配置如下,在中断函数中 exit0()是函数名, 可自定义, 但必须符合 C 语言标识符定义规则,interrupt 是一个关键字, 表示 51 单片机中断。 后面的“0” 是中断号, 外部中断 0 中断号为 0, 这个可参考前面的内容
\"51单片机学习记录(三)中断系统_第7张图片\"
相关寄存器的说明在前面已经介绍过了,可以往上查看,源码如下:

void exit0_init(void)
{
    IT0=1; //下降沿触发
    EX0=1; //int0中断打开
    EA=1; //打开总中断
}
void exit0() interrupt 0 //外部中断0的中断服务函数
{
    if(KEY3 == 0)
        LED1 = !LED1;
}

2、定时器中断

1、单片机中的时序

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

2、51单片机的定时器

51单片机的定时器是一个16位的自增计数器,由两个8位寄存器组成,为THx还有TLx,输入一个时钟脉冲,计数器自增,当增加到我们设定的计数值的时候,就会溢出并使能相应的标志位为1。

3、相关的寄存器

下面是工作方式寄存器,根据这个寄存器中M1,M2的取值,定时器可以有四种工作方式,同时可以看到这个寄存器其实可以拆分成高四位还有低四位,GATE是一个门控位,就是如果这个位置1的话,定时器的开启要多一个步骤了(多的这个步骤为外部信号触发,就是是否需要外部信号触发才能打开
\"51单片机学习记录(三)中断系统_第8张图片\"
C/T是计数模式选择位,就是选择是定时模式(0)还是计数模式(1),M1M0是工作方式设置位。 根据M1M0的选择定时/计数器的四种工作方式如下所示:
\"51单片机学习记录(三)中断系统_第9张图片\"
下面是控制寄存器的说明:
\"在这里插入图片描述\"
说明如下:

下面是四个定时器的工作方式介绍:

4、定时器配置

定时器的配置如下,下面顺序不分先后
\"51单片机学习记录(三)中断系统_第10张图片\"
下面是定时器计数时间的计算,这里需要注意就是定时时间的计算方式:
\"51单片机学习记录(三)中断系统_第11张图片\"

5、定时器配置

根据上面的部分,可以对定时器进行配置,如下所示:
\"51单片机学习记录(三)中断系统_第12张图片\"
下面是源代码,相关寄存器都可以在上文查到

void time0_init(void)
{
    TMOD=0x01;
    TH0=0xFC;
    TL0=0x18;
    ET0=1;
    EA=1;
    TR0=1;
}

void time0() interrupt 1
{
    static u16 i;
    TH0=0xFC;
    TL0=0x18;
    i++;
    if(i == 1000)
    {
        i=0;
        LED1 = !LED1;
    }
}

或者我们也可以直接在官方提供的工具里面生成:
\"51单片机学习记录(三)中断系统_第13张图片\"

3、串口中断

1、串口中断相关寄存器

下面是串口控制寄存器的描述:
\"在这里插入图片描述\"
其中SM0还有SM1决定了串口的四种工作方式:
\"51单片机学习记录(三)中断系统_第14张图片\"
相关寄存器的说明我根据参考资料画了一张表:

补充上面没有说到的位,REN,REN是串口接收使能为,软件置REN=1的话就会启动串口接收数据,反之就会关闭串口数据接收。

下面是电源控制寄存器,电源控制寄存器的说明如下:
\"51单片机学习记录(三)中断系统_第15张图片\"
其中SMOD寄存器决定了波特率是否倍增,当SMOD=1的时候,波特率就会倍增。

下面对定时器的四种模式进行说明:

2、波特率计算

这边波特率也可以用官方工具来计算
\"51单片机学习记录(三)中断系统_第16张图片\"

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号