内部资源之外部中断
中断类型 中断入口地址 中断序号
外部中断0(INT0)P3.2 0003H 0
外部中断1(INT1)P3.3 0013H 2
定时计数器0(T0) 16bit 000BH 1
定时计数器1(T1) 001BH 3
定时计数器2(T2) 002BH 5
异步串行通信口(UART) 0023H 4
CPU外围模块的掌握方法:
(1)相关口线
(2)相关控制字
(3)模块的工作方式
一、外部中断
(1)相关口线
P3.2:int0,外部中断0输入。分为低电平和下降沿两种可选触发
P3.3:int1,外部中断1输入。分为低电平和下降沿两种可选触发
(2)相关控制字
IE :中断允许控制寄存器
EA -- ET2 ES ET1 EX1 ET0 EX0 IE=0X85 : EA=1 EX1=1 EX0=1
1 0 0 0 0 1 0 1
EA: 中断总允许控制位
ET2:定时中断2允许控制位
ES: 串行中断控制位
ET1:定时中断1允许控制位
ET0:定时中断0允许控制位
EX0:外部中断0允许控制位
EX1:外部中断1允许控制位
当中断控制位为0时禁止中断,为1是允许中断
IP:中断优先级控制寄存器
-- -- PT2 PS PT1 PX1 PT0 PX0 PX0=0 PX1=1 IP=0X04;
PX0:外部中断0优先级控制位
PX1:外部中断1优先级控制位
PT0:定时中断0优先级控制位
PT1:定时中断1优先级控制位
PT2:定时中断2优先级控制位
PS: 串行中断优先级控制位
优先级控制位为0时表示中断优先级为低,
为1时表示中断优先级为高,
中断优先级高的中断源可再次中断中断优先级低的中断源
同级间不能发生再次中断
TCON:定时计数器控制寄存器
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 IT0=1 : TCON=0X01
0 0 0 0 0 0 0 1
IT0:外部中断0触发方式选择位
当IT0=0时,外部中断0为低电平触发中断
当IT0=1时,外部中断0为下降沿触发中断,.优先选择
IE0:外部中断0中断请求标志位
当EA&EX0=1时,如果中断外部(P3.2)有信号时,
IE0自动置1,当CPU响应中断后自动清零。
IT1:外部中断1触发方式选择位
当IT1=0时,外部中断1为低电平触发中断
当IT1=1时,外部中断1为下降沿触发中断
IE1:外部中断1中断请求标志位
当EA&EX1=1时,如果中断外部脚(P3.3)有信号时,
IE1自动置1,当CPU响应中断后自动清零。
(3)CPU外围模块的使用方法:
<1>相关控制字初始化;
<2>如果模块工作在中断模式,则编写响应中断功能的子程序。
单片机中断是指CPU在正常执行程序的过程中,由于计算机内部或外部发生了另一事件(如定时时间到,超压报警等),请求CPU迅速去处理,CPU暂时停止当前程序的运行,而转去处理所发生的事件。通俗的讲,就是单片机在中断发生时,就立即停止执行正在执行的内容,而去执行中断服务函数。
今天要做的一个实验,按下按键,停止主程序中的内容,立即转去执行中断服务函数。
我们主要看到原理图与代码,了解中断是什么,到底是怎么执行的
打开仿真软件,开始绘制原理图。
我们的目的是按下按键,CPU不在执行主程序,转去执行中断服务函数,我们为了更好的观察,主函数里让灯灭,中断服务函数让灯亮,只要灯亮了,那么就一定执行了中断服务函数。而中断服务函数执行条件就是外部中断引脚INT0或INT1检测到上升沿或者下降沿。(可以通过寄存器设置)
```c
#include <reg51.h>
sbit LED = P1^0;// 定义LED就是P1^0
void delayms(unsigned int t) //延时函数
{
unsigned int a,b;
for(a=0; a<t; a++)
for(b=0; b<120; b++);
}
void main(void)
{
//设置INT0 (设置位寄存器)
IT0=1;//跳变沿出发方式(下降沿)
EX0=1;//打开INT0的中断允许。
EA=1;//打开总中断
while(1)
{
LED = 0; //注意,主函数是让led灭掉
}
}
/*外部中断0函数,只有INIT0引脚有下降沿才会触发,并且只会执行一次*/
/*外部中断0*/
void Int0() interrupt 0 //外部中断0的中断函数
{
LED = 1;
delayms(1000);
}
在keil里编译,然后烧录到仿真,如果按下按键,灯亮一秒后熄灭,实验成功。不懂的话仔细分析代码与原理图,或者给我留言。
附带生成文件://download.csdn.net/download/mbs520/12168882
另外,提供给学者一本秘籍:《51精简版教程》