赞
踩
中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。STC89C52系列单片机提供了8个中断请求源,它们分别是:
所有的中断都具有4个中断优先级。用户可以用关总中断允许位(EAE.7)或相应中断的允许位来屏蔽所有的中断请求,也可以用打开相应的中断允许位来使CPU响应相应的中断申请:每一个中断源可以用软件独立地控制为开中断或关中断状态:每一个中断的优先级别均可用软件设置。高优先级的中断请求可以打断低优先级的中断,反之,低优先级的中断请求不可以打断高优先级及同优先级的中断。当两个相同优先级的中断同时产生时,将由查询次序来决定系统先响应哪个中断。STC89C52系列单片机的各个中断查询次序如下表所示:
相同优先级内的查询次数也就是我们在使用时的中断号: 函数名() interrupt 中断号
主函数:
#include "STC.h"//选择对应型号头文件,这里由于重定义不再选择 “reg52.h” #include "delay.h" //#include "uart.h" #include "ex_interrupt.h" void main() { P1=0xff; P46 = 1; // 初始化外部中断 Ex0_Init(Mode_1); //初始化外部中断为模式1,下降沿触发 Ex1_Init(Mode_0); //初始化外部中断为模式0,低电平触发 Ex2_Init(Mode_1); Ex3_Init(Mode_0); while(1) { P46=!P46; delay_ms(500); } }
ex_interrupt.h文件:
#ifndef _EX_INTERRUPT_H #define _EX_INTERRUPT_H #include "STC.h" //外部中断子函数声明 void Ex0_Init(uint8 ExMode); void Ex1_Init(uint8 ExMode); void Ex2_Init(uint8 ExMode); void Ex3_Init(uint8 ExMode); extern uint8 Mode_0; extern uint8 Mode_1; //void MCU_PowerDown(); //STC MCU掉电唤醒 /* STC89C系列 外部中断2,3 定义 */ /* 如果使用reg52.h或STC89C52的头文件未定义,请取消如下注释 */ //sfr P4 = 0xe8; //sbit INT2 = P4^3; //中断输入引脚 //sbit INT3 = P4^2: //sfr XICON = 0xc0; //sbit PX3 = XICON^7; //sbit EX3 = XICON^6; //sbit IE3 = XICON^5; //sbit IT3 = XICON^4; //sbit PX2 = XICON^3; //sbit EX2 = XICON^2; //sbit IE2 = XICON^1; //sbit IT2 = XICON^0; #endif
在 ex_interrupt.c文件中简单配置一下,我这里采用模块化程序,在main()函数中调用初始化函数,并传入触发方式参数。
#include "ex_interrupt.h" /***************************************************** * 函数名: void Ex0_Init() * 功 能 : 外部中断INT0 初始化函数 * 入参数: 中断模式设置(1:下降沿触发, 0:低电平触发) * 返回值: 无 *****************************************************/ void Ex0_Init(uint8 ExMode) { if(ExMode==Mode_0) { IT0 = 0; } IT0 = 1; //中断模式设置(1:下降沿触发, 0:低电平触发 EX0 = 1; //使能外部中断0 EA = 1; //开总中断 } /***************************************************** * 函数名: void Ex1_Init() * 功 能 : 外部中断INT1 初始化函数 * 入参数: 中断模式设置(1:下降沿触发, 0:低电平触发) * 返回值: 无 *****************************************************/ void Ex1_Init(uint8 ExMode) { if(ExMode==Mode_0) { IT1 = 0; } IT1 = 1; //中断模式设置(1:下降沿触发, 0:低电平触发) EX1 = 1; //使能外部中断1 EA = 1; //开总中断 } /***************************************************** * 函数名: void Ex2_Init() * 功 能 : 外部中断INT2 初始化函数 * 入参数: 中断模式设置(1:下降沿触发, 0:低电平触发) * 返回值: 无 *****************************************************/ void Ex2_Init(uint8 ExMode) { if(ExMode==Mode_0) { IT2 = 0; } IT2 = 1; //中断模式设置(1:下降沿触发, 0:低电平触发) EX2 = 1; //使能外部中断2 EA = 1; //开总中断 } /***************************************************** * 函数名: void Ex3_Init() * 功 能 : 外部中断INT3 初始化函数 * 入参数: 中断模式设置(1:下降沿触发, 0:低电平触发) * 返回值: 无 *****************************************************/ void Ex3_Init(uint8 ExMode) { if(ExMode==Mode_0) { IT3 = 0; } IT3 = 1; //中断模式设置(1:下降沿触发, 0:低电平触发) EX3 = 1; //使能外部中断3 EA = 1; //开总中断 } // ==================================================== /**************************************************** * 函数名:void ExInt0_ISR() interrupt 0 * 功 能 :外部中断INT0 服务函数 引脚 P32 * 返回值:无 ****************************************************/ void ExInt0_ISR() interrupt 0 { /* 用户中断服务任务 */ P10 = !P10; //状态取反 } /**************************************************** * 函数名:void ExInt1_ISR() interrupt 2 * 功 能 :外部中断INT1 服务函数 引脚P33 * 返回值:无 ****************************************************/ void ExInt1_ISR() interrupt 2 { /* 用户中断服务任务 */ P11 = !P11; //状态取反 } /**************************************************** * 函数名:void ExInt2_ISR() interrupt 6 * 功 能 :外部中断INT2 服务函数引脚P43 * 注 意 :在使用外部中断2时需要定义 P43 和 XICON寄存器,见.h文件 * 返回值:无 ****************************************************/ void ExInt2_ISR() interrupt 6 { /* 用户中断服务任务 */ P12 = !P12; //状态取反 } /**************************************************** * 函数名:void ExInt3_ISR() interrupt 7 * 功 能 :外部中断INT3 服务函数 引脚P42 * 注 意 :在使用外部中断3时需要定义 P42 和 XICON寄存器,见.h文件 * 返回值:无 ****************************************************/ void ExInt3_ISR() interrupt 7 { /* 用户中断服务任务 */ P13 = !P13; //状态取反 } /*************************************************** * 函数名: void MCU_PowerDown() * 功 能 : STC89C52系列单片机外部中断0(下降沿)唤醒掉电模式 任何方式均可设置 掉电模式 并非只有外部中断 * 返回值: 无 * 使用说明:若使用请 将该函数放在主循环中 ****************************************************/ void MCU_PowerDown() { INT0=1; //ready read INTO port while(!INT0); // check INTO _nop_(); //空语句 延时 _nop_(); PCON = 0x02; //MCU power down 唤醒掉电模式 _nop_(); _nop_(); P1++; }
经过对STC89C52四个外部中断的简单配置 使用,可见其和传统51单片机具有相似性,继承了传统控制方式,又添加了新的可用外设。但其中需要注意,对于STC89C52RC的P4端口的使用,在官方的头文件和keil 环境中的reg52.h中是没有定义的,外部中断INT2和INT3的控制寄存器,各位也没有定义。所以用户若要使用这两个额外中断,需要更具官方手册自行定义。但也要注意,区分不同系列,比如STC89C52RC的XICON寄存器首地址为:0xc0; P4端口的首地址为:0xe8;而在12系列中则不是这个对应关系了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。