关于中断部分的小结

发布者:码农创想家最新更新时间:2012-10-27 来源: 21ic 关键字:中断部分  中断扩展  初始化 手机看文章 扫描二维码
随时随地手机看文章
主要是针对外部中断部分,总结外部中断对特殊功能寄存器的设置以及程序的编写流程。此外这里重点介绍一些中断扩展的方法。
外部中断信号是由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代码
}
 
    完整外部中断例程代码如下:
    #include
#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。
关键字:中断部分  中断扩展  初始化 引用地址:关于中断部分的小结

上一篇:CCS PICC实现的矩阵键盘扫描
下一篇:16*16汉字点阵显示器制作心得

推荐阅读最新更新时间:2024-03-16 13:11

OK6410A 开发板 (八) 60 linux-5.11 OK6410A 异常相关初始化
arch/arm/kernel/head.S 77 ENTRY(stext) arch/arm/kernel/traps.c devicemaps_init void * vectors = early_alloc(PAGE_SIZE * 2); early_trap_init(vectors); vectors_base = vectors; vectors_page = vectors; // 填充 vectors - vectors+0x1000-1 vectors_base) = 0xe7fddef1; memcpy((void *)vectors, __vectors_star
[单片机]
ARM裸机开发bootloader核心初始化
一、异常向量表 1、异常的定义 异常:因为内部或者外部的一些事件,导致处理器停下正在处理的工作,转而去处理这些发生的事情。 2、异常的类型 ARM处理器有7种Exception type分别为:Reset、Undefined instructions、Software interrupt、Prefetch Abort、Data Abort、IRQ、FIQ 2、什么是异常向量 当一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址去执行异常处理程序,而这个固定的地址,就称为异常向量。 3、异常向量表 由七个异常向量及其处理函数跳转关系组成的表为异常向量表。 下面是一个例子: start.S .text
[单片机]
ARM裸机开发bootloader核心<font color='red'>初始化</font>
stm32初始化流程图解析
  STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。   stm32参数:   12V-36V供电   兼容5V的I/O管脚   优异的安全时钟模式   带唤醒功能的低功耗模式   内部RC振荡器   内嵌复位电路   工作温度范围:-40°C至+85°C或105°C   stm32特点:   内核:ARM32位Cortex-M3 CPU,最高工作频率72MHz,1.25DMIPS/MHz。单周期乘法和硬件除法。   存储器:片上集成32-512KB的Flash存储器。6-64KB的SRAM存储器。时钟、复位和电源管理:2.0-3.6V的电源供电和I/O接口的驱动电压。上电
[单片机]
stm32<font color='red'>初始化</font>流程图解析
基于STM32F051库函数版本的SPI初始化
void SPI_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; SPI_InitTypeDef SPI_InitStruct; /*! SPI_CS_GPIO, SPI_MOSI_GPIO, SPI_MISO_GPIO, SPI_SCK_GPIO Init */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF| RCC_AHBPeriph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(FLASH_SPI2, ENABLE); /*! Configure SPI pins: SCK */ GPIO_I
[单片机]
S3C2440存储控制器、SDRAM原理、内存初始化
NandFlash和NorFlash都是Flash的一种,都是散存,都是磁盘存储介子,但是NandFlash一般比较大,而NorFlash都比较小,并且NorFlash比较贵,并且NorFlash写的速度比较慢,但读的速度比较快,而NandFlash读的速度比较慢,写的速度比较快。 NOR Flash是总线型设备,可在芯片内执行(XIP,eXecute In Place),应用程序可以直接在FIash闪存内运行,不必再把代码读到系统RAM中;而NAND Flash则需I/O接口,因此使用时需要写入驱动程序     SDRAM:Synchronous Dynamic Random Access Memory,同步动态随机存储器
[单片机]
avr单片机外部中断0,1,2初始化配置及说明
#include iom16v.h #include macros.h /*1.状态寄存器SREG bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 I T H S V N Z C I:全局中断使能位。 在I置位后,单独的中断使能由不同的中断寄存器控制。若I为0,则禁止中断。 MCU 控制寄存器- MCUCR MCU 控制寄存器包含中断触发控制位与通用 MCU 功能 Bit 7 6 5 4 3 2 1 0 SM2 SE SM1 SM0
[单片机]
基于ARM的硬件启动程序设计-初始化堆栈
ARM有7种运行状态,每一种状态的堆栈指针寄存器(SP)都是独立的。所以,对于程序中需要用的每一种 处理器模式,都要给SP定义一个堆栈地址。流程为:修改状态寄存器内的状态位,使处理器切换到需要的模式,然后给SP赋值。需要注意的是:不要切换到 User模式进行该模式下的堆栈设置,因为进入User模式后就不能再操作CPSR返回到其他模式了。 先定义各种模式对应的CPSR寄存器M 的值,该值决定了进入何种模式,可参考相关数据手册。 Mode_USR EQU 0x10 Mode_FIQ EQU 0x11 Mode_IRQ EQU 0x12 Mode_SVC EQU 0x13 Mode_ABT
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved