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

中断系统

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

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)。
中断源有中断请求。

中断初始化:

c 复制代码
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物理连接
c 复制代码
#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灯会发生状态变化。

c 复制代码
#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;
}  

未完待续......

相关推荐
Amrzs_hp1 天前
stm32温度采集
stm32·单片机·嵌入式硬件
童话名剑1 天前
序列模型与集束搜索(吴恩达深度学习笔记)
人工智能·笔记·深度学习·机器翻译·seq2seq·集束搜索·编码-解码模型
鄭郑1 天前
STM32学习笔记--I2C封装与OLED(2026.2.1)
笔记·stm32·学习
想放学的刺客1 天前
单片机嵌入式试题(第29期)嵌入式系统的电源完整性设计与去耦电容选型。抗干扰设计与EMC合规性
c语言·stm32·嵌入式硬件·物联网·51单片机
酒鼎1 天前
学习笔记(4)HTML5新特性(第3章)- WebSocket
笔记·学习·html5
-Springer-1 天前
STM32 学习 —— 个人学习笔记2-2(新建工程)
笔记·stm32·学习
tb_first1 天前
万字超详细苍穹外卖学习笔记4
java·spring boot·笔记·学习·spring·mybatis
日更嵌入式的打工仔1 天前
C内存布局
笔记
卡布叻_星星1 天前
达梦数据库笔记之使用教程以及不推荐迁移选择小写
笔记
山岚的运维笔记1 天前
SQL Server笔记 -- 第15章:INSERT INTO
java·数据库·笔记·sql·microsoft·sqlserver