2019-03-25 18:38:39 xhluojinji 阅读数 235
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

    18927 人正在学习 去看看 朱有鹏

这次是关于中断的专题啦!

中断源:是指引起中断的原因或者设备。

MCS-51单片机设置了5个中断源,其中内部有3个中断源,包括定时/计数器T0、T1和片内串口,外部有两个中断请求输入,当系统产生中断时,5个中断源的中断请求标志分别由特殊功能寄存器TCONSCON的相应位来锁存。

  • 定时计数器控制器TCON

既能控制定时计数器T0、T1,又能锁存外部中断请求标志和定时计数器T0、T1的溢出中断标志,具有双重功能,相关位的定义如下:

TF0:定时计数器T0溢出标志。

TF1:定时计数器T1溢出标志。

定时计数器T0、T1启动后,当计数产生溢出时,硬件自动置位TF0、TF1标志,并请求中断,CPU响应中断后,这两个标志位既可通过软件清除,也可通过硬件自动清除。

IE1:外部中断1请求标志。

IE0:外部中断0请求标志。

由CPU检测外部中断请求,当输入信号有效触发后,硬件自动置位IE0,IE1标志,并请求中断,CPU响应中断后,这两个标志位被硬件自动清除。

IT0:外部中断0触发方式选择位。

IT1:外部中断1触发方式选择位。

可用程序控制为0或1,当该位为0,外部中断为电平触发方式,即低电平有效;当该位为1,外部中断为边沿触发方式,即下降沿有效。

  • 串行口控制寄存器SCON

既是串行口控制寄存器,当串行口发生中断请求时,SCON低两位又能锁存其发送中断和接收中断,具有双重功能,其相关位的定义如下:

T1:串行口发送中断标志。

当CPU向串行口的发送数据缓冲器SBUF写入一个数据或字符时,发送器就开始发送,当发完一帧数据后,硬件自动置位TI标志,表示串口正在向CPU发送中断请求,请求发送下一帧数据,该标志必须由软件进行清0.

RI:串行口接收中断标志

若串行口接收器允许接收,当接收器接收到一帧数据后,硬件自动置位RI标志,表示串口接收器正在向CPU发送中断请求,使CPU读取接收数据缓冲器中的数据,该标志必须由软件进行清0。

中断系统:单片机中用于管理各类中断的逻辑。

中断的优点:

1、分时操作:中断系统解决了CPU的快速运行与慢速外设、定时计数器及串口之间的“定时”矛盾,这样CPU在运行主程序的同时可以令定时器、串口及其他外设同时工作,当出现中断后,CPU响应中断,停止主程序的运行,转入执行中断服务程序,使CPU高效而有序的工作。

2、实时处理:中断系统使CPU能及时处理实时控制系统中的许多随机参数和信息,它们能在任何时候向CPU发出中断请求,要求转向中断程序,CPU会对变化的现场信息进行及时响应,使CPU具有随机应变和实时处理能力。

3、故障处理:中断系统还可以使CPU处理系统中出现的故障,从而不必进行人工干预或停机,提高了系统的稳定性和可靠性。

  • 中断控制

中断系统的功能主要包括以下几点:
1、中断的打开与关闭:

2、中断响应(有一个中断优先级的问题)

中断优先级:
简单点说就是当同时来了多个中断的时候,CPU必须判断哪些中断的优先级比较高,因为一些中断会导致系统功能无法实现甚至故障,自然优先级就高,CPU必须先处理。

所以我们需要对特殊功能寄存器IE编程,用来选择允许或禁止哪些中断,然后可以通过中断优先级寄存器IP进行编程,定义被允许中断的优先级。

  • IE:设置允许的中断源,相关位如下:

EA: CPU总中断允许位,为0时,禁止所有中断;为1时允许中断。

*ET2:MCS-52系列单片机中T2中断允许位,为0禁止中断;

ES:串行口中断允许位,为0时,禁止串行口中断;

ET1:定时/计数器T1中断允许位,为0时,禁止中断;

EX1: 外部中断1中断允许位,为0时,禁止中断;

ET0: 定时/计数器T0中断允许位,为0时,禁止中断;

EX0:外部中断0中断允许位,为0时,禁止中断。

  • 中断优先级寄存器IP

