按键中断程序

合集下载

实验二 按键中断实验

实验二  按键中断实验

实验二按键中断实验一、实验目的了解中断的含义二、实验内容板子加电后,按动板子上K1-K3按键,可控制对应的LED1-LED3的亮灭,该实验学习了外部中断(EXTI)程序的编制及控制流程。

三、实验仪器、设备计算机、开发板、keil软件四、硬件设计在开发板上V6、V7、V8分别与MCU的PB5、PD6、PD3相连,如下图所示键盘部分如下图所示:例程所用到的列扫描线:PC5,PC2,PC3。

例程所用到的行扫描线(EXTI中断线):PE2。

五、实验要求和步骤开发板上有3个蓝色状态指示灯V6(LED1),V7(LED2),V8(LED3),通过对应的按键K1-K3,控制LED的亮灭,将PE2引脚配置为外部中断,当其上出现下降沿时产生一个中断,根据扫描PC5,PC2,PC3来判别是哪个按键按下。

首先我们了解一下什么是外部中断/事件控制器(EXTI)。

外部中断/事件控制器由19个产生事件/中断要求的边沿检测器组成。

每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。

每个输入线都可以被独立的屏蔽。

挂起寄存器保持着状态线的中断要求。

EXTI控制器的主要特性如下:每个中断/事件都有独立的触发和屏蔽每个中断线都有专用的状态位支持多达19 个中断/事件请求检测脉冲宽度低于APB2 时种宽度的外部信号如要产生中断,中断线必须事先配置好并被激活。

这是根据需要的边沿检测通过设置2个触发寄存器,和在中断屏蔽寄存器的相应位写“1”到来允许中断请求。

当需要的边沿在外部中断线上发生时,将产生一个中断请求,对应的挂起位也随之被置1。

通过写“1”到挂起寄存器,可以清除该中断请求。

为产生事件触发,事件连接线必须事先配置好并被激活。

这是根据需要的边沿检测通过设置2个触发寄存器,和在事件屏蔽寄存器的相应位写“1”到来允许事件请求。

当需要的边沿在事件连线上发生时,将产生一个事件请求脉冲,对应的挂起位不被置1。

中断的使用流程

中断的使用流程

中断的使用流程1. 概述中断是计算机系统中的重要概念,用于改变程序的正常执行流程。

本文将介绍中断的基本原理和使用流程。

2. 中断的基本原理中断是一种异步事件,可以分为硬件中断和软件中断两种类型。

硬件中断由外部设备发起,例如键盘输入或定时器事件;软件中断则是程序内部发起的,通过软件指令触发。

3. 中断的使用流程下面是中断的使用流程简述: 1. 初始化中断处理程序:编写中断处理程序,并将其与特定的中断号关联起来。

2. 开启中断:通过设置相应的标志位或寄存器,告诉系统允许中断事件的发生。

3. 等待中断事件:程序进入一个循环,不断检测是否发生中断事件。

可以使用轮询或阻塞等方式进行等待。

4. 检测中断类型:当中断事件发生时,系统会根据中断号来确定具体的中断类型。

5. 执行中断处理程序:系统会根据中断类型,调用相应的中断处理程序进行处理。

6. 中断处理程序执行完毕:中断处理程序执行完毕后,系统会返回到原来的执行流程。

4. 中断的优点中断机制具有以下优点: - 提高系统的并发性:通过中断机制,可以在处理某个事件时,同时处理其他事件,提高系统的并发性。

- 提高系统的实时性:中断能够迅速打断程序的执行,优先处理紧急事件,提高系统的实时性。

- 简化程序设计:通过中断机制,可以将一些常见的操作,如读取输入设备或处理定时器事件,抽象为中断处理程序,简化程序设计。

5. 中断的注意事项在使用中断时,需要注意以下问题: - 中断处理程序应尽量简短,避免长时间的中断服务例程,以免影响其他任务的执行。

- 中断处理程序中应该禁止或限制其他中断的发生,以确保中断处理程序的完整性。

