单片机开发:外部中断仿真与开发板实验

实验目标

了解51单片机的外部中断机制,包括中断触发方式、中断优先级等概念。学习并掌握51单片机外部中断的编程方法,通过实验,掌握从程序设计、硬件设计到软件编程的完整过程,提升系统设计与开发能力。

 

中断机制

中断机制是指单片机在执行主程序时,发生外部事件A,请求单片机迅速处理(中断请求),单片机暂停当前的主程序(中断响应),保存当前断点数据,然后调用事件A的处理程序进行事件响应,事件A处理完成后,主程序恢复断点处的数据,并继续执行主程序。

引起单片机中断的来源称为中断源,中断源向单片机发出中断请求,单片机暂停主程序的执行,转去处理中断事件,对事件处理完毕,再回到原来被中断的地方(断点)继续执行主程序。中断源可以是传感器、串口、键盘等外部设备,这些外部设备如何向51单片机发送中断请求呢?51单片机通过P3.2端口、P3.3端口引入外部中断,该端口为低电平或下降沿时会引发中断,P3.2端口的中断名称为INT0,P3.3端口的中断名称为INT1,外部设备可以连接这两个端口向单片机发送中断请求。

上图给出了一个单片机中断场景,按钮接P3.2端口,即单片机外部中断INT0,按钮的另一端接地,P3.2端口与地接通,输入低电平,触发INT0中断请求,单片机主程序调用INT0中断函数,给P1.0端口送入低电平,发光二极管点亮,当按钮再次被按下时,再次触发INT0中断请求,单片机主程序调用INT0中断函数,给P1.0端口送入高电平,发光二极管熄灭,……,以此类推每次按下按钮都会触发INT0中断请求,发光二极管状态取反(点亮或熄灭)。

51单片机提供了5个中断源,如果同时有两个中断源发出中断请求信号,CPU会根据优先级决定接受哪一个中断请求,先接受高优先级的中断请求,再接受低优先级的中断请求。

中断源 优先级 触发 中断编号
外部中断 INT0 由P3.2端口触发该中断,低电平或下降沿触发 0
定时器 T0 较高 由T0计数器计满回零触发 1
外部中断 INT1 适中 由P3.3端口触发该中断,低电平或下降沿触发 2
定时器 T1 较低 由T1计数器计满回零触发 3
串行通信中断R1或T1 串行口端口完成一帧字符发送/接收后触发 4

单片机可以配置中断功能的启用和关闭,它通过中断允许寄存器IE来设定各个中断源的打开和关闭,IE是特殊功能寄存器,寄存器地址是A8H,该寄存器允许位操作,位地址由低位到高位分别是A8H~AFH,单片机复位是IE寄存器的全部位都清零,即关闭所有中断功能,若要开启中断功能,需要在程序中开启。中断允许寄存器IE位定义见下表。

EA是全局中断允许位,要开启某个中断源,先要设置EA为1,然后再设置该中断源的中断允许位。

外部中断仿真实验

实验目的

通过中断仿真实验,了解简单中断电路的设计和中断程序设计。

实验步骤

实验步骤如下:① 设计电路图;② 编写中断程序;③ 仿真运行中断程序。

设计电路图

创建一个新工程

启动Proteus 8,新建一个工程,选择“DEFAULT”模板,选择“不创建PCB布版设计”,选择“创建固件项目”,固件选择8051系列的AT89C52芯片,C编译器选择Keil for 8051,单击“下一步”,在弹出的对话框中单击“完成”按钮,即可完成工程的创建。

 

设计电路图

在“原理图绘制窗口”进行电路图的设计。AT89C52元件已放置到原理图绘制窗口,另外添加一个按钮、一个发光二极管、一个电阻,一个接地端、一个电源到原理图绘制窗口。
各电子元件接线方式如下图所示:


按钮一端接P3.2端口,即单片机外部中断INT0,另一端接地。当按钮按下时,P3.2端口与地接通,该端口输入低电平,触发INT0中断请求。
电路图的D1为发光二极管,负极接单片机P1.0,正极接200欧姆的电阻,电阻的一端接5V电源,该电阻对电路进行限流,因为发光二级管允许流过的电流较小,所以需要串联一个约几百欧姆的电阻。

 

