专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

关于中断部分的小结(1)

作者:佚名   来源:本站原创   点击数:  更新时间:2010年05月13日   【字体:

 中断是单片机和其他各种微处理器中必不可少的一部分之一,在此对51单片机中断有用的部分加以小结。

小结(1)主要是对中断部分,对中断编程常用的特殊功能寄存器加以罗列小结,这一部分是中断思想的核心,以后的编程全部围绕这些寄存器进行。以后对于中断的编程及其寄存器设置可参考这一部分内容。
一、关于51中断:
对于51单片机中断子程序的编写我们必须知道大多51单片机芯片有5个中断源,有2个中断优先级,每个中断源的优先级可以编程控制。
5个中断源分别是:
外部中断0,由INT0/P3.2输入
外部中断1,由INT1/P3.3输入
定时器/计数器0,溢出中断请求;
定时器/计数器1,溢出中断请求;
串行口发送/接收,中断请求;
这里给出一个非常经典的中断源图,根据这个图我们就能大概知道中断的具体过程,以及在中断编程中哪些地方需要设置。

很明显的,5个中断源可以分为三类,外
部中断,定时器中断和串口中断;并且我们需要对TCON,IE,IP等进行设置。
 
二、几个重要的特殊功能寄存器:
1.中断允许控制寄存器IE
CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。

EX0(IE.0),外部中断0允许位;
ET0(IE.1),定时/计数器T0中断允许位;
EX1(IE.2),外部中断1允许位;
ET1(IE.3),定时/计数器T1中断允许位;
ES(IE.4),串行口中断允许位;
EA (IE.7), CPU中断允许(总允许)位。
 
2.控制寄存器TCON
 TCON的低4位用于控制外部中断, TCON的高4位用于控制定时/计数器的启动和中断申请。其格式如下:


 

TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。
TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。
TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。
TR0(TCON.4):T0运行控制位,其功能与TR1类同。
IE1(TCON.3),外部中断1中断请求标志位。
IT1(TCON.2),外部中断1触发方式控制位。
当IT0=0时,为电平触发方式。
当IT0=1时,为边沿触发方式(下降沿有效)。
IE0(TCON.1),外部中断0中断请求标志位。
IT0(TCON.0),外部中断0触发方式控制位。
当IT0=0时,为电平触发方式。
当IT0=1时,为边沿触发方式(下降沿有效)。
 
3.串口控制寄存器SCON

 

RI(SCON.0),串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI向CPU申请中断。注意,RI必须由软件清除。
TI(SCON.1),串行口发送中断标志位。当CPU将一个发送数据写入串行口发送缓冲器时,就启动了发送过程。每发送完一个串行帧,由硬件置位TI向CPU申请中断。注意,TI必须由软件清除。
 
4.中断优先级寄存器IP
51单片机有两个中断优先级,即可实现二级中断服务嵌套。每个中断源的中断优先级都是由中断优先级寄存器IP中的相应位的状态来规定的 。

 

PX0(IPH.0),外部中断0优先级设定位;
PT0(IPH.1),定时/计数器T0优先级设定位;
PX1(IPH.2),外部中断0优先级设定位;
PT1(IPH.3),定时/计数器T1优先级设定位;
PS (IPH.4),串行口优先级设定位;
PT2 (IPH.5)    ,定时/计数器T2优先级设定位
 
三、其他相关:
1.P3口复用功能;
51单片机P3口除了作为通用I/O口外,还具有复用的特殊功能,而这些功能通常都和各种中断有关。
P3.0 RXD(串行数据输入口)
P3.1 TXD(串行数据输出口)
P3.2 INT0(外部中断0)         
P3.3 INT1(外部中断1)
P3.4 T0(定时器/计数器0外部输入)
P3.5 T1(定时器/计数器1外部输入)
P3.6 WR(外部数据存储器写脉冲)
P3.7 RD(外部数据存储器读脉冲)
 
2.中断排队和中断服务入口表
同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示:


 
3.中断函数写法:
在C51中中断函数的完整语法如下:
返回值 函数名({参数}) [模式] [重入] interrupt n [ using n ]
Interrupt 后面接一个0-31的整数,不允许用表达式。
例:
void INT_TEST() interrupt 0 using 0 //外部中断0/1 编号(0/2)
{
…………
}
中断不允许用于外部函数,小型程序中的中断程序使用默认的寄存器0,
不带using属性的可能会取得更高的效率。
 
 其实今后对于中断的应用除了核心思想外,无非是对上述特殊功能寄存器的设置。

关闭窗口

相关文章