- 中断处理程序需要处理所有可能的中断类型,以保证系统能够正确响应各种中断事件。

6. 总结中断是计算机系统中的重要概念,能够改变程序的正常执行流程。

本文介绍了中断的基本原理和使用流程,以及中断的优点和注意事项。

使用中断可以提高系统的并发性和实时性,简化程序设计。

嵌入式中断按键实验报告

嵌入式中断按键实验报告

嵌入式中断按键实验报告本实验的目的是学习如何在嵌入式系统中使用中断来处理按键输入。

通过该实验,我们可以掌握如何配置和使用中断,以及如何编写中断服务程序来处理按键输入。

实验材料:1. 嵌入式开发板2. 按键模块3. 电源适配器实验步骤:1. 将按键模块连接到嵌入式开发板的GPIO引脚上,确保连接正确。

2. 打开开发板的开关,给开发板供电。

3. 在开发板上配置GPIO引脚作为中断输入,并使能中断。

4. 编写中断服务程序来处理按键输入。

当按键被按下时,中断服务程序将被调用,并执行相应的操作。

5. 在主程序中初始化中断服务程序,并进入一个无限循环。

在该循环中,可以进行其他的操作,并等待按键中断的发生。

实验结果:在实验中,我们成功地配置并使用了中断来处理按键输入。

当按键被按下时,中断服务程序被调用,并执行了相应的操作。

讨论与分析:通过该实验,我们学习到了中断的基本原理和使用方法。

中断是一种非常重要的机制,可以使嵌入式系统更高效地响应外部事件。

在实际的嵌入式应用中,按键输入是非常常见的操作,使用中断可以很好地处理按键输入,提高系统的响应速度和可靠性。

然而,中断也存在一些问题。

首先,中断处理需要一定的时间,在高速的系统中,中断的处理时间可能会影响到系统的性能。

另外,当系统存在多个中断源时,中断处理的优先级和调度也需要仔细设计,以确保系统的正常运行。

总结:通过本实验,我们成功地学习了嵌入式系统中使用中断处理按键输入的方法。

中断是一种重要的机制,可以使系统更高效地响应外部事件。

通过合理地设计和使用中断,可以提高系统的性能和可靠性。

在实际的嵌入式应用中,我们应该根据具体的需求和系统条件来选择最合适的中断处理方法,并进行适当的优化和调试。

单片机实验:外部中断按键

单片机实验:外部中断按键

单⽚机实验:外部中断按键实验内容:实验⼤致上就是说:按键不按的时候,灯⼀直亮,按键按下的时候,灯不亮,报警器响。

现在给了汇编语⾔,要改成c语⾔,并在proteus⾥⾯仿真。

思考与总结:响应中断请求的条件:1.总中断允许开关EA=1。

2.中断源的中断允许位为1。

3.中断源发出中断请求。

4.⽆同级或更⾼级中断正在被服务。

结合实验,就知道,这⾥跑到中断⼦程序的条件,⾸先总开关打开。

然后选择中断请求源,对这个实验来说,也就是选择I N T 0 ‾\overline{INT0}INT0外部中断请求0,它的中断允许控制位是E X 0 EX0EX0,我们置1后,就说明允许了外部中断0中断。

我们如果选⽤跳沿触发,⼀个机器周期采样到外部中断输⼊为⾼,下⼀个为低,那么中断请求触发器置⼀,这个时候进⼊中断⼦程序。

这个实验是电平触发。

cpu查询到中断请求时,就会进⾏中断响应(这⾥假设只是单⼀中断,如果有不同优先级的中断,那么cpu还要进⾏判断)。

硬件⽣成⼀个长调⽤指令并执⾏,程序转向中断⼊⼝地址,两个中断⼊⼝相隔8字节,难以放下中断⼦程序,此时需要⼀个跳转指令,转向在其他地址下的⼦程序中。