编写中断程序

中断程序主要由初始化中断和中断处理函数构成。初始化中断完成中断寄存器、中断类型、中断触发方式的配置。中断处理函数用于响应中断事件。

(1)初始化中断
‌开启总中断‌:设置EA(全局中断允许位)为1,以允许中断发生。
‌开启特定中断‌:根据需要开启的中断类型(如外部中断、定时器中断等),设置相应的中断允许位。例如,对于外部中断0,需要设置EX0为1。
‌配置中断触发方式‌(对于外部中断):根据需求配置为低电平触发(IT0/IT1=0)或下降沿触发(IT0/IT1=1)。
(2)中断函数
51单片机中断处理函数格式如下:
void 函数名() interrupt 中断号 using 工作组
{
中断处理代码
}
中断处理函数不返回任何值,因此函数的返回类型为void,函数名命名规则和C函数相同,中断函数不能带任何参数,interrupt是定义中断处理函数关键字,中断号是中断源的序号,该序号是编译器识别不同中断的唯一符号,在写中断处理函数时必须要对应正确的中断号,“using 工作组”是设置该中断处理函数使用单片机内存4组工作寄存器的那一组,编译器在编译时会自动分配寄存器工作组,因此该语句可以省略。

单片机内运行的完整C程序如下:

#include<reg51.h>
sbit led0 = P1^0;
sbit button=P3^2; //定义按键
void main()
{
EA = 1; // 全局中断允许位,启用所有中断
EX0 = 1; // 外部中断0允许位
led0 = 1; // 初始化LED状态
while(1); // 主循环,等待中断发生
}

// 中断处理函数
void t1() interrupt 0
{
if( button == 0 ) {
led0 = ~led0;
}

}

在Proteus 8内打开源代码窗口,编辑main.c文件,输入上面的代码,然后构建工程,若代码存在问题,修改代码后再次构建工程。

 

仿真运行中断程序

工程构建成功后,将窗口切换到“原理图绘制”,选择“调试”菜单下的“运行仿真”命令。程序运行后,按下按钮,D1发光二极管点亮。

外部中断开发板实验

实验目的

使用开发板上的独立按键K3控制LED亮灭。

硬件设计

本实验实验的硬件资源如下:
(1)独立按键模块K3
(2)LED模块D1
如果要想使用外部中断 0 控制 LED,就必须通过单片机外部中断管脚与按键 K3 连接。由于开发板上部分模块电路是集成的,因此无需手动连接直接使用单片机 P3^2 和 P2^0 管脚即可。

软件设计

本实验使用独立按键K3控制LED模块的D1亮灭。从电路原理图可以看出,按键K3与单片机P3^2管脚连接,而P3^2端口正是单片机引入外部中断的端口,K3按键被按下后,P3^2端口接地,触发外部INT0中断请求。D1通过限流电阻与P2^0管脚连接,P2^0管脚引入低电平D1点亮,引入高电平D1熄灭。
定义外部中断初始化函数,启用所有中断,配置外部中断0允许位,初始化LED模块D1状态。
定义中断服务函数,在中断服务函数内部修改LED模块D1状态。

 

编写程序

启动Keil软件后,创建一个新项目,选择单片机型号STC89C52RC。在项目中添加C语言源文件main.c。
在main.c文件内输入下面的源代码:

#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit k3=P3^2; //定义按键 K3
sbit led=P2^0; //定义 P20 口是 led

// 延迟函数
void delay(u16 i)
{
while(i--);
}

// 初始化函数
void Int0Init()
{
//设置 INT0
IT0=1;//跳变沿出发方式(下降沿)
EX0=1;//打开 INT0 的中断允许。
EA=1;//打开总中断
}

void main()
{
Int0Init(); // 设置外部中断 0
while(1);
}

//外部中断 0 的中断函数
void Int0() interrupt 0
{
delay(1000); //延时消抖
if(k3==0)
{
led=~led;
}

3.8.4.5.实验现象

使用 USB 线将开发板和电脑连接成功后,把编写好的程序编译后将编译产生的.hex 文件烧入到芯片内,开发板会自动运行下载的程序,按下K3按键,LED模块的D1会反转其状态。