【笔记】重学单片机(51)(下)

发布于:2025-08-05 ⋅ 阅读:(16) ⋅ 点赞:(0)

中断系统

正常运行过程中,被打断进行另外工作,结束后回到原有进程。
5个中断源

外部中断源(2个):
   INT0——由P3.2端口线引入,低电平或下降沿引起。
   INT1——由P3.3端口线引入,低电平或下降沿引起。
   这两个外部中断源标志和它们的触发方式控制位由特殊功能寄存器TCON的低4位控制。
内部中断源(3个):
    T0——定时器/计数器0中断,由T0回零溢出引起。
    T1——定时器/计数器1中断,由T1回零溢出引起。
    TI/RI——串行I/O中断,串行端口完成一帧字符发送/接收后引起。
    这3个内部中断源的控制位分别锁存在特殊功能寄存器TCON和SCON中。

在这里插入图片描述

1、中断请求标志TCON(88H)可位寻址 【2.配置中断方式】

TCON:Timer控制寄存器,低4位管理外部中断
作用:设置外部中断触发方式,标注外部中断请求。
在这里插入图片描述

IE0/IE1:外部中断申请标志位:
     =0:没有外部中断申请;
     =1:有外部中断申请。
IT0/IT1:外部中断请求的触发方式选择位:
     =0:在INT0/INT1端申请中断的信号 低电平 有效;
     	注意:低电平触发 引脚上的低电平须持续到中断发生。若中断返回前仍未及时撤除低电平,将再次中断。
     =1:在INT0/INT1端申请中断的信号 负跳变 有效。
     	注意:负脉冲触发 CPU在前一机器周期采到INT0/INT1引脚为高,后一机器周期采到为低才认为是一次中断请求。CPU 可记忆申请、可自动撤除中断申请。

2、中断允许控制寄存器IE(A8H)【1.允许中断】

作用:CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。
在这里插入图片描述

EA , CPU中断允许(总允许)位; =0 时禁止全部中断;=1 时允许中断。
ES,串行口中断允许位;=0 时禁止中断;  =1 时允许中断。
ET1,定时/计数器T1中断允许位;=0 时禁止中断;  =1 时允许中断。
EX1,外部中断1允许位;=0 时禁止中断;  =1 时允许中断。
ET0,定时/计数器T0中断允许位;=0 时禁止中断;  =1 时允许中断。
EX0,外部中断0允许位; =0 时禁止中断;  =1 时允许中断。

3.中断优先级控制寄存器IP (B8H)可位寻址【3.中断处理-优先级】

在这里插入图片描述

PX0/PX1:INT0/1优先级控制位:
  =0 时属低优先级; =1 时属高优先级。
PT0/PT1:T0/1中断优先级控制位:
  =0 时属低优先级; =1 时属高优先级。
PS:串行口中断优先级控制位:
  =0 时属低优先级; =1 时属高优先级。

对同时发生多个中断申请时:

不同优先级的中断同时申请(很难遇到)
             ——先高后低
相同优先级的中断同时申请(很难遇到)
             ——按序执行
正处理低优先级中断又接到高级别中断
             ——高打断低
正处理高优先级中断又接到低级别中断
             ——高不理低

在这里插入图片描述

编程知识点

中断响应条件:

此中断源的中断允许位为1。
总中断CPU中断打开(EA = 1)。
中断源有中断请求。

中断初始化:

EX0 = 1; //开外部中断0
IT0 = 0; //低电平触发
EA = 1; //开总中断

编程

1.外部中断0低电平触发

实现:外部中断0低电平触发方式,每按下一次S2按键就会进入一次中断,LED灯会发生状态变化。
注意:

按键S2:连接在P3.0引脚(定义为key_s2)
中断触发信号:由P3.7引脚(定义为flag)产生 低电平
外部中断0:实际中断触发引脚为P3.2(固定硬件功能),需确保硬件上P3.7与P3.2物理连接
#include <reg52.h>

#define uint unsigned int
#define uchar unsigned char

sbit key_s2 = P3^0;//独立按键S2
sbit flag = P3^7; //外部中断信号产生脚

/*====================================
函数	: delay(uint z)
参数	:z 延时毫秒设定,取值范围0-65535
返回值	:无
描述	:12T/Fosc11.0592M毫秒级延时
====================================*/
void delay(uint z)
{
	uint x,y;
	for(x = z; x > 0; x--)
		for(y = 114; y > 0 ; y--); 		
} 
//外部中断0初始化
void int0Init()
{
	EA = 1;	//开总中断
	EX0 = 1;//开外部中断0
	IT0 = 0;//外部中断0低电平触发	
}

void main()//main函数自身会循环
{
	int0Init();//外部中断0初始化	
	while(1)
	{
		if(key_s2 == 0)//判断S2是否被按下
		{
			delay(20);//按键消抖
			if(key_s2 == 0)
			{
				flag = 0;
				flag = 0;//产生低电平,CPU会采样2次P3.2的状态,两次都为低才触发
				flag = 1;//结束低电平
				while(!key_s2);//松手检测
			}	
		}

	}	
}

//外部中断1中断服务程序
void int0() interrupt 0
{
	P1 = ~P1;//P1的状态按位取反
}  

外部中断1跳变沿

实现:外部中断1下降沿触发方式,每按下一次S2按键就会进入一次中断,LED灯会发生状态变化。

#include <reg52.h>

#define uint unsigned int
#define uchar unsigned char

sbit key_s2 = P3^0;//独立按键S2
sbit flag = P3^7; //外部中断信号产生脚

/*====================================
函数	: delay(uint z)
参数	:z 延时毫秒设定,取值范围0-65535
返回值	:无
描述	:12T/Fosc11.0592M毫秒级延时
====================================*/
void delay(uint z)
{
	uint x,y;
	for(x = z; x > 0; x--)
		for(y = 114; y > 0 ; y--); 		
} 
//外部中断1初始化
void int1Init()
{
	EA = 1;	//开总中断
	EX1 = 1;//开外部中断1
	IT1 = 1;//外部中断1下降沿触发	
}

void main()//main函数自身会循环
{
	int1Init();//外部中断1初始化	
	while(1)
	{
		if(key_s2 == 0)//判断S2是否被按下
		{
			delay(20);//按键消抖
			if(key_s2 == 0)
			{
				flag = 1;
				flag = 0;//产生下降沿
				while(!key_s2);//松手检测
			}	
		}

	}	
}

//外部中断1中断服务程序
void int1() interrupt 2
{
	P1 = ~P1;
}  

未完待续……


网站公告

今日签到

点亮在社区的每一天
去签到