精华内容
下载资源
问答
  • 1.定时器与延时的区别大家可能会觉得我们用延时函数照样可以实现上一讲代码的实验现象,但是定时器与延时的概念不同,延时函数需要占用CPU的使用权,正在延时的时候其他任务没有CPU的使用权就会拖慢执行效率。...

    1.定时器与延时的区别

    大家可能会觉得我们用延时函数照样可以实现上一讲代码的实验现象,但是定时器与延时的概念不同,延时函数需要占用CPU的使用权,正在延时的时候其他任务没有CPU的使用权就会拖慢执行效率。

    而定时器是不需要占用CPU的使用权的,它是独立自己运行的,就像我们在第一讲的时候提到调好5分钟的闹钟,在这5分钟里我们可以随意执行任务,也可以什么事都不做,但是5分钟过后闹钟响了就要执行相关的任务了。

    所以上一讲的代码的实现原理就是每隔51微秒,有个变量会自加1,过了1000个51微秒的时候LED的状态才会改变,可以说CPU在51ms的时间里基本没什么事做,只是在51微秒到了的时候做了“cnt++;”这样简单的任务,然后又空闲地等下一个51微秒的到来再执行“cnt++;”。

    2.定时器中断函数

    与外部中断一样,定时器中断也有中断函数,同理,程序去执行中断函数就会把TF0的中断标志位自动清0,所以只要我们用了定时器中断函数,那么TF0就可以不用再出现在程序书写中了。

    还记得外部中断这个图吗

    518c0273a0367ab6b47e21d7f5ef6e9a.png

    同样定时器0的中断函数使能如下

    127a22cf341936aa049c2e49cba364b5.png

    至于“interrupt”后面的数字为什么是1,请再看我们以前给过大家的这个图的中断函数编号就明白了

    c8f14c29c09fd94f50f3d959c7cf8617.png

    这些编号是为了区分哪些硬件资源的相关中断函数,如果我们同时使用两个定时器,那么只能用“interrupt 1”和“interrupt 3”来区分谁是谁的中断函数了。

    使用“TIM0_IRQHandler”作为函数名也是模仿STM32定时器中断函数名的写法。

    如果我们使用的是工作模式1,每次触发中断函数的执行内容首先就是再次给TH0和TL0赋初值保证下次的定时时间还是一样。

    这里我们使用中断函数的执行方式来实现30ms的间隔流水灯,算出TH0和TL0合成的“16位的变量”要填充的值为37888=0x9400。

    在中断函数里也是可以定义局部变量的,当然如果这个变量是用来辅助流水灯的,那么肯定是要定义成静态变量的。

    3.代码#include 

    #include //详见第六章第8讲

    void main()

    {

    LED_Init();  //初始化LED硬件模块

    EA = 1;      //闭合总中断开关

    TMOD = 0x01; //设置定时器0为工作模式1

    TH0  = 0x94; //设置定时时间为30ms

    TL0  = 0x00;

    ET0  = 1;    //闭合定时器0中断的开关

    TR0  = 1;    //启动定时器0

    while(1);

    }

    void TIM0_IRQHandler() interrupt 1

    {

    static u8 i;

    TH0  = 0x94;  //重新设置定时时间为30ms

    TL0  = 0x00;

    P0=~(0x80>>i);//这一次让流水灯向右移

    i++;

    if(i>=8)i=0;

    }

    觉得30ms的流速太快,想改为300ms的话,修改一下中断函数即可,如下void TIM0_IRQHandler() interrupt 1

    {

    static u8 i,cnt;

    TH0  = 0x94;      //重新设置定时时间为30ms

    TL0  = 0x00;

    cnt++;

    if(cnt>=10)

    {

    cnt=0;

    P0=~(0x80>>i);//这一次让流水灯向右移

    i++;

    if(i>=8)i=0;

    }

    }

    展开全文
  • 51单片机程序,使用定时器时,定时器计数、定时器中断函数、while(1)循环三者之间如何协调好整个流程? 【定时器0实现间隔1s的流水灯】示例模板 #include <reg52.h> typedef unsigned int u16; //对...

    51单片机程序,使用定时器时,定时器计数、定时器中断函数、while(1)循环三者之间如何协调好整个流程?

    我拿一个最经典的单片机应用——‘流水灯’来分析吧。

    【定时器0实现间隔1s的流水灯】简单示例

    #include <reg52.h>
    
    typedef unsigned int u16;	  //对数据类型进行声明定义
    typedef unsigned char u8;
    
    #define LED P3
    
    bit LED_flag=0;  //定时到1s的标志位
    u8 n;            //循环变量,用作LED总线的位索引index
    
    void InitTimer0(void); //定时器0,初始化
    
    void main()
    {
        LED=0XFF;	//先初始化LED全灭(自上而下流动)
        InitTimer0();
        while(1)
        {
            if(LED_flag==1)
            {
                LED_flag=0;
                LED=~(0x01<<n);          //P1=~(0x80>>n);(自下而上流动)
                if(++n==8)
                    n=0;
            }
    			
        }
    }
    
    
    void InitTimer0(void) 
    {
        TMOD |= 0x01;   //用|=防止配置冲突
        TH0 = (65536 - 50000)/256; ///定时器0,置初值(定时50ms)
        TL0 = (65536 - 50000)%256;
        EA = 1;
        ET0 = 1;
        TR0 = 1;
    }
    
    void Timer0() interrupt 1    //定时器0,中断服务函数
    {
        static u16 i;
        TH0 = (65536 - 50000)/256; ///定时器0,重装初值(定时50ms)
        TL0 = (65536 - 50000)%256;
        i++;
        if(i==20) // 1s = 20 × 50ms 
        {
            i=0;
            LED_flag=1;	
        }	
    }

     

    第一、定时器什么时候开始工作呢?

    TR0=1;//启动定时器0,这个断点就标志着定时器0开始工作了,不管同不同意中断,它都在计时。


    第二、什么时候进入中断函数,进入中断函数后定时器又是怎么工作的,怎么循环累加出延时时间的?

    该示例程序配置了定时器的中断时间为 50ms(12MHz晶振),也就是每隔 50ms 就进入一次中断函数。

    进入中断后,程序又重新给定时器定时50ms(定时器0不会自动重装初值),同时对中断次数进行计数(i++)。

    主程序只要查询计数值(i),就能知道 定时器中断了多少次了。


    第三、while(1)循环里面又是怎么工作的呢?

    首先,主函数的 while(1)表示系统是一个 循环系统,一直在循环,不结束。

    当定时器产生中断时,就会暂停主函数,这就称为定时器中断。等中断服务函数执行结束后,又会在主函数被打断的地方,继续执行主函数的内容。

     

    进一步理解

    定时器等中断服务属于前台工作,主函数属于后台工作。

    这样的系统称为前后台系统,包括一个死循环和若干个中断服务程序:应用程序是一个无限循环,循环中调用API函数完成所需的操作,这个大循环就叫做后台系统;而中断服务程序,接收到系统的各种异步事件,也就是前台系统。

    这就像一个酒店服务流程一样:酒店前台柜员(中断服务程序)接收到客户的突发问题(单片机系统的各种异步事件),前台柜员再将接收到的问题反馈给大堂经理(while(1)后台)进行事件的处理解决。

    这说明了:主函数在执行的时候,定时器中断在前台是一直在工作的(只要你开启了)。

     

    程序中,主函数的while(1),对定时器的中断次数是否到达1s定时的标志位LED_flag进行查询,如果==1,那它就将该标志位清0 ,并且执行流水灯事件。

     

     

     

    展开全文
  • 1、单片机定时器中断后计数器是否还会计数 ...解决:中断在执行时,如果又有一个中断产生,将不会进入中断函数,知道当前中断执行结束后,才允许下一个新的中断进入。 总结:定时器中断在执行中断过程中,计数器...

    1、单片机定时器中断后计数器是否还会计数

    解决:单片机定时器中断后计数器还是会计数的,如果重新赋值,会按照设置的时间进行计时。如果没有,则从0开始。

    2、单片机在执行定时器中断时,是否在没执行当前中断情况再次执行定时器中断(中断嵌套?)

    解决:中断在执行时,如果又有一个中断产生,将不会进入中断函数,知道当前中断执行结束后,才允许下一个新的中断进入。

    总结:定时器中断在执行中断过程中,计数器一直计数,但是产生的中断不能进入中断函数。只有上一个中断结束后,才会发生新的中断进入。

    测试:

    单片机:stc12c5a60s2

    软件:keil

    串口软件:stc-isp

    思路:在定时中断执行函数中使用串口打印0-9,采用两次打印,它们之间间隔1s,定时中断时间是10ms。通过查看串口发送的数据,如果是相同的数字两两相邻,表示延迟1s过程中中断没有再次进入;如果数字是连续而且很快显示出来的,表示在延迟1s的过程中多次进入了中断。

    代码:

    void time0_inter() interrupt 1{
    	//2msʱ¼ä
    	TF0 = 0;
    	TH0 = 0xF8;
      TL0 = 0x30;
    	adc.transFlag++;
    	if(adc.transFlag>=10){
    		adc.transFlag=0;
    	}
    	uart0_send_byte('0'+adc.transFlag);
    	//²âÊÔ¶¨Ê±ÖжÏʱÊÇ·ñ»á¼ÌÐø¼Æʱ
    	delay1s();
    	uart0_send_byte('0'+adc.transFlag);
    	
    	//´ò¿ªADC
    	adc_switch(ADC_OPEN);
    }

    结果:

                                         

    由结果可以看出:定时器在延迟1s的过程中没有多次进行定时中断函数执行。

    可以得出的结论是:

    如果在定时中断执行函数中处理的时间超过定时时间,那么会出现中断丢失的问题,即需要进行中断处理时,由于上一个中断还未结束,失去这个时间点需要处理执行指令的机会。

    如果中断函数执行处理的时间小于定时中断时间,那么就能够在下一次中断到来之前结束本次中断,这样新来的中断就能够执行需要的处理指令。

    展开全文
  • 用定时器中断,单片机中断处理时间大于定时器定时...而是在本次中断处理结束后,单片机又马上进入新的定时器中断函数,主函数中的语句可能会没有机会运行下去,会影响后面中断的实时性。所以答案为2。 如果为了避免

    用定时器中断,单片机中断处理时间大于定时器定时时间会怎样?

    如果是不同的中断类型是可以根据优先级嵌套,如果是同一中断类型(如题),
    有三种结果:1、马上进入新的中断处理(中断嵌套) 2、等待中断处理完再进入新的中断处理 3、出错。

    单片机中断处理时间大于定时器定时时间,在下次中断时间到时,因为中断是同一类型、同一优先级,所以不会马上进入新的中断处理。
    而是在本次中断处理结束后,单片机又马上进入新的定时器中断函数,主函数中的语句可能会没有机会运行下去,会影响后面中断的实时性。所以答案为2。

    如果为了避免中断嵌套(同一优先级不会发生),在中断处理中人为的在进入中断时关中断,处理完中断后开中断,会影响后面中断的实时性。

    最安全的处理方式:中断处理时间越短越好,有什么事放外面处理。中断的初衷是为了提高系统实时性,中断处理太长,会影响同级的中断响应,其它中断谈何实时。

    附:解决高速大量数据的中断处理难题
    1.在中断中,只接收。或加上简单判断。 2、在主程序中处理。

     

     

    展开全文
  • 定时器中断

    千次阅读 2010-03-07 17:54:00
    走到这里,大家肯定对Linux的中断处理有概念了,下面我们通过一个具体的实例,来了解Linux内核处理中断的全过程,那就是定时器中断。在详细分析这个过程之前,我们把Linux时间管理的概念先缕一缕。 在当前的80x86...
  • 8定时器中断

    2012-07-17 18:15:25
    走到这里,大家肯定对Linux的中断处理有概念了,下面我们通过一个具体的实例,来了解Linux内核处理中断的全过程,那就是定时器中断。在详细分析这个过程之前,我们把Linux时间管理的概念先缕一缕。   在当前的80x...
  • 1 如果初始化定时器 ,里面会加一个清除标志位的 2 然后 中断函数要加上 清除标志位 那么就知道 初始化函数的跟中断函数的关系啦
  • 【LL 库】详细讲述了 STM32CubeMX TIM2 定时器中断配置方法,内附图文及代码。
  • 1 nordic定时器的使用(定时器闪灯) 1.1 加入头文件 #include "app_timer.h" 1.2 定义定时器名称 //创建定时器 APP_TIMER_DEF(led_on); APP_TIMER_DEF(led_off); 1.3 创建定时器 void Createled_offtimer(void) {...
  • 前几天一直在忙挑战杯的决赛,好几天没能睡上安稳觉,今天下午答辩结束,终于有空能够继续总结笔记写博客了。(在此先感谢下带队的张总与带队老师)。 正文 如上图示,我的51单片机外接了一个11.0592MHZ的外部晶振...
  • 本文以定时器中断方式控制LED周期性闪烁为例学习私有定时器的使用。同时学习如何将软件程序与硬件比特流文件一起固化到SD卡中,实现上电自动配置与启动自定义系统。 功能定义:通过定时器中断实现与MIO连接的单个LED...
  • STM32之定时器中断控制LED闪烁

    万次阅读 多人点赞 2018-07-27 12:14:49
    上篇博客我们是用延时函数实现了LED的闪烁,今天我们使用STM32的定时器来使LED闪烁。 关于32的定时器的种类,今天我在这先不做过多的说明,有时间我会再另写一篇博客来专门介绍32的定时器。今天我们使用32的定时器3...
  • 针对TIM5的中断处理函数,做出如下解释。(TIM5的中断既包括定时器更新中断(定时器计数发生了溢出),也包括捕获中断) u8 TIM5CH1_CAPTURE_STA = ...//TIM5 输入捕获中断函数 void TIM5_IRQHandler(void) { if((TIM
  • STM32F4定时器中断理解

    2021-01-27 21:59:08
    1.使用定时器可以替代延延时函数,延时函数占用CPU。 2.定时器计算固定脉冲,时间可准确计算: 公式: Ft=168Mhz/4*时钟分频 Tout(us)=((arr+1)*(psc+1))/Ft(Mhz) arr:自动重装载值 psc:定时器分频 (分频系数...
  • 51单片机定时器中断实验

    千次阅读 2020-08-04 10:52:08
    附:中断基本概念 定时器相关内容 CPU时序的有关知识 ①振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)。 ②状态周期:2 个振荡周期为 1 个状态周期,用 S 表示。振荡周期又称 S 周期或...
  • 51定时器中断程序编写 [李园7舍_404]

    千次阅读 2012-12-01 08:17:45
    上篇笔记记录到51单片机的中断允许...然后今天再这里补填中断函数的编写格式,以后就可以编写定时器中断程序了。   1.中断服务程序的写法 C51的中断函数格式如下: void 函数名() 中断号 using 工作组 {  
  • (一)项目任务ü 任务1:用定时方式控制LEDn 子任务1.1 两种定期器...swtich语句认识n 子任务2.2 中断系统的认识n 子任务2.3 采用定时和中断方式驱动按键(二)相关知识点2.1、定时器的基本概念标准的51单片机有T0...
  • 51单片机定时器中断程序

    千次阅读 多人点赞 2016-10-13 12:14:48
    程序运行开始,A灯先亮5秒,然后灭了到B灯亮5秒,B再灭再到C灯亮5秒,C灭,程序结束,不再运行。这程序该怎么写?用定时器精确定时……晶振11.092MHZ。 #include "REG52.H" /* * */ sbit LED_A = P1^0; sbit LED...
  • 单片机定时器中断后计数器和中断再进入 pangyinglong 2019-12-03 12:41:05 1407 收藏 9 分类专栏: 单片机 文章标签: 单片机 定时器 定时器中断 时间 版权 单片机 专栏收录该内容 10 篇文章0 订阅 订阅专栏 1、...
  • 这周调试一款报警灯,这款报警灯的工作原理是这样的:一引脚持续拉高,一引脚输出波形控制报警灯的响停。 报警灯响时序: 8ms高+2ms低+ 七个(512us高+1512us低)+...之前的项目尝试过定时器实现延时100us的,因为这...
  • STM32定时器 相关函数介绍

    千次阅读 2018-01-07 14:48:15
    几种模式函数的类型都差不多,包括基本类型(Base),输出比较(OC),输入捕获(IC),pwm(PWM),单脉冲(One_Pulse)和编码器(Encoder)。 /****** xxx使用上述几种模式的英文替换即可*******/ HAL_TIM_xxx_Init HAL_TIM...
  • 闲时偷学51一周 完成蓝牙小车定时器中断PWM调速控制 关键问题: 51蓝牙串口通信、定时器、中断、L298N、PWM调速 先把我学习过程中的问题摆出来:89C52仅有的两个定时器在使用串口时的干扰问题,PWM产生 一开始找...
  • STM32F4XX 学习日志:定时器中断模拟PWM波实现呼吸灯前言任务目标解决办法过程定时器配置标准库时钟主频配置出现问题中断服务函数主函数小结以上代码亲测有效。 前言 使用反客科技STM32F407VET6 M1的核心板,板载8M...
  • STM32CUBEMX配置教程(四)定时器中断配置 基于STM32H743VI 使用STM32CUBEMX两年了,始终觉得这个工具非常的方便,但因为不是经常使用,导致有些要点总是会有些遗忘,因此写下这一系列教程以供记忆,顺便让我这个大...
  • STM32自学笔记(四)定时器中断

    千次阅读 2019-02-03 14:10:38
    定时器离不开中断,前置技能——中断若没有加点的话,可以去下面的链接看下 传送门:https://blog.csdn.net/pmj110119/article/details/86748016 TIM功能简介 STM32F1的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)...
  • // 捕获中断回调函数,每次捕获到信号就会进入这个回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle) { RxLine++; //每接收到一个数据,进入回调数据长度加1 DataBuff...
  • 51 系列单片机一定有基本的 2 个 定时器定时器 0 和定时器 1),但不全有 3 个中断,通常 我们使用的都是基本的 2 个定时器定时器 0/1。 二、定时器\计数器 2.1、CPU 时序的有关知识 ①振荡周期:为...
  • 基于STM32CubeMX配置定时器 利用HAL库开发实现功能:使用TIM2实现定时,每隔1秒实现双闪功能 相关软件使用说明 STM32CubeMX+Keil+Proteus相关的安装、使用、配置等基础操作不再赘述,有关内容的详细介绍如下 STM32...
  • 加满了就会溢出也就是我们所理解的定时的时间到了,而一般加满了我们会进入一个叫定时器中断的东西,和前面的外部中断有点类似,前面是按键按下进入中断,而这里是定时器溢出了进入中断,问题不大。对于这个定时,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,688
精华内容 8,275
关键字:

定时器中断函数结束