精华内容
下载资源
问答
  • C51单片机定时器中断应用,程序控制LED灯的亮灭,通俗易懂,运用简单程序学习中断
  • 定时器中断应用实例 设计要求: 每秒点亮P1.0口的发光二极管一次,然后熄灭,使发光二极管形成闪烁效果 实现思路: 通过定时/计数器,每秒触发一次P1.0取反 涉及到的功能模块:定时器,中断,LED操

    博主福利:100G+电子设计学习资源包!

    http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5d5d0f15df84f4a92ebf72f88d4ee8&scene=18#wechat_redirect
    --------------------------------------------------------------------------------------------------------------------------

     

    定时器中断应用实例

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

    设计要求:

    每秒点亮P1.0口的发光二极管一次,然后熄灭,使发光二极管形成闪烁效果

     

    实现思路:

    • 通过定时/计数器,每秒触发一次P1.0取反
    • 涉及到的功能模块:定时器,中断,LED操作
    • 定时器装填:

      需要计数每秒的话,计数921600时溢出即可,在四种方式定时方式中,最大的计数范围是方式2:65536,将921600分解成20份,每份计数46080时溢出,当溢出20次时灯闪烁,每次定时器溢出都要重新装填

    模块设计

    • 初始化

      • LED(上拉输入模式)
      • 定时器(T0,工作方式1,装填初值,启动(在中断初始化后启动))
      • 中断(开放中断,开放T0中断)
    • while(1)
    • 中断

      • 重置定时器(溢出位复位,重新装填计时)
      • 判断溢出次数(到达20次时LED改变状态,计数清零。未到达20次时溢出次数加一)

    实现代码

    #include <reg52.h>
    #include <intrins.h>
    typedef unsigned char uchar;
    sbit LED = P1 ^ 0;
    uchar count = 0;
    void Interrupt() interrupt 1
    {
        TH0 = (65536 - 46080) / 256; //触发中断时重新装填计时
        TL0 = (65536 - 46080) % 256;
        if (count == 20)
        {
            LED = ~LED;
            count = 0;
        }
        else ++count;
    }
    void main(void)
    {
        LED = 0xff; //初始化LED
        TMOD = 0x01; //初始化TMOD,定时器0,方式1
        TH0 = (65536 - 46080) / 256; //装填计数
        TL0 = (65536 - 46080) % 256;
        EA = 1; //开放所有中断
        ET0 = 1; //开放定时器0中断控制位
        TR0 = 1; //定时器0开始计时
        while(1)
        {
            _nop_();
        }
    }

     

    展开全文
  • ————————————————...定时器中断应用实例 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -...

    ————————————————————————————————————————————

    定时器中断应用实例

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

    设计要求:

    每秒点亮P1.0口的发光二极管一次,然后熄灭,使发光二极管形成闪烁效果

     

    实现思路:

    • 通过定时/计数器,每秒触发一次P1.0取反
    • 涉及到的功能模块:定时器,中断,LED操作
    • 定时器装填:

      需要计数每秒的话,计数921600时溢出即可,在四种方式定时方式中,最大的计数范围是方式265536,将921600分解成20份,每份计数46080时溢出,当溢出20次时灯闪烁,每次定时器溢出都要重新装填

    模块设计

    • 初始化
      • LED(上拉输入模式)
      • 定时器(T0,工作方式1,装填初值,启动(在中断初始化后启动))
      • 中断(开放中断,开放T0中断)
    • while(1)
    • 中断
      • 重置定时器(溢出位复位,重新装填计时)
      • 判断溢出次数(到达20次时LED改变状态,计数清零。未到达20次时溢出次数加一)

    实现代码

     1 #include <reg52.h>
     2 #include <intrins.h>
     3 typedef unsigned char uchar;
     4 sbit LED = P1 ^ 0;
     5 uchar count = 0;
     6 void Interrupt() interrupt 1
     7 {
     8     TH0 = (65536 - 46080) / 256; //触发中断时重新装填计时
     9     TL0 = (65536 - 46080) % 256;
    10     if (count == 20)
    11     {
    12         LED = ~LED;
    13         count = 0;
    14     }
    15     else ++count;
    16 }
    17 void main(void)
    18 {
    19     LED = 0xff; //初始化LED
    20     TMOD = 0x01; //初始化TMOD,定时器0,方式1
    21     TH0 = (65536 - 46080) / 256; //装填计数
    22     TL0 = (65536 - 46080) % 256;
    23     EA = 1; //开放所有中断
    24     ET0 = 1; //开放定时器0中断控制位
    25     TR0 = 1; //定时器0开始计时
    26     while(1)
    27     {
    28         _nop_();
    29     }
    30 }

     

    转载于:https://www.cnblogs.com/hughdong/p/6877973.html

    展开全文
  • 定时器中断学习和简单应用

    千次阅读 2019-12-25 22:03:28
    简单应用定时器中断基本介绍清楚明白工作原理定时器结构主要内容两个寄存器初始化程序简单应用-秒表基本功能代码详解 彩蛋:对于独立按键的使用 没啥硬核内容,就是初学者萌新入门,学长大佬请移步 定时器中断 ...

    • 彩蛋:对于独立按键的使用
    • 没啥硬核内容,就是初学者萌新入门,学长大佬请移步

    定时器中断

    基本介绍

    清楚明白

    • 定时器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。
    • 51单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据**+1**.
    • 有了定时器/计数器后,可以增加单片机的效率,一些简单重复加1的工作可以交给定时器/计数器去处理。CPU转而处理一些复杂的事情。同时可以实现精确定时作用。
      -本次使用定时器,并用外部的脉冲信号+1

    工作原理

    定时器实质上是一个+1计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动+1,当加到计数器为全1时,再输入一个脉冲就使计数器归零(下文有实例,如果最大装15,此时要再+1达到”16“才归零),且计数器的溢出使相应的中断标志位置1,向CPU发出中断请求(中断允许时)。

    定时器结构

    定时器的实质是加1计数器(16位),由高8位和低8位两个寄存器THX和TLX组成。TMOD是定时器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。

    主要内容

    两个寄存器

    • 相当于你给了几个按钮,让它服从你的指令去采用不同方式完成你的要求。
      1,工作方式寄存器TMOD
      因为触发条件和精确读的要求,所以要选择相适应的工作方式。
      在这里插入图片描述
    • 显而易见8个各自分成两组,下面分别介绍一下每组内容
      1.第一个是门控位
    GATE启动定时器工作条件
    =0TCON的TR0/1=1
    =1TCON的TR0/1=1&&外部中断引脚INT0/1=1

    -可以看出=0的条件要少一点
    2.
    C/T:定时/计数模式选择位。 C/T=0为定时模式;C/T=1为计数模式
    3.
    M1M0工作方式设置位(一个四种)

    M1M0工作方式说明
    00方式013位定时器
    01方式116位定时器
    10方式28位自动重装定时器
    11方式3T0分为两个独立的8位计时器;T1停止计数
    1. 控制寄存器TCON
    • 低四位用于控制外部中断(在这里不介绍),高四位控制定时/计数的启动和中断申请。
      在这里插入图片描述
    • TR1:T1运行控制位。置1时,T1开始工作;置0时,T1停止工作。
    • TR0:T0控制位,同上。
    1. 重点介绍方式1
      位数为16位,
      TL0作为低8位TH0作为高8位
      组成了16位+1计数器。
      计数个数与计数初值的关系为:X=2^16-N在这里插入图片描述

    -看着花里胡哨,但是不用仔细看懂

    初始化程序

    • 对TMOD赋值,以确定T0和T1的工作方式
    • 计算初值,并将其写入TH0、TL0或者TH1、TL1
    • 中断方式时,对EA赋值,开放定时器中断
    • 使TR0或者TR1置位,启动定时器定时
    • 关于服务函数,[上篇博客](这里用interrupt 1||3)(https://blog.csdn.net/weixin_45779702/article/details/103681485)有讲过,再提一次
      在这里插入图片描述

    简单应用-秒表

    在这里插入图片描述

    基本功能

    • 按键S1开始计时
    • 按键S2停止计时
    • 按键S3数据归零

    代码详解

    #include <reg52.h>
    #define uint unsigned int						  //对数据类型进行声明定义
    #define uchar unsigned char
    /*位定义*/
    sbit LSA = P2^2;				 //138芯片A2引脚
    sbit LSB = P2^3;				 //138芯片A1引脚
    sbit LSC = P2^4;				 //138芯片A0引脚
    /*全局变量&&数组*/
    uchar DT_SECOND = 0;				 //秒计时
    uchar DT_MINUTE = 0;				 //分计时
    
    uchar code duan[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};             //共阴数码管无小数点 显示0~9,十分位,百分位,十位
    uchar code duanpoint[] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};        //个位 //共阴数码管有小数点 显示0~9
    
    /*函数部分*/
    
    //延时1ms函数
    void delay1ms(uint t)
    {
    	uint i,j;
    	for(i=0;i<t;i++)
    	{
    		for(j=0;j<100;j++);	
    	}
    }
    //中断函数,初始化
    void Timer0Init()
    {
    	TMOD = 0x01; 		//选择T0定时/计数器,工作在方式1,16位计数器		
    	TH0 = 0xFC;	        //计数初始值,计数从64536开始,计1000个数,完成一次计数,时间为1ms
    	TL0 = 0x18;		    //65536-1000/256;(65536-1000)%256-->数制知识
    	ET0 = 1;			//定时/计数器0中断允许位
    	EA = 1;				//总中断开启
    }
    //独立按键S3函数
    void S3()
    {
    	DT_SECOND = 0;			//秒归零
    	DT_MINUTE = 0;			//分归零
    	TR0 = 0;			//运行控制位清0,关闭定时器
    }
    
    //和运算判断键值
    void ScanKey()
    {
    	uchar Key;                   //临时变量
    	Key = P3&0x07;	   //只需要三个按键,分别接的P3^1,P3^2,P3^3,故把P3高五位被屏蔽
    	if(Key!=0x07)	   //判断哪个键被按下
    	{
    		delay1ms(10);	 //消抖10ms
    		Key = P3&0x07;	 //再次赋值,避免此时按键状态改变
    		if(Key!=0x07)	 //确认按键被按下
    		{
    			switch(Key)
    			{
    				case 0x05:				  //S1(P3^1)被按下101
    							TR0 = 1;	  //定时器0运行控制位为1,启动定时器0
    							break;
    				case 0x06:				  //S2(P3^0)被按下110
        
    							TR0 = 0;	  //定时器0运行控制位为0,关闭定时器0
    							break;
    				case 0x03:				  //S3(P3^2)被按下011
    							S3();
    							break;
    			}
    		}
    		while(Key!=0x07)		//松手检测
    		{
    			Key = P3&0x07;
    		}
    	}
    	
    	
    }
    
    //数码管动态扫描函数
    void DigDisplay(uchar s,uchar min)                //数码管从右往左
    {
    	LSA = 0;			       //秒个位位选
    	LSB = 0;
    	LSC = 0;
    	P0 = duan[s%10];		      //发送段码,显示秒个位
    	delay1ms(5);	                       //间隔一段时间扫描
    
    	LSA = 1;			      //秒十位位选 
    	LSB = 0;
    	LSC = 0;
    	P0 = duan[s/10];		       //发送段码显示秒十位
    	delay1ms(5);			  //间隔一段时间扫描
    
    	LSA = 0;			  //分的个位位选
    	LSB = 1;
    	LSC = 0;
    	P0 = duanpoint[min%10];		  //发送段码,显示分的个位
    	delay1ms(5);			  //间隔一段时间扫描
    
    	LSA = 1;			  //分的十位位选
    	LSB = 1;			  //间隔一段时间扫描
    	LSC = 0;
    	P0 = duan[min/10];		  //发送段码,显示分的十位
    	delay1ms(5);			  //间隔一段时间扫描
    
    	P0 = 0x00;				  //消隐,清除已有数据
    }
    
    //主函数咯
    void main(void)
    {
    	P0 = 0x00;		   //读端口前写1
    	P3 = 0xFF;		   //读端口前写1
    	Timer0Init();	  //定时器中断初始化函数
    	while(1)
    	{
    		DigDisplay(DT_SECOND,DT_MINUTE);	   //数码管显示函数
    		ScanKey();		  //按键扫描函数
    	}
    }
    
    //服务函数咯
    void Timer0() interrupt 1
    {
    	static uint count_s;	
    	static uint count_min;		//采用静态变量,不用赋初值0
    	TH0 = 0xFC;				    //计数值初始化(1s计时是连续的下一次还得使),从64536开始计数,计满时为65536,溢出时即为 1ms
    	TL0 = 0x18;
    	count_s++;				     //秒计数
    	count_min++;				 //分计数
    	if(count_s==1000)			 //计数到1s(1000*1ms)时,秒计数器开始工作
    	{
    		count_s = 0;		 //秒计数清零
    		DT_SECOND++;			 //显示秒计数值自增
    		if(DT_SECOND>59)		 //秒数最大为59
    		{
    			DT_SECOND = 0;
    		}
    	}
    	if(count_min==60000)		  //计数到60000ms时,秒计数器开始工作
    	{
    		count_min = 0;		  //分计数清零
    		DT_MINUTE++;				  //显示分计数值自增
    		if(DT_MINUTE>59)			  //分数最大为59
    		{
    			DT_MINUTE = 0;
    		}
    	}
    }
    
    
    • 详解
    1. 动态数码管(共阴)
      在这里插入图片描述
    • 先说段选,就是让这个8.亮出什么数字的模样
      例如显示0.,就得让图中的A,B,C,D,E,F,DP亮起来,需要用八个二进制数,1是亮,0是不亮,而且A是八位的最右端,所以就是1011 1111,这样对于的两个十六进制就是0XBF.
    • 再说位选,一般开发板是八个数码管,通过芯片74HC245来打开某一数码管的点亮权限。这样由LSA,LSB,LSC来判断,开3个二进制位,正好控制八个数码管。例如,秒表的秒百分位,也就是显示的最右一位,对应的是000,也就是八个数码管最右边那一个(顺序是从右往左)。(放个图大家感受一下)
    • 这里因为有四位,其中第二位(左起)带有小数点,所以它的数组库不太一样(duanpoint)。
      在这里插入图片描述
    1. 初始化和服务函数对1s的计时
    • 晶振是12KHZ
    • 初始化的TMOD是0x01,也就是门控位为0,T0运行控制位,定时模式,工作方式为1.
    • 初始化那里是FC18,对应的十进制也就是2^16(65536)-1000,实现脉冲1000次。16个二进制位其实是2 ^16-1,但是由溢出一词,就像水缸的水一样将将满,还没有满,所以再加一滴才算满。
    • 初始化实现了1000*1us也就是1ms,在服务函数中循环1000次,最终也就是1s。当然我们也可以改变初始化和循环的搭配实现1s的计时,这样做只是一定程度上提高了计时上限和降低一定误差罢了。
    1. 独立按键判断键值
      按常规我们可以通过位定义,消抖来判断哪个按键被按下,但是这里采用和运算。
      我们通过KEY=0X07(0000 0111),由于上拉电阻所以独立按键均置高电平,在按下之后变低电平。然后我们观察四个按键相应的引脚顺序。K2–1,K1–2,K3–3,K4–4(K4用不到)。
      然后按照此规律,当K1被按下,也就是第二位变0,即0000 0101=0x05。
      在这里插入图片描述
    2. 计时
      这里其实蛮好理解了,对应的count_s相当于星际争霸的scv一样,搬运工干活的,而DT_second就是外显在动态(DT)数码管上的,一个主内一个主外。
    3. 如有不懂欢迎私信
    展开全文
  • 定时器中断实验

    2019-01-22 16:08:49
    定时器中断实验
  • 定时器中断方式应用

    2016-03-11 23:01:59
    源程序: #include #define LED P2 #define count 50000 #define TH_M1 (65536-count)/256 #define TL_M1 (65536-count)%6 int IntCount=0; void main() {  IE=0x82;  TMOD=0x01;  TH0=TH_M1;...

    源程序:

    #include<reg1.h>
    #define LED P2
    #define count 50000
    #define TH_M1 (65536-count)/256
    #define TL_M1 (65536-count)%6
    int IntCount=0;
    void main()
    {
      IE=0x82;
      TMOD=0x01;
      TH0=TH_M1;
      TL0=TL_M1;
      TR0=1;
      LED=0x00;
      while(1);
    }
    void my_t0() interrupt 1
    {
      TH0=TH_M1;
      TL0=TL_M1;
      IntCount++;
      if(IntCount==2)
      {
        LED=~LED;
     IntCount=0;
      }
    }

    展开全文
  • 定时器中断

    2019-11-07 16:15:19
    文章目录定时器中断时钟定时器POSIX定时器定时器操作timer_create()(创建定时器)timer_settime()(初始化定时器)timer_gettime()(获得一个活动定时器的剩余时间)timer_getoverrun()(取得一个定时器的超限运行次数)...
  • 本文主要对西门子plc定时器中断常见问题解答进行了汇总,一起来学习一下
  • stm32入门——定时器中断 产生定时中断是定时器的用法之一,与定时器用来进行PWM输出和输入捕获相比,定时器中断更容易理解、掌握。 原理简介 使用通用定时器进行中断的原理,其实和开发板Systick定时器进行中断延时...
  • 应用定时器中断的知识来设计IO在按键触发情况下输出波形变换
  • 数码管显示及定时器中断应用.ppt
  • stm32 定时器中断算法

    2018-09-06 01:16:13
    stm32 定时器中断算法,s曲线七段法,可以根据自己应用实例进行更改
  • STM32Cube-定时器中断

    2018-09-08 17:25:36
    stm32的定时器功能非常强大,包括基本定时器,通用定时器以及高级定时器。 本章介绍定时器的基本应用,通过定时器中断控制LED闪烁,间隔1s
  • 在单片机定时器应用过程中,在中断时间设置方面出现误差是工程师们最不愿见到的错误之一。那么,都是哪些原因导致了单片机定时器中断时间设置出现了误差呢?这些误差的的严重程度又是怎样的呢?在今天的文章中,...
  • 数码管静态显示程序 定时器设置及中断应用
  • 数码管静态显示及定时器中断应用.ppt
  • 在前面的几篇文章中,每当程序需要延时时,我们是利用循环语句来实现。这种方法的延时简单,但不是很精确,...一般是利用定时器来实现。在这里,我们就介绍一下s3c2440定时器的使用方法。   在讲解之前,先介绍一
  • 定时器中断实现步骤

    千次阅读 2018-12-03 17:03:06
    ①1、使能定时器时钟。 &nbsp;RCC_APB1PeriphClockCmd();&nbsp; ②&...③3、开启定时器中断,配置NVIC。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void TIM_ITConfig
  • //用定时器中断闪烁LED void main(void) //主程序 { TMOD=0x01; //定时器0,16位工作方式 TR0=1; //启动定时器 ET0=1; //打开定时器0中断 EA=1; //打开总中断 while(1) //程序循环 { ;...
  • 51单片机程序,使用定时器时,定时器计数、定时器中断函数、while(1)循环三者之间如何协调好整个流程? 【定时器0实现间隔1s的流水灯】示例模板 #include <reg52.h> typedef unsigned int u16; //对...
  • TQ2440 定时器中断--基本应用

    千次阅读 2014-05-28 21:27:00
    注意:在ISR和main函数里面都要访问的变量必须加上volatile S3C2440 定时器总结: ...定时器0配置步骤:(其他的也类似) ...3.配置TCNTB0,定时器计数初始值 ...5.向中断向量表timer0安装中断
  • 数码管静态显示及定时器中断应用
  • 《STM32中文参考手册V10》-第14章通用定时器   STM32的定时器 STM32F103ZET6一共有8个定时器,其中分别为: 高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5);基本定时器(TIM6、TIM7)。 ...
  • STM32定时器中断显示时间

    千次阅读 2020-01-07 11:21:34
    利用STM32的定时器中断,实现时间的显示。我们知道利用定时器中断只能进行tick的计算,然而用来显示时间我们应该怎么办呢?经过项目的实际运用,我发现利用定时器中断配合串口通讯也能实现时间显示。 这种方法应用...
  • mini2440 定时器中断实验源代码

    热门讨论 2012-08-09 17:29:25
    是能在友善之臂的mini2440板子上运行的定时器中断代码。定时器没0.5秒产生一次中断,控制led1的亮灭。可以结合韦东山的《嵌入式Linux应用开发完全手册》第十章来理解。
  • 实验一定时器/中断程序设计实验 一 实验目的 1 掌握定时器/中断的工作原理 2 学习单片机定时器/中断应用设计和调试 二 实验仪器和设备 1 普中科技单片机开发板HC6800-EM3V3. 0 2 Keil uVision4程序开发平台 3 PZ-...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,636
精华内容 15,454
关键字:

定时器中断的应用