文档库 最新最全的文档下载
当前位置:文档库 › 实验二 按键中断实验

实验二 按键中断实验

实验二  按键中断实验
实验二  按键中断实验

实验二按键中断实验

一、实验目的

了解中断的含义

二、实验内容

板子加电后,按动板子上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”,一个中断/事件请求也可以通过软件来产生。

本次实验需要组件的工程文件文档如下:

USER--stm32f10x_it.c 为中断服务程序主程序,我们对主程序进行一次详细的注释。

//______________________主程序____________________________________________________________________

int main(void)

{

unsigned char a=0,b=0,c=0;

/*完成对系统时钟的设置,例程中通过系统时钟设置函数,外接晶振采用8Mhz,经过片内频率合成,9倍频,设置为72MHz的时钟。*/

RCC_Configuration();

/*嵌套向量中断控制器

说明了EXTI2 抢占优先级级别0(最多1位),和子优先级级别0(最多7位) */

NVIC_Configuration();

/*对控制3个LED指示灯的IO口进行了初始化,将3个端口配置为推挽上拉输出,口线速度为50Mhz。将中断线PE2配置为输入模式。将键盘扫描列线PC5,PC2,PC3设置为推挽上拉输出。在配置某个口线时,首先应对它所在的端口的时钟进行使能。否则无法配置成功,由于用到了端口

B和端口D,C,D,因此要对这4个端口的时钟进行使能,同时由于用到复用IO口功能用于配置外部中断。因此还要使能AFIO(复用功能IO)

时钟。*/

GPIO_Configuration();

//用于配置AFIO外部中断配置寄存器AFIO_EXTICR1,用于选择EXTI2外部中断的输入源是PE2。

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);

EXTI_InitStructure.EXTI_Line = EXTI_Line2; //PE2 作为键盘的行线。检测状态

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

/* 置3根键盘列扫描线为0,以便在按键按下时产生中断

GPIO_ResetBits(GPIOC, GPIO_Pin_2);

GPIO_ResetBits(GPIOC, GPIO_Pin_3);

GPIO_ResetBits(GPIOC, GPIO_Pin_5);

while (1)

{

GPIO_ResetBits(GPIOC, GPIO_Pin_2);

GPIO_ResetBits(GPIOC, GPIO_Pin_3);

GPIO_ResetBits(GPIOC, GPIO_Pin_5);

numm(); //键盘扫描程序判断是哪个键按下

if(num==1&&a==0){GPIO_ResetBits(GPIOB, GPIO_Pin_5);a=1;} //K1 按下作处理

else if(num==1&&a==1){GPIO_SetBits(GPIOB, GPIO_Pin_5);a=0;}

if(num==2&&b==0){GPIO_ResetBits(GPIOD, GPIO_Pin_6);b=1;} //K2 按下作处理

else if(num==2&&b==1){GPIO_SetBits(GPIOD, GPIO_Pin_6);b=0;}

if(num==3&&c==0){GPIO_ResetBits(GPIOD, GPIO_Pin_3);c=1;} //K3 按下作处理

else if(num==3&&c==1){GPIO_SetBits(GPIOD, GPIO_Pin_3);c=0;}

}

//_____________________键盘扫描程序_____________________________________________________________________

void numm(void){

num=0;

if(_it0==1){ //按键按下标志

GPIO_ResetBits(GPIOC, GPIO_Pin_5); //置PC5为0。

GPIO_SetBits(GPIOC, GPIO_Pin_2);

GPIO_SetBits(GPIOC, GPIO_Pin_3);

if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0){ //K1

Delay(0xff);

if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0){ //按键消抖动

while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); //是否松开按键

num=1; //键值1 为K1按下

goto n_exit;

}

}

GPIO_SetBits(GPIOC, GPIO_Pin_5);

GPIO_ResetBits(GPIOC, GPIO_Pin_2); //置PC2为0

GPIO_SetBits(GPIOC, GPIO_Pin_3);

Delay(0xff);

if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0){ //K2

Delay(0xff);

if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0){ //按键消抖动

while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); //是否松开按键

num=2; //键值2 为K2按下

goto n_exit;

}

}

GPIO_SetBits(GPIOC, GPIO_Pin_5);

GPIO_SetBits(GPIOC, GPIO_Pin_2);

GPIO_ResetBits(GPIOC, GPIO_Pin_3); //置PC3为0

Delay(0xff);

if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0){ //K3

Delay(0xff);

if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0){ //按键消抖动

while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); //是否松开按键

num=3; //键值3 为K3按下

goto n_exit;

}

}

n_exit:;

_it0=0;

}

}

//_______________________键盘中断服务程序___________________________________________________________________

/*键盘中断(EXTI2)服务程序*/

void EXTI2_IRQHandler(void)

{

if(EXTI_GetITStatus(EXTI_Line2) != RESET) //判别是否有键按下

{

_it0=1; //按键中断标志

EXTI_ClearITPendingBit(EXTI_Line2); //清除中断请求标志

}

}

将工程文件建立和调试后下载到开发板,板子上电复位后,按动K1-K3可分别控制相应的LED1-LED3亮灭。

外部中断实验