实验结果:汇编语⾔实现:ORG 0000hLJMP MAIN//主程序ORG 0003hLJMP INT0s//中断⼊⼝ORG 0100hMAIN: CLR IT0//外部中断请求0为电平触发SETB EA//总中断允许SETB EX0 //允许外部中断0LOOP: CLR P0.0//p0.0是低电平,此时灯亮SETB P2.3//p2.3是⾼电平,此时警报不响SJMP LOOP//短转移指令,程序跳到loop函数循环ORG 0200h//伪指令INT0s: SETB P0.0//p0.0是⾼电平,此时灯灭CLR P2.3//p2.3是低电平,此时警报响Delay: MOV R0,#200//延时函数D1: MOV R1,#254D2: DJNZ R1,D2DJNZ R0,D1RETIEND改成c51语⾔:#include<reg51.h>#define uchar unsigned charsbit key = P3^2;void delay(unsigned int i)//延时函数{unsigned int j;for(;i>0;i--)for(j=0;j<333;j++){}}void main()//主函数{EA=1;//总中断允许EX0=1;//允许外部中断0IT0=0;//选择外部中断0为电平触发⽅式while(1)//循环{P0=0xfe;}//P0.0⼝的Led亮}void key_scan() interrupt 0//外部中断0的中断服务函数{if(key==0)//判断是否有按键按下{delay(10);//延时去抖if(key==0){P2=0xf7;P0=0xff;while(!key);//等待按键松开P2=0xff;P0=0xfe; }}}proteus仿真:。

中断编程实例实验报告

中断编程实例实验报告

一、实验目的1. 理解中断的概念和作用。

2. 掌握中断编程的基本方法。

3. 熟悉中断程序的编写和调试。

4. 通过实例加深对中断编程的理解。

二、实验环境1. 操作系统:Windows 102. 开发环境:Visual Studio 20193. 编程语言:C++三、实验内容本次实验以中断编程为例,通过编写一个简单的程序,实现按键输入时中断主程序的执行,并输出按键信息。

四、实验步骤1. 创建一个C++项目,命名为“中断编程实例”。

2. 在项目中创建一个名为“main.cpp”的源文件。

3. 在“main.cpp”文件中编写以下代码:```cpp#include <iostream>#include <conio.h>using namespace std;// 全局变量,用于存储按键信息char keyInfo;// 中断服务例程(ISR)void interruptServiceRoutine() {// 读取按键信息keyInfo = getch();// 中断标志清除_emit(0x20);}// 主函数int main() {// 初始化中断interruptServiceRoutine();// 设置中断向量表setvect(0x09, interruptServiceRoutine);// 执行主程序cout << "按任意键开始接收按键信息:" << endl;while (true) {// 检查按键信息是否已读取if (keyInfo != '\0') {cout << "按键信息:" << keyInfo << endl; keyInfo = '\0'; // 清除按键信息}}return 0;}```4. 编译并运行程序。

5. 按下任意键,程序将中断执行并输出按键信息。

总结按键输入外部中断请求信号存在的问题与解决方法

总结按键输入外部中断请求信号存在的问题与解决方法

总结按键输入外部中断请求信号存在的问题与解决方法外部中断是嵌入式系统中常见的一种事件响应机制,可以通过外部设备发出的中断信号来触发处理器执行相应的中断服务程序。

在实际的应用中,按键输入作为一种常见的外部中断源,经常被应用于用户交互和控制系统中。

然而,按键输入外部中断请求信号也会带来一些问题,包括抖动、冲突以及消隐等,并且需要针对这些问题采取相应的解决方法。

按键输入外部中断请求信号存在的问题主要包括抖动、冲突和消隐,下面将逐一介绍这些问题及解决方法。

一、抖动问题按键抖动是指在按下或释放按键的瞬间,由于机械结构的弹性特性或者接触点的不良接触,会导致按键信号在短时间内多次震动,造成中断信号的多次触发,使得系统产生误操作或者多次中断的情况。

