精华内容
下载资源
问答
  • 大家主循环里写扫描按键状态的时候,想必都发觉了一个问题:要么按钮会重复起作用(每一循环都会触发一),要么只能用中断解决。如果是控制流水灯流速加速减速吧,按着就不断加减速,倒也方便;但是如果是切换...

    存在问题

    大家主循环里写扫描按键状态的时候,想必都发觉了一个问题:要么按钮会重复起作用(每一次循环都会触发一次),要么只能用中断解决。如果是控制流水灯流速加速减速吧,按着就不断加减速,倒也方便;但是如果是切换模式或者启停这类的话,重复响应会造成很大麻烦。

    原因分析

    最主要的原因有两个:一是主循环速度非常快,而按键来不及释放返回初始电平。二是由于按键的内部弹片抖动,造成按键返回时会出现高低电平的震荡。从而导致了按键的重复响应。
    问题最大症结,在于没法检测到“按下”“松开”的事件,只能探测到某时刻是抬起还是松开。要探测“按下”“松开”怎么办呢?我们可以借助一个辅助变量(标志位)。先让它与按钮电平相同(刚开始没按下,就是高电平);当按钮电平变化,它还没有改变,两者就不相等,这时就可以触发按下或松开的事件(要视当时按钮电平而定)。这时再让它与按钮电平相同,就不会重复触发。按钮电平再变化时,按钮电平与辅助变量又会不等,又会触发事件。看图:
    在这里插入图片描述
    于是我们就可以写出这样的代码:(52单片机,keil开发环境)

    /*
    
     *单次按钮触发例程
    
     *P3.0和P3.1搭上按钮,P0搭上灯就能用
    
     */
    
    #include "reg52.h"
    
    
    
    #define led P0
    
    sbit sOn		= P3 ^ 0;
    
    sbit sMode		= P3 ^ 1;
    
    
    
    unsigned char
    
    	bOn		= 1,
    
    	bMode	= 1,
    
    	flag_on = 0,
    
    	mode = 1;
    
    
    
    void delay(unsigned int t)
    
    {
    
    	unsigned int x,y;
    
    	for(x = t;x;x--)
    
    		for(y = 110;y;y--);
    
    }
    
    
    
    void ledControl()
    
    {
    
    	switch(mode)
    
    	{
    
    		case 1://滚动
    
    			if(!led)
    
    				led = 1;
    
    			else
    
    				led <<= 1;
    
    			break;
    
    		case 2://闪动
    
    			led = ~led;
    
    	}
    
    }
    
    
    
    void onBtnOnClick()
    
    {
    
    	//可选:重置而非记忆闪烁模式
    
    	mode = 1;
    
    
    
    	flag_on = !flag_on;
    
    	led = 0;
    
    }
    
    
    
    void onBtnOnOffClick()
    
    {
    
    
    
    }
    
    
    
    void onBtnModeClick()
    
    {
    
    	++mode;
    
    	if(mode > 2)
    
    		mode = 1;
    
    	led = 0;
    
    }
    
    
    
    void onBtnModeOffClick()
    
    {
    
    
    
    }
    
    
    
    void main()
    
    {
    
    	unsigned int tdelay = 100;
    
    
    
    	led = 0;
    
    
    
    	for( ; ; )//与while(1)等效,没什么特别含义
    
    	{
    
    		if(sOn != bOn)
    
    		{
    
    			//如果按钮是按下的(低电平)就是按下事件,否则是松开事件
    
    			if(sOn == 0)
    
    				onBtnOnClick();
    
    			else
    
    				onBtnOnOffClick();
    
    			//更新bOn,避免重复触发
    
    			bOn = sOn;
    
    		}
    
    
    
    		//模式改变同理
    
    		if(bMode != sMode)
    
    		{
    
    			if(sMode == 0)
    
    				onBtnModeClick();
    
    			else
    
    				onBtnModeOffClick();
    
    			bMode = sMode;
    
    		}
    
    
    
    
    
    		if(flag_on)
    
    			ledControl();
    
    
    
    		delay(tdelay);
    
    
    
    	}
    
    }
    

    显然这样的方法还有不少缺点:要和亮灯一起丢在一个循环里面,代码分离度不好,还占用运算时间……总之就是没有中断好用。不过中断不够用的情况下(按钮狂魔),这个方法我个人认为还是不错的。

    作者:2020级黄家伟

    展开全文
  • 为扩展AT9lRM9200中断处理能力,将通用IO配置为中断输入,并针对负脉冲中断信号的二次响应问题提出2种优化解决方案。实验表明,在成功解决了中断二次响应的问题基础上,满足系统的实时性要求。
  • 52单片机中断

    2021-02-02 15:03:00
    中断的概念 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生); CPU暂时中断当前的工作,转去处理事件B(中断响应中断服务);... 中断响应条件 1.中断源有中断请求; 2.此中断

    一 中断的概念
    CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);
    CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);
    待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程被称为中断
    概念可能不好理解,举个例子:假如你是个老师,你在上课,突然电话响了,一看是你老婆打过来的,你不敢不接,于是你只好暂停讲课接听电话,挂完电话,你继续讲课。这个过程中实际发生了一次中断。
    二 中断的响应条件
    1.中断源有中断请求;
    2.此中断源的中断允许位为1;
    3.CPU开中断。
    以上3条同时满足时,CPU才有可能响应中断。
    三 中断的种类
    52单片机共有六个中断源,分别是外部中断INT0、INT1,定时器\计数器中断T0、T1、T2,串行口中断TI\RI。
    这里面还设计到一个中断优先级的概念:

    中断源 级别
    INT1 最高
    T0 第二
    INT1 第三
    T1 第四
    TI\RI 第五
    T2 最低

    本次主要讲的定时器T0、T1功能。
    四 定时器的使用
    目前要实现定时功能主要有以下方式:软件定时(说简单点就是用for循环)、采用时基电路定时(555电路)、采用可编程芯片定时。本次主要讲述的就是第三种方法。在这里插入图片描述
    工作原理十分简单:当加到计数器全为1时,再输入一个脉冲就使得计数器回零,且计数器的溢出使TCON中TF0或TF1置1,向CPU发出中断请求。
    定时器的工作方式又由寄存器TMOD决定。TMOD总共有八位,第四位用于T0、高四位用于T1。
    TMOD的格式如上图
    各位功能如下:
    在这里插入图片描述
    M1M0的功能如下:
    在这里插入图片描述
    这里我们主要讲的方式1。
    控制寄存器TCON:
    在这里插入图片描述
    定时器的使用步骤:
    1.对TMOD赋值,以确定T0和T1的工作方式。
    2.计算初值,并讲其写入TH0、TL0或TH1、TL1。
    3.对中断允许寄存器IE赋值,开放中断。
    4.使TR0、TR1置位。
    接下来我们来写代码:
    首先我们来看看中断函数怎么写:

    void exter0() interrupt 1   //中断函数不能返回任何值,函数名字可以随便起
     {						    //interrupt后面跟的数字为中断优先级。				
    	TH0=(65536-50000)/256;	//往往后面还会带一个using + 一个数字。
    	TL0=(65536-50000)%256;  //这个数字表示此中断使用四组工作寄存器哪一组。		
    	tt++;					//C51编译器自动分配工作组,因此这个using常常省略。
     } 
    

    这就是中断函数,当加一计数器溢出时则会进入此函数。
    初始化定时器:

    void init()
    {
      	  tt=0;
      	  TMOD=0X01;//设置定时器0为方式1
    	  TH0=(65536-50000)/256;
    	  TL0=(65536-50000)%256;
      	  EA=1;		 //开总中断
    	  ET0=1;	 //开定时器中断0	 
    	  TR0=1;       //启动中断
    }
    

    这里往往大家有疑问的是那个初值怎么赋值,从上面的知识点可知,每个定时器都有4种工作模式,可通过设置TMOD寄存器中的M1M0位来进行工作方式选择。这里我们主要讲16位的。
    方式1的计数位数是16位,对T0来说,由TL0寄存器作为低8、TH0寄存器作为高8位,组成了16位加1计数器。
    定时器一但启动(TR0、TR1=1),它便在原来的数值上开始加1计数,若在程序开始时,我们没有设置TH0和TL0,它们的默认值都是0,假设时钟频率为12MHz,12个时钟周期为一个机器周期,那么此时机器周期为1us,记满TH0和TL0就需要2的16次方 -1个数,再来一个脉冲计数器溢出,随即向CPU申请中断。因此溢出一次共需65536us,约等于65.6ms,如果我们要定时50ms的话,那么就需要先给TH0和TL0装一个初值,在这个初值的基础上记50000个数后,定时器溢出,此时刚好就是50ms中断一次,当需要定时1s时,我们写程序时当产生20次50ms的定时器中断后便认为是1s,这样便可精确控制定时时间啦。要计50000个数时,TH0和TL0中应该装入的总数是65536-50000=15536.,把15536对256求模:15536/256=60装入TH0中,把15536对256求余:15536/256=176装入TL0中。
    以上就是定时器初值的计算法,总结后得出如下结论:当用定时器的方式1时,设机器周期为TCY,定时器产生一次中断的时间为t,那么需要计数的个数为N=t/TCY ,装入THX和TLX中的数分别为:
    THX=(65536-N)/256 , TLX=(65536-N)%256 <x为0或1>。如果还不懂可以去看看B站上的课程。
    以上图片来自于郭天祥老师2007年在哈尔滨授课的课件中。

    展开全文
  •    本系列共6篇文章,本文作为本系列的第篇文章,介绍实验中断控制实验,本系列文章基于Dais-52PRO实验箱。...   每触发按键一,INT0管脚就得到一次中断触发,从而引发单片机的中断响应。  

       本系列共6篇文章,本文作为本系列的第二篇文章,介绍实验二 :中断控制实验,本系列文章基于Dais-52PRO实验箱。

    本系列文章链接:

    -----------------------------------------------------------------------------

       51单片机汇编语言实验(一)-----数字量输入输出(附参考代码及注释)
       51单片机汇编语言实验(二)-----中断控制实验(附参考代码及注释)
       51单片机汇编语言实验(三)-----定时/计数器实验(附参考代码及注释)
       51单片机汇编语言实验(四)----串行通信实验(附参考代码及注释)
       51单片机汇编语言实验(五)-----A/D 0809模数转换和DA0832数模转换实验(附参考代码及注释)
       51单片机汇编语言实验(六)-----8255键盘与显示设计(附参考代码及注释)

    -----------------------------------------------------------------------------

    一、实验目的:

       1.学习中断控制技术的基本原理;

       2.掌握51单片机的中断子程序的编写方法。

    二、实验设备:

       PC计算机一台,Dais-52PRO+实验系统一套。

    三、实验内容:

       1. 外部中断实验

       2. 定时器中断实验

    四、外部中断实验

       1、实验原理:

       每触发按键一次,INT0管脚就得到一次中断触发,从而引发单片机的中断响应。

       2、实验步骤:

      ① 将试验箱IO区的P1.0与LED区的L0按下图连线;
      ② 将试验箱IO区的P3.2与脉冲区的SP按下图连线;
      ③ 编写程序,经编译、链接无语法错误后装载到实验系统;
      ④ 运行程序,每按动一次单脉冲按钮令发光二极管L0交替点亮或熄灭;
      ⑤ 实验完毕后,应使用暂停命令中止程序的运行。

       3、参考代码:

    //实验二   外部中断实验 
        LED  BIT P1.0
    	ORG	 0000H
    	AJMP MAIN	;上电,转向主程序
    	ORG	0003H	    ;外部中断0入口地址
    	AJMP	INT0SVR	;转向中断服务程序
    	ORG	0100H	    ;主程序
    MAIN:	
    	SETB	EX0	;允许外部中断0中断
    	SETB	IT0	;选择边沿触发方式
    	SETB	EA	;CPU开中断
    HERE:
        SJMP   HERE	;等待中断		
         
    		 
    INT0SVR:  CPL   LED     ;LED取反
              RETI		;中断返回       
              END
    

    五、中断控制实验:

       1、实验原理:

       利用51单片机的定时器T0,使P1.0控制的发光二极管L0每隔1秒交替点亮或熄灭。

       2、实验步骤:

      ① 将试验箱IO区的P1.0与LED区的L0按下图连线;
      ② 编写程序,经编译、链接无语法错误后装载到实验系统;
      ③ 运行程序,观察发光二极管L0,应每隔1秒交替点亮或熄灭;
      ④ 实验完毕后,应使用暂停命令中止程序的运行。

       3、参考代码:

         //实验二   定时器中断实验
    COUNT   EQU  9217        ;11.0592MHz 延时10ms
    LED     EQU  P1.0
            ORG 0000H       ;复位地址
            AJMP MAIN       ;开始时跳转转到主程序
            ORG  000BH          ;T0入口地址
            AJMP INT_T0
            ORG 0100H
    MAIN:   SETB LED
            MOV TMOD,#00000001B            ;设置定时器T0工作在方式1(16位
    		MOV  TH0,#HIGH(65536-COUNT)         ;设置初值
            MOV  TL0,#LOW(65536-COUNT)
            CLR  TF0           ;先把溢出标志位清零
            SETB TR0       ;开始计时
            SETB  EA           ;全局中断打开
            SETB  ET0          ;定时器/计数器T0溢出中断打开
            MOV  R7,#00H     ;作为定时器累加器使用
            SJMP $          ;循环,等待中断
            ;中断服务子程序
    INT_T0: INC R7       ;计数增量
            CLR TF0         ;重新置中断标志位为0
            MOV  TH0,#(65536-COUNT)/256        ;重新符初值65536-9217=563191101101111111111  低八位正好是255
            MOV  TL0,#255
            CJNE  R7,#100,RETURN ;让灯明暗相间1s
            MOV   R7,#00H
            CPL   LED              ;让灯明暗交替变化
    RETURN: RETI
            END		
    

        本文介绍的内容完整的工程文件我会放在附件里,需要者自取,放的时候都是免费,它会自己涨,链接失效或者需要的可以在评论区留言,我直接发给你。本文附件链接如下:

         51单片机汇编语言实验(二)-----中断控制实验(附参考代码及注释)附件链接

    展开全文
  • 51中断(数据丢失)

    2013-04-22 20:12:31
    51中断在没有执行完的情况下,中断再次发生这时是不会响应二次中断的。或者说中断使能置没有打开这是来的中断变不会响应。 其实这是一个很明显的问题,只是在写程序的时候,特别遇到多中断处理的程序时便会产生...

    51中断在没有执行完的情况下,中断再次发生这时是不会响应第二次中断的。或者说中断使能置没有打开这是来的中断变不会响应。

    其实这是一个很明显的问题,只是在写程序的时候,特别遇到多中断处理的程序时便会产生数据的丢失。而且又是很容易被忽略这么简单的问题。

    展开全文
  • 这是本人第一写博客,将自己学习之后理解到的都记录下来。如有侵权请联系删除。 STM32F4是ARM公司Contex-M4内核的芯片。本身具有256个中断,用于一般项目已经...是对每一个中断中断设置其抢占优先级和响应优先级。
  • 信号的响应过程

    2021-04-26 20:46:14
    是指信号的行为不可靠,因为执行现场不是我们布置的,而是由内核布置的,所以有可能第一次调用还没有结束的时候,就发生了第二次调用。 可重入函数:就是为了解决信号的不可靠 第一次调用还没有结束的时候,就发生了...
  • 24中断标志位,这个1在中断发生就置1与我们中断总开关的开关允许三个条件都满足与时就会向cpu打出中断,换而言之,响应完要清除中断标志位 写一1就清除了标志位 调用ISR中断子程序 中断函数与中断向量表关联 ...
  • 当在终端使用ssh命令连接到服务器时,如果一段时间没有活动连接会被中断 一、修改ssh客户端配置 ...ServerAliveCountMax 3 #客户端发出请求后,服务器端没有响应达到3,就自动断开连接。 、..
  • 二次按下S1进行称重;按下S2则关机。 真正运行起来卡的不行甚至动不起来,请问是不是我的主函数设计有问题? 还有求多个触发中断的例程,感觉自己写的结构确实很不合理。 谢谢啦 void main(void) { ...
  • 【背景】 每次发送请求,在接收到服务器响应时,直接通过回调方法对服务器端返回的数据进行处理并更新...理应在第二次请求时,如果第一次没有接收到服务器端的响应中断第一次请求的回调方法。 【代码】 // 委...
  • 开篇闲话 前两天做项目的时候遇到一个问题,那就是路由切换了但是上一个路由的请求依旧继续执行,导致页面卡顿,以及新的请求和之前...2、然后在对axios进行二次封装,设置请求(request)和响应(response)的处理操
  • 输入输出系统

    2020-04-28 10:27:13
    程序中断方式 概念 IO中断的产生 中断方式的接口电路 中断处理流程 中断服务程序流程 中断 ...一次中断处理过程大致分为:中断请求,中断判优,中断响应中断服务和中断返回等五个阶段。 ...
  • 可以减少对 CPU的中断频率,放宽对中断响应时间的限制 提高 CPU和度 I/O设备之间的并行性 Mybatis也设置了缓存 一级缓存 一级缓存是SqlSession间的缓存 我们知道,一sql操作数据库,需要一个SqlSession对象.....
  • 记录一服务假死的整个排查过程,服务基础为spring boot + druid + 多数据源切换,在请求过多(尤其是长事务请求)时,服务出现请求无响应的状况,之前未完结的查询也没有任何返回结果。 、定位问题原因 问题...
  • 次中断接收一个报文。在中断处理程序中把报文从硬件缓存中拷贝到内存中,并把报文加入到协议栈中对应的入口队列中,中断退出时调用收包软中断来从相应队列来读取报文进行处理。这种方式优点是内核对报文响应较快,...
  • 也就是说,浏览器和服务器每进行一HTTP操作,就建立一连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器...
  • Internet通讯协议分为两类:...Http是stateless协议,客户端发出一请求,服务端建立一个连接,请求得到响应后,连接中断。 通常的应用都是利用http协议来进行通信,服务端要想把用户的状态或者其他信息与一个...
  • 一、GPIO端口复用配置过程、NVIC中断假定设置中断优先级组为2,然后设置中断3(RTC)的抢占优先级为2,响应优先级为1。中断6(外部中断0)的抢占优先级为3,响应优先级为0。中断7(外部中断1)的抢占优先级为2,...
  • 第一次的被中断,第二次响应异常。因2次提交的code都一样,而微信的code 只能使用一次,故第二次的异常是正常情况。问题出在第一次,为什么会中断。 刷新2次的问题,从网上找了很多帖子,有在客户端的cookie做...
  • ,精度不高,因为要考虑中断能否实时响应。过零触发电路产生的中断响应具有不确定性。  我们在使用TMS320F240 DSP开发交流采样系统时,巧妙地利用该款DSP的定时器、捕获器
  • 单片机STC15期末复习笔记

    千次阅读 2020-07-02 00:09:31
    [定时器溢出响应方法:中断法和查询标志位法 、编程题(中断(一)定时器1、定时器T2(16位可自动重装初值) ~~(1)、查询法~~(2)、中断法①定时器初始化函数流程:②定时初值计算 ③系统时钟f_{sys}f sys ④`例`...
  • TCP的握手

    2021-03-16 15:37:59
    二次服务器给客户端响应ACK(SYN+1)和自己的SYN,说明我已经接收到了你的请求 第三次是客户端发给服务器ACK确认收到服务器的SYN 为什么是三次?原因 首先肯定不可能是一次,TCP是面向连接的协议,是双向的...
  • JSP总结-会话跟踪全解

    2016-03-11 17:35:22
    答:一个客户端与服务端不中断的请求响应序列。   、什么是会话跟踪?为什么要进行会话跟踪? 答:对客户端与服务端进行会话的监视。由于浏览器与web服务器之间是使用http协议进行通信的,它是无状态的协议。当...
  • Wince驱动调试杂项

    2013-01-07 15:23:45
    最近在学习wince驱动时,收获颇多,将遇到的问题写下来,以免忘...但是,我写了一个流驱动,第一次加载的时候可以正常运行,可以响应中断,可是卸载之后,第二次加载时,虽然能成功加载,可就是不响应中断。刚开始百思
  • ReentrantLock可响应中断、可轮回,synchronized是不可以响应中断的,为处理锁的不可用性提供了更高的灵活性 ReentrantLock是API级别的,synchronized是JVM级别的 ReentrantLock可以实现公平锁 ReentrantLo
  • ①按下F12,产生键盘中断,而键盘中断的相应函数为keyboard_interrupt。 ②keyboard_interrupt被调用后,会将键盘扫描码做为下标,调用数组 key_table 保存的与F12对应的响应函数。 ③在响应函数中,设置是否
  • tcp建立链接3次握手: 1.客户端→服务端,发送seq=x,syn=1 2.服务端→客户端,发送seq=y,syn=1,ack=x+1 ...客户端模拟大量第一次握手(通过ip欺骗),每次第二次握手时,客户端没有响应,造成链接不能中断,又要...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 129
精华内容 51
关键字:

中断二次响应