一、设计目的
1、学习并掌握中断系统工作原理;
2、学习并掌握中断程序编写方法;
3、学习并掌握中断嵌套原理;
4、学习并掌握中断优先级设置方法;
二、实验设备
1、计算机;
2、单片机开发板;
3、Keil C51编程软件;
4、Proteus仿真软件;
三、设计内容
1、功能
功能1:中断不嵌套
(1)K1和K2都未按下时,P1口8只LED呈流水灯显示
(2)K1(P3.2)按下再松开时,P1口的4只LED交替闪烁5次,然后再回到流水灯显示。
(3)K2(P3.3)按下再松开时,P1口的8只LED全部闪烁5次,然后再回到流水灯显示。
(4)若K1按下4只LED交替闪烁5次期间,按下K2则等交替闪烁之后,8只LED全部闪烁5次
(5)以上延时时间均为500ms。
功能2:中断嵌套
若K1按下4只LED交替闪烁5次期间,按下K2则马上8只LED全部闪烁5次,然后回来继续4只LED交替闪烁
功能3:K3按下一次,切换上述两种功能。
2、硬件电路原理图
3、设计程序
#include <reg52.h>#include <intrins.h> //宏定义 #define uchar unsigned char #define FOSC 11059200L //晶振设置,使用11.0592M Hz
//IO接口定义 sbit Trans = P3^4;//转换功能一与功能二开关,为key3
/******************************************************************************* * 函 数 名 :Delayms * 函数功能 :实现 ms级的延时 * 输 入 :ms * 输 出 :无 *******************************************************************************/ void Delayms(unsigned int ms) { unsigned int i,j; for(i=0;i<ms;i++) #if FOSC == 11059200L for(j=0;j<114;j++); #elif FOSC == 12000000L for(j=0;j<123;j++); #elif FOSC == 24000000L for(j=0;j<249;j++); #else for(j=0;j<114;j++); #endif } /******************************************************************************* * 函 数 名 :EX_Init * 函数功能 :外部中断初始化程序 * 输 入 :无 * 输 出 :无 *******************************************************************************/ void EX_Init() { EA=1; //开总中断 //允许 INT0 INT1 外部中断 EX0=1; EX1=1; //触发方式为脉冲负边沿触发 IT0=1; IT1=1;
PX0=0; PX1=0; } /******************************************************************************* * 函 数 名 : LED * 函数功能 :流水灯及key3检测 * 输 入 :无 * 输 出 :无 *******************************************************************************/ void LED() { unsigned char k; k=0xfe; while(1) { //按键检测 if(Trans == 0) { Delayms(30);//按键消抖 if(Trans == 0) PX1 = ~PX1;//中断优先级切换 while(!Trans);//松手检测 } //流水灯 P1=k; Delayms(500); k=_crol_(k,1); } } /******************************************************************************* * 函 数 名 :main * 函数功能 :主函数 * 输 入 :无 * 输 出 :无 *******************************************************************************/ void main( ) { EX_Init();//外部中断初始化:允许 INT0 、INT1 外部中断、触发方式为脉冲负边沿触发、开总中断 LED();//流水灯 }
/******************************************************************************* * 函 数 名 :int0_isr * 函数功能 :外部中断0中断服务函数 ISR * 输 入 :无 * 输 出 :无 *******************************************************************************/ void int0_isr(void) interrupt 0
{ uchar i; //四个灯闪烁5次 for(i=0;i<5;i++) { P1=0x0f; Delayms(500); P1=0xf0; Delayms(500); }
}
/******************************************************************************* * 函 数 名 :int1_isr * 函数功能 :外部中断2中断服务函数 ISR * 输 入 :无 * 输 出 :无 *******************************************************************************/ void int1_isr(void) interrupt 2 {
uchar j; //八个灯闪烁5次 for (j=0;j<5;j++) { P1=0x00; Delayms(500); P1=0xff; Delayms(500); } }
四、本任务中的几个功能如何实现?(说明设计思路) 设计思路:①功能二和功能一中的(4)都要以功能一中的前三点做基础、故先实现上述三点基础功能。②功能二与功能一中的(4)区别就是中断优先级、通过对中断初始化函数配置中、分别实现两个功能。③功能三依托第②步中,分析两个功能差别,使用按键检测来实现切换。 设计过程:先定义文件名,然后定义宏变量,定义Delayms函数,定义两个中断函数,中断一和中断二,定义中断初始化函数,定义流水灯函数。主函数中运行中断初始化函数、流水灯程序当按键一按下时,中断一发生,执行中断一中的程序,当按键二按下时执行中断二中的程序。功能一与功能二的实现依托两个中断函数,其中功能一要求两个优先级相同,功能二要求外部中断1的优先级要大于外部中断0,功能三依托LED函数中的按键检测功能,检测到key3按下时、重新配置外部中断1的优先级,实现两个功能的切换。
全部资料51hei下载地址:
外部中断与应用设计keil5工程.rar
(5.3 MB, 下载次数: 30)
|