1 外部中断实验 一、实验目的 1掌握外部中断技术的基本使用方法 2掌握中断处理程序的编写方法 二、实验说明 1、外部中断的初始化设置共有三项内容:中断总允许即EA=1,外部中断允许即EXi=1(i=0或1),中断方式设置。中断方式设置一般有两种方式:电平方式和脉冲方式,本实验选用后者,其前一次为高电平后一次为低电平时为有效中断请求。因此高电平状态和低电平状态至少维持一个周期,中断请求信号由引脚INT0(P3.2)和INT1(P3.1)引入,本实验由INT0(P3.2)引入。 2、中断服务的关键: a 、保护进入中断时的状态。 堆栈有保护断点和保护现场的功能使用PUSH 指令,在转中断服务程序之前把单片机中有关寄存单元的内容保护起来。 b 、必须在中断服务程序中设定是否允许中断重入,即设置EX0位。 c 、用POP 指令恢复中断时的现场。 3、中断控制原理: 中断控制是提供给用户使用的中断控制手段。实际上就是控制一些寄存器,51系列用于此目的的控制寄存器有四个:TCON 、IE 、SCON 及IP 。 4、中断响应的过程: 首先中断采样然后中断查询最后中断响应。采样是中断处理的第一步,对于本实验的脉冲方式的中断请求,若在两个相邻周期采样先高电平后低电平则中断请求有效,IE0或IE1置“1”;否则继续为“0”。所谓查询就是由CPU 测试TCON 和SCON 中各标志位的状态以确定有没有中断请求发生以及是那一个中断请求。中断响应就是对中断请求的接受,是在中断查询之后进行的,当查询到有效的中断请求后就响应一次中断。 INT0端接单次脉冲发生器。P1.0接LED 灯,以查看信号反转。 三、实验内容及步骤 1、使用单片机最小应用系统1模块,P1.0接发光二极管,INTO 接单次脉冲输出端。 2、安装好仿真器,用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机插座中,打开模块电源,打开仿真器电源。 3、启动计算机,打开Keil 仿真软件,进入仿真环境。选择仿真器型号、仿真头型号、CPU 类型。 4、打开 中断.ASM 源程序,编译无误后,全速运行程序,连续按动单次脉冲产生电路的按键,发光二极管每按一次状态取反,即隔一次点亮。 5、可把源程序编译成可执行文件,烧录到89C51芯片中。 四、流程图及源程序 1、流程图 保护现场 设置初始状态 设置中断控制寄存器 开始 中断入口

基于STM8的外部中断实验

例程四按键中断 其实在上个例程就说那个中断的,但不是重点说,例程四就重点说下这个中断的设置,主要是针对外部中断,对于其他的中断,到时在相应的模块里面会说的。在STM8S207RB这个芯片里面有很多IO口都可以触发中断的。主要是GPIO_A,GPIO_B,GPIO_C,GPIO_D,GPIO_E,这五组IO口都可以触发外部中断,所以大家以后要设计电路的话,必须先要查看先对应的文档来看下,了解清楚芯片的资料才好设置。其实大家学会调用库里面的函数的话,这些初始化相当来说就很容易的了。 以上外部中断的设置来自“STM8寄存器.pdf”文档第74页 下面看下电路图先吧,只要当你清楚电路具体的链接,才能完成相对应的初始化。

用到内部的资源 "stm8s_clk.h" "stm8s_exti.h" "stm8s_gpio.h" "stm8s_uart1.h" "stm8s_clk.c" "stm8s_exti.c" "stm8s_gpio.c" "stm8s_uart1.c" 看完了电路图,照样是先看主函数

在主函数里面最重要的是Buttom_Init();的初始化,其他的初始话上前几个例程已经有介绍过,相信大家也很清楚了。下面重点讲下Buttom_Init()。 函数原型: 第一条语句是设置Buttom1和Buttom2相对应的IO为上拉输入; 第二条语句是设置GPIOD,也即是按键,为下降沿触发中断。 __enable_interrupt();这条语句是开总中断,在上一个例程里面说过了,以后凡是有触发中断的都要用上这条语句,所以说这条语句很重要的。 下面讲下外部中断常用的几个函数,这些函数都是库有的,可以直接调用的。

实验五 键盘中断实验

实验五键盘中断实验 一、实验目的 1.熟练运用CodeWarrior嵌入式开发系统环境、C语言、调试方式。 2.复习串行通信接口(SCI)的内容。 3.加强键盘中断基本原理及编程原理的理解。 4.理解“行扫描”法的原理并能进行键值识别和键值编码。 5.理解键盘接线原理图(如图5-1)。 二、知识要点 本实验采用的是4×4矩阵式键盘(以下简称键盘)。PTG4、PTD2、PTD3、PTD7分别接四根列线,定义为输入且上拉,PTG0~PTG3分别接四根行线,且定义为输出。行扫描法是使键盘的某一行输出为低电平,其余行为高电平,然后读取列值,如果列值中有某位为低电平,则表明该行和列交点处的键被按下;若为全高则再扫描下一行,直至扫描完全部的行线为止。这样就可以确定是哪一行哪一列交点的键被按下。 MCU与键盘接线原理图: 图5-1 4×4键盘与MCU接法示例 键盘的c语言编程: 1)初始化,先按IO口方式初始化,即定义列线为输入且上拉,行线为输出,然后依输入口的键盘功能初始化相应的寄存器。 2)定义键值表 3)扫描一次,读取键值 4)获得键盘定义值 行扫描法是使键盘的某一行输出为低电平,其余行为高电平,然后读取列值,如果列值中有某位为低电平,则表明该行和列交点处的键被按下;若为全高则再扫描下一行,直至扫描完全部的行线为止。这样就可以确定是哪一行哪一列交点的键被按下。

