ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

51单片机外部中断的使用以及优先级设置

2021-04-30 22:31:53  阅读:423  来源: 互联网

标签:定时器 优先级 中断 51 单片机 设置 寄存器 LED


51单片机中断的使用及优先级设置
51单片机有两个外部中断,两个定时器/计数器,两个外部中断分别是int0,int1。定时器/计数器分别是t0,t1,还有一个串口中断TI/RI,加起来有五个中断。它们在硬件上的排列顺序是INT0,T0,INT1,T1,TI/RI,这5个中断源的中断顺序号依次就是interrupt 后面的0,1,2,3,4。其中定时器可以选择工作方式,因为我们使用定时器的方式不一而足,有的程序会用来计时,有的程序用来计数,根据程序要求设置工作方式各取所需。
下图显示了51单片机中的4个寄存器,分别是TCON,SCON,IE,IP,还有我们常用的定时器模式控制寄存器TMOD。

在这里插入图片描述

一、TMOD:定时器/计数器工作方式控制寄存器
TMOD中存放两个定时器/计数器,每个定时器都可以设置它们的工作方式,如定时器0的工作方式1设置就是TMOD=0x01,定时器1设置方法同定时器0,不过设置位数变到前4位TMOD=0x10。如果两个都用方式1的话就是TMOD=0x11了吧。
TMOD寄存器结构TMOD工作方式
二、IP:优先级寄存器
IP寄存器是控制中断优先级的寄存器,在51单片机中可以设置中断为高优先级或低优先级,以达到嵌套的目的。想要嵌套中断,必须使用到我们前面说过一嘴的IP寄存器,否则int0的优先级只是查询优先级最高,而不是中断优先级最高。IP寄存器结构如下图,通过设置IP寄存器可以设定由哪个中断最先运行,51单片机可以设置二级中断服务嵌套。通过IP寄存器结构我们可以明显看到下面5个中断所处的位置,因此可以轻易的设置想要的中断优先级,例如设置PX0,即外部中断int0优先级最高,就是IP=0x01;或者PX0=1;效果相同。举一反三,其他中断也是如此设置。
IP寄存器结构
在这里插入图片描述

三、protues仿真
了解了中断和定时器的基本使用方式就可以画仿真图以及写程序了,先画一个简单的仿真图。

四、编写代码
图中52单片机有两个按键和两个LED灯,我们设置他们的功能。
1.使用定时器定时2秒,两秒后点亮两个LED灯,点亮LED灯后重置定时器,如果LED灯被熄灭后间隔两秒又会被重新点亮。
2.按键1按下后,通过中断int0把两个LED熄灭一段时间,int0优先级设置为最高(优先级必须设置,设置后才能嵌套,否则即使它是int0,也不能嵌套进int1中)。
3.按键2被按下后,LED1闪烁5次。
4.最后效果是,当定时器点亮两个LED灯,我们按下按键2,LED1闪烁。此时,按下按键1,LED1和LED2全部熄灭并保持一段时间后,LED1继续未完成的闪烁,直至完成后两个LED灯依旧点亮。通过简单的功能实现,我们可以充分的了解外部中断和定时器的具体应用。
代码如下:

#include"reg52.h"
#define uchar unsigned char  //定义字符类型
#define uint unsigned int
sbit led=P2^0;   //定义IO口P2.0为led
sbit led1=P2^1;
uchar flag;	//定义flag类型

void delay(){  //延时程序
int i,j;
	for(i=500;i>0;i--)
	 for(j=100;j>0;j--);
}
void init()//初始化,即打开各中断开关
{
	 TMOD=0x01;
	 TH0=(65536-50000)/256; //定时器0装初值
     TL0=(65536-50000)%256; //同上
     IT0=1;//外部中断0为跳变沿触发方式
     IT1=1;//外部中断1为跳变沿触发方式
     EA=1;//开总中断
     EX0=1;//打开外部中断0
     EX1=1;//打开外部中断1
	 ET0=1;//打开定时器0中断开关
	 TR0=1;//打开定时器0运行开关
	 IP=0x01;//设置int0优先级为高,与PX0=1;等效
}
/*按键1*/
void int0() interrupt 0 using 0//外部中断0的执行程序。
{ 							   //interrupt 0指外部中断0 using 0指第0组寄存器			  			
	led=0;  //熄灭LED灯
	led1=0;
	delay();//延时
	delay();
	delay();
}
void t0() interrupt 1 using 1 //定时器
{   
   TH0=(65536-50000)/256; //定时器0装初值
   TL0=(65536-50000)%256; //同上
   flag++; //记录定时器经过的时间
   if(flag==40){	 //定时2秒后执行,flag=40时约两秒
	 led=1;   //点亮LED灯
     led1=1;
	 flag=0; //重置定时,达到每两秒点亮一次的目的
   }
}
/*按键2*/
void int1() interrupt 2 using 2//外部中断1的执行程序。
{
	unsigned char i;	
	for(i=0;i<10;i++)//实现led闪烁五次。
    	{
		   led=~led;
		   delay();
		}	
}
void main()//主函数
{
	init();	  //初始化
	led=0;   //指定LED灯开始的时候是熄灭状态
	led1=0;
	while(1);
}

`

标签:定时器,优先级,中断,51,单片机,设置,寄存器,LED
来源: https://blog.csdn.net/CenJuLong/article/details/116304524

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有