项目三抽奖器设计
任务三外部中断的复杂实例应用
任务描述本任务要求利用按键(按键接P3.2引脚)模拟外部中断0,当外部中断0有中断请求时,统计中断计数,显示在数码管上,如下图所示。
知识链接按键消抖如果按键作为外部中断源,那么就有必要作按键的去抖动处理,主要采用延时消抖,范例如下:voidinit()interrupt0
{
if(key==0);//关闭外部中断0
delay(1);//延时消抖
if(key==0)//S1是外部中断对应的IO口
{
beep=~beep;
}
while(!S1);
EX0=1;//打开外部中断0
}
任务实施1.硬件电路。2.程序设计。
1.硬件电路
2.程序设计#includereg51.h /*8051单片机资源说明*/#defineucharunsignedchar//宏定义#defineuintunsignedint//宏定义ucharcodeBitTab[]={0x7F,0xBF,0xDF,0xEF};//位选信号数组ucharcodeDispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; /*共阳段码表*/uintcount=0; //计数值sbitkey=P3^2; //按键定义
/****************中断初始化函数init()*******************/Voidinit(){ EA=1;//打开总中断EX0=1;//允许外部中断0中断 IT0=1;//P3.2引脚信号出现负跳变触发中断}/**********12M晶振,毫秒级延时函数mDelay()**********/voidmDelay(uintm){ ucharc; for(;m0;m--) for(c=124;c0;c--);}
/****************获取计数值的中断函数***************/voidint_0()interrupt0{EA=0;//进入中断服务程序,暂时禁止所有中断key=1; if(key==0) { mDelay(10); //延时消抖if(key==0) //确认有键按下 { count++; //计数值加1 }} EA=1;//中断处理完毕,打开总中断}
/**********四位一体化数码管显示及扫描驱动设计**********/voiddisp_led(){ ucharj,tmp,DispBuf[4]; DispBuf[3]=count/1000; /*计数值的千位*/ DispBuf[2]=(count%1000)/100; /*计数值的百位*/ DispBuf[1]=(count%100)/10; /*计数值的十位*/ DispBuf[0]=count%10; /*计数值的个位*/ for(j=0;j4;j++) /*动态扫描*/ { tmp=DispBuf[j]; P0=DispTab[tmp];//送段码信号 P2=BitTab[j];//送位选信号 mDelay(1); P2=0xff;//熄灭数码管,消除相互干扰 }}
/**********主函数**********/voidmain(){ init(); //中断初始化 while(1){disp_led();//调用数码管显示mDelay(15);//延时}}
知识总结中断的使用一定要注意初始化,同时如果按键作为中断源,注意按键抖动的处理。
综合评价
课后作业51系列单片机能提供几个中断源?它们的入口地址各是多少?
谢谢观看《单片机技术与应用》课程