51单片机【中断】学习知识点汇总

文章一直在修改,之前学了外部中断和定时/计数器中断,对中断设置流程感觉比较清晰。

学串行通信时,又用到中断,而且多了几步设置,回头看时又把前面学的寄存器符号弄混了。

现在按自己的思路从头把流程和各种符号梳理一下。

外部中断

外部中断的设置程序比较简单,分为三步

  1. 选择用外部中断0还是外部中断1,并通过请求控制位选择中断引起原因为P3.2脚的低电平或下降沿信号          //IT0=1/0或者 IT1=1/0      
  2. 打开所选择的外部中断的相应的中断允许位                                                                                                    //EX0=1或者EX1=1        
  3. 打开CPU中断(总允许)位                                                                                                                           //EA=1

在实验中,通过运行例子程序,程序在k3键按下的下一步进入中断处理程序

此过程涉及到两个寄存器的设置

  • TCON定时器/计数器控制寄存器/逻辑板(Timer Control Register)

  • IE中断允许寄存器(Interrupt Enable)


定时/计数器中断

  1. 对TMOD赋值,以确定T0和T1的工作方式。
  2. 计算初值,并将其写入TH0、TL0或TH1、TL1。
  3. 中断方式时,则对EA赋值,开放定时器中断。
  4. 使TR0或TR1置位,启动定时/计数器定时或计数

此过程涉及到三个寄存器的设置

  • TMOD工作方式寄存器(Timer/Counter Mode Control Register)
  • TCON定时器/计数器控制寄存器/逻辑板(Timer Control Register)
  • IE中断允许寄存器(Interrupt Enable)


预备知识

一.中断的概念

  1. 中断发生 
    CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理
  2. 中断响应和中断服务 
    CPU暂时中断当前的工作,转去处理事件B
  3. 中断返回 
    待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A 。

这一过程称为中断


二.51单片机的中断系统结构

中断允许寄存器IE(Interrupt Enable)

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中断允许(总允许)位。

TCON定时器/计数器控制寄存器/逻辑板(Timer Control Register)


  • IT0(TCON.0),外部中断0触发方式控制位。
        当IT0=0时,为电平触发方式。
        当IT0=1时,为边沿触发方式(下降沿有效)。
  • IE0(TCON.1),外部中断0中断请求标志位。
  • IT1(TCON.2),外部中断1触发方式控制位。
  • IE1(TCON.3),外部中断1中断请求标志位。
  • TR0(TCON.4),定时/计数器T0溢出中断请求控制位。
  • TF0(TCON.5),定时/计数器T0溢出中断请求标志位。
  • TR1(TCON.6),定时/计数器T1溢出中断请求控制位。
  • TF1(TCON.7),定时/计数器T1溢出中断请求标志位。   
中断源中断请求标志中断允许控制
中断源符号名称中断引起原因中断号优先级控制位标志位允许控制位
/INT0外部中断0P3.2引脚低电平或下降沿信号0IT0IE0EXO
T0定时器0中断定时/计数器0计数0溢出1TR0TF0ETO
/INT1外部中断1P3.3引脚低电平或下降沿信号2IT1IE1EX1
T1定时器1中断定时/计数器1计数0溢出3TR1TF1ET1
TI/RI串行口中断串行通信完成一帧数据发送或接收引起中断4
RI或TIES







EA:CPU中断允许(总允许)位
此图表自行制作的,欢迎指正和补充!


三.外部中断的处理过程

1、设置中断触发方式,即IT0=1或0,IT1=1或0 
2、开对应的外部中断,即EX0=1或EX1=1; 
3、开总中断,即EA=1; 
4、等待外部设备产生中断请求,即通过P3.2,P.3.3口连接外部设备产生中断 
5、中断响应,执行中断服务函数

 eg. 外部中断0实验  *

        实现现象:下载程序后按下K3按键可以对D1小灯状态取反。           

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

sbit k3=P3^2;  //定义按键K3
sbit led=P2^0;	 //定义P20口是led

void delay(u16 i)
{
	while(i--);	
}

void Int0Init()
{
	//设置INT0
	IT0=1;//跳变沿出发方式(下降沿)
	EX0=1;//打开INT0的中断允许。	
	EA=1;//打开总中断	
}

void main()
{	
	Int0Init();  //	设置外部中断0
	while(1);		
}

void Int0()	interrupt 0		//外部中断0的中断函数
{
	delay(1000);	 //延时消抖
	if(k3==0)
	{
		led=~led;
	}
}

四.定时器/计数器中断

初始化程序应完成如下工作:
  1. 对TMOD赋值,以确定T0和T1的工作方式。
  2. 计算初值,并将其写入TH0、TL0或TH1、TL1。
  3. 中断方式时,则对EA赋值,开放定时器中断。
  4. 使TR0或TR1置位,启动定时/计数器定时或计数

1.定时器/计数器工作原理

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

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

2.定时器/计数器的控制

51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。

GATE是门控位, GATE=0时,用于控制定时器的启动是否受外部中断源信号的影响。只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚INT0/1也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了INT0/1引脚为高电平这一条件。
     C/T :定时/计数模式选择位。C/T =0为定时模式;C/T =1为计数模式。

    M1M0:工作方式设置位。定时/计数器有四种工作方式。


工作方式寄存器TMOD(Timer/Counter Mode Control Register)

 工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。其格式如下:


定时器/计数器控制寄存器/逻辑板TCONTimer Control Register)

TCON的低4位用于控制外部中断,已在前面介绍。TCON的高4位用于控

制定时/计数器的启动和中断申请。其格式如下



3.定时/计数器的工作方式

1、方式0

          方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。计数初值计算的公式为:X=213-N。


2、方式1 

      方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位,组成了16位加1计数器 。计数个数与计数初值的关系为:X=216-N


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


4、方式3 

      方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。 工作方式3将T0分成为两个独立的8位计数器TL0和TH0 。


eg.定时器0实验  *
实现现象:下载程序后D1小灯循环点亮1秒,熄灭1秒。使用单片机内部定时器可以实现准确延时。

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

sbit led=P2^0;	 //定义P20口是led

void Timer0Init()
{
	TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

	TH0=0XFC;	//给定时器赋初值,定时1ms
	TL0=0X18;	
	ET0=1;//打开定时器0中断允许
	EA=1;//打开总中断
	TR0=1;//打开定时器			
}

void main()
{	
	Timer0Init();  //定时器0初始化
	while(1);		
}

void Timer0() interrupt 1
{
	static u16 i;
	TH0=0XFC;	//给定时器赋初值,定时1ms
	TL0=0X18;      //此处第二次赋初值是为了让中断程序重复工作,但我的对它的理解还有些模糊,请路过的高手讲解一下
	i++;
	if(i==1000)
	{
		i=0;
		led=~led;	
	}	
}


Timer Control Register

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值