一、实验相关知识点 1.掌握外部中断的工作原理; 2.学会中断程序设计。 二、实验内容及要求 【实验内容】 (1)创建一个包含80C51固件,采用Keil for 8051编译器的新项目; (2)仿照图A.5和表A.4绘制电路原理图; (3)编写C51源程序,要求采用中断方法实现如下功能:程序启动后,D1处于熄灯、LED1处于黑屏状态;单击K1,可使D1亮灯状态反转一次;单击K2,可使LED1显示值加1,并按十六进制数显示,达到F后重新从1开始。 (4)完成源程序编译和动态调试,实现实验4的控制功能要求; (5)完成实验4文档的撰写。 【实验要求】 提交实验文档并包括如下内容: (1)电路原理图 (2)C51源程序(含注释语句) (3)软件调试分析 (4)仿真运行截图 (5)实验小结 三、实验方法 1.实验电路图中按键K1和K2分别接于P3.2和P3.3,发光二极管D1接于P0.4,共阴极数码管LED1接于P2口。 2.软件编程原理为:将数码管0~F的显示字模保存在数组中,K1和K2的按键动作分别作为的中断请求,在中断函数中进行LED灯控制和数码管显示刷新。初始化后,主函数处于无限循环状态,等待中断请求。 四、实验流程 1.电路原理图 2. C51源程序(含注释语句) - #include "reg51.h"// 引入8051单片机的头文件
- unsigned char led_mod[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71,};
- // 定义一个无符号字符型数组 led_mod,用于存储数码管显示 0 - F 以及其他字符的段码
- // 这里共阴极数码管显示 0 - F 及部分字符对应的段码依次存储在数组中
- unsigned char count = 0; // 定义一个无符号字符型变量 count,用于记录数码管显示的索引值,初始化为 0
- sbit P04 = P0^4;// 使用 sbit 关键字定义 P0 口的第 4 位为 P04,方便后续对该引脚进行操作
- // 外部中断 0 的中断服务函数,当外部中断 0 触发时执行此函数
- // 函数名为 int0_key,中断号为 0
- int0_key() interrupt 0{
- P04 = !P04; // 对 P04 引脚的电平取反,实现连接在该引脚的 LED 灯亮灭状态的切换
- }
- // 外部中断 1 的中断服务函数,当外部中断 1 触发时执行此函数
- // 函数名为 int1_key,中断号为 2
- int1_key() interrupt 2{
- P2 = led_mod[count];
- if (++count>=0x10) count=0;
- // 先将 count 的值加 1,然后判断是否大于等于 0x10
- // 如果大于等于 0x10,则将 count 重新置为 0,实现循环显示
- }
- // 主函数,程序的入口点
- void main(){
- IT0=IT1=EX0=EX1=EA=1;
- // 设置外部中断 0 和外部中断 1 的触发方式为下降沿触发
- // IT0 控制外部中断 0 的触发方式,IT1 控制外部中断 1 的触发方式
- // EX0 使能外部中断 0,EX1 使能外部中断 1
- // EA 是总中断允许位,置 1 表示允许所有中断
- P2 = 0; // 将 P2 口初始化为低电平,即数码管初始不显示任何字符
- while(1);
- // 主函数进入一个无限循环,程序会一直停留在这个循环中
- // 等待外部中断的触发,当有中断触发时,会跳转到相应的中断服务函数执行
- }
复制代码3. 程序分析 这段代码主要功能是利用外部中断来控制硬件设备。具体而言,通过外部中断 0 控制一个 LED 灯(连接在 P0.4 引脚)的亮灭状态切换,通过外部中断 1 控制共阴极数码管(连接在 P2 口)循环显示预设的字符段码。 (1)头文件包含 引入了reg51.h头文件,该头文件中定义了 8051 单片机的特殊功能寄存器和位定义,使得代码可以方便地访问和操作单片机的各个寄存器。 (2)数码管段码数组 定义了一个无符号字符型数组led_mod,用于存储共阴极数码管显示 0 - F 以及其他字符的段码。每个元素对应一个字符的显示编码,当需要显示某个字符时,只需将对应的段码输出到数码管的控制端口。 (3)计数器变量 定义了一个无符号字符型变量count,初始值为 0。该变量作为索引,用于从led_mod数组中选取要显示的段码,同时在外部中断 1 的处理中用于控制显示的循环。 (4)引脚定义 使用sbit关键字将 P0 口的第 4 位定义为P04,这样在代码中可以直接使用P04来操作该引脚,提高了代码的可读性和可维护性。 (5)外部中断 0 服务函数 函数名为int0_key。中断号为0,表示这是外部中断 0 的服务函数。当外部中断 0 触发时,将P04引脚的电平取反,从而实现连接在该引脚的 LED 灯亮灭状态的切换。 (6)外部中断 1 服务函数 函数名为int1_key,中断号为2,表示这是外部中断 1 的服务函数。功能是将led_mod数组中索引为count的段码赋值给 P2 口,驱动数码管显示对应的字符。并将count的值加 1,然后判断是否大于等于0x10。如果大于等于0x10,则将count重新置为 0,实现数码管显示的循环。 (7)主函数 中断和触发方式设置:IT0 = IT1 = 1,将外部中断 0 和外部中断 1 的触发方式设置为下降沿触发。EX0 = EX1 = 1,使能外部中断 0 和外部中断 1。EA = 1,使能总中断,允许所有中断源产生中断。 数码管初始化:P2 = 0,将 P2 口初始化为低电平,使数码管初始状态不显示任何字符。 无限循环:while(1);,主函数进入一个无限循环,程序会一直停留在这个循环中,等待外部中断的触发。当有中断触发时,程序会跳转到相应的中断服务函数执行。 4. 软件调试 5. 仿真运行截图
实验结论
本次实验基于 80C51 单片机,成功运用 Keil for 8051 编译器完成项目创建与代码编写,通过绘制电路原理图并搭建硬件连接,实现了外部中断控制功能。其中,K1 按键触发外部中断 0,能够准确实现 D1 亮灯状态的反转;K2 按键触发外部中断 1,可使 LED1 按十六进制数规律循环显示数值。经编译调试与仿真运行,程序稳定运行,功能完全符合预期,验证了外部中断工作原理在单片机控制系统中的有效性和实用性,达到了实验目标。
实验个人体会
通过本次实验,我对外部中断的工作机制有了更深刻的理解,从理论学习到实际编程调试,掌握了中断程序设计的基本方法和技巧。在调试过程中,遇到过按键抖动导致误触发、数码管显示异常等问题,通过查阅资料和逐步排查,最终得以解决,这极大地提升了我的问题分析和解决能力。同时,也意识到代码规范性、注释添加以及硬件连接准确性的重要性。未来,我将继续深入学习单片机知识,加强实践操作,提升综合应用能力,以便更好地应对复杂的嵌入式系统开发任务。
仿真文件和Word ppt下载:
实验5.7z
(979.97 KB, 下载次数: 0)
|