设置键盘中断允许寄存器,当键盘有键被按下时,立即产生中断,中断程序处理按键事件,比如确定哪个键被按下,然后转换为该键的定义值。 键盘的键面标示码(即定义值)与MCU识别的键值对应关系通过列表对应起来,即键盘定义表对应表示。当通过“行扫描”法获得某个键的键值时,通过查表法就可以得到它的定义值。 该键盘中断方式程序的主程序主体是一个死循环,且是一个空循环体,所有处理的过程代码放在中断程序中。 三、演示性实验 在光盘资料中提供读者键盘实例程序文件夹。 编程采用规范要求编写,将键盘独立成一个构件,如C语言中,形成key.h头文件和key.c源文件。头文件对键盘的所用端口寄存器或引脚进行宏定义以及初始化函数和驱动函数声明。源文件对初始化函数和驱动函数进行定义。具体实现代码见光盘。 四、设计性实验 要求按下的一个键的键值和键面定义值(键的ASCII码值)通过串口在PC方软件界面显示。 当键值被按下时,高端虚拟键盘被按下,或者在高端PC机中显示对应按键值。 1、资源使用 键盘的数据线分别接在MCU 口的号引脚、口的号引脚。 2、硬件设计(标识引脚名) 图5-2 4×4键盘按键的信息显示在PC机界面的连线图 3、软件设计 1)MCU端程序流程图 2)编程 (1)下面填写主程序main。 (填写主程序main.c) 键盘中断程序 (填写C语言编写的键盘中断程序)

单个外部中断实验

一、 实验要求 在单片机的外中断输入引脚INT0————(或INT1———— ),接一个按键开 关来产生外部中断请求,通过P1口连接的8个LED 发光二极管的状态,来反映外中断的作用。 中断未发生时,P1口连接的8个LED 为流水状态,当按键 开关按下,即外部中断请求产生时,8个LED 呈现闪烁状态。按键开关松开,8个LED 又为流水状态。 二、 实验目的 (1) 理解掌握外部中断源、中断请求、中断标志、中断入口 等概念。 (2) 掌握中断程序的设计方法。 程序如下: ORG 0000H //程序入口 LJMP MAIN //跳入主程序入口MAIN ORG 0003H //INT0中断入口 LJMP INT0P ORG 0030H MAIN: SETB EA //中断允许总开关控制位 SETB EX0 //允许外部中断0中断 SETB PX0 //外部中断0中断为高优先级 START:MOV R2,#8 MOV A,#0FEH //为点亮引脚发光二极管需写入P1口的点亮控制码 LOOP: MOV P1,A //点亮控制码写入P1口,点亮相应的LED

LCALL DELAY //调用延时子程序 RL A //点亮控制码循环左移,点亮下一位 DJNZ R2,LOOP //判断左移是否超过8位,未超过继续循环 LJMP START //左移循环已8次,再重新进行下一次循环点亮 INT0P: PUSH PSW //保护现场 PUSH Acc NOLIG: JNB IE0,IT0R MOV P1,#00H LCALL DELAY MOV P1,#0FFH LCALL DELAY LJMP NOLIG IT0R:RETI DELAY: MOV R5,#60 //延时子函数 D1: MOV R6,#20 D2: MOV R7,#248 D3: DJNZ R7,D3 DJNZ R6,D2 DJNZ R5,D1 RET END 程序如图:

键盘及LED显示实验

实验三键盘及LED显示实验 一、实验内容 利用8255可编程并行接口控制键盘及显示器,当有按键按下时向单片机发送外部中断请求(INT0,INT1),单片机扫描键盘,并把按键输入的键码一位LED 显示器显示出来。 二、实验目的及要求 (一)实验目的 通过该综合性实验,使学生掌握8255扩展键盘和显示器的接口方法及C51语言的编程方法,进一步掌握键盘扫描和LED显示器的工作原理;培养学生一定的动手能力。 (二)实验要求 1.学生在实验课前必须认真预习教科书与指导书中的相关内容,绘制流程图,编写C51语言源程序,为实验做好充分准备。 2.该实验要求学生综合利用前期课程及本门课程中所学的相关知识点,充分发挥自己的个性及创造力,独立操作完成实验内容,并写出实验报告。 三、实验条件及要求 计算机,C51语言编辑、调试仿真软件及实验箱50台套。 四、实验相关知识点 1.C51编程、调试。 2.扩展8255芯片的原理及应用。 3.键盘扫描原理及应用。 4.LED显示器原理及应用。 5.外部中断的应用。 五、实验说明 本实验仪提供了8位8段LED显示器,学生可选用任一位LED显示器,只要按地址输出相应的数据,就可以显示所需数码。 六、实验原理图

P1口桥接。 八、实验参考流程图 1.主程序流程图

2.外中断服务程序流程图 外部中断0 外部中断1 定时器0中断程序,用于消抖动:

3.LED显示程序流程图 九、C51语言参考源程序 #include "reg52.h" unsigned char KeyResult; //存放键值 unsigned char buffer[8]; //显示缓冲区 bit bKey; //是否有键按下 xdata unsigned char P_8255 _at_ 0xf003; //8255的控制口 xdata unsigned char PA_8255 _at_ 0xf000; //8255的PA口 xdata unsigned char PB_8255 _at_ 0xf001; //8255的PB口 xdata unsigned char PC_8255 _at_ 0xf002; //8255的PC口 code unsigned char SEG_TAB[] = { //段码 0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x0}; sbit bLine0 = P3^2; sbit bLine1 = P3^3; //延时1ms void Delay1ms() { unsigned char i;