用于控制不同中断源的优先级的高低,相关位如下:

PT2:定时/计数器T2优先级设定,为0时,T2设定为低优先级;为1时,T2设定为高优先级。

PS:串行口优先级设定,为0时,串行口设定为低优先级;为1时,串行口设定为高优先;

PT1:定时/计数器T1优先级设定,为0时,T1设定为低优先级

PX1:外部中断1优先级设定,为0时,外部中断1设定为低优先级;

PT0:定时/计数器T0优先级设定,为0时,设为低优先级;

PX0:外部中断0优先级设定,为0时,设为低优先级。

  • CPU在响应中断请求时遵循两个原则:

1、对于一个正在执行的低级中断服务程序,可以被高级中断请求所打断,但不能被同等优先级的中断请求所中断。

2、一个正在执行的高级中断服务程序,不能被任何中断请求所中断,只有在执行完此高级中断服务程序后,返回主程序再执行一条指令才能响应新的中断请求。

MCS-51单片机中只设置有两个优先级,必然会出现几个中断源处于同等的优先级状态,当CPU同时接收到几个同等优先级中断请求时,按照内部硬件查询逻辑,按照自然优先顺序来查询,优先顺序由高到低为:外部中断0->定时/计数器0->外部中断1->定时计数器1->串行口->定时计数器2.

  • 中断响应:

51单片机在每个机器周期都顺序查询每一个中断源,若接收到中断请求,将在紧跟着的下一个机器周期执行该中断,但是在遇到一些情况时中断会暂时受阻。

  • 最后扯扯51单片机的外部中断源:

1、外部中断源端口引脚:外部中断0,端口引脚为12(P3^2),引脚符号为INTO^

外部中断1:端口引脚13(P3^3),引脚符号为INT1^

2、外部中断请求方式:负边沿触发,使控制位IT0=1即可;

低电平触发,使控制位IT1=0即可

  • 51单片机外部中断源应用步骤

1、设置外部中断请求允许位,设置IE寄存器中的EAEX1EX0

2、选择合适的外部中断请求触发方式,设置TCON寄存器中的IT1IT0

3、编写中断服务函数,函数格式为:

返回值  函数名([参数]interrupt n [using m]

#include <reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
sbit key = P3^2;
sbit led = P1^0;

void delay(u16 num)
{
    u16 x ,y;
    for(x=num; x>0; --x)
        for(y=110; y>0; --y)
        {
            ;    // 延时1ms
        }
}

int main(void)
{
    TCON |= 0x01;    //设置外部中断0触发方式为边沿触发方式
    IE = 0X81;    //开放总中断并且外部中断0允许中断
    while(1)
    {
        ;
    }
}

void ext_int0(void) interrupt 0
{
    delay(10);
    if(key == 0)
    {
        led =~led;
    }
    while(!key);
}

 

 

 

 

 

2019-04-05 10:57:05 qq_40181592 阅读数 1356
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

    18927 人正在学习 去看看 朱有鹏

C51单片机学习笔记(四)——单片机的中断系统及应用

1.单片机的中断系统

  • 中断的概念:
    CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断产生);
    CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);
    待CPU将事件B处理完毕后,再回到原来事件A中断的地方继续处理事件A(中断返回),这一过程称为中断。
    在这里插入图片描述
  • 引起CPU中断的根源叫做中断源。中断源向CPU的请求,叫做中断请求。
    CUP暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再
    回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的
    部件称为中断系统(中断机构)。在这里插入图片描述
  • 51单片机的中断源:引起中断的事件称为中断源,51单片机一共有5个中断源,如下图:
  • 中断优先级:当单片机正在执行主程序时,如果发生了几个中断请求,单片机会由根据中断优先级寄存器的默认优先级进行处理,如下表:
    在这里插入图片描述
  • 中断嵌套:51单片机最多可以执行二级嵌套:
    在这里插入图片描述

