文章目录
前言
本次主要介绍一下关于单片机的实验:MCS-51单片机中断系统与应用设计。
一、MCS-51单片机中断系统原理
1.1 Proteus仿真模拟
从图中可以看出,本电路中用到了STC89C52单片机的P2的8个管脚和P3.2以及P3.3两个管脚。其中P2的8个管脚分别连接8个LED灯,P3.2和P3.3两个管脚分别与按键相连接。
1.2 MCS-51中断系统内部结构及其原理如下
A、中断响应就是CPU对中断源提出的中断请求的接受。满足什么条件才开进行中断响应呢?我们可以从上图MCS-51中断系统内部结构中推出中断相应条件:
(1)总中断允许开关接通,即IE寄存器中的中断总允许位EA=1。
(2)该中断源发出中断请求,即该中断源对应中断请求标志为“1”。
(3)该中断源的中断允许位=1,即该中断被允许。
(4)无同级或更高级中断正在被服务。
B、中断服务函数的一般形式为:
函数类型 | 函数名(形式参数表) | interrupt n | using n |
---|---|---|---|
void | int0 ( ) | interrupt 0 | using 0 |
其中interrupt后面的 n是中断号,取值为0~4,n=0时,对应的中断源是外部中断0;n=1时,对应的中断源是定时器0;n=2时,对应的中断源是外部中断1;n=3时,对应的中断源是定时器1;n=4时,对应的中断源是串行口。
C、中断服务函数与平时子程序的调用类似,二者的最大区别在于:子程序在使用时会在主程序有一个调用的过程,但是后者产生中断服务后,会直接跳到对应的程序。
二、MCS-51单片机中断应用案例功能
在外部中断0引脚(P3.2)接一只按钮开关。在外部中断1引脚(P3.3)接另一个开关,编制一段程序,当程序启动时,P2口上的8只LED全亮。按第一个开关,让低4位的LED与高4位的LED交替闪烁5次,按第二个开关让8个LED同时闪亮,然后从中断返回,控制8只LED再次全亮。
三、MCS-51单片机中断应用案例程序代码
代码如下(示例):
#include<reg52.h> //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit k3=P3^2; //定义按键 K3
sbit k4=P3^3 ; //定义按键 K4
sbit led=P2^0; //定义 P20 口是 led
void delay(u16 i)
{
while(i--);
}
void Int0Init() //设置 INT0
{
IT0=1; //跳变沿出发方式(下降沿)
EX0=1; //打开 INT0 的中断允许。
EA=1; //打开总中断
}
void Int1Init() //设置INT1
{
IT1=1; //跳变沿出发方式(下降沿)
EX1=1; //打开 INT0 的中断允许。
EA=1; //打开总中断
}
void main() //主程序
{
P2=0;
Int0Init(); // 设置外部中断 0
Int1Init(); // 设置外部中断 1
while(1)
{P2=0;} ;
}
void Int0() interrupt 0 using 0 //中断 0 的中断函数
{
delay(1000); //延时消抖
if(k3==0)
{
unsigned char m;
for(m=0;m<5;m++) //交替闪烁5次
{
P2=0x0f; //低4位LED灭,高4位LED亮
delay(100000); //延时
P2=0xf0; //高4位LED灭,低4位LED亮
delay(100000);
EX0=1; //中断返回前,打开外部中断0中断
}
}
}
void Int1() interrupt 1 //中断 1 的中断函数
{
delay(1000); //延时消抖
if(k4==0)
{
unsigned char m;
for(m=0;m<5;m++) //闪亮5次
{
P2=0xff; //LED全灭
delay(100000); //延时
P2=0x00; //LED全亮
delay(100000);
EX1=1; //中断返回前,打开外部中断1中断
}
}
}
四、MCS-51单片机中断应用案例电路图