外部中断实验

实验二外部中断实验 一.实验目的 1.学习外部中断技术的基本使用方法; 2.学习中断处理程序的编程方法。 二.实验设备及器材配置 1.单片机仿真实验系统。 2.计算机。 3.导线。 三.实验内容 在以下实验题目中任选一个或由老师指定。 1.P1口做输出口,接八只发光二极管,编写程序,使其循环点亮。以单脉冲输出端做为中断申请,当第一次产生外部中断时,使发光二极管全亮,延时1秒后返回中断之前的状态;当第二次产生外部中断时,使发光二极管全灭,延时1秒后返回中断之前的状态;以后如上述一直循环下去。 2.以单脉冲输出端做为中断申请,自行设计连线,用实验箱上的红、绿、黄发光二极管模拟交通灯控制。当有急救车通过时,两交通灯信号为全红,以便让急救车通过,延时10秒后交通灯恢复中断前状态。 四.实验原理说明 本实验中中断处理程序的应用,最主要的地方是如何保护进入中断前的状态,使得中断程序执行完毕后能返回中断前P1口及发光二极管的状态。除了保护累加器A、程序状态字PSW外、P1口的状态外,还要注意主程序中的延时程序和中断程序的延时程序不能混用,本实验中,主程序延时程序用的寄存器和中断延时用的寄存器也不能混用。 五.连线方法及实验电路 8031的P1.0—P1.7分别接发光二极管L0—L7,P3.2接单脉冲输出端“ ” 外部中断实验电路如图1-3所示。

图1-3 外部中断实验电路 六.思考题及实验报告要求 1.思考题 (1).试说明51系列单片机外部中断如何使用。 (2).修改程序,外部中断产生时,使发光二极管闪亮移位方向改变。 2.实验报告要求 (1).给出自行设计的程序清单、程序流程图。 (2). 总结实验过程中调试所遇到的问题和解决方法,写出编程调试的经验和体会。 VW集成调试软件使用 1.自建以字母开头的文件夹,推荐在F盘。 2.双击桌面V/W快捷方式 3.左击【文件】-新建文件-保存文件(存于自建文件夹下,以字母开头,后缀为.ASM或.C) 4.左击【文件】-新建项目-(以字母开头,存于自建文件夹下,加入自存的汇编或C源程序) 5.编写程序 6. 左击【项目】-编译,根据提示将提示的错误位置修改,编译,直至程序无错。 7.实验箱断电、连线完毕后,打开实验箱电源开关。左击【仿真器】,在出现的窗口中选择LAB8000\MCS51\8031AH或A T89C51,晶体频率:6000000Hz。 8. 左击【执行】-全速运行,在实验箱上观察运行结果。

外部中断0实验程序

51单片机第十四课外部中断0实验 #include #define uchar unsigned char #define uint unsigned int sbit led0=P0^0; unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71,0x00}; unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78}; //************************************************ //延时函数,在12MHz的晶振频率下 //大约50us的延时 //************************************************ void delay_50us(uint t) { uchar j; for(;t>0;t--) for(j=19;j>0;j--); } //************************************************ //延时函数,在12MHz的晶振频率下 //大约50ms的延时 //************************************************ void delay_50ms(uint t) { uint j; for(;t>0;t--) for(j=6245;j>0;j--); } void main() {

实验二 外部中断实验

实验二外部中断实验 一、实验目的 1.掌握外部中断技术的基本使用方法 2.掌握中断处理程序的编写方法 二、实验原理 1.外部中断的初始化设置的三项内容:中断总允许即EA=1,外部中断允许即EXi=1(i=0或1),中断方式设置。中断方式设置一般有两种方式:电平方式和脉冲方式. 2.中断服务的关键: (1)保护进入中断时的状态。 堆栈有保护断点和保护现场的功能使用PUSH,在转中断服务程序之前把单片机中有关寄存单元的内容保护起来。注:中断程序自动保护PC,对其做入栈操作 (2)用POP指令恢复中断时的现场。(先进后出) 3.中断控制原理: 中断控制是提供给用户使用的中断控制手段。实际上就是控制一些寄存器,51系列用于此目的的控制寄存器有四个:TCON 、IE 、SCON 及IP。 TCON格式(中断控制字) TF1、TF0:定时器/计数器T的溢出中断请求标志位; TR1、TR0:计数器控制位TR1(TR0)=1启动定时器TR1(TR0)=0停止计数器 IE1:外部中断请求1标志位; IT1:IT1=0为低电平触发IT1=1为负跳变有效; IE0:外部中断请求0标志位; IT0:IT0=0为低电平触发IT0=1为负跳变有效; 复位后TCON被清零,中断请求被禁止。