2.中断需要设置的4个寄存器

  • 中断允许寄存器IE
    CPU对中断源允许或不允许,由中断允许寄存器IE控制,IE在特殊功能寄存器中,字节地址为A8H,编程时可对寄存器的每一位单独操作,单片机复位时IE的各个位全部变为0.
    在这里插入图片描述
    在这里插入图片描述
  • 中断优先级寄存器IP
    中断优先级寄存器IP在特殊功能寄存器中,字节地址为B8H,IP用于设定各个中断源属于两级中断中的哪一级,单片机复位时,IP全部赋值为0
    在这里插入图片描述
    在这里插入图片描述
    注意:高优先级中断可以打断低优先级中断而形成中断嵌套,同优先级中断之间不能形成嵌套,低优先级中断不能打断高优先级中断。一般情况下,中断优先级寄存器不需要设置,而采用默认设置。
  • 定时器、计数器工作方式寄存器TMOD:
  • TMOD在单片机内部的特殊功能寄存器中,字节地址为89H,不能位寻址(编程时不能单独操作各个位,只能采用字节操作),该寄存器用来设定定时器的工作方法及功能选择,单片机复位时,TMOD全部为0.
    在这里插入图片描述
    在这里插入图片描述
  • 中断控制寄存器TCON:
    TCON在特殊功能寄存器中,字节地址为88H,可以进行位寻址,该寄存器用于控制定时器/计数器的开启停止、标志定时器/计数器的溢出和中断情况,还可对外部中断进行设置,单片机复位时TCON全部为0.
    在这里插入图片描述
  • 中断系统的工作原理图:
    在这里插入图片描述
  • 中断程序的写法格式:
void 函数名() interrupt 中断号
{
	中断服务程序的语句
}

3.使用中断控制流水灯

#include<reg52.h>
#define uchar unsigned char
#define LED P2
void main()
{
	EA = 1;	 //中断允许寄存器IE中的总控制开关,EA=0代表允许产生中断
	EX0 = 1; //中断允许寄存器IE中的EX0=1代表允许INT0产生中断
	IT0 = 0; //中断控制寄存器TCON 当IT0 =0时,为电平触发方式,
	         //如果P3.2为低电平,则产生中断请求(我的单片机P3.2连的是按键6,所以当按键6被按下时,产生中断请求)
	
	LED = 0x0f; //使后四个LED灯亮

}
void Change_LED() interrupt 0
{
	LED = 0xf0;	 //使前四个LED灯亮
}

4.定时器T0和T1的工作方式1

  • 这里用到前面所展示的定时器和计数器的工作方式寄存器TMOD

    在这里插入图片描述
    • 工作方式1的计数位是16位,下面以T0为例说明(T1和T0方式1是一样的)。T0有两个寄存器TL0个TH0组成,TL0为低8位,TH0为高8位。
    • 启动T0后TL0便在机器周期的作用下从0000 0000开始计数每次加一,当TL0计满(1111 1111十进制255)时,再计一个到256,此时TL0清零,同时向TH0进一位,直到TH0也计满此时达到65535,再计一个数就溢出,产生中断请求,进入中断处理程序,同时TF0(中断标识位自动置1)中断程序执行完后,硬件将自动将TF0清0.

5.定时器控制流水灯

  • 下面用定时器做一个将发光二极管亮1s,熄1s,周期性闪烁
#include<reg52.h>
#define uchar unsigned char
#define LED P2
uchar num;
void main()
{
	LED = 0xf0;
	TMOD = 0x01;//将定时器0设为方式1,即16位定时器
	/*TH0中每增加1,就相当于计了256个数,所以TH0装入初值是对256取模,TL0是对256取余*/
	TH0 = (65536-45872)/256;//给定时器的高八位赋初值
	TL0 = (65536-45872)%256;//给定时器的低八位赋初值
	/*过程中不可能让其计65536个数,所以要给他赋初始值,单片机的晶振为11.0582MHz,机器周期为
	1.09us(计一个数的时间),若要每50ms产生一个中断,则要计数50000/1.09=45872,所以将其作为初值*/
	EA = 1;//开总中断
	ET0 = 1;//开定时器0中断
	TR0 = 1;//启动定时器T0
	while(1)
	{	   
		
		if(num == 20) //num=20代表用了50ms*20  = 1s
		{
			num = 0;
			LED = ~LED;
		}
	}
}
void T0time() interrupt 1
{
	TH0 = (65536-45872)/256;//重装初值
	TL0 = (65536-45872)%256;
	num++;			  //每发生一次中断后,num++,num等于几,用的时间就是几个50ms

}

