51单片机中断系统的原理和运用

QX-MCS51开发板上使用的是DIP封装(双列直插式)有40只引脚!
40只引脚按其功能来分,有三类

一、电源和时钟引脚:Vcc、Vss;XTAL1、XTAL2

**电源引脚接入单片机工作电源**
Vcc(40脚):接+5V电源;
Vss ( 20脚 )   :接地

**时钟引脚**
XTAL1和XTAL2分别接开发板的外部晶振,为单片机提供工作效率节拍

二、控制引脚

RST(RESET)是复位信号输入端
当单片机运行时,在此引脚加上持续两个机器周期的高电平时,就可以完成复位操作
Vpd为本引脚的第二功能,即备用电源输入端
当电源Vcc发生故障,降低到某一规定值的低电平时,将+5V电源自动接入RST端,为内部RAM提供备用电源,从而保证单片机复位后能继续运行
EA为内外部程序储存器选择端
当EA为高电平时,单片机访问内部程序储存空间,为低电平时访问外部程序储存空间
Vpp编程电压的输入端
ALE为地址所存允许信号
PROG为对片内为PROG的单片机编写程序时,此引脚做编程脉冲输入
PSEN当单片机访问外部程序储存器时,此引脚为读取外部储存选通信号

三、I/O口引脚

P0三态IO口,P1口、P2口内部有上拉普通准双向IO口,P3口内部有上拉普通准双向IO口(第二功能,可以通过配置特殊功能寄存来实现)
P3第二功能各引脚功能定义:
P3.0:RXD串行口输入
P3.1:TXD串行口输出
P3.2:INT0外部中断0输入
P3.3:INT1外部中断1输入
P3.4:T0定时器0外部输入
P3.5:T1定时器1外部输入
P3.6:WR外部写控制
P3.7:RD外部读控制

中断

计算机执行某程序时,发出来紧急事件或有特殊请求,CPU暂停某程序的执行,转而去处理上述事件或请求,处理完毕后再重新执行某程序的过程。

中断四个步骤:
中断请求→中断响应→中断处理→中断返回

中断功能的强弱是计算机性能优劣的重要标志

提高CPU效率
解决速度矛盾
实现并行工作
应付突发事件

数据的输入/输出方式

无条件传送方式
一方对另一方来说总是准备好的
查询传送方式(LOOK UP)
传送前一方先查询另一方的状态,若已经准备好就传送,否则就继续查询/等待
中断传送方式(IRQ):
一方通过申请中断的方式与另一方进行数据传送
直接存储器存取方式(DMA):
双方直接通过总线传送数据,不经CPU中转,适用于数据量大高速通讯的设备不占用CPU时间

51子系列允许5个中断源

外部中断源(2个):
INT0——由P3.2端口线引入,低电平或下降沿引起
INT1——由P3.3端口线引入,低电平或下降沿引起

这两个外部中断源标志和它们的触发方式控制位由特殊功能寄存器TCON的低四位控制

内部中断源(3个):
T0——定时器/计数器0中断,由T0回零溢出引起
T1——定时器/计数器1中断,由T1回零溢出引起
TI/RI——串行I/O中断,串行端口完成一帧字符发送/接收后引起

这三个内部中断源的控制位分别锁存在特殊功能寄存器TCON和SCON中。

中断请求标志TCON(88H)可位寻址

TCON:Timer控制寄存器,低四位管理外部中断
作用:设置外部中断触发方式,标注外部中断请求

76543210
符号TF1TR1TF0TR0IE1IT1IE0IT0

IE0/IE1:外部中断申请标志位
=0:没有外部中断申请
=1:有外部中断申请

IT0/IT1:外部中断请求的触发方式选择位
=0:在INT0/INT1端申请中断的信号 低电平有效
=1:在INT0/INT1端申请中断的信号 负跳变有效(下降沿)

中断允许控制寄存器IE(A8H)

作用:CPU对中断系统所有中断以及某个中断源的开发和屏蔽是由中断允许寄存器IE控制的。

76543210
符号EAESET1EX1ET0EX0

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

外部中断及中断请求的撤除

低电平触发:
引脚上的低电平须持续到中断发生。若中断返回前仍未及撤除低电平,将再次中断
负脉冲触发:
CPU在前一机器周期采到INT0/INT1引脚为高,后一机器周期采到为低才认为是一次中断请求。CPU可记忆申请、可自动撤除中断申请。

51的中断系统有5个中断源,2个优先级,可实现二级中断嵌套

在这里插入图片描述
中断优先级控制寄存器IP(B8H)可位寻址

01234567
符号---PSPT1PX1PT0PX0

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

中断优先级处理原则

同时发生多个中断申请时:
1、不同优先级的中断同时申请(很难遇到)——先高后低
2、相同优先级的中断同时申请(很难遇到)——按序执行
3、正处理低优先级中断又接到高级别中断——高打断低
4、正处理高优先级中断又接到低级别中断——高不理低

在这里插入图片描述

中断响应条件
1、此中断源的中断允许位为1
2、总中断CPU中断打开(EA = 1)
3、中断源有中断请求
外部中断0初始化例子

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

跳变沿触发代码示例:
灯闪一下

#include<reg52.h>
 
#define uchar unsigned char
#define uint unsigned int

void delay(uint z)
{
	uint x,y;
	for(x = z;x > 0;x --)
		for(y = 114;y > 0;y --);
}

void init() //中断服务特殊功能寄存器配置
{
	EXO = 1; //开外部中断0
	IT0 = 1;//低电平触发方式
	EA = 1;//开总中断
}

void int0() interrupt 0
{
	P1 = 0;
	delay(100);
}

void main()
{
	init();
	while(1)
	{
		P1 = 0xff;
	}
}

led灯隔200ms闪烁一次
代码示例:

#include<reg52.h>
 
#define uchar unsigned char
#define uint unsigned int

uint count = 0;

void delay(uint z)
{
	uint x,y;
	for(x = z;x > 0;x --)
		for(y = 114;y > 0;y --);
}

void init() //中断服务特殊功能寄存器配置
{
	TMOD = 0x01; //定时器0为计数模式
	TH0 = 0x4b;
	TL0 = 0xfd//50ms
	ET0 = 1;//开定时器0中断
	TR0 = 1;//启动定时器0
	EA = 1;//开总中断
}

/*因为T0溢出中断优先级为第二高
所以interrupt后面唯一,最高级为0,最低为4
*/
void timer0() interrupt 1  //因为T0溢出中断优先级为第二高,所以
{
	TH0 = 0x4b;
	TL0 = 0xfd;
	count ++;
	if(count == 4)
	{
		P1 = 0;
		delay(5);
		count = 0;
    }
}

void main()
{
	init();
	while(1)
	{
		P1 = 0xff;
	}
}
  • 9
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值