SCON格式(触发方式中断控制字) TI:串行口的发送中断请求标志位。发送1帧串行数据后,硬件自动为TI置1。注:CPU不会为T1清零,需要在中断程序中用软件为TI清零 RI:串行口接受中断请求标志位。接收完1帧串行数据后,硬件自动为RI置1。注:CPU不会为R1清零,需要在中断程序中用软件为RI清零 三、实验内容 参考实验程序(主程序为P1口输出跑马灯程序),编写中断子程序使得发生外部中断0,且为下降沿触发时,LED灯全亮。中断结束后LED继续接上次状态进行跑马灯闪烁。注:注意保护现场。且编译器不支持工作组寄存器名(R0-R7)入栈,需要对栈地址操作。例:PUSH 06H (累加器支持左移右移不支持压栈出栈; 工作组寄存器不支持左移右移支持压栈出栈);把R6入栈等同PHSHU R6 四、实验步骤 1.使用单片机最小应用系统1模块,P1接发光二极管,INTO接单次脉冲输出端。 2.用串行数据通信线连接计算机与仿真器,把仿真器插到模块的锁紧插座中,请注意仿真器的方向:缺口朝上。 3.打开Keil uVision2仿真软件,首先建立本实验的项目文件,接着添加**.ASM源程序,进行编译,直到编译无误。 4.打开模块电源和总电源,点击开始调试按钮,点击RUN按钮运行程序。 五、参考程序 汇编语言: ORG 0000H LJMP START ORG 0003H LJMP INT ORG 0030H INT: PUSH 05H PUSH 06H PUSH 07H MOV P1,#00H ACALL DELAY POP 07H POP 06H POP 05H RETI START: MOV IE,#81H MOV TCON, #01H MOV A, #0FEH

实验二 按键中断实验

实验二按键中断实验 一、实验目的 了解中断的含义 二、实验内容 板子加电后,按动板子上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”,一个中断/事件请求也可以通过软件来产生。 本次实验需要组件的工程文件文档如下: USER--stm32f10x_it.c 为中断服务程序主程序,我们对主程序进行一次详细的注释。 //______________________主程序____________________________________________________________________ int main(void) { unsigned char a=0,b=0,c=0; /*完成对系统时钟的设置,例程中通过系统时钟设置函数,外接晶振采用8Mhz,经过片内频率合成,9倍频,设置为72MHz的时钟。*/ RCC_Configuration(); /*嵌套向量中断控制器

嵌入式KL25 键盘中断实验

嵌入式KL25 键盘中断实验

实验五键盘中断实验 一、实验目的 1.熟练运用CodeWarrior嵌入式开发系统环境、C语言、调试方式。 2.复习串行通信接口(SCI)的内容。 3.加强键盘中断基本原理及编程原理的理解。4.理解“行扫描”法的原理并能进行键值识别和键值编码。 5.理解键盘接线原理图(如图5-1)。 二、知识要点 本实验采用的是4×4矩阵式键盘(以下简称键盘)。PTG4、PTD2、PTD3、PTD7分别接四根列线,定义为输入且上拉,PTG0~PTG3分别接四根行线,且定义为输出。行扫描法是使键盘的某一行输出为低电平,其余行为高电平,然后读取列值,如果列值中有某位为低电平,则表明该行和列交点处的键被按 下;若为全高则再扫描下一行,直至扫描完全部的行线为止。这样就可以确定是哪一行哪一列交点的键被按下。 MCU与键盘接线原理图:

键盘的c语言编程: 1)初始化,先按IO口方式初始化,即定义列线为输入且上拉,行线为输出,然后依输 入口的键盘功能初始化相应的寄存器。2)定义键值表 3)扫描一次,读取键值 4)获得键盘定义值 行扫描法是使键盘的某一行输出为低电平,其余行为高电平,然后读取列值,如果列值中有某位为低电平,则表明该行和列交点处的键被按下;若为全高则再扫描下一行,直至扫描完全部的行线为止。这样就可以确

定是哪一行哪一列交点的键被按下。 设置键盘中断允许寄存器,当键盘有键被按下时,立即产生中断,中断程序处理按键事件,比如确定哪个键被按下,然后转换为该键的定义值。 键盘的键面标示码(即定义值)与MCU 识别的键值对应关系通过列表对应起来,即键 盘定义表对应表示。当通过“行扫描”法获得某个键的键值时,通过查表法就可以得到它的定义值。 该键盘中断方式程序的主程序主体是一个死循环,且是一个空循环体,所有处理的过程 代码放在中断程序中。 三、演示性实验 在光盘资料中提供读者键盘实例程序文件夹。 编程采用规范要求编写,将键盘独立成一个构件,如C 语言中,形成key.h 头文件和key.c 源文件。头文件对键盘的所用端口寄存器或引脚进行宏定义以及初始化函数和驱动函数声明。源文件对初始化函数和驱动函数

单片机外部中断实验(附C语言程序)复习进程

单片机外部中断实验(附C语言程序)

单片机外部中断实验(附c程序) 一、实验目的 掌握外部中断的C语言和汇编语言编程方法,会用外部中断解决实际应用问题。 。 二、实验内容 8051C51单片机P2.0接一个发光二极管LED1、P2.1接一个发光二极管LED2,P3.2接一个开关、P3.3接一个开关要求实现以下功能:(1)合上、P3.3断开时LED1闪烁 (2)P3.2断开、P3.3合上时LED2闪烁 (3)P3.2合上后(不断开)再合上P3.3,LED1闪烁LED2不闪烁 (4)P3.3合上后(不断开)再合上P3.2,LED2不闪烁LED1闪烁 试编写C语言和汇编语言程序 使用自然优先级就可以 也可 XO 高级X1低级PX0=1 PX1=0 四、实验电路 五、参考程序(自己完成)