6。按键+中断+流水灯实例

  • 要求,当按键按下时,流水灯停止流动,再次按下时,流水灯从原来的位置继续流动
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define LED P2
sbit S = P3^2;
int j;
uchar code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void init();
void key();
void delay(uint z);
void LED_display();
void main()
{
	init();
	while(1)
	LED_display();
}

void init()
{
	IT0 = 0; //设置低电平触发外部中断
	EA = 1;  //开总中断
	EX0 = 1;//开外部中断
	j = 0;
}
void key()
{
	if(S == 0)
	{
		delay(8); //按键消抖
		if(S == 0)
		{
			j++;
			if(j==2)
			j = 0;
		}
	}
	while(!S);
}
void delay(uint z) //延时函数
{
	uint x,y;
	for(x = z;x>0;x--)
		for(y=110;y>0;y--);
}
void LED_display()
{
	uint i;
	for(i=0;i<8;i++)   //数组控制流水灯
	{
		LED = table[i];
		delay(500);
	}
}
void stop() interrupt 0
{
	do{
		key();
	}while(j == 1);  //中断函数,当按键按下时中断

}
2018-12-01 12:44:20 YouCanDoIt_ 阅读数 741
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

    18927 人正在学习 去看看 朱有鹏

89C51单片机中的中断系统

对于在单片机中的学习,中断系统是一难点,如果中断系统没有理解透彻,51单片机的学习就算是失败的。
首先,举例说明下什么是中断。
eg.当你在家正在吃着爆米花,看着电视,突然门铃响了,这时你不得不停止吃爆米花看电视,起身去开门,这个过程就是中断。
中断概念
CPU在处理某一事件A时,发生了另一件事件B请求CPU马上去处理(中断发生)
CPU暂时中断当前工作,转去处理事件B(中断响应和中断服务)
等待CPU把事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回), 这整个一个过程 称为中断
中断系统的概念:
引起CPU中断的根源,叫中断源 。 是中断源向CPU提出的中断请求。 CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(被中断的地方叫 断点,“断点”不是一个实际存在的,只是一个人为提出的概念 ), 这一过程称为中断返回。实现以上中断功能的部件称为 中断系统。

在这里插入图片描述
中断技术解决了 快速主机与慢速I/O设备之间的数据传送 问题
中断系统优点: 1. 分时操作 CPU可以分时为多个I/O设备服务,提高了计算机的利用率
2.实时响应 CPU能够及时处理应用系统的随机事件,系统的实时性增强
3.可靠性高 CPU具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高
eg. 89C51/52 的中断系统有5个中断源,2个优先级,可以实现二级中断嵌套
中断允许控制
CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制

EX0(IE.0):外部中断0允许控制位
EX1(IE.2):外部中断1允许控制位
ET0(IE.1):定时/计数器T0允许控制位
ET1(IE.3):定时/计数器T1允许控制位
ES(IE.4):串行口中断允许位
EA(IE.7):CPU中断允许位(总中断允许位)
中断请求标志 TCON
在这里插入图片描述
IT0(TCON.0):外部中断0触发方式控制位
当IT0=0,则是电平触发方式,分为低电平和高电平
当IT0=1,则是边沿触发方式,那么此时为下降沿有效控制
IT1(TCON.2):外部中断1触发方式控制位
IE0(TCON.1):外部中断0中断请求标志位
IE1(TCON.3):外部中断1中断请求标志位
TF0(TCON.5):定时器/计数器T0溢出中断请求标志位
TF1(TCON.7):定时器/计数器T1溢出中断请求标志位
TR0(TCON.4):串行口R0中断请求标志位
TR1(TCON.6):串行口R1中断请求标志位

当同一优先级中的中断申请不止一个的时候,就有中断优先权排队的问题,同一优先级的中断优先权排队,是由中断系统硬件确定的自然优先级形成
外部中断0(IE0) > 定时/计数器0(TF0) > 外部中断1(IE1) > 定时/计数器1(TF1) > 串行口(RI/TI)
中断源
在这里插入图片描述
中断优先级三条原则:

  1. CPU同时接收到几个中断时,首先响应优先级别最高的中断请求

  2. 正在进行的中断过程不能被新的同级或低优先级的中断请求所中断

  3. 正在进行的低优先级中断服务,能被高优先级中断请求所中断
    为实现2,3原则,中断系统内部设有两个用户不能寻址的优先级状态触发器 ,其中一个触发器置为 1 ,表示正在响应高优先级的中断, 它会阻断后来所有的中断请求;另外一个同样置为 1 ,表示正在响应低优先级中断,它会阻断后来所有的低优先级的中断请求

    中断响应的条件

  4. 中断源有中断请求

  5. 中断源的中断允许位是 1

  6. CPU开启中断(EA=1)
    只有3条同时满足时,CPU才有可能会响应中断
    对于如上的概念,需经常阅读和理解,对于程序员来说,并不需要熟知硬件中的各种电路图,对于程序员来使用中断,只需要记住:
    1 想使用的中断是哪个,选择相应的中断号;
    2 触发条件是什么,低电平触发 or 下降沿触发 ;
    3 中断之后做什么

下面是不同中断的代码
外部中断0:

#include "reg51.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit k3=P3^2;
sbit led=P2^0;

void delay(u16 i)
{
  while(i--);
}
void zhongduan()
{
   IT0=1;
   EX0=1;
   EA=1;
 }
void Int0() interrupt 0
{
   delay(1000);
   if(k3==0);
   {
      led=~led;
	  }
}
void main()
{
  zhongduan();
  while(1);
}

定时器中断0:

#include "reg51.h"
typedef   unsigned char u8;
typedef unsigned int u16;

sbit led=P2^0;

void time0()
{
  TMOD=0x01;
  TH0=0xfc;
  TL0=0x18;
  EA=1;
  TR0=1;
  ET0=1;
}
void time01() interrupt 1{
  static u16 i;
  TH0=0xfc;
  TL0=0x18;
  i++;
  if(i==1000){
   led=~led;
   i=0;
  }
}

void main()
{
  time0();
}

本人同样也是在学习过程中,如有问题,欢迎下方留言讨论

2016-11-14 20:19:20 easour 阅读数 6517
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

    18927 人正在学习 去看看 朱有鹏

51单片机的中断系统十分重要,前几次我在学习的时候,根本分不清外部中断、定时器中断的区别以及正确使用方法。今天,偶然打破了自己的常规思路,得到了一点点理解,与大家分享下,希望大家不吝指出其中的不足与错误。

        1.单片机的中断分类:只有两类,外部中断和定时器中断。这两种中断使用时可以完全分离。

2.最常用的自动中断是定时器中断,也就是自己设定一个“倒计时”,该倒计时与主程序同时开始,一旦时间耗尽,开始停止主程序,进行中断程序。这种定时器中断的开启方法只需要这几个寄存器设置:

EA=1表示允许任何中断开启;

ETx表示时间耗尽允许执行中断程序;

TRx表示允许倒计时开始;

TMOD表示倒计时的计时工作方式;

THx,TLx表示倒计时的值。

然后写中断程序interrupt 1或3 。

3.可以人工控制的中断是外部中断,开启方式最简单,只需要以下寄存器:EA=1表示意义同上;EXx表示外部条件(3.2或者3.3口低电平)满足去执行中断程序。然后写中断程序interrupt 0或 2 。


以前总是误认为使用外部中断必须要开启定时器中断,现在想想不是这样的。

提供两个简单程序供大家测试:

程序一:定时器中断

sbit beep=P2^3;
void init();
int main()
{
    init();
    while(1);
}

void init()
{
    EA=1;
    ET0=1;
    TR0=1;
    TH0=(65535-50000)/256;
    TL0=(65535-50000)%256;
    TMOD=0x01;
}
void inter() interrupt 1
{
    int a;
    TH0=(65535-50000)/256;
    TL0=(65535-50000)%256;
    a++;
    if(a==40)
    {
        a=0;
        beep=~beep;
    }
    
}



程序二:外部中断

#include<reg52.h>
void init()
{
    EA=1;
    EX0=1;
    IT0=0;
    
}
int main()
{
    init();
    while(1)
    {
        P1
    }
}
void interceshi() interrupt 0
{
    P1=0;
}

单片机中断系统

阅读数 491

51单片机中断问题

阅读数 279

没有更多推荐了,返回首页