项目三抽奖器设计
任务四中断嵌套实例应用
任务描述本任务P2口驱动8只LED,实现闪烁,当产生外部中断0时,LED逐一点亮,循环2次;当产生外部中断1时,P0口驱动BCD数码管,实现9~0的倒数计数,也循环2次;当产生外部中断1的同时,产生外部中断0,那么外部中断1会被暂时中断。外部中断0和外部中断1用两只开关来模拟。?
知识链接中断的嵌套
中断的嵌套当一个中断正在执行的时候,如果事先设置了中断优先级寄存器IP,那么当一个更高优先级的中断到来的时候会发生中断嵌套,否则不会发生任何嵌套;如果有同一个优先级的中断触发,它并不是在“不断的申请”,而是将它相应的中断标志位置即IE寄存器的某位置位,当CPU执行完当前中断之后,按照查询优先级重新去查询各个中断标志位,进入相应中断。
注意:没有设置IP时,单片机会按照查询优先级(或都说逻辑优先级)来排队进入服务。如果要想让某个中断优先响应,则要设置IP,更改执行优先级(或者说物理优先级)。当设置了IP后,当低执行优先级中断在运行时,如果有高执行优先级的中断产生,则会嵌套调用进入高执行优先级的中断。如果你是用C语言写的程序,并在中断服务时using了寄存组,要注意,两个不同执行优先级的中断服务程序不要using同一组寄存器。
任务实施1.硬件电路。2.程序设计。
1.硬件电路
2.程序设计#includereg51.h /*8051单片机资源说明*/#includeintrins.h//包含_cror_和_crol_函数#defineucharunsignedchar//宏定义#defineuintunsignedint//宏定义sbitkey=P3^2; //按键定义sbitkey_1=P3^3; //按键定义uchari,j,k,m;//循环变量ucharw=0x01;
/****************中断初始化**************/voidinit(){ EA=1;//中断使能,开放所有中断 IT0=1;//P3.2引脚信号出现负跳变触发中断 IT1=1;//P3.3引脚信号出现负跳变触发中断 EX0=1;//允许外部中断0中断 EX1=1;//允许外部中断1中断 PX0=1;//外部中断0中断高优先级}/**************延时程序***************/voidmDelay(uintm){ ucharc; for(;m0;m--) for(c=124;c0;c--);}
/**************外部中断0的中断函数**********/voidint_0()interrupt0{key=1;//定义key的初始值if(key==0){//判断key是否为零,也就是按键是否按下 mDelay(10); //去抖动if(key==0){//确认有键按下for(m=0;m2;m++){//控制循环2次 for(k=0;k8;k++){//控制循环8次 P2=w;//点亮LED mDelay(1500);//延时大约1.5S w=_crol_(w,1);//W循环左移1位}}}}}
/**********外部中断1的中断函数**********/voidint_1()interrupt2{key_1=1;//定义key_1初始值if(key_1==0){//判断外部中断1是否发生 mDelay(10); //去抖动if(key_1==0){ //确认外部中断1发生 for(j=0;j2;j++){//循环2次 for(i=9;i0;i--){//定义i值从9到0递减循环 P0=i; mDelay(1500); }//内层循环显示9~0 } P0=0xff;//循环结束数码管全部熄灭 }}}
/**********电路初始状态函数**********/voidstate_0(void){