C程序: Include Sbit P2_0=P2^0; Sbit P2_1=P2^1; Sbit P3_2=P3^2; Sbit P3_3=P3^3; void delay02s(void) //延时0.2秒子程序{ unsigned char i,j,k; for(i=20;i>0;i--) for(j=20;j>0;j--) for(k=248;k>0;k--); } Void main { EA=1; EX0=1; EX1=1 ; ITO=1 ; IT1=1 ; PX0=1; PX1=0; While(1) ; } Void int0(void) interrupt 0 { if(!P3_2) { While(1) { P2_0=1; delay02s(); P2_0=0; delay02s(); } } } Void int1(void) interrupt 2 { if(!P3_3) {

键盘接口实验实验报告及程序

实验六键盘接口实验 姓名专业通信工程学号成绩 一、实验目的 1.掌握Keil C51软件与Protues软件联合仿真调试的方法; 掌握单片机的键盘接口电路; 掌握单片机键盘扫描原理; 掌握键盘的去抖原理及处理方法。 实验仪器与设备 1.微机1台C51集成开发环境3。Proteus仿真软件 实验内容 用Proteus设计一矩阵键盘接口电路。要求利用P1口接一4*4矩阵键盘。串行口通过一74LS164接一共阴极数码管。参考电路见后面。 用线反转法编写矩阵键盘识别程序,要求采用中断方式(列线通过4输入与门74LS20接/INT0),无按键按下时,数码管循环画“8”;有按键按下时产生中断并将按键的键值0~F通过串行口输出,在数码管上显示3秒钟后返回;返回后,数码管继续循环画“8”。 将P1口矩阵键盘改为8个独立按键(用中断方式设计),键盘通过74LS30(8输入与非门)和74LS04(六反相器)与/INT0相连,重新编写识别和显示程序。实验原理 矩阵键盘识别一般应包括以下内容: 判别有无键按下。 键盘扫描取得闭合键的行、列号。 用计算法火或查表法得到键值。 判断闭合键是否释放,如果没释放则继续等待。 将闭合键的键值保存,同时转去执行该闭合键的功能。 实验步骤 用Proteus设计键盘接口电路; 在Keil C51中编写键盘识别程序,编译通过后,与Proteus联合调试; 按动任意键,观察键值是否能正确显示。 电路设计及调试、程序 程序设计:矩阵键盘 #include<> #define uchar unsigned char #define uint unsigned int uchar code table1[]={0x00,0x01,0x21,0x61,0x65,0x6d,0x7d,0x7f}; uchar code key_table[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0 xd7,0xb7,0x77};

实验二--外部中断实验报告

桂林电子科技大学 一、实验目的 1 学习外部中断指令的基本使用方法; 2 学习外部中断处理程序的编程方法。 二、实验内容 1在实验一内容的基础上增加允许急救车优先通过的要求; 2 急救车到达时(产生外部中断),交通信号为全红,以便让急救车通过 3 急救车通过路口时间为10秒(四个红灯亮10秒)。急救车通过后,交通灯恢复原状态(中断前的状态); 4 中断申请信号为单脉冲“”。 三、实验原理图

四、实验程序框 五、实验步骤 1、检查试验仪,确认相应单片机放置位置,确认无误后将试验仪的USB 数据线连接电脑; 2、打开单片机电源开关,运行MEFlash 软件,确认电脑与试验仪连接成功; 3、将A T89S52的P0和P2口用短接线LED 灯的端口相连; 4、运行KC 编辑软件,调整好程序,并生成相应的.HEX 文件; 5、使用MEFlash 软件,将生成的.HEX 文件烧录到单片机中,运行成功; 6、测试中断是否运行正常,进行调试,确保程序正常运行。 六、实验程序清单 #include //*******延时1ms 秒******** void delay(unsigned int i) { unsigned int j; while(i--) 交通灯程序的流程图