解决按键抖动问题的方法主要包括软件滤波和硬件滤波。

1、软件滤波软件滤波是通过在中断服务程序中增加延时、状态检测等手段来解决按键抖动问题的方法。

通过在中断服务程序中增加延时等操作,可以排除由于按键抖动造成的多次中断信号的干扰,确保系统的稳定性和可靠性。

然而,软件滤波需要占用处理器的执行时间和资源,容易影响系统的实时性和响应速度。

2、硬件滤波硬件滤波是采用电路设计来解决按键抖动问题的方法。

通过在按键输入信号的引脚上接入RC滤波电路、反嵌二极管等元件,可以有效地减少按键抖动造成的中断信号的干扰,确保系统对按键输入信号的正确响应。

相比于软件滤波,硬件滤波可以减轻处理器的负担,提高系统的实时性和响应速度。

二、冲突问题按键冲突是指在多个按键同时按下或释放的情况下,会产生错误的中断信号或者无法正确识别所触发的按键,导致系统的误操作或功能执行异常。

解决按键冲突问题的方法主要包括硬件防抖和编码解码电路。

1、硬件防抖硬件防抖是通过在按键输入信号的引脚上接入双稳态触发器或者滤波电路等元件来解决按键冲突问题的方法。

通过这些电路设计,可以确保在多个按键同时按下或释放的情况下,系统可以正确识别并执行相应的中断服务程序,确保系统的稳定性和可靠性。

独立按键中断实验说明

独立按键中断实验说明

/**************************************************************************
****/
/**
*
* This is the entry function from the TestAppGen tool generated application
三.源代码说明
3.1 函数及变量说明
/***************************** Include Files *********************************/ #include "xparameters.h" #include "xgpio.h" #include "xil_exception.h" #include "xscugic.h" #include "xil_printf.h"
XGpio_SetDataDirection(&Gpio_LEDS, LEDS_CHANNEL, 0); //set all LEDS pins as output
XGpio_SetDataDirection(&Gpio_LEDS, SEG7_CHANNEL, 0); //set all SEVEN SEGMENGT LEDS pins as output
int GpioIntrInitialize();
int GpioSetupIntrSystem(INTC *IntcInstancePtr, XGpio *InstancePtr, u16 DeviceId, u16 IntrId, u16 IntrMask);
void GpioDisableIntr(INTC *IntcInstancePtr, XGpio *InstancePtr, u16 IntrId, u16 IntrMask);

单片机中断实现按键

单片机中断实现按键

单片机中断实现按键一、引言在嵌入式系统中,往往需要通过外部输入设备如按键来与系统进行交互。

为了能够及时响应按键操作,避免忙等的情况发生,通常会使用中断技术来实现按键的检测和处理。

本文将介绍如何使用中断来实现按键检测,并具体以8051单片机作为示例进行说明。

二、中断基础知识在单片机中,中断是一种由硬件触发的特殊事件,当一些中断条件满足时,单片机会暂停当前任务,跳转到中断服务程序中执行对应的处理代码,待中断处理结束后再返回到原来的任务中。

中断的触发方式一般有两种:外部触发中断和内部触发中断。

对于按键这种外部输入设备,一般通过外部触发中断来实现。

三、实现原理1、按键电路:按键通常由一个导电片和两个触点组成,平时靠两个触点之间的弹簧将导电片与触点隔开,当按下按键时,弹簧压缩,导电片与触点接触形成通路。

为了能够检测按键操作,需要将按键引脚连接到单片机的外部中断引脚上。

2、中断设置:在单片机的程序中,需要设置好相应的中断向量表和中断服务程序。

中断向量表是一个存放中断服务程序地址的表格,当中断触发时,单片机会根据中断号从中断向量表中找到相应的中断服务程序地址并跳转到该地址执行对应代码。

3、中断触发条件:在按键电路中,按键的两个触点状态变化(从断开到接通或从接通到断开)时会产生干扰信号,为了避免干扰,通常会使用软件消抖技术。

