关于中断部分的小结
时间:10-27
来源:互联网
点击:
主要是针对外部中断部分,总结外部中断对特殊功能寄存器的设置以及程序的编写流程。此外这里重点介绍一些中断扩展的方法。
外部中断信号是由P3口的P3.2和P3.3两个管脚输入的。
外部中断程序编写流程:
一、外部中断初始化:
在使用外部中断前,先要设置相关特殊功能寄存器,即初始化过程;
1.开CPU总中断:EA=1;
2.开外部中断:
开外部中断0:EX0=1;
开外部中断1:EX1=1;
3.设置外部中断触发方式:
外部中断0触发控制位IT0;
当IT0=0时,为电平触发方式
当IT0=1时,为边沿触发方式(下降沿有效)
外部中断1触发控制位IT1(同上);
4.外部中断优先级设置(可以不设置)
PX0=1;
PX1=1;
举例如下:
void interrupt_init(void) // 中断初始化
{
EA = 1; //开总中断
EX0 = 1; //开外部中断0
EX1 = 1; //开外部中断0
IT0 = 1; //外部中断0下降沿触发方式
IT1 = 0; //外部中断1电平的触发方式
}
二、主程序
主程序部分为你需要实现的功能,这部分和中断几乎没什么太大关联,只不过,在执行主程序时,如果从外部来一个外部中断信号,不得不放弃现在执行的任务而转而执行中断子程序;
三、中断子程序
这部分主要便是对请求中断成功后进入中断后,你需要执行什么任务;
外部中断子程序写法如下:
void INT_0() interrupt 0 using 0 //外部中断0子程序
{
LED0 = ~LED0; //这句话代换成你所需要功能的C代码
}
void INT_1() interrupt 2 using 2 //外部中断1子程序
{
LED1 = 0; //这句话代换成你所需要功能的C代码
}
完整外部中断例程代码如下:
#includereg52.h>
#define uchar unsigned char
sbit wr=P3^6;
sbit LED0 = P1^0;
sbit LED1 = P1^1;
void interrupt_init(void) // 中断初始化
{
EA = 1; //开总中断
EX0 = 1; //开外部中断0
EX1 = 1; //开外部中断0
IT0 = 1; //外部中断0下降沿触发方式
IT1 = 0; //外部中断1电平的触发方式
}
void main(void)
{
wr=0; //低电平时第三列为独立按键
interrupt_init();
while(1)
{
LED1 = 1;
}
}
void INT_0() interrupt 0 using 0 //外部中断0子程序
{
LED0 = ~LED0;
}
void INT_1() interrupt 2 using 2 //外部中断1子程序
{
LED1 = 0;
}
实现功能:初始灯1和2全灭;
当按下P3.2对应键盘1(矩阵键盘第三行第三列),向下降沿触发外部中断0子程序,按一次键1松手灯1亮,再按一次键1松手灯1灭;
当按下P3.3对应键盘2(矩阵键盘第四行第三列),送入低电平信号触发外部中断1子程序,按下键2灯2亮,松手灯2灭。
中断的扩展:
一、定时器扩展为外部中断源
在51单片机内部有两个定时器/计数器T0和T1,在满足中断响应的情况下,当T0或T1的计数值从全1(0xFFFF)状态进入全0(0x0000)时,此时就会产生定时器溢出中断。
根据以上分析,我们只需要把计数器的初值设置为0xFFFF,那么只要计数输入端再来一个脉冲就可以产生溢出中断申请。设想我们把外部中断输入连接到计数器输入端,就可以利用外部中断申请的负脉冲产生定时器溢出中断申请,而转移到相应中断服务程序入口地址。只要在(0x000B或0x001B)处存放外部中断服务子程序,就可以达到目的。
具体步骤如下:
1.将定时/计数器T0或T1的计数输入端(P3.3或P3.4)作为扩展外部中断请求输入端。
2.置定时/计数器T0或T1为工作模式2,计数方式—8位自动装载方式。
3.定时/计数器T0或T1的高8位和低8位都预置为全1。
4.在相应的中断服务程序入口(0x000B或0x001B)处存放外部中断服务子程序。
二、软件查询扩展外部中断源
当需要的外部中断源较多,采用第一种方法仍不能满足实际需求,我们可以采用这种方法。
设有四个外部中断源,INT00、INT01、 INT02 、INT03,这四个外部中断请求源的输入端通过一个4路的或非门连接到51单片机的/INT0引脚输入端。只要4个外部中断请求源中有一个或者一个以上的有效(高电平),就会产生一个负的/INT0信号向51单片机发出中断申请。
为了确认在/INT0有效时究竟是INT00、INT01、 INT02 、INT03中哪个发出的中断申请,可以通过软件查询的方法来确认。将四个中断源输入端INT00、INT01、 INT02 、INT03分别接到P1.0~P1.3这四个引脚上。一旦响应中断,在中断服务程序中CPU通过软件查询方法对P1.0~P1.3这四条线的电位进行检测,以确认提出中断申请的中断源。
当扩展的4个外部中断源优先级不同时,软件查询的顺序也应按照优先级的的由高到低顺序进行。设扩展的4个外部中断源的优先级由高到低的顺序是INT00到INT03,则软件查询顺序为P1.0到P1.3。
外部中断信号是由P3口的P3.2和P3.3两个管脚输入的。
外部中断程序编写流程:
一、外部中断初始化:
在使用外部中断前,先要设置相关特殊功能寄存器,即初始化过程;
1.开CPU总中断:EA=1;
2.开外部中断:
开外部中断0:EX0=1;
开外部中断1:EX1=1;
3.设置外部中断触发方式:
外部中断0触发控制位IT0;
当IT0=0时,为电平触发方式
当IT0=1时,为边沿触发方式(下降沿有效)
外部中断1触发控制位IT1(同上);
4.外部中断优先级设置(可以不设置)
PX0=1;
PX1=1;
举例如下:
void interrupt_init(void) // 中断初始化
{
EA = 1; //开总中断
EX0 = 1; //开外部中断0
EX1 = 1; //开外部中断0
IT0 = 1; //外部中断0下降沿触发方式
IT1 = 0; //外部中断1电平的触发方式
}
二、主程序
主程序部分为你需要实现的功能,这部分和中断几乎没什么太大关联,只不过,在执行主程序时,如果从外部来一个外部中断信号,不得不放弃现在执行的任务而转而执行中断子程序;
三、中断子程序
这部分主要便是对请求中断成功后进入中断后,你需要执行什么任务;
外部中断子程序写法如下:
void INT_0() interrupt 0 using 0 //外部中断0子程序
{
LED0 = ~LED0; //这句话代换成你所需要功能的C代码
}
void INT_1() interrupt 2 using 2 //外部中断1子程序
{
LED1 = 0; //这句话代换成你所需要功能的C代码
}
完整外部中断例程代码如下:
#includereg52.h>
#define uchar unsigned char
sbit wr=P3^6;
sbit LED0 = P1^0;
sbit LED1 = P1^1;
void interrupt_init(void) // 中断初始化
{
EA = 1; //开总中断
EX0 = 1; //开外部中断0
EX1 = 1; //开外部中断0
IT0 = 1; //外部中断0下降沿触发方式
IT1 = 0; //外部中断1电平的触发方式
}
void main(void)
{
wr=0; //低电平时第三列为独立按键
interrupt_init();
while(1)
{
LED1 = 1;
}
}
void INT_0() interrupt 0 using 0 //外部中断0子程序
{
LED0 = ~LED0;
}
void INT_1() interrupt 2 using 2 //外部中断1子程序
{
LED1 = 0;
}
实现功能:初始灯1和2全灭;
当按下P3.2对应键盘1(矩阵键盘第三行第三列),向下降沿触发外部中断0子程序,按一次键1松手灯1亮,再按一次键1松手灯1灭;
当按下P3.3对应键盘2(矩阵键盘第四行第三列),送入低电平信号触发外部中断1子程序,按下键2灯2亮,松手灯2灭。
中断的扩展:
一、定时器扩展为外部中断源
在51单片机内部有两个定时器/计数器T0和T1,在满足中断响应的情况下,当T0或T1的计数值从全1(0xFFFF)状态进入全0(0x0000)时,此时就会产生定时器溢出中断。
根据以上分析,我们只需要把计数器的初值设置为0xFFFF,那么只要计数输入端再来一个脉冲就可以产生溢出中断申请。设想我们把外部中断输入连接到计数器输入端,就可以利用外部中断申请的负脉冲产生定时器溢出中断申请,而转移到相应中断服务程序入口地址。只要在(0x000B或0x001B)处存放外部中断服务子程序,就可以达到目的。
具体步骤如下:
1.将定时/计数器T0或T1的计数输入端(P3.3或P3.4)作为扩展外部中断请求输入端。
2.置定时/计数器T0或T1为工作模式2,计数方式—8位自动装载方式。
3.定时/计数器T0或T1的高8位和低8位都预置为全1。
4.在相应的中断服务程序入口(0x000B或0x001B)处存放外部中断服务子程序。
二、软件查询扩展外部中断源
当需要的外部中断源较多,采用第一种方法仍不能满足实际需求,我们可以采用这种方法。
设有四个外部中断源,INT00、INT01、 INT02 、INT03,这四个外部中断请求源的输入端通过一个4路的或非门连接到51单片机的/INT0引脚输入端。只要4个外部中断请求源中有一个或者一个以上的有效(高电平),就会产生一个负的/INT0信号向51单片机发出中断申请。
为了确认在/INT0有效时究竟是INT00、INT01、 INT02 、INT03中哪个发出的中断申请,可以通过软件查询的方法来确认。将四个中断源输入端INT00、INT01、 INT02 、INT03分别接到P1.0~P1.3这四个引脚上。一旦响应中断,在中断服务程序中CPU通过软件查询方法对P1.0~P1.3这四条线的电位进行检测,以确认提出中断申请的中断源。
当扩展的4个外部中断源优先级不同时,软件查询的顺序也应按照优先级的的由高到低顺序进行。设扩展的4个外部中断源的优先级由高到低的顺序是INT00到INT03,则软件查询顺序为P1.0到P1.3。
- WinCE启动失败原因与解决办法(03-01)
- μC/OS-II实时操作系统内存管理的改进(10-01)
- 嵌入式软件开发之: 复位和初始化(08-30)
- 简单初始化STM32的RTC(12-03)
- 基于STM32F10x的uC/GUI初始化设置(12-02)
- ARM9 S3C2440—中断和定时器的初始化配置(11-28)