中断嵌套。附件里包含源代码,proteus工程文件。 使用一个外部中断和定时器中断,通过P1口连接的八个发光二极管来显示中断的作用。外部中断未发生时,即引脚INT0的按键开关没有按下时,系统通过定时器定时中断的方法,使LED呈流水灯显示,当INT0脚的按键开光按下,即产生外部中断,外部中断INT0打断定时器的定时中断,从而控制8个LED闪烁显示。当按键开关松开,继续呈流水灯显示。本实验中外部中断0设置为高优先级中断,定时器中断设置为低优先级中断。 电路原理图: 电路工作原理的重点说明:发光二极管为共阳极连接,当对应P1口输出0时,发光二极管发光。K1按键没按下时,INT0=1,当K1按键按下时,INT0=0。 源代码 控制程序的重点说明:PX0=1外部中断为高优先级,PT0=0定时器中断为低优先级,IT0=0将外部中断0设置为电平触发中断方式,当按键K1按下时,为低电平触发中断,当按键松开时为高电平,外中断0的中断服务函数执行完后,中断结束,回到定时器T0的中断服务函数。
单片机源程序如下: - #include <reg51.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char//延时函数Delay( ),i为形式参数,不能赋初值
- void delay(uint i) {
- uchar j;
- for(;i>0;i--)
- for(j=0;j<125;j++)
- {;} //空函数
- }
- void main( )
- { //主函数
-
- TMOD=0x01; //定时器t0为方式1
- TH0=0xee; //设置定时器初值
- TL0=0x00;
- EA=1; //总中断允许
- ET0=1;//允许定时器t0中断
- TR0=1;//启动定时器t0
- EX0=1; //允许外部中断0中断
- IT0=0; //选择外部中断0为电平触发中断方式
- PX0=1;//外部中断为高优先级
- PT0=0;//定时器中断为低优先级
- P1=0xff;
- while(1);
- {;} //循环等待
- }
- void timer0() interrupt 1 //T0中断程序
- {
- uchar i;
- uchar display[9]= {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //流水灯显示数据组
- TH0=0xee;
- TL0=0x00;
- while(1)
- {
- P1=0xff;
- for(i=0;i<9;i++)
- {
- delay(500);
- P1=display[i];
- }
- }
- }
- void int0_isr(void) interrupt 0 //外中断0的中断服务函数
- {
- P1=0;
- delay(700);
- P1=0xff;
- delay(700);
- }
复制代码
Keil代码与Proteus仿真下载:
中断嵌套.zip
(34.25 KB, 下载次数: 18)
中断嵌套.zip
(11.62 KB, 下载次数: 14)
|