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

您所在的位置:网站首页 用按键模拟单片机外部中断输入源 51单片机外部中断的使用以及优先级设置

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

2024-06-20 14:00| 来源: 网络整理| 查看: 265

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 init(); //初始化 led=0; //指定LED灯开始的时候是熄灭状态 led1=0; while(1); }

proteus仿真加keil4代码文件下载链接: https://download.csdn.net/download/CenJuLong/18281185

`



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3