{ //对于11.0592M晶振延时越是1ms for(j=0;j<125;j++) { {;} } } } //*****延时结束******* // k 代表黄灯闪烁的次数 void blink(unsigned int k) { for(;k>0;k--) //黄灯闪烁5次 { P2=0xF0; delay(300); P2=0xFF; delay(300); } } //******主函数****** //******主函数****** void main() { P0=0x0F; //初始状态东西南北红灯全亮 P2=0xFF; delay(2000) ; EA=1; //开启中断 IT0=0 ; EX0=1; //D27到D24分别代表东西南北绿灯 //D07到D04分别代表东西南北红灯 // D23到D20四灯代表黄灯 while(1) { P0=0xCF; //南北红灯亮 P2=0x3F; //东西绿灯亮 delay(2000) ;

实验2-外部中断的LED控制

外部中断的LED控制 实验目的 1.了解中断的作用 2.掌握嵌入式系统中断的处理流程 3.掌握ARM中断编程 实验内容 编写中断处理程序,处理外部中断 预备知识 了解ADT集成开发环境的基本功能;了解中断的作用以及基本处理过程。 实验设备 硬件:JXARM9-2400教学试验箱,PC机; 软件:PC机操作系统Windows 98(2000、XP)+ADT IDE开发环境 基础知识 参照教学实验教程P73-79 实验步骤 1.参照模板工程interrupt新建一个工程,并修改工程设置。 2.加入如下文件到工程中:2400lib.c; 2440init.s; 2440slib.s interrupt.c。 3.参照基础知识编写中断程序和主程序。 4.在中断服务函数中添加代码实现如下功能:每触发一次中断,二极管进行若干次闪烁。 5.参考模板工程interrupt对工程进行设置,然后编译 6.下载斌运行程序,按下外部中断键,实现实验效果。 实验报告要求 简述中断处理的步骤有哪些?说明每一步的主要工作。

main.c代码 /* 包含文件*/ #include "def.h" #include "2410lib.h" #include "option.h" #include "2410addr.h" #include "interrupt.h" #define U8 unsigned char /* functions */ void eint3_isr(void) __attribute__ ((interrupt("IRQ")));; void delay(); /* variables */ int dither_count3 = 0; /***************************************************************************** // Function name : Main // Description : JXARM9-2410 中断实验主程序 // 完成功能: // 外部中断按键引发中断 // Return type : void // Argument : void *****************************************************************************/ void Main(void) { /* 中断初始化*/ Isr_Init(); /* 初始化端口*/ Port_Init(); /* 请求中断*/ Irq_Request(IRQ_EINT3, eint3_isr); /* 使能中断*/ Irq_Enable(IRQ_EINT3); dither_count3 = 0; while(1) { delay(); dither_count3++;

AVR单片机基本输入和外部中断实验二

A VR学习笔记二、基本输入和外部中断实验 -------基于LT_Mini_M16 2.1 利用按键控制发光二极管的亮灭 2.1.1 实例功能 在“点亮发光二极管”和“让发光二极管动起来”这两个例子中,都是通过单片机程序来控制发光二极管的亮灭。如果想要控制发光二极管的亮灭,只有通过打开或者关闭电源来实现控制。那么怎样实现人工参与控制呢? 在有些应用场合,需要单片机对人工的开关信号作出相应的响应和处理,通过控制电源的通断会影响到单片机系统中的其他功能,所以通过控制电源的方法并不明智。能不能通过按动一个按键来实现发光二极管的亮灭呢? 当然可以,前面已经讲过,A VR单片机的I/O口都是双向的,也就是既能当作输出控制端口,也能当作输入检测端口。既然我们可以通过控制端口输出不同的高低电平使发光二极管实现点亮和熄灭;那么为什么不能通过监测端口输入电平的状态来进行相应的处理呢。 在本例中,通过介绍利用按键开关控制发光二极管的亮灭来了解A VR单片机的端口检测外部信号的功能和方法。 本例中有3个功能模块,描述如下: ●单片机系统:检测外界的按键开关信号,根据按键的开关状态控制发光二极管的亮灭状态。 ●外围电路:首先是产生信号的按键电路,包括对按键去抖动电路的介绍;然后是发光二极管的控制电路。 ●软件程序:通过读取AVR单片机相应端口的状态,编写相应的程序控制发光二极管的亮灭。 本例的目的在于希望读者完成本例后,能完成相关电路的设计和相应程序的编写,从而掌握以下知识点: ◆了解AVR单片机端口输入功能,掌握使用AVR单片机端口输入功能检测外部信号的原理。 ◆熟悉单片机端口输入输出功能的综合使用。 ◆掌握AVR单片机按键的硬件去抖动的电路设计和原理。 ◆掌握AVR单片机端口输入输出程序的编写。 ◆掌握AVR单片机按键软件去抖动功能的实现。 2.1.2 器件和原理 本例主要介绍A VR单片机外围电路中按键去抖电路的设计,分别介绍相应的软件和硬件解决方案。然后利用C语言编写通过按键控制发光二极管亮灭状态的程序。 1、按键的去抖动电路 (1)按键的响应过程 我们日常所说的按键,实际上是一个机械开关,本实例所用的按键外观如图2.1.1所示。理想的按键的闭合和断开时,接触点的电压应该立即变高或者变低,但是由于机械触点的弹性以及按键按动时电压突变等原因,在触点闭合或断开的瞬间会出现电压抖动现象,如

51单片机外部中断实验

实验6 外部中断实验 (仿真部分) 一、实验目的 1. 学习外部中断技术的基本使用方法。 2. 学习中断处理程序的编程方法。 二、实验内容 在INT0和INT1上分别接了两个可回复式按钮,其中INT0上的按钮每按下一次则计数加一,其中INT1上的按钮每按下一次则计数减一。P1.0~ P1.3接LED灯,以显示计数信号。 三、实验说明 编写中断处理程序需要注意的问题是: 1.保护进入中断时的状态,并在退出中断之前恢复进入时的状态。 2.必须在中断处理程序中设定是否允许中断重入,即设置EX0位。 3.INT0和INT1分别接单次脉冲发生器。P1.0~ P1.3接LED灯,以查看计数信号. 四、硬件设计 利用以下元件:AT89C51、BOTTON、CAP、CAP-POL、CRYSTAL、RES、NOT、LED-Yellow。设计出如下的硬件电路。晶振频率为12MHz。 五、参考程序框图 开始 设置有关中断控制寄存器 开外中断INT0、INT1 设置P1.0~ 3初始状态 显示循环等待中断 INT0中断入口 计数加一 保护现场 恢复现场 中断返回

主程序框图INT0中断处理程序框图 实验6 外部中断实验 (实验箱部分) 1.实验目的 认识中断的基本概念 学会外部中断的基本用法 学会asm和C51的中断编程方法 2.实验原理 图按键中断 【硬件接法】 P1.1控制LED,低电平点亮 P3.3/INT1接按键,按下时产生低电平 【运行效果】 程序工作于中断方式,按下按键K2后,LED点亮,1.5秒后自动熄灭。 8051单片机有/INT0和/INT1两条外部中断请求输入线,用于输入两个外部中断源的中断请求信号,并允许外部中断源以低电平或下降沿触发方式来输入中断请求信号。/INT0和/INT1中断的入口地址分别是0003H和0013H。 TCON寄存器(SFR地址:88H)中的IT0和IT1位分别决定/INT0和/INT1的触发方式,置位时为下降沿触发,清零时为低电平触发。实际应用时,如果外部的中断请求信号在产生后能够在较短时间内自动撤销,则可以选择低电平触发。在中断服务程序里要等待其变高后才能返回主程序,否则会再次触发中断,产生不必要的麻烦。 如果外部的中断请求信号产生后可能长时间后才能撤销,则为了避免在中断服务程序里长时间无谓等待,可以选择下降沿触发。下降沿触发是“一次性”的,每次中断只会有1个下降沿,因此中断处理程序执行完后可以立即返回主程序,而不必等待中断请求信号恢复为高电平,这是一个重要的技巧。 3. 实验步骤 ●参考实验例程,自己动手建立Keil C51工程。注意选择CPU类型。Philips半导体的 P89V51RB2。 ●编辑源程序,编译生成HEX文件。 ●ISP下载开关扳到“00”,用Flash Magic软件下载程序HEX文件到MCU BANK1,运行。 运行Flash Magic软件。各步骤操作如下:

外部中断实验

计算机科学与技术系 实验报告 专业名称计算机科学与技术专业 课程名称单片机应用设计 项目名称外部中断实验 班级 14计科一班 学号 姓名 同组人员无 实验日期 2016年4月15日

一、实验目的 熟悉MCS51中断系统的工作原理和编程方法,掌握单片机中断优先级的原理和处理方法,掌握中断系统的应用、实时程序的设计和调试技巧。 二、实验内容 1、将单片机的INT0和INT1分别外接一个独立按键,要求 INT0设置为下降沿触发,INT1设置为低电平触发,并且为高优先级。 2、对每次的按键动作进行计数,要求分别显示在 LED 数码管上,并确保每次按键过程中只识别一次按键动作。 三、实验原理图 四、连线说明

五、演示程序 ;------------功能描述------------ ;外部中断0下降沿触发计数 0-60,由K1按下实现 ;外部中断1低电平触发计数 0-60由K2按下实现 ;K3为基准键,K3与K4~K8组合分别控制LED4~LED8 DS_595 EQU P2.2 SHCP_595 EQU P2.1 ;移位寄存器时钟 STCP_595 EQU P2.0 ;存储器时钟 INT_0 EQU P3^2 ;外部中断0 INT_1 EQU P3^3 ;外部中断1 LED EQU P1 KBASE_3 EQU P0^2 ;基键 K_4 EQU P0^3 K_5 EQU P0^4 K_6 EQU P0^5 K_7 EQU P0^6 K_8 EQU P0^7 DIS_DAT EQU 33H ;段选 DIS_ADDR EQU 32H ;位选 COUNT0 EQU 30H ;记按键次数 COUNT1 EQU 31H ;-------------定义地址-------------- ORG 0000H LJMP MAIN ORG 0003H ;外部中断0的入口地址 LJMP OUT0 ORG 0013H LJMP OUT1 ;-------------主函数--------------- MAIN: MOV COUNT0,#0 MOV COUNT1,#0 %SETB INT_0;复位P3.2口重新置位 %SETB INT_1;复位P3.2口重新置位 SETB EX0 ;置1,运行外部中断0产生中断 SETB IT0 ;置1,外部中断0为跳沿触发 SETB PX1 SETB EX1 CLR IT1 ;置0,低电平触发 SETB EA ;置1,CPU开总中断

嵌入式系统实验三-按键中断实验

《嵌入式系统》课程实验报告 学生姓名: 所在班级: 指导教师: 记分及评价: 一、实验名称 按键中断实验 二、实验目的 通过实验掌握S3C2410X的中断控制寄存器的使用;通过实验掌握S3C2410X处理器的中断响应过程;通过实验掌握ARM处理器的中断方式和中断处理过程;通过实验掌握ARM处理器中断处理的软件编程方法。 三、实验内容 编写程序,当用户在实验箱按下KEY1键或KEY2键时在中断服务子程序中将相关信息打印到串口中,显示在超级终端上。 四、实验原理 在本实验平台的主板上设计了两个外部按键,电路原理图如下: EXINT0和EXINT1信号作为CPLD芯片的输入信号。CPLD内部逻辑图:

五、实验结果 超级终端上显示以下信息: 按下KEY1键或KEY2键,超级终端上显示以下信息。 六、练习题 编写程序实现:按下KEY1或KEY2后点亮实验系统的LEDs一段时间后熄灭。 任务:按下KEY1键后LED1点亮一段时间后熄灭;按下KEY2键后点亮LED2一段时间后熄灭。#define rCPLDIntControl (*(volatile unsigned char*)0x22600000) #define rCPLDIntStatus (*(volatile unsigned char*)0x22200000) #define rCPLDLEDADDR (*(volatile unsigned char*)0x21180000) void __irq int_int(void) { unsigned char Status; int i; Status = rCPLDIntStatus; Status = ~(Status & 0x6); if(Status & 0x2) { uart_printf(" Eint0 interrupt occurred.\n"); rCPLDLEDADDR = (rCPLDLEDADDR | 0xFF )& 0xFE; for(i = 0; i < 100000; i++);

相关文档