当按键被按下,并经过一段时间的消抖后,会产生一个稳定的按键信号,此时可以检测到按键变化,并触发相应的中断。

四、实现步骤1、硬件连接:将按键引脚连接到单片机的外部中断引脚上。

2、中断设置:在单片机的程序中,需要设置中断的相关寄存器,包括中断向量表和中断控制寄存器。

中断向量表保存中断服务程序的入口地址,中断控制寄存器用于设置中断触发条件和中断优先级等参数。

3、中断服务程序:编写中断服务程序,在按键中断触发时执行对应的处理代码。

中断服务程序一般需要包括中断触发条件的判断和处理代码的执行。

4、主程序:在主程序中调用中断服务程序,并添加相应的处理代码,实现按键操作的具体功能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

* 1个LED指示灯,对应的GPIO为 : PC0输出为1点亮LED 输出为0关闭LED
另外PC1为外部中断触发:按键按下时为低电平,即可设置为低电平触发
/* GPIO配置函数 */
void GPIO_Configuration(void)
{
/*定义2个结构体变量 */
GPIO_InitTypeDef GPIO_InitStructure;
/*开启GPIOB,GPIOC ,复用口时钟的时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/*给GPIOC_Pin_1一个初始值*/
GPIO_ResetBits(GPIOC, GPIO_Pin_0);
配置IO口,初始化IO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;
// 将连接LED的GPIO设置为推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//设置为2MHZ的速度,响应时间,没要求越小越好GPIO_Mode_IPU为输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
//初始化GPIOC
GPIO_Init(GPIOC, &GPIO_InitStructure);
/*给KEY_InitStructure.GPIO_Pin KEY_InitStructure.GPIO_Mode KEY_InitStructure.GPIO_Speed付初始值*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
//设置为上拉输入
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU ;
//设置为2MHZ的速度
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
//初始化GPIOB
GPIO_Init(GPIOC, &GPIO_InitStructure);
//设置GPIOC的中断标志位
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource1); }
/******配置EXTI**********/
void EXTI_Configuration(void)
{ //定义一个结构体
EXTI_InitTypeDef EXTI_InitStructure;
//设置中段线
EXTI_InitStructure.EXTI_Line = EXTI_Line1;
//使能中断线
EXTI_InitStructure.EXTI_LineCmd = ENABLE ;
//设置中断模式
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
//设置中断触发方式
EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Falling;
//初始化中断
EXTI_Init(&EXTI_InitStructure);
}
/********配置优先级*****************/
void NVIC_Configuration(void)
{
//定义一个结构体
NVIC_InitTypeDef NVIC_InitStructure;
//设置优先级组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0) ;
//设置存入寄存器
NVIC_SetVectorTable (NVIC_VectTab_FLASH ,0x0);
//设置外部中断1线这里对应的是外部中断1因为我选的是之前的PC1来触发另外EXTI5_9_IRQn则表示外部中断5-9线。

NVIC_InitStructure.NVIC_IRQChannel =EXTI1_IRQn;
//使能优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//配置抢断优先级这个是决定中断跳转可否嵌套的依据***非常重要
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0; //配置响应优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;
//初始化优先级
NVIC_Init(&NVIC_InitStructure);
}
//主函数
int main(void)
{
/*
//调用初始化GPIO函数
GPIO_Configuration ();
EXTI_Configuration ();
NVIC_Configuration ();
while(1)
{
;
}
}
在it.c中的程序:
void EXTI1_IRQHandler(void)
{
delay_GSM(10000);
if( EXTI_GetITStatus (EXTI_Line1) ==1 ) {
EXTI_ClearITPendingBit (EXTI_Line1); send_gprs_data(GPRMC,1);
GPIO_WriteBit(GPIOC,GPIO_Pin_1,Bit_SET); delay_GSM(100000);
GPIO_WriteBit(GPIOC,GPIO_Pin_1,Bit_RESET); }
}。

相关文档
最新文档