历史上的今天
今天是:2024年11月03日(星期日)
2021年11月03日 | STC89C52之中断系统 ---- 51单片机的核心 自学笔记
2021-11-03 来源:eefocus
一、中断系统
1.1、概念
cpu在处理某一事件A时,发生了另外一事件B请求cpu迅速去处理(中断发生);
cup暂时中断当前的工作,转去处理事件B(中断响应和中断服务);
待cup将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回);
这一过程称为中断。

引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。cup暂时中断原来的事务A,转去处理事件B。对事件B
处理完毕后,再回到原来被中断的地方(即:断点)称为中断返回,实现上述中断功能的部件称为中断系统。

1.2、中断系统的功能与优点
解决了快速主机与慢速i/o设备的数据传送问题。
分时操作:cpu可以为多个io设备服务,提供计算机的利用率。
实时操作:cpu能够及时处理应用系统的随机事件,系统实时性大大增强。
可靠性高:cpu具有处理设备故障及掉电等突发性事件的能力,从而使系统可靠性提高。
1.3、89C52单片机中断系统的结构
89C52的中断系统有5个中断源,2个优先级,可实现二级中断嵌套。
二级中断嵌套:在一个中断里面还可以实现一个中断

TF0,TF1:T1溢出(外部)中断请求标志 TF0=1溢出 TF0不等于1 计数器、定时器正常工作
RI:接收完成标志 RI =1 一帧数据接受完成 向cpu发送中断请求
TI:发送完成标志 TI=1 一帧数据发送完成 向cpu发送中断请求
IE0、IE1:中断标志位
二、中断允许控制

CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。
EX0(IE,0):外部中断0允许位; 置1允许外部中断 置0不允许外部中断
ET0(IE,1):定时/计数器T0中断允许位 置1允许定时器计数器中断 置0 不允许打开中断
EX1(IE,2):外部中断1允许位; 置1允许外部中断 置0不允许外部中断
ET1(IE,3);定时计数器T1中断允许位 置1允许定时器计数器中断 置0 不允定时器计数器中断
ES(IE,4);串行口中断允许位 置1允许串行口中断 置0不允许串行口中断
EA(IE,7);CPU中断允许位(总允许)位 ; 如果EA不置1,上述如EX1,ET1置1也效
三、中断请求标志
3.1、TCON的中断标志
ITO(TCON.0):外部中断0触发控制位。
当IT0=0时,为电平触发方式 低电平
当IT0=1时,为边沿触发方式(下降沿有效)
IE0(TCON.1):外部中断0中断请求标志位。
IT1(TCON.2):外部中断1触发方式控制位。
IE1(TCON.3):外部中断1中断请求标志位。
TF0(TCON.5):定时/计数器T0溢出中断请求标志位。 置1溢出
TF1(TCON.7):定时/计数器T1溢出中断请求标志位。
2.2、优先级问题
同一优先级中的中断申请不止一个时,则有中断优先权排队问题,同一优先级的中断优先排队,由
中断系统的硬件确定的自然优先级形成,排列如下
2.3、51单片机的中断优先级的三条原则
CPU同时收到几个中断时,首先响应优先级别最高的中断请求。
正在进行的中断过程不能被新的同级或低优先级的中断请求所中断
正在进行的优先级中断服务,能被高优先级中断请求所中断
为了实现上述后两条原则,中断系统内部设有两个用户不能寻址的优先级状态触发器,其中一个置1,表示正在响应高优先级的中断,他将阻断后来所有的中断请求:另外一个置1,表示正在响应低优先级中断,他将阻断后来所有的低优先级中断请求。
四、51单片机中断处理过程
4.1、中断响应条件
中断源有中断请求
此中断的中断允许为1;
CPU开中断(即EA=1)
同时满足以上三条件,cpu才可能响应中断
4.2、使用中断的注意事项
你想使用的是那个中断是那个,选择相应的中断号;
你希望触发中断的条件是什么?
你希望中断之后干什么
五、代码示例
5.1、k3按键点亮LED模块的第一个LED灯
#include typedef unsigned int u16; typedef unsigned char u8; sbit k3=P3^2; // 定义按键k3 sbit led = P2^0; // 定义 P20口是led /* 1,单片机-->LED&交通灯模块 P20-->D1 2,单片机-->独立按键模块 P32-->K3 */ void delay(u16 i) // 延时函数 { while(i--); } void IntoInit() // 外部中断函数 { //设置 INT0 IT0=1;//跳变沿触发方式(下降沿) EX0=1;//打开 INT0 的中断允许。 EA=1;//打开总中断 } void main() { IntoInit(); // 设置外部中断 while(1); } void into() interrupt 0 { delay(1000); // 延时消抖 if(k3==0) { led=~led; } } 5.2、k4点亮led #include typedef unsigned int u16; // 宏定义 数据类型的声明 typedef unsigned char u8; sbit k4=P3^3; // 定义按键k4 sbit led = P2^0; // 定义 P20口是led /* 1,单片机-->LED&交通灯模块 P20-->D1 2,单片机-->独立按键模块 P33-->K4 */ void delay(u16 i) // 延时函数 { while(i--); } void IntoInit() // 外部中断函数 { //设置 INT0 IT1=1;//跳变沿触发方式(下降沿) EX1=1;//打开 INT0 的中断允许。 EA=1;//打开总中断 } void main() { IntoInit(); // 设置外部中断 while(1); } /* 中断0 外部知中断0 interrupt 0 中断道1 定时器1中断 interrupt 1 中断2 外部中断1 interrupt 2 中断3 定时器2中断 interrupt 3 中断4 串口中断 interrupt 4 */ void into() interrupt 2 // interrupt 一个中断处理函数 { delay(1000); // 延时消抖 if(k4==0) { led=~led; } } 中断0 外部知中断0 interrupt 0 中断1 定时器1中断 interrupt 1 中断2 外部中断1 interrupt 2 中断3 定时器2中断 interrupt 3 中断4 串口中断 interrupt 4
史海拾趣
|
各位大佬: 您们好! 我市昨射频调制器的,最近遇见常见的问题,但是令我很困挠,敬请您们拉一把,请提出您们的高见,万分感激! 问题是:调制器安安装在机顶 ...… 查看全部问答> |
|
IAR的开发环境,用的是Atmega48单片机。 T0中断无法进入!设置如下: void timer0Init() //定时器0初始化 { // initialize timer 0 //TCCROB =0X00;   ...… 查看全部问答> |
|
全球体积最小 价格最低进口GSM模块 sirius 35** 特点 目前市场存在的所有GSM模块(包括进口和国产模块) 价格最低廉,体积最小的一款GSM module 功耗低 若电池供电,待机时间长 关机… 查看全部问答> |
|
首先,我先交代一下故事的发生背景。 暑假里一个实验室里要搞个类似于兴趣小组的东西,我当时兴冲冲的跑去了。老师给我布置的任务是将从单片机里的数据取出并存储,要求: ⑴能显示多行数据。(在五行以上) ⑵用单片机(51系列的)。 ⑶显示效 ...… 查看全部问答> |
|
PIC24hj128gp510 ad采样之后转换不了 DONE 不能被硬件置1 写了一个AD采样程序,显示用数码管;但是无论自动手动都不能转换,DONE位不能被硬件置1,采样1次1次中断,不能进入中断, 晶振是6M, #include unsigned char const Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, ...… 查看全部问答> |
|
先看数据手册: 对应到小四轴上的坐标: 近似水平放置下的重力加速度数据: 以Y轴作为轴,沿着X轴顺时针转90度,把小四轴竖起来,获得下列加速度值: 以X轴作为轴,沿着Y轴逆时针转90度,把小四轴竖起来,获得下列加速度值: … 查看全部问答> |







