51单片机之中断实验
2021-07-12 来源:eefocus
什么叫中断:
中断是指CPU在执行当前程序的过程中,由于某种随机出现的外设请求或CPU内部的异常事件,使CPU暂停正在执行的程序而转去 执行相应的服务处理程序;当服务处理程序运行完毕后,CPU再返回到暂停处继续执行原来的程序。
单片机在执行程序时其程序流程图
引起CPU中断的根源,称为中断源,中断源向CPU提出中断请求,CPU暂时中断原来的事务A,转去处理事件B,对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。中断的开启与关闭、设置启用哪一个中断等都是由单片机内部的一些特殊功能寄存器来决定的。
当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。
STC90C51RC/RD+系列单片机提供了8个中断请求源,它们分别是:外部中断O(INTO),定时器0中断、外部中断1(INT1)、定时器1中断、定时器2中断、串口(UART)中断、外部中断2(INT2)、外部中断3(INT3)。
用户可以用关总中断允许位(EA/IE.7)或相应中断的允许位来屏蔽所有的中断请求,也可以用打开相应的中断允许位来使CPU响应相应的中断申请;、每二个中断源可以用软件独立地控制为开中断或关中断状态;每一个中断的优先级别均可用软件设置。高优先级的中断请求可以打断低优先级的中断,反之,低优先级的中断请求不可以打断高优先级及同优先级的中断。当两个相同优先级的中断同时产生时,将由查询次序来决定系统先响应哪个中断。
中断系统结构图
1、定时器/计数器控制寄存器TCON
1)IT0和IT1是设置外部中断的触发方式。
当其为0时,为低电平触发方式
当其为1时,为负跳变触发方式。
2) IE0和IE1是外部中断标志位
3) TF0和TF1是定时器的中断标志。
4) TR1和TR0是打开相应的定时器
2、中断允许寄存器IE
1)EA:总中断允许位。
为0时:CPU屏蔽所有的中断请求。
为1时:CPU开放所有中断。
2)ES:串行口中断允许位。
为0时:禁止串行中断。
为1时:允许串行中断。
3)ET1和ET0:分别是定时器1和定时器0中断允许位
为0时:禁止相应的定时器中断
为1时:允许相应的定时器中断
4)EX1和EX0:分别是外部中断1和外部中断0的中断允许位
为0时:禁止相应的外部中断
为1时:允许相应的外部中断
3、中断优先寄存器IP
1)PS:串行口中断优先级
为1时:串行口中断定义为高优先级
为0时:串行口中断定义为低优先级
2)PT1和PT0:分别是定时器1和定时器0的中断优先级
为1时:相应的定时器中断为高优先级
为0时:相应的定时器中断为低优先级
3)PX1和PX0:分别是外部中断1和外部中断0的中断优先级
为1时:相应的外部中断为高优先级
为0时:相应的外部中断为低优先级
一般都默认低优先级,不是特别需求不用改。
4、中断地址
5、开启外部中断步骤:
1)打开总中断(EA)
2)打开相应的外部中断允许(EX0或者EX1)
3)设置外部中断触发方式(IT0或者IT1)
实例一:按键按下后,触发外部中断0,LED灯状态翻转
#include 'reg52.h'
typedef unsigned char u8;
typedef unsigned int u16;
sbit led = P2^0;
sbit k3 = P3^2; //P3^2 引脚和INT0引脚相连
void delay(u16 i)
{
while(i --);
}
void Int0Init()
{
EA = 1; //打开总中断
EX0 = 1; //允许外部中断0
IT0 = 1; //设置外部中断0触发方式为:为负跳变触发方式
}
void main()
{
Int0Init();
while(1);
}
void Int0() interrupt 0
{
delay(1000);
if(k3 == 0)
{
led =~led;
}
}
实例二:按键按下后,触发外部中断1,LED灯状态翻转
#include 'reg52.h'
typedef unsigned char u8;
typedef unsigned int u16;
sbit led = P2^0;
sbit k3 = P3^3; //P3^3 引脚和INT1引脚相连
void delay(u16 i)
{
while(i --);
}
void Int1Init()
{
EA = 1; //打开总中断
EX1 = 1; //允许外部中断1
IT1 = 1; //设置外部中断1触发方式为:为负跳变触发方式
}
void main()
{
Int1Init();
while(1);
}
void Int1() interrupt 2
{
delay(1000);
if(k3 == 0)
{
led =~led;
}
}