课程名称 | 单片机原理及应用 | 实验课时 | 2 |
实验项目 | 中断系统实验 | 实验时间 | |
指导老师 | 胡国华 | 实验成绩 | |
实验目的(本次上机实验所涉及并要求掌握的知识点) | 了解中断处理系统的工作原理,熟悉中断处理特别是外部中断处理的过程,掌握中断处理子程序的书写格式和使用方法。 | ||
实验环境 | Protues仿真软件 KellC51 集成开发环境 微机1台 | ||
实验内容 | 一、通过两个实验介绍有关中断应用程序的编写。 1. 单一外中断的应用 例题:在单片机P1口上接有8只LED。在外部中断0输入引脚(P3.2)接一只按钮开关K1。 要求将外部中断0设置为电平触发。程序启动时,P1口上的8只LED全亮。每按一次按钮开关K1,使引脚接地,产生一个低电平触发的外中断请求,在中断服务程序中,让低4位的LED与高4位的LED交替闪烁5次。然后从中断返回,控制8只LED再次全亮。 利用中断控制8只LED交替闪烁1次的电路如下所示 file:///C:/Users/zyt/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png 参考程序如下: #include <reg51.h> #define uchar unsigned char void Delay(unsigned int i) //延时函数Delay( ),i形式参数,不能赋初值 { unsigned int j; for(;i > 0;i--) for(j=0;j<333;j++) //晶振为12MHz,j选择与晶振频率有关 {;} //空函数 } void main( ) //主函数 { EA=1; //总中断允许 EX0=1; //允许外部中断0中断 IT0=1; //选择外部中断0为跳沿触发方式 while(1) //循环 { P1=0;} // P1口的8只LED全亮 } void int0( ) interrupt 0 using 0 //外中断0的中断服务函数 { uchar m; EX0=0; //禁止外部中断0中断 for(m=0;m<5;m++) //交替闪烁5次 { P1=0x0f; //低4位LED灭,高4位LED亮 Delay(400) ; //延时 P1=0xf0; //高4位LED灭,低4位LED亮 Delay(400); //延时 EX0=1; //中断返回前,打开外部中断0中断 } 本例程包含两部分,一部分是主程序段,完成中断系统初始化,并把8个LED全部点亮。另一部分是中断函数部分,控制4个LED交替闪烁1次,然后从中断返回。 2、两个外中断的应用 当需要多个中断源时,只需增加相应的中断服务函数即可。 例题:在单片机P1口上接有8只LED。在外部中断0输入引脚(P3.2)接有一只按钮开关K1。在外部中断1输入引脚(P3.3)接有一只按钮开关K2。要求K1和K2都未按下时,P1口的8只LED呈流水灯显示,仅K1(P3.2)按下再松开时,上下各4只LED交替闪烁10次,然后再回到流水灯显示。如果按下再松开K2(P3.3)时,P1口的8只LED全部闪烁10次,然后再回到流水灯显示。设置两个外中断的优先级相同。 电路图如下: file:///C:/Users/zyt/AppData/Local/Temp/msohtmlclip1/01/clip_image004.png 参考程序如下: #include <reg51.h> #define uchar unsigned char void Delay(unsigned int i)//延时函数Delay( ),i为形式参数,不能 // 赋初值 { uchar j; for(;i>0;i--) for(j=0;j<125;j++) {;} //空函数 } void main( ) //主函数 { uchar display[9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf, 0x7f};//流水灯显示数据数组 unsigned int a; for(;;) { EA=1; //总中断允许 EX0=1; //允许外部中断0中断 EX1=1; //允许外部中断1中断 IT0=1; //选择外部中断0为跳沿触发方式 IT1=1; //选择外部中断1为跳沿触发方式 IP=0; //两个外部中断均为低优先级 for(a=0;a<9;a++) { Delay(500); //延时 P1=display[a]; //将已经定义的流水灯显示数据送到P1口 } } } void int0_isr(void) interrupt 0 using 1//外中断0的中断服务函数 { uchar n; for(n=0;n<10;n++) //高、低4位显示10次 { P1=0x0f; //低4位LED灭,高4位LED亮 Delay(500); //延时 P1=0xf0; //高4位LED灭,低4位LED亮 Delay(500); //延时 } } void int1_isr (void) interrupt 2 using 2//外中断1中断服务函数 { uchar m; for(m=0;m<10;m++) //闪烁显示10次 { P1=0xff; //全灭 Delay(500); //延时 P1=0; //全亮 Delay(500); //延时 } } | ||
总结(对上机实验结果进行分析,上机心得体会及改进意见 | 此次实验中,我了解了中断处理系统的工作原理,为了熟悉中断处理系统,我做了两个实验,一个为单-外中断,另一个为两外中断。掌握了中断处理子程序的书写格式和使用方法。虽然在实验过程中遇到了很多难题,但借助了网络进行查询,也加上同学的帮助,完成的还比较顺利。 |
moky 发表于 2019-7-4 15:41
你这个怎么触发中断呢?我没看懂啊
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |