单片机中断实现按键
- 格式:docx
- 大小:37.76 KB
- 文档页数:4
单片机中断实现按键(总3页)页内文档均可自由编辑,此页仅为封面#include<>#include<>#define uint unsigned int#define uchar unsigned charsbit duoj=P0^0;sbit key=P1^0;uchar duojcount,degree;void main(){TMOD=0x01; {degree++; {SendStr("1");P2 = 0xfe;Delay_ms(240);}}}}}// 发送一个字节void SendByte(unsigned char dat){SBUF = dat;while(!TI);TI = 0;}// 发送一个字符串void SendStr(unsigned char *s){while(*s!='\0')// \0 表示字符串结束标志,通过检测是否字符串末尾{SendByte(*s);s++;}}内容:连接好串口或者usb转串口至电脑,下载该程序,打开电源打开串口调试程序,将波特率设置为9600,无奇偶校验晶振,发送和接收使用的格式相同,如都使用字符型格式,按复位重启程序,可以看到接收到 UART test,技术论坛:请在发送区输入任意信然后在发送区发送任意信息,接收区返回同样信息,表明串口收发无误#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/*------------------------------------------------函数声明------------------------------------------------*/void SendStr(unsigned char *s);/*------------------------------------------------串口初始化------------------------------------------------*/void InitUART (void){SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装TH1 = 0xFD; // TH1: 重装值 9600 波特率晶振TR1 = 1; // TR1: timer 1 打开EA = 1; //打开总中断// ES = 1; //打开串口中断}/*------------------------------------------------主函数------------------------------------------------*/void main (void){InitUART();SendStr("UART test,技术论坛:请在发送区输入任意信息");ES = 1; //打开串口中断while (1){}}/*------------------------------------------------发送一个字节------------------------------------------------*/void SendByte(unsigned char dat){SBUF = dat;while(!TI);TI = 0;}/*------------------------------------------------发送一个字符串------------------------------------------------*/void SendStr(unsigned char *s){while(*s!='\0')// \0 表示字符串结束标志,通过检测是否字符串末尾 {SendByte(*s);s++;}}/*------------------------------------------------串口中断程序------------------------------------------------*/void UART_SER (void) interrupt 4 //串行中断服务程序{unsigned char Temp; //定义临时变量if(RI) //判断是接收中断产生{RI=0; //标志位清零Temp=SBUF; //读入缓冲区的值P2=Temp; //把值输出到P1口,用于观察SBUF=Temp; //把接收到的值再发回电脑端}if(TI) //如果是发送标志位,清零TI=0;}。
KB_lnit:P SHA LDA STA LDA STA LDA STA#$00 ;KB_P #%00001111 KB_D #%11110000 KB PUE保护A 复位相应寄存器定义7-4为输入,3-0为输出 定义输入引脚有内部上拉电阻 屏蔽键盘中断(IMASK=1) 允许输入引脚的中断可进入 BSET 1,INTKBSCR ; LDA #%11110000 ;STA INTKBIER BSET 2,INTKBSCR ; PULA ;RTS*KB_Scan:扫描读取键值子程序 扫描4*4键盘,读取键值 ->A,无按键,为$FF 无A=键值清除键盘中断请求(ACKK=1) 恢复A*功能 *入口*出口* 堆栈深度:2+2=4 ** KB_Scan:AIS #-!2 ;LDA #%11111110 STA !1,S P LDA #$04; STA !2,S P KB_Scan1: LDA KB P ;开辟临时变量使第一根行线为0(低电平) 将扫描4根行线取 KB P->A9.2 汇编语言键盘中断模块编程实例(2)键盘编程汇编语言子程序下面给出有关键盘编程的汇编语言子程序。
它们是:键盘中断初始化子程序、 扫描法读取键值子程序、键值转为定义值子程序。
即使不使用中断方式识别按键, 三个子程序仍然需要使用。
只不过键盘初始化子程序中改为不允许中断进入。
扫描法读取键值与键值转为定义值两个子程序在键盘编程中通常需要使用的。
KBsub.ASM**文件描述 :包含3个键盘子程序,分别为:* (1) 键盘初始化子程序(KB_Init)* (2)扫描读取键值子程序 (KB_Scan) * (3)*键值转为定义值子程序 (KB_Def)KB_P EQU PTA ; KB_D EQU DDRA ; KB_PUE EQU PTAPUE ; *KB_Init:键盘初始化子程序*功能:初始化键盘中断的引脚,但未开放键盘中断 *入口 :无*出口 :无 *堆栈深度:2*:以下为子程序源代码========== ; 键盘接在PTA 口上相应的方向寄存器相应的上拉电阻允许寄存器台匕ORA #%00001111 ;KB P.7-4 保留,KB P.3-0 为 1AND $1,S P ; 令KB_P.n=0,n=0、1、2、3STA KB_PNOPNOPLDA KB_P ; 看第n行是否有键按下AND #%11110000 ;KE LP.7-4 保留,令低4位=0CBEQA #$F0,KB_Scan2 ; 本行无键按下,转KB_Scan2LDA KB_P ; 本行有键按下BRA KB_Scan_ExitKB_Scan2:SEC ;C=1ROL $1,S P ; 使下一个行线为0DBNZ !2,S P,KB_Scan1 ; 对行线循环LDA #$FF ; 没有键被按下返回$FFKB_Scan_Exit:AIS #!2 ; 释放临时变量RTS*KB_Def:键值转为定义值子程序----------------- * *功能:键值转为键盘定义值**入口:A=键值* *出口:A=键定义值**堆栈深度:2+3=5 * **KB_Def:P SHH ; 保护HXP SHXAIS #-!1 ; 开辟临时变量STA !1,S P ; 把键值存入(!1,SP)LDHX #KB_Table ; 取键盘定义表首地址KB_Def1:LDA ,XCMP #$00 ; 与0(定义表结束标志)相比较BEQ KB_Def3 ;=0, 表示即表中无次定义值CMP $1,S P ; 与键值相比较BNE KB_Def2 ; 不等,未找到转KB_Def2AIX #!1 ; 找到LDA ,X ; 取键定义值-〉ABRA KB_DefRKB_Def2:AIX #!2 ; 指向下一个键值BRA KB_Def1 ; 继续判断KB_Def3:LDA #$FF ; 无此定义,用FF标志KB_DefR:AIS #!1 ; 释放临时变量P ULX ; 恢复HXP ULHRTS;键盘定义表KB_Table FCB $EE,"1",$DE,"2",$BE,"3",$7E,"A"FCB $ED,"4",$DD,"5",$BD,"6",$7D,"B"FCB $EB,"7",$DB,"8",$BB,"9",$7B,"C"FCB $E7,"*",$D7,"0",$B7,"#",$77,"D"FCB $00922键盘中断编程举例下面给出的实例程序的功能是, 当按下键盘上任何一个键, 产生键盘中断,在键盘中断 程序中,通过串行口发送“键值”及“键定义值”。
单⽚机实验:外部中断按键实验内容:实验⼤致上就是说:按键不按的时候,灯⼀直亮,按键按下的时候,灯不亮,报警器响。
现在给了汇编语⾔,要改成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仿真:。
实训题目:按键控制LED模式并使用中断
描述:在这个实训中,你将使用STM32L151C8T6微控制器编写一个程序,以通过三个按键来控制两个LED灯的状态,而且这次LED有不同的模式,并使用中断来检测按键的状态变化。
具体要求如下:
要求:
使用STM32CubeIDE或其他适合的开发环境创建一个新的STM32L151C8T6项目。
配置两个GPIO引脚分别用于控制两个LED灯的开关,将其设置为输出模式。
配置三个GPIO引脚作为按键的输入引脚。
配置外部中断(例如,使用EXTI线路)以检测按键的状态变化(按下和释放)。
在中断处理程序中检测按键的状态变化,并实现以下LED模式切换:
当按下按键1时,切换LED1的模式(例如,常亮、闪烁、呼吸等)。
当按下按键2时,切换LED2的模式。
当按下按键3时,同时熄灭两个LED。
为每个LED模式实现不同的效果。
例如,如果选择闪烁模式,LED应该以不同的频率闪烁;如果选择呼吸模式,LED应该逐渐变亮和变暗。
编写一个无限循环,以让程序持续运行,允许按键切换LED的模式和控制LED的开关。
测试你的程序,确保按下不同的按键会导致相应的LED模式切换和LED状态变化。
这个实训题目要求你不仅要处理按键的状态变化,还要实现多种LED模式,每种模式有不同的效果。
这将帮助你深入了解STM32的GPIO配置、中断处理以及复杂的LED控制。
硬件电路参考如下:程序参考如下:#pragma sfr#pragma interrupt INTP0 LED_INTP0 /* 定义使用INTP0中断,中断函数名LED_INTP0*/ #pragma di /*禁止使用中断功能声明*/#pragma ei /*允许使用中断功能声明*//*数码管编码数组*/unsigned char LED_light[10]={0x30,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x3F}; unsigned char j=0; /*按键次数变量*/void hdinit() /*硬件初始化*/{PM1=0; /*P1口输出数码管字型码,所以设置为输出*/PU1=0XFF; /*由于P1口直接驱动数码管显示,为增大驱动,设置为内部上拉*/PM12.0=0; /*P12.0口线要作为中断多功能,设置为输出和内部上拉 */PU12.0=1;PIF0=0; /*中断请求标志,没有中断请求*/PMK0=0; /*中断屏蔽标志,允许中断*/PPR0=1; /*中断优先级,低优先级*/EGP.0=1; /*与EGN组合,上升沿有效*/EGN.0=0;}void main (void){DI(); /*首先做准备,禁止中断*/IMS=0XCC;IXS=0X00;hdinit();EI(); /*准备完成,允许中断*/while(1){ /*啥也不干,就等待中断,仅是在这个实验中使用中断,实际不是这样/*}}__interrupt void LED_INTP0() /*中断函数*/{ P1= LED_light[j]; /*P1赋值,数码管显示相应数值*/j++; /*按键次数加一*/if(j==10) /*如果按键次数达到十次,按键计数归0*/{j=0;} }思考: 如果用两位数码管,从0—99循环计数又该怎样设计硬件和软件呢?。
一、实验目的1. 熟悉单片机中断系统的工作原理和中断响应过程。
2. 掌握使用外部中断实现单个按键控制的实验方法。
3. 学习通过编程设置中断源、中断优先级和中断服务程序。
二、实验原理单片机的中断系统允许CPU在执行程序的过程中,暂停当前程序的执行,转而处理由外部事件引起的中断请求。
在本实验中,我们使用外部中断0(INT0)来实现单个按键的控制。
当按键按下时,通过外部中断0引脚(P3.2)向CPU发送中断请求。
CPU响应中断后,暂停当前程序的执行,转而执行外部中断0的中断服务程序(ISR)。
在中断服务程序中,我们可以根据按键的状态来执行相应的操作,例如点亮或熄灭LED灯。
三、实验设备1. 单片机开发板(如STC89C52)2. 按键3. LED灯4. 连接线5. 仿真软件(如Keil uVision)四、实验步骤1. 硬件连接:- 将按键的一个引脚连接到单片机的P3.2引脚(外部中断0)。
- 将按键的另一个引脚连接到地(GND)。
- 将LED灯的正极连接到单片机的P1.0引脚,负极连接到地(GND)。
2. 编写程序:- 使用Keil uVision软件编写程序。
- 初始化外部中断0,设置中断优先级和中断服务程序。
- 编写中断服务程序,根据按键状态控制LED灯的亮灭。
3. 编译程序:- 使用Keil uVision软件编译程序,生成可执行文件。
4. 下载程序:- 将编译好的程序下载到单片机开发板上。
5. 运行程序:- 观察按键按下时LED灯的亮灭状态,验证中断功能是否正常。
五、实验代码```c#include <reg52.h>#define LED P1_0#define BUTTON P3_2void main(void) {EA = 1; // 开启总中断EX0 = 1; // 开启外部中断0IT0 = 1; // 设置外部中断0为下降沿触发while (1) {// 主循环,等待中断}}void ext0_isr(void) interrupt 0 {LED = !LED; // 切换LED灯状态}```六、实验结果与分析1. 实验结果:- 按键按下时,LED灯亮;按键释放时,LED灯灭。
单片机中断实现按键
一、引言
在嵌入式系统中,往往需要通过外部输入设备如按键来与系统进行交互。
为了能够及时响应按键操作,避免忙等的情况发生,通常会使用中断
技术来实现按键的检测和处理。
本文将介绍如何使用中断来实现按键检测,并具体以8051单片机作为示例进行说明。
二、中断基础知识
在单片机中,中断是一种由硬件触发的特殊事件,当一些中断条件满
足时,单片机会暂停当前任务,跳转到中断服务程序中执行对应的处理代码,待中断处理结束后再返回到原来的任务中。
中断的触发方式一般有两种:外部触发中断和内部触发中断。
对于按键这种外部输入设备,一般通
过外部触发中断来实现。
三、实现原理
1、按键电路:按键通常由一个导电片和两个触点组成,平时靠两个
触点之间的弹簧将导电片与触点隔开,当按下按键时,弹簧压缩,导电片
与触点接触形成通路。
为了能够检测按键操作,需要将按键引脚连接到单
片机的外部中断引脚上。
2、中断设置:在单片机的程序中,需要设置好相应的中断向量表和
中断服务程序。
中断向量表是一个存放中断服务程序地址的表格,当中断
触发时,单片机会根据中断号从中断向量表中找到相应的中断服务程序地
址并跳转到该地址执行对应代码。
3、中断触发条件:在按键电路中,按键的两个触点状态变化(从断
开到接通或从接通到断开)时会产生干扰信号,为了避免干扰,通常会使
用软件消抖技术。
当按键被按下,并经过一段时间的消抖后,会产生一个
稳定的按键信号,此时可以检测到按键变化,并触发相应的中断。
四、实现步骤
1、硬件连接:将按键引脚连接到单片机的外部中断引脚上。
2、中断设置:在单片机的程序中,需要设置中断的相关寄存器,包
括中断向量表和中断控制寄存器。
中断向量表保存中断服务程序的入口地址,中断控制寄存器用于设置中断触发条件和中断优先级等参数。
3、中断服务程序:编写中断服务程序,在按键中断触发时执行对应
的处理代码。
中断服务程序一般需要包括中断触发条件的判断和处理代码
的执行。
4、主程序:在主程序中调用中断服务程序,并添加相应的处理代码,实现按键操作的具体功能。
五、代码示例
下面是以8051单片机为例的按键中断实现代码示例,用来检测是否
按下按键并显示按键状态。
```c
#include <reg51.h>
sbit key = P1 ^ 0; //按键连接到单片机的P1.0引脚,作为外部中
断输入
void INT0_interrupt( interrupt 0 //外部中断0的中断服务程序if (key == 0) //判断按键是否按下
P2=0x01;//按下按键后,P2口输出1
}
else
P2=0x00;//未按下按键,P2口输出0
}
void main
IT0=1;//设置外部中断0触发方式为下降沿触发
EX0=1;//使能外部中断0
EA=1;//使能总中断
while (1)
//循环执行其他任务
}
```
这段代码实现了当按键按下时,P2口输出1,否则输出0。
其中,INT0_interrupt(函数是外部中断0的中断服务程序,当外部中断0触发时会跳转到该函数执行。
六、总结
本文介绍了使用中断来实现按键检测的原理和步骤,并以8051单片
机为例进行了具体说明。
中断技术可以大大提高按键响应的速度和可靠性,使系统能够即时响应按键操作,提升用户体验。
在实际应用中,还可以根
据具体需求对按键中断进行扩展,实现更复杂的操作功能。