精华内容
下载资源
问答
  • 51单片机定时器中断程序(C语言)TH0=(65536-初值)%256; TL0=(65536-初值)/256;
  • 51单片机定时器中断程序

    千次阅读 多人点赞 2016-10-13 12:14:48
    程序运行开始,A灯先亮5秒,然后灭了到B灯亮5秒,B再灭再到C灯...用定时器精确定时……晶振11.092MHZ。 #include "REG52.H" /* * */ sbit LED_A = P1^0; sbit LED_B = P1^1; sbit LED_C = P1^2; unsigned char T

    程序运行开始,A灯先亮5秒,然后灭了到B灯亮5秒,B再灭再到C灯亮5秒,C灭,程序结束,不再运行。这程序该怎么写?用定时器精确定时……晶振11.092MHZ。

    #include "REG52.H"
    
    /*
    *
    */
    sbit      	LED_A	= P1^0;
    sbit      	LED_B	= P1^1;
    sbit      	LED_C	= P1^2;
    
    unsigned char TIME_BASE;
    unsigned char MACT_ENDB;
    unsigned char Rece_Errp;
    
    /*
    *    定时器初始化
    */
    void SystemInit(void)
    {
    	TMOD = 0x01;
    	TH0 = (65536 - 45872) / 256;	 // 定时50ms  //晶振:11.0592MHZ
    	TL0 = (65536 - 45872) % 256;
    	ET0 = 1;
    	TR0 = 1;
    	EA  = 1;
    }
    
    int main(void)
    {
    	SystemInit();
    
    	while(1)
    	{
    		/* 程序一开始上电Rece_Errp = 0 定时器5秒加一次 */
    		if(Rece_Errp == 0)
    		{
    			LED_A = 0;		// A亮5秒
    			LED_B = 1;		// B是灭
    			LED_C = 1;		// C是灭
    		}
    		/* 判断是否5秒时间到 */
    		else if(Rece_Errp ==1)
    		{
    			LED_A = 1;	 // A是灭
    			LED_B = 0;	 // B亮5秒
    			LED_C = 1;	 // C是灭	
    		}
    		else if(Rece_Errp == 2)
    		{
    			LED_A = 1;	// A是灭
    			LED_B = 1;	// B是灭
    			LED_C = 0;	// C亮5秒		
    		}
    		else
    		{
    			LED_A = 1;	 // A是灭
    			LED_B = 1;	 // B是灭
    			LED_C = 1;	 // C是灭
    			while(1);	 // 程序运行到这里停止
    		}				
    	}
    }
    
    void Timer0_IRQ(void) interrupt 1
    {
    	TH0 = (655365 - 45872) / 256;
    	TL0 = (655365 - 45872) % 256;
    	/* 进入中断50ms +1次 */
    	TIME_BASE++;
    	
    	if(TIME_BASE == 20)	 //	20ms * 50ms = 刚好等于1000ms 也就是1秒
    	{
    		TIME_BASE = 0;
    		MACT_ENDB++;	// 一秒加一次
    		if(MACT_ENDB == 5) // 等于刚好5秒时间到
    		{
    			MACT_ENDB = 0;
    			Rece_Errp++;   // 用来切换LED A、B、C5秒灭
    		}
    	}	
    }





    展开全文
  • 本文主要为单片机定时器中断实现长时间定时程序,希望对你的学习有所帮助
  • 定时器中断程序 111111111111111111111111111111
  • 1、单片机定时器中断后计数器是否还会计数 解决:单片机定时器中断后计数器还是会计数的,如果重新赋值,会按照设置的时间进行计时。如果没有,则从0开始。 2、单片机在执行定时器中断时,是否在没执行当前中断...

    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的过程中没有多次进行定时中断函数执行。

    可以得出的结论是:

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

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

    展开全文
  • C51单片机定时器中断应用,程序控制LED灯的亮灭,通俗易懂,运用简单程序学习中断
  • 运用定时器0工作在方式1(16位计数器)实现LED灯的闪烁。先来看看定时器0工作在方式1的逻辑结构图。 从上图可以看到,GATE先经过非门,再和INT0引脚作为或门的输入。这里简单提一下数字电路中的与门、或门和非门。...
  • 51单片机定时器中断

    万次阅读 多人点赞 2019-06-08 23:58:02
    51定时器中断 1.定时器/计数器 51单片机有2个16位定时器/计数器:定时器0(T0为P3.4) 和定时器1(T1为P3.5) 这里所说的16位是指定时/计数器内部分别有16位的计数寄 存器。当工作在定时模式时,每经过一个机器...

    51定时器中断

    1.定时器/计数器

    51单片机有2个16位定时器/计数器:定时器0(T0为P3.4) 和定时器1(T1为P3.5)
    这里所说的16位是指定时/计数器内部分别有16位的计数寄 存器。当工作在定时模式时,每经过一个机器周期内部的16位计数 寄存器的值就会加1,当这个寄存器装满时溢出。 我们可以算出工作在定时模式时最高单次定时时间为 65535*1.085us=时间(单位us)
    当工作在计数器模式时,T0(P3.4引脚),T1(P3.5引脚)每 来一个脉冲计数寄存器加1
    在这里插入图片描述
    定时器作用:定时计数器可以用于精确事件定时,PWM脉宽调 制,波形发生,信号时序测量的方面。

    使用51定时/计数器步骤:

    (1)启动定时/计数器(通过TCON控制器)
    (2)设置定时/计数器工作模式(通过TMOD控制器)
    (3)查询定时/计数器是否溢出(读TCON内TF位
    在这里插入图片描述
    在这里插入图片描述

    3.代码片:

    (1)定时器定时:

    #include <reg52.h>
    #include <intrins.h>
    #define uint unsigned int
    #define uchar unsigned char
    sbit DU = P2^6;
    sbit WE = P2^7;
    uchar  code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
    void delay(uint z)
    {
     uint x,y;
     for(x = z; x > 0; x--)
      for(y = 114; y > 0 ; y--);   
    } 
    void display(uchar i)
    {
     uchar bai, shi, ge;
     bai = i / 100; //236 / 100  = 2
     shi = i % 100 / 10; //236 % 100 / 10 = 3
     ge  = i % 10;//236 % 10 =6   
     P0 = 0XFF;
     WE = 1;
     P0 = 0XFE; //1111 1110
     WE = 0; 
     DU = 1;
     P0 = tabel[bai];//
     DU = 0;
     delay(5);
     P0 = 0XFF;
     WE = 1;
     P0 = 0XFD; //1111 1101
     WE = 0; 
     DU = 1;
     P0 = tabel[shi];//
     DU = 0;
     delay(5);
     P0 = 0XFF;
     WE = 1;
     P0 = 0XFB; //1111 1011
     WE = 0; 
     DU = 1;
     P0 = tabel[ge];//
     DU = 0;
     delay(5);
    }
    void timer0Init()
    {
     TR0 = 1; 
     TMOD = 0X01; 
     TH0 = 0x4b;
     TL0 = 0xfd; 
    }
    void main()
    { 
     uchar mSec, Sec;
     timer0Init();
     while(1)
     {
      if(TF0 == 1)
      {
       TF0 = 0;
       TH0 = 0x4b;
       TL0 = 0xfd; 
       mSec++;
       if(mSec == 20)
       {
        mSec = 0;
        Sec++;
       }     
      }
      display(Sec); 
      if(Sec > 10)
       Sec = 0;
     } 
    } 
    

    (2)定时器计数:

    #include <reg52.h>
    #include <intrins.h>
    #define uint unsigned int
    #define uchar unsigned char
    sbit DU = P2^6;
    sbit WE = P2^7;
    sbit LED1 = P1^0;
    uchar  code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
    void delay(uint z)
    {
     uint x,y;
     for(x = z; x > 0; x--)
      for(y = 114; y > 0 ; y--);   
    } 
    void display(uchar i)
    {
     uchar bai, shi, ge;
     bai = i / 100;
     shi = i % 100 / 10;
     ge  = i % 10;   
     P0 = 0XFF;
     WE = 1;
     P0 = 0XFE; //1111 1110
     WE = 0;
     DU = 1;
     P0 = tabel[bai];//
     DU = 0;
     delay(5);
     P0 = 0XFF;
     WE = 1;
     P0 = 0XFD; 
     WE = 0;
     DU = 1;
     P0 = tabel[shi];
     DU = 0;
     delay(5);
     P0 = 0XFF;
     WE = 1;
     P0 = 0XFB; //1111 1011
     WE = 0;
     DU = 1;
     P0 = tabel[ge];//
     DU = 0;
     delay(5);
    }
    void timer0Init()
    {
     TR0 = 1;  
     TMOD |= 0X05; 
     TH0 = 0;
     TL0 = 0; 
    }
    void timer1Init()
    {
     TR1 = 1;  
     TMOD |= 0X10; 
     TH1 = 0x4b;
     TL1 = 0xfd; 
    }
    void main()
    { 
     uchar mSec, Sec;
     timer0Init();
     timer1Init();
     while(1)
     {
      if(TF1 == 1)
      {
       TF1 = 0;
       TH1 = 0x4b;
       TL1 = 0xfd; 
       mSec++;
       if(mSec == 10) 
       {
        mSec = 0;
        LED1 = ~LED1;
       }     
      }
      display(TL0); 
     } 
    } 
    

    (3)定时器中断:

    #include <reg52.h>
    #include <intrins.h>
    #define uint unsigned int
    #define uchar unsigned char
    sbit DU = P2^6;
    sbit WE = P2^7;
    sbit key_s2 = P3^0;
    sbit key_s3 = P3^1;
    uchar num;
    uchar mSec, Sec;
    uchar code SMGduan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
    uchar code SMGwei[] = {0xfe, 0xfd, 0xfb};
    void delay(uint z)
    {
     uint x,y;
     for(x = z; x > 0; x--)
      for(y = 114; y > 0 ; y--);   
    } 
    void display(uchar i)
    {
     static uchar wei;   
     P0 = 0XFF;
     WE = 1;
     P0 = SMGwei[wei];
     WE = 0;
     switch(wei)
     {
      case 0: DU = 1; P0 = SMGduan[i / 100]; DU = 0; break;
      case 1: DU = 1; P0 = SMGduan[i % 100 / 10]; DU = 0; break; 
      case 2: DU = 1; P0 = SMGduan[i % 10]; DU = 0; break;  
     }
     wei++;
     if(wei == 3)
      wei = 0;
    }
    void timer0Init()
    {
     EA = 1; 
     ET0 = 1;
     TR0 = 1; 
     TMOD = 0X01; 
     TH0 = 0xED;
     TL0 = 0xFF; 
    }
    void main()
    { 
     timer0Init();
     while(1)
     {
      if(key_s2 == 0)
      {
       delay(20);
       if(key_s2 == 0)
       {
        if(num != 120)
        num++;
        while(!key_s2);
       } 
      }
      if(key_s3 == 0)
      {
       delay(20);
       if(key_s3 == 0)
       {
        if(num > 0)
         num--;
        while(!key_s3);
       } 
      }
     } 
    } 
    void timer0() interrupt 1
    {
     TH0 = 0xED;
     TL0 = 0xFF; 
     display(num);  
    }
    
    展开全文
  • 当CPU正在执行某指令或某中断服务程序时,它响应定时器溢出中断往往延迟一段时间。这种延时虽对单片机低频控制系统影响甚微,但对单片机高频控制系统的实时控制精度却有较大的影响,有时还可能造成控制事故。
  • msp430g2553单片机定时器中断例程
  • 单片机定时器中断

    千次阅读 2018-05-11 16:44:15
    就在前不久,我觉得我虽然书上的内容我已经看了不少,但是我觉得我对前面的内容还是...所以这次我就来分享一下我所了解的定时器中断吧。 其实中断的概念大家都很容易懂,简单的讲,就是单片机在处理某一件事情的时...

      就在前不久,我觉得我虽然书上的内容我已经看了不少,但是我觉得我对前面的内容还是了解的太少了,后面的内容就看不走,所以我又把书从头看着走,不过这次我带上了实际操作,就是每看完一节,自己就去跟着操作,收获确实不少,但是在中断这一节,我停留的时间比较久,估计差不多整整一周的时间吧。所以这次我就来分享一下我所了解的定时器中断吧。

      其实中断的概念大家都很容易懂,简单的讲,就是单片机在处理某一件事情的时候,突然另外一件事情发生了,就停下当前的工作,去处理另外一件事情,当然可能不止一件事情发生,这就要根据它的优先级来看先处理那一件事情了。

      我今天来说一下定时器中断的问题,也是一个困扰我很久的问题。首先我们来看一张图。本图片是百度的·

        其实光看懂这张图,我就花了很多时间。下面的TMOD,TCON是两个寄存器,分别是定时器/计数器工作方式寄存器和定时器/计数器控制寄存器,TMOD的高4位用于设置定时器1,也就是上图的T1引脚,低四位用于设置定时器0,上图的T0引脚。TCON其实主要是用来控制定时器的启、停、标志定时器中断溢出情况。

      我给大家举个例子,假如说我们用了定时器0,首先我们要给定时器0的TL0和TH0装一个初值,然后定时器就开始加1计数,然后当TL0记满后,向TH0进一位,直到把TH0也记满,此时计数器就溢出,置TF0为1(TF0为TCON中的一位,也就是定时器0的溢出标志),接着向CPU申请中断。

        如果说你看到这儿还没懂,废话不多说,下面来看一段程序,帮助理解。

    #include<reg52.h>
    #define uchar unsigned char
    #define uint unsigned int
    sbit led1 = P1^0;
    uchar num;
    void main()
    {
    	TMOD=0x01;    //设置定时器0为工作方式1(M1M0为01)
    	TH0=(65536-45782)/256;//装初值
    	TL0=(65536-45782)%256;
    	EA=1;                 //开总中断
    	ET0=1;	              //开定时器0中断
    	TR0=1;                  //启动定时器0
    	while(1);            //程序停止在这里等待中断发生
    }
    void T0_time()interrupt 1
    {
    	TH0=(65536-45782)/256;
    	TL0=(65536-45782)%256;
    	num++;
    	if(num==2+0)
    	{
    		num=0;
    		
    	}	
    }
    
      各位看懂了吗?欢迎提出问题。
    展开全文
  • 基于51单片机用汇编语言写的定时器中断功能,编译通过,可以参考下
  • //用定时器中断闪烁LED void main(void) //主程序 { TMOD=0x01; //定时器0,16位工作方式 TR0=1; //启动定时器 ET0=1; //打开定时器0中断 EA=1; //打开总中断 while(1) //程序循环 { ;...
  • 程序思路:该程序是利用51单片机定时器中断,另外根据音符的频率计算每个音符定时时长从而输出不同音符对应的PWM波驱动蜂鸣器播放音乐。 使用工具:Keil4,protues8;程序具体代码和仿真原理图都已打包放到《基于...
  • 刚在写博客的时候口渴,我起身起身去喝水,喝水过程中不小心打翻了杯子弄湿了地面,又不得不去拖地,其实这就是生活中常见的中断,我本来在写博客,这是我的主程序,口渴便是一个中断源,它提示我应该喝水,当我停下...
  • 单片机T0作定时器实现数码管显示的汇编程序(中断法),一起来学习一下
  • 应广单片机定时器中断配置

    千次阅读 热门讨论 2019-12-28 00:34:32
    应广单片机主要应用于消费电子,资源有限,只有一个定时器,因此用好T16定时器就非常关键了.可以说是整个单片机系统的核心配置 不说那么多了,直接上代码. BIT LED_G : PA.3; #define GRE_LED_FLASH {if(LED_G){LED_G...
  • 通过插入硬件输出片段观察到定时器更新后10us左右进入了定时器中断,而该定时器设置中断时间为100us,明显不对 原因: 定时器使能时中断标志触发,允许中断后会立马进入中断 解决方案: 在使能定时器中断前插入...
  • p1.0口做输出口,接一只喇叭,利用定时器中断方式编写程序,使喇叭放出悦耳的音乐。晶振频率6MHz。
  • 51单片机定时器中断写MIDI音乐(按键可切换)
  • 代码如下,设置断点后发现,程序不进入定时器中断函数 #include #include #define uchar unsigned char #define uint unsigned int sbit key=P3^7; uchar display[8][8]; /*rank:Z,H,B,I,T,I,心,U*/ uchar code ...
  • 本文章是一个定时器中断程序
  • 实现定时器中断和中断嵌套 一、背景知识 1.定时器结构和原理: (1)组成:两个16位的定时器T0和T1,以及他们的工作方式寄存器TMOD和控制寄存器TCON等组成。内部由总线与CPU连接。 (2)工作模式 每个定时器内部...
  • 51单片机定时器中断函数中变量初始化的问题 #include<reg51.h>//调用头文件 #define uint unsigned int //宏定义 #define uchar unsigned char uint n=0; //查表变量 uchar temp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf...
  • 本文给大家分享了51单片机定时器计数器中断总结。
  • 51单片机定时器0工作在模式0,每中断10次,使P2.0引脚连接的LED灯闪烁
  • 自己整理的STC12C5A60S2单片机定时器实验程序,定时器0的3种模式,定时器1的三种模式,封装,适合初学51单片机的朋友
  • 单片机定时器中断原理和C语言代码详解   <br />  <br />我之前都是用ARM7,单片机基本不会。但一个项目要用到51,所以克了一下51还是有点模糊,今天调了这个代码之后,对51定时器中断有些...
  • 用51单片机定时器中断写数码管0-99

    千次阅读 2020-11-23 12:47:55
    定时器0实现数码管的0-99变化 #include "reg52.h" #define uchar unsigned char #define uint unsigned int sbit dula = P2^6;//段选 sbit wela = P2^7;/位选 uint n=0;//个位 uint b=0;//十位 uint m=0;//控制...
  • 实验一定时器/中断程序设计实验 一 实验目的 1 掌握定时器/中断的工作原理 2 学习单片机定时器/中断的应用设计和调试 二 实验仪器和设备 1 普中科技单片机开发板HC6800-EM3V3. 0 2 Keil uVision4程序开发平台 3 PZ-...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,974
精华内容 6,389
关键字:

单片机定时器中断程序