文章目录
前面讲到了关于51单片机的中断,串口通信,但是他的中断系统没有详细介绍,因此这里就来把他的中断系统做一个理清。
注:下面内容参考普中科技51单片机教程
1、中断系统介绍
1、中断概念
首先还是中断系统的流程,就是发生中断后的处理过程:
相关概念,下面例举一些后面可能出现的概念,可能会在后面出现的:
- 中断源:引起CPU中断的因素
- 中断优先级:当同时有多个CPU发生中断的时候多个中断源根据中断优先级来排队(高优先级打断低优先级中断就会发生中断嵌套现象)
51单片机上的中断系统可以总结为:
- 外部中断O(INTO)
- 外部中断 1(INT1)
- 外部中断 2(INT2)
- 外部中断 3(INT3)
- 定时器 0中断
- 定时器 1 中断
- 定时器 2 中断
- 串口(UART)中断
这里需要注意的就是外部中断2和3还有定时器2中断有些51不一定有,这里需要慎用,这里51一共有四个中断优先级(差一点的只有2个中断优先级)
普中这里还提供了相关的中断查询表
如果设定的中断优先级相同的话,中断执行的先后要按照下表中的相同优先级内的查询次序来决定:
2、中断相关寄存器
这里51单片机对中断的控制都在一个叫中断允许寄存器IE来进行控制的,这里也是用普中给的这个图来看
相关位的说明如下:
- EX0(IE.0), 外部中断 0 允许位
- ET0(IE.1), 定时/计数器 T0 中断允许位
- EX1(IE.2), 外部中断 0 允许位
- ET1(IE.3), 定时/计数器 T1 中断允许位
- ES(IE.4), 串行口中断允许位
- EA (IE.7), CPU 中断允许(总允许) 位
开启了中断之后获取中断请求需要读取中断请求标志,也是一个寄存器为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 溢出中断请求标志位
下面就是中断优先级和中断号了:
中断号如下所示:
综上就是一个中断的所有过程了,那么我们要想自己的中断被响应,就需要:
- 中断源设置了中断请求
- 中断源中断允许被触发
- 总中断开启(EA=1)
3、中断服务函数
如果我们编写一个外部中断的函数,配置如下,在中断函数中 exit0()是函数名, 可自定义, 但必须符合 C 语言标识符定义规则,interrupt 是一个关键字, 表示 51 单片机中断。 后面的“0” 是中断号, 外部中断 0 中断号为 0, 这个可参考前面的内容。
相关寄存器的说明在前面已经介绍过了,可以往上查看,源码如下:
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的话,定时器的开启要多一个步骤了(多的这个步骤为外部信号触发,就是是否需要外部信号触发才能打开)
C/T是计数模式选择位,就是选择是定时模式(0)还是计数模式(1),M1M0是工作方式设置位。 根据M1M0的选择定时/计数器的四种工作方式如下所示:
下面是控制寄存器的说明:
说明如下:
下面是四个定时器的工作方式介绍:
4、定时器配置
定时器的配置如下,下面顺序不分先后
下面是定时器计数时间的计算,这里需要注意就是定时时间的计算方式:
5、定时器配置
根据上面的部分,可以对定时器进行配置,如下所示:
下面是源代码,相关寄存器都可以在上文查到
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;
}
}
或者我们也可以直接在官方提供的工具里面生成:
3、串口中断
1、串口中断相关寄存器
下面是串口控制寄存器的描述:
其中SM0还有SM1决定了串口的四种工作方式:
相关寄存器的说明我根据参考资料画了一张表:
补充上面没有说到的位,REN,REN是串口接收使能为,软件置REN=1的话就会启动串口接收数据,反之就会关闭串口数据接收。
下面是电源控制寄存器,电源控制寄存器的说明如下:
其中SMOD寄存器决定了波特率是否倍增,当SMOD=1的时候,波特率就会倍增。
下面对定时器的四种模式进行说明:
2、波特率计算
这边波特率也可以用官方工具来计算