51单片机中断系统

一、什么是中断

中断指通过硬件来改变CPU的运行方向,简单来说就是外部设备给CPU中断信号,然后CPU暂停当前程序,去执行中断信号的程序,当程序执行完之后再回去执行先前的程序。

二、中断系统结构及中断有关寄存器

1.中断源有5个,分别为外部中断0请求INT0、外部中断1请求INT1、T0溢出中断请求TF0、T1溢出中断请求TF1和串口中断请求RI/TI

序号中断源说明
1INT0由P3.2引脚引入,IT0位决定低电平有效还是高电平有效
2INT1由P3.3引脚引入,IT0位决定低电平有效还是高电平有效
3TF0当T0产生溢出时,T0溢出中断标志位TF0置位,由硬件自动执行,请求中断处理
4TF1当T0产生溢出时,T0溢出中断标志位TF0置位,由硬件自动执行,请求中断处理
5RI/TI当接受或发送完一个串行帧时,内部串行口中断请求标志位RI/TI置位,请求中断

2.与中断有关的寄存器4个:中断标志寄存器TCON和串行口控制寄存器SCON、中断允许控制寄存器IE和中断优先级控制寄存器IP

3.中断系统中断允许位的含义

51单片机的5个中断源都是可屏蔽中断,中断系统内部设有一个专用寄存器IE,用于控制CPU对各中断的开放或屏蔽

IE寄存器格式如下

EAXXESET1EX1ET0EX0

 三、中断的优先级别

51单片机有两个中断优先级:高优先级和低优先级

中断源通过设置中断优先级寄存器IP确定高优先级或低优先级判断,同一优先级的采用自然优先级

中断优先级寄存器IP,用于锁存各中断优先级控制位,格式如下:

XXXPSPT1PX1PT0PX0

自然优先级由最高级到最低级排序如下:

外部中断0              定时器T0中断             外部中断1           定时器T1中断           串行口中断 

四、中断响应过程

中断相应过程就是自动调用并执行中断函数的过程

定义形式如下:

void  函数名() interrupt n
中断源n入口地址
外部中断000x0003
定时/计数器010x000B
外部中断020x0013
定时/计数器030x001B
串行口40x0023
void int_0()    interrupt 0    //外部中断0,型号对应的为0
void timer_0()  interrput 1    //定时/计数器0,型号对应的为1
void int_1()    interrput 2    //外部中断1,型号对应的为2
void timer_1()  interrupt 3    //定时/计数器1,型号对应的为3

下面以一个简单的程序来实现一下外部中断,这个程序主要是靠外部中断来控制流水灯的状态

先展示一下仿真:

 仿真图比较简单

代码实现:

#include <reg51.h>
#include <intrins.h>
sbit btn1=P3^2;
sbit btn2=P3^3;
bit b=0;
int num=0;
int j=0xfe;
/*****************************/
void timer_0() interrupt 1
{ 
  
   TH0=(65536-50000)/256;
	 TL0=(65536-50000)%256;
	 num++;
	 if(num==20)
	 {  
		    num=0;
		    P1=j;
	        j= crol_(j,1);//向右1固定,向左1位     
		   
	 }
}
/********************************/
void  int_0()  interrupt 0  //停止流水灯
{
   if(b==0)
	 {
	   TR0=0;
		 b=1;
	 }
	 else
	 {
		 b=0;
	   TR0=1;
	 }
}
/************************************/
void  int_1()  interrupt 2  //改变灯亮的位置
{
	  
    P1=j;
	j= crol_(j,1);//向右1固定,向左1位   
}
/*************************************/
void  main()
{
    TMOD=0x01;//使用T0计时器
	TH0=(65536-50000)/256;//设置初值
	TL0=(65536-50000)%256;
	
    IP=0x05;//设置外部中断1/0为高优先级中断
	
	EA=1;//开总中断
	
	EX0=1;//开外部中断0
	IT0=1;//设置外部中断0低电平触发
	EX1=1;//开外部中断1
	IT1=1;//设置外部中断1低电平触发
	
	ET0=1;//开定时器T0中断
	TR0=1;//启动定时器T0
	while(1);
}
/**********************************/

希望可以帮到大家!

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值