基础介绍

之前我们了解了单片机定时器的使用(跳转页面),但是之前采用的是查询的方法,这种方法如果代码量多的话就无法做到及时响应,我们要想在定时器时间一到就及时响应就需要用到中断的方法。

要使用中断的方法首先要有一个中断源(也就是产生中断的地方),单片机中一共有5个中断源,2个定时中断,2个外部中断,1个串行中断。之前介绍过TCON寄存器,在TCON寄存器中TF1/TF0是定时中断,IE1/IE0是外部中断。当定时器/计数器1溢出的时候TF1就会为1,此时就会产生一个中断;类似的,当定时器/计数器0溢出时,TF0也会产生中断。

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

TCON寄存器

除了这些,我们要使用中断还需要学习中断允许寄存器IE和中断优先级寄存器IP的使用。

中断允许寄存器IE

中断允许寄存器IE

其中EA是全局中断允许位,也就是总开关,当它为0时全部中断关闭。

ES是串行口中断的开关,ES=1打开串行口中断,ES=0关闭串行口中断。

ET1、EX1、ET0、EX0分别是定时器/计数器1、外部中断1、定时器/计数器0、外部中断0的中断开关,为1时打开相应的中断,为0时关闭相应的中断。

中断优先级寄存器IP

中断优先级寄存器IP

这里的PS、PT1、PX1、PT0、PX0分别是串行口、定时器/计数器1、外部中断1、定时器/计数器0、外部中断0的中断优先级控制位,为1时对应的中断就是高优先级中断,为0时对应的中断就是低优先级中断。

在单片机中,高优先级中断可以打断低优先级中断,并且如果有几个中断源同时向CPU请求中断,CPU就会按照优先级的高低确定响应的先后顺序。

我们使用中断的时候需要执行这3个步骤:

  1. 打开中断总开关EA;
  2. 设置中断优先级(可省略);
  3. 打开对应中断的开关。

发生中断后单片机就会执行相对应的中断程序,在C语言中需要在中断程序的函数名后面加上 interrupt 中断号 。各个中断源对应的中断号如下表:

单片机默认中断级别

具体使用

下面我们以一个例子来看看定时器中断的具体使用。

要实现的功能:一个晶振为12MHz的单片机P1.0脚接一个LED灯,采用定时器中断的方法控制其一秒钟闪烁一下。

硬件电路图:

硬件电路图

软件代码:

#include <reg51.h>
sbit LED=P1^0;
int a=0;
void main()
{
  TMOD=0x01;//使用定时器T0,高4位全为0,低4位GATE=0,C/T=0,采用工作方式1,M1=0,M1=1
  TH0=0x3c;//装入初值
  TL0=0xae;
  TR0=1;//启动定时器0
  EA=1;//打开中断总开关
  ET0=1;//打开定时器0中断开关
  while(1);
}
void abc() interrupt 1
{
  TH0=0x3c;//重新装入初值
  TL0=0xae;
  if(a==20)//因为要1秒闪烁一次,到这里计数器计了0.05s,需要20个0.05s才有1s
  {
    LED=~LED;
    a=0;
  }else{
    a=++a;
  }
}

本文版权归一天天世界所有,转载请注明出处并添加本文链接。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

 
返回顶部
ett