您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 机械/模具设计 > MCS-51单片机中断系统及应用(基于Proteus仿真)
2012年8月3日星期五1/10MCS-51单片机中断系统及应用基于Proteus仿真前言:本文对MCS-51单片机的中断系统进行了简明扼要的总结和归纳,并在后面举了三个简单的例子,这样有助于更好地理解与掌握。1、MCS-51单片机有5个中断源,2个中断优先级。相同优先级条件下,CPU响应中断的顺序是处部中断0,定时/计数器0,外部中断1,定时/计数器1,串行口中断。当某一优先级的中断处理程序正在执行时,可以被更高优先级的中断请求中断,但不会被同级或低级的中断源所中断。2、中断允许寄存器IE(interruptenable):可位寻址,相应位置1,表示开相应中断,置0表示关相应中断。(EX英文全称为external外部,所以EX0表示外部中断0)总中断:EA外部中断0:EX0中断编号为0,在函数后加上interrupt0来说明是外部中断0外部中断1:EX1中断编号为2,在函数后加上interrupt2来说明是外部中断1定时/计数器0:ET0中断编号为1,在函数后加上interrupt1来说明是T0中断定时/计数器1:ET1中断编号为3,在函数后加上interrupt3来说明是T1中断串行口中断:ES中断编号为4,在函数后加上interrupt4来说明是串行口中断只有使用interrupt关键字定义的函数才能被当作中断服务函数使用3、中断优先级寄存器IP(interruptpriority中断优先级):可位寻址,相应位置1,表示高优先级,置0表示低优先级。外部中断0:PX0外部中断1:PX1定时/计数器0:PT0定时/计数器1:PT1串行口中断:PS4、定时/计数器T0,T1控制寄存器TCON:中断请求标志都是当CPU检测到有相应中断发生后,由硬件将相应的标志置1,当CPU响应该中断转向相应的中断处理程序时,由硬件自动将相应的标志位清0.系统复位时,TCON每一位都清零。在查询方式时,TF0,TF1可以由程序查询和清“0”。2012年8月3日星期五2/10外部中断0触发方式控制位:IT0=1为下降沿触发,IT0=0为低电平触发外部中断1触发方式控制位:IT1=1为下降沿触发,IT1=0为低电平触发外部中断0中断标志位IE0:为1表示有中断请求,为0表示无中断请求外部中断1中断标志位IE1:为1表示有中断请求,为0表示无中断请求定时/计数器0中断标志位TF0:为1表示有中断请求,为0表示无中断请求定时/计数器1中断标志位TF1:为1表示有中断请求,为0表示无中断请求定时/计数器0运行控制位TR0:为1表示启动,为0表示停止定时/计数器1运行控制位TR1:为1表示启动,为0表示停止5、串行口控制寄存器SCON:TI(TransmitInterrupt发送中断)是串行口发送中断标志位,CPU将一个数据写入发送缓冲器SBUF时,就启动发送。每发送完一帧串行数据后,由中断系统的硬件自动将TI置1.但CPU响应中断时,并不清除TI,必须在中断处理程序中用指令将TI清0RI(ReceiveInterrupt接收中断)是串行口接收中断标志位,在允许串行口接收时,每接收完一帧数据后,中断系统的硬件自动将RI置1.同样,CPU响应中断处理程序时,并不自动将RI复位,必须在中断处理程序中用指令将其清06、总结编写中断函数时,要记得在函数后面加上interrupt+中断编号,以说明是什么中断函数。在主函数中要记得开总中断,开相应中断,设置优先级,对外部中断要设置触发方式,对定时/计数器中断要用TR0/TR1=1启动计数器7、外部中断的简单应用实例(一)如下图所示,正常情况下,数码管以一定时间间隔循环轮流显示0~9,每按一次按钮开关,触发一次外部中断0,使数码管闪烁10次,闪烁完毕后继续正常的数字轮流显示。2012年8月3日星期五3/10C程序如下:#includereg51.h#defineucharunsignedchar#defineuintunsignedintvoiddelay(uintx){uchari;while(x--)for(i=0;i120;i++);}ucharcodedis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchari;voidmain(){EA=1;//开总中断EX0=1;//开外部中断0IT0=1;//外部中断0设置为下降沿触发while(1){for(i=0;i10;i++){P0=dis[i];delay(200);}}}voidint0()interrupt0//外部中断0函数定义2012年8月3日星期五4/10{P0=0xff;delay(200);for(i=0;i10;i++)//闪烁十次{P0=~P0;delay(200);}}}Proteus仿真运行结果如下:2012年8月3日星期五5/108、外部中断的简单应用实例(二)如下图所示,正常情况下,数码管以一定时间间隔循环轮流显示0~9,按下K1键后,触发低优先级外部中断0,依次点亮8只黄色发光二极管,最后熄灭。按下K2键后,触发高优先级外部中断1,逐个点亮8只条形LED。(注意要加上限流电阻,否则仿真失败)C程序如下:(虽然主函数和两个中断函数都用到变量i,但还是不要把i设置为全局变量,否则运行结果不正确)#includereg51.h#defineucharunsignedchar#defineuintunsignedintvoiddelay(uintx){uchari;while(x--)for(i=0;i120;i++);}ucharcodedis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};voidmain(){uchari;EA=1;EX0=1;EX1=1;IT0=1;IT1=1;PX0=0;//外部中断0设置为低优先级PX1=1;//外部中断1设置为高优先级while(1)2012年8月3日星期五6/10{for(i=0;i10;i++){P0=dis[i];delay(200);}}}voidint0()interrupt0//外部中断0函数定义{uchari;P2=0XFF;for(i=0;i8;i++){P2=P21;//右移用0填补delay(200);}P2=0XFF;}voidint1()interrupt2//外部中断1函数定义{uchari;P1=0XFF;for(i=0;i8;i++){P1=P11;delay(200);}P1=0XFF;}Proteus仿真运行结果如下:2012年8月3日星期五7/109、外部中断的简单应用实例(三)本例实现外部中断源的扩展设计。如下图所示,系统正常工作情况下,数码管以一定时间间隔循环轮流显示0~9,四只绿色LED点亮,四只红色LED熄灭。按下K1~K4任意一个按键时,触发外部中断0,对应的一只绿色LED熄灭,一只红色LED点亮,并持续发出报警声音,表示系统出现故障。直到按下复位按钮,系统恢复正常工作,报警声音停止。(注意P0口要接上拉电阻,否则仿真失败)C程序如下:#includereg51.h#defineucharunsignedchar#defineuintunsignedintvoiddelay(uintx){uchari;while(x--)for(i=0;i120;i++);}2012年8月3日星期五8/10ucharcodedis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};sbitagreen=P1^0;sbitared=P1^1;sbitbgreen=P1^2;sbitbred=P1^3;sbitcgreen=P1^4;sbitcred=P1^5;sbitdgreen=P1^6;sbitdred=P1^7;sbitbuzzer=P3^0;//蜂鸣器sbitk1=P3^4;sbitk2=P3^5;sbitk3=P3^6;sbitk4=P3^7;voidmain(){uchari;EA=1;EX0=1;EX1=1;IT0=1;IT1=1;P1=0Xaa;//正常时点亮四只绿色LED灯buzzer=0;//正常时关闭蜂鸣器while(1){for(i=0;i10;i++){P0=dis[i];delay(200);}}}voidint0()interrupt0//外部中断0函数定义{if(k1==0){agreen=1;ared=0;buzzer=1;}elseif(k2==0){bgreen=1;bred=0;buzzer=1;}elseif(k3==0){cgreen=1;2012年8月3日星期五9/10cred=0;buzzer=1;}elseif(k4==0){dgreen=1;dred=0;buzzer=1;}}voidint1()interrupt2//外部中断1函数定义{P1=0Xaa;buzzer=0;}Proteus仿真运行结果如下:10、上述Proteus仿真文件下载地址:、参考文献2012年8月3日星期五10/10[1]彭伟.单片机C语言程序设计实训100例.北京:电子工业出版社.2009[2]贾振国,许琳.智能化仪器仪表原理及应用.北京:中国水利水电出版社.2011
本文标题:MCS-51单片机中断系统及应用(基于Proteus仿真)
链接地址:https://www.777doc.com/doc-2882708 .html