单片机 定时器中断程序 - CSDN
  • #include unsigned char i; void main() { TMOD=0X01; TR0=1; ET0=1; EA=1; P0_3=1; while(1) {}; } timer0() interrupt 1 { TH0=0X00; TL0=0X06; i++; if(i==10) ...}

    #include   <AT89X51.H>
    unsigned char i=0,j=0;

    void main()
    {
     TMOD=0X01;
     TH0=0X4c;
     TL0=0X00;
     TR0=1;
    ET0=1;
    EA=1;
    P0_3=1;

     while(1)
       {};
    }

    timer0() interrupt 1
    {
     TR0=0;
     TH0=0X4c;//5000us
     TL0=0X00;
     i++;
     if(i>=20)
       {
       i==0;
       j++;
       if(j>=20)
        {
      j=0;
       P0_3= ~P0_3;
     }

       }
     TR0=1;
    }

    //注意此处必须用两个变量i,否则程序不会通过。

    展开全文
  • 本文主要为单片机定时器中断实现长时间定时程序,希望对你的学习有所帮助
  • 51单片机-定时器1中断

    千次阅读 2020-04-28 15:32:47
    ************************************************************************************** * 定时器1实验 * 实现现象:下载程序后数码管最后一位间隔一秒循环显示0-F。使...

    **************************************************************************************
    *                      定时器1实验                                                  *
    实现现象:下载程序后数码管最后一位间隔一秒循环显示0-F。使用单片机内部定时器可以实现准确延时。
    注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。                                                                                  
    ***************************************************************************************/

    #include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器

    typedef unsigned int u16;      //对数据类型进行声明定义
    typedef unsigned char u8;

    sbit LSA=P2^2;
    sbit LSB=P2^3;
    sbit LSC=P2^4;

    u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
    u8 n=0;
    /*******************************************************************************
    * 函 数 名         : Timer1Init
    * 函数功能           : 定时器1初始化
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    void Timer1Init()
    {
        TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。

    //0x10=0001 0000,所以是T1模式,工作方式1

        TH1=0XFC;    //给定时器赋初值,定时1ms  (65536-1000=64536)
        TL1=0X18;    
        ET1=1;//打开定时器1中断允许
        EA=1;//打开总中断
        TR1=1;//打开定时器            
    }

    /*******************************************************************************
    * 函 数 名       : main
    * 函数功能         : 主函数
    * 输    入       : 无
    * 输    出         : 无
    *******************************************************************************/
    void main()
    {    
        LSA=0;
        LSB=0;
        LSC=0;
        Timer1Init();  //定时器1初始化
        while(1);        
    }

    /*******************************************************************************
    * 函 数 名         : void Timer1() interrupt 3
    * 函数功能           : 定时器0中断函数
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    void Timer1() interrupt 3
    {
        static u16 i;
        TH1=0XFC;    //给定时器赋初值,定时1ms
        TL1=0X18;
        i++;
        if(i==1000)
        {
            i=0;
            P0=smgduan[n++];
            if(n==16)n=0;    
        }    
    }

     

    展开全文
  • 定时器系统是单片机内部一个独立硬件部分,与CPU和晶振之间通过内部某些控制线连接并相互作用,CPU一旦启动定时功能,定时器便会在晶振的作用下自动计时,当定时器计数器积满之后就会产生中断,通知CPU接下来做什么...

    51单片机共有两个16位可编程的定时器/计数器,即定时器T0和定时器T1。它们既有定时功能又有计数功能,通过设置一些相关的特殊功能寄存器就可以选择启用哪一个功能。定时器系统是单片机内部一个独立硬件部分,与CPU和晶振之间通过内部某些控制线连接并相互作用,CPU一旦启动定时功能,定时器便会在晶振的作用下自动计时,当定时器计数器积满之后就会产生中断,通知CPU接下来做什么。

    定时器或计数器实质是加一计数器(16位)(其输入脉冲有两个来源,一是由系统时钟振荡器输出脉冲经过十二分频后送来;另外是T0或T1引脚输入的外部脉冲源,每来一个脉冲计数器加1,当加到计数器全为1时,在输入一个脉冲就可使计数器回零,计数器的溢出是的TCON寄存器中TF0或TF1置1,向CPU发出中断请求,如果定时或计数器工作于定时模式,则表示定时时间到了,如果是计数则表示计数值已满)由高八位和低八位两个寄存器组成。
    TMOD:定时器/计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER) ,确定工作方式和功能
    TCON:控制寄存器,控制T0,T1的启动和停止及设置溢出标志。

    定时器/计数器模式控制寄存器TMOD是一个逐位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。其格式为:其中低四位定义定时器/计数器C/T0,高四位定义定时器/计数器C/T1,各位的说明:
    GATE——门控制。
    GATE=1时,由外部中断引脚INT0、INT1来启动定时器T0、T1。 当INT0引脚为高电平时TR0置位,启动定时器T0; 当INT1引脚为高电平时TR1置位,启动定时器T1。 GATE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。
    C/T——功能选择位
    C/T=0时为定时功能,C/T=1时为计数功能。 置位时选择计数功能,清零时选择定时功能。
    M0、M1——方式选择功能
    由于有2位,因此有4种工作方式:
    M1M0 工作方式计数器模式 TMOD(设置定时器模式)
    0 0 方式0 13位计数器 TMOD=0x00
    0 1 方式1 16位计数器 TMOD=0x01
    1 0 方式2 自动重装8位计数器 TMOD=0x02
    1 1 方式3 T0分为2个8位独立计数器,T1为无中断重装8位计数器 TMOD=0x03 单片机定时器0设置为工作方式1为TMOD=0x01

    TCON: 定时器/计数器控制寄存器(TIMER/COUNTER CONTROL REGISTER)
    TMOD分成2段,TCON控制更加精细,分成四段,在本文中只要用到高四段。 TF0(TF1)——计数溢出标志位,当计数器计数溢出时,该位置1。
    TR0(TR1)——定时器运行控制位 当TR0(TR1)=0 停止定时器/计数器工作 当TR0(TR1)=1 启动定时器/计数器工作
    IE0(IE1)——外中断请求标志位

    IT0(IT1)——外中断请求信号方式控制位 当IT0(IT1)=1 脉冲方式(后沿负跳有效)
    当IT0(IT1)=0 电平方式(低电平有效)此位由软件置1或清0。
    TF0(TF1)——计数溢出标志位
    当计数器产生计数溢出时,此位由硬件置1。当转向中断服务时,再有硬件自动清0。计数溢出的标志位的使用有两种情况:采用中断方式时,作中断请求标志位来使用;采用查询方式时,作查询状态位来使用。注意记忆方法,理解单词原形,就绝对不会把TF和TR搞混。TF的F也就是溢出Over Flow的F。TR的R就是运行Run。默认是0不运行,当然要置1才运行

    在写单片机定时器程序时候,在程序开始出需要对定时器及中断寄存器做初始化设置,通常初始化过程如下:

    对TMOD赋值,以确定T0和T1的工作方式;
    计算初值,并将初值写入TH0,TL0或者TH1,TL1;
    中断方式时,则对IE赋值,开放中断
    使TR0或TR1置位,启动定时器/计数器定时或者计数。

    //实现led灯一秒亮灭闪烁
    void main()
    {
        TMOD=0x01;//设置定时器0为工作方式1(M1 M0为01)
        TH0=(65536-45872)/256;//装初值11.0582晶振定时50ms数为45872
        TL0=(65536-45872)%256;
        EA=1;//开总中断
        ET0=1;//开定时器0中断
        TR0=1;//启动定时器0
        while(1);//程序停止在这里等待中断发生
    }
    
    void T0_time() interrupt 1
    {
        TMOD=0x01;//重装初值
        TH0=(65536-45872)/256;
        num++;//num每加一次判断一次是否到20次
        if(num==20)//如果到了20次,说明1秒时间到
            {
                num=0;//num清0重新计数
                led=~led1;
            }
    }
    展开全文
  • 51单片机定时器和外部中断程序,可移植性强
  • 定时器中断单片机中断处理时间大于定时器定时时间会怎样? 如果是不同的中断类型是可以根据优先级嵌套,如果是同一中断类型(如题), 有三种结果:1、马上进入新的中断处理(中断嵌套) 2、等待中断处理完再...

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

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

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

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

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

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

     

     

    展开全文
  • 准备使用两个定时器和外部中断,但在调试的时候发现当开启定时器1时程序卡死 理论上定时器0和外部中断都不会被低级的定时器1打断,但是程序还是不动了 最后分析发现是没有写定时器1的中断服务函数,即使设置了其为...
  • 单片机中断原理及定时器详解

    万次阅读 多人点赞 2018-04-22 17:20:21
    中断的概念什么是中断:CPU在处理某一事件A时,发生的另外某一事件B请求CPU去处理(产生了中断),随后CPU暂时中断当前正在执行的任务,去对事件B进行处理,CPU处理完事件B后再返回之前中断的位置继续执行原来的事件...
  • AT89C52单片机--定时器中断,外部中断,串口使用实例!内有原理图!
  • AT89X51单片机中断嵌套程序定时器1与外部中断0相互嵌套
  • 单片机定时器溢出后会继续计数,从“65536-设置“的初值开始,只有当TRn=0时才停止计数 单片机 定时器/计数器, 可以用来 作 定时器 或者 外部计数器 作 定时器 一般以中断 形式完成,当 定时器溢出后 产生中断,...
  • 51单片机入门教程(5)——定时器中断

    千次阅读 多人点赞 2020-05-06 08:27:11
    51单片机入门教程(5)——定时器中断一、中断的概念二、定时器...THx/TLx2.3 定时器中断程序写法 写在开头:中断是包括单片机在内的所有微处理器很重要的功能之一,初学单片机必须这一部分的知识。 一、中断的概...
  • 1、单片机定时器中断后计数器是否还会计数 解决:单片机定时器中断后计数器还是会计数的,如果重新赋值,会按照设置的时间进行计时。如果没有,则从0开始。 2、单片机在执行定时器中断时,是否在没执行当前中断...
  • 以stm32F103为例解释:如果初始化配置的是自动重装初值(寄存器TIMx->CR1中第三位默认为发生更新事件时计数器不停止,可软件置1更改为手动开启计数器),那么定时器溢出后(即进入中断后)就会立刻进行下一轮计数,...
  • 51单片机定时器0中断与串口使用相冲突 做小毕设的时候想实现一秒发送一个数据,被这个问题困扰了很久,后来在一位小伙伴的帮助下解决了问题,在这里还是谢谢热心解答问题的群友。 下面是最开始写的代码,冲突了 ...
  • 单片机延时的实时性解决方法

    千次阅读 2019-04-15 14:17:43
    1、如果单片机采用delay函数来进行...2、可以采用定时器来记录延时时间,在定时器来计算时间的期间,单片机可以处理其他事情,等计时时间到了之后,再来处理延时之后的事情。如果程序中有多个地方需要用到延时,单...
  • 51单片机第二讲(定时器中断

    千次阅读 2018-01-28 19:03:34
    1.中断的概念 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断产生);...51单片机里一共有5个中断源,分别是外部中断0,定时器0,外部中断1,定时器1,串口中断中断优先级从大到
  • 基于at89c51的外部定时器0终端实验,包含汇编源码和proteus仿真工程文件。
  • 单片机-中断

    2020-02-06 21:09:23
    51单片机内部一共有5个中断源,即有5种情况发生时,会使单片机去处理中断程序 52单片机内部一共有6个中断源 INT0— 外部中断 0, 由 P3.2 端口线引入, 低电平或下降沿引起。 INT1— 外部中断 1, 由 P3.3 端口线...
  • 51单片机中断相关寄存器

    千次阅读 2018-12-31 15:52:58
    52单片机中断级别 中断允许寄存器IE EA——全局中断 ES——串口中断 ET2——定时器2中断 EX1——外部中断1 ET1——定时器1 中断 EX0——外部中断0 中断优先级寄存器IP PS——串口 PT——计时器 PX...
1 2 3 4 5 ... 20
收藏数 13,569
精华内容 5,427
热门标签
关键字:

单片机 定时器中断程序