51单片机——定时器

51单片机——定时器

  • 为什么使用定时器?
  • 定时器原理?
  • 定时器设置
  • 中断配置
  • 源代码

为什么使用定时器?

之前我们的led灯每隔1s循环左移点亮的时候,使用的定时方法是在c程序执行若干次空循环,这样会耗费很多cpu资源,因为空轮询。本篇博客将使用51单片机内置的定时器 中断系统完成循环左移LED灯。
想一个问题:为什么中断不耗费cpu资源,或者说没那么耗费
其实问题的答案很简单:因为发生中断的时候,cpu把当前任务放到等待队列里,然后去调用相应的中断处理程序,处理完中断后再从等待队列把进程丢到工作队列抢占cpu资源。类似的设计思路其实很多,比如java的AQS.

定时器原理?

51单片机内部有一个12MHZ的晶振

我们算一下:hz是频率单位,它是每秒钟的周期性变动重复次数的计量。
即时钟周期=1/(12M) (s)= 1/12/1000/1000 (s) = 1/12 us
51单片机一个指令周期是12个时钟周期,即指令周期=12*1/12 us = 1us
51单片机定时器0内部有两个寄存器TH0和TL0,都是一字节的,理解位定时器0高位寄存器(TH0),定时器0低位寄存器(TL0), 我们知道2字节最大能存65535。
每过一个指令周期(1us),寄存器的值 1,当加到溢出后发出一个溢出中断,我们程序可以捕获到这个中断,就可以知道此时经历了(65535 1)us。
如果我们要定时1ms,可以这样做,设置寄存器的初值为64536,这样到溢出值65536就正好1ms。

定时器设置

我们这使用定时器0,具体可以参考STC89C52文档

TCON寄存器(可位寻址,后缀为1的是定时器1的配置,不用管)
TF0 = 0; //清除TF0溢出中断标志,加到65536后TF0会被置为1
TR0 = 1; //允许定时器0计时
IE0和IT0不用管,需要的话自己去看文档

TMOD寄存器(不可位寻址)

定时器1的不用配置,定时器0配置如下
GATE=0:这个看电路图就知道为啥给0(不需要管INT0是啥)
C/T=0:0代表用作定时器,1代表用作计数器
M1=0,M0=1。M1和M0这样设置代表使用模式1,即TH0和TL0两个寄存器都使用
TMOD=0x01

TH0和TL0
TL0=64535%256 1;
TH0=64535/256;
//距离65535差1000,一次1us,1000次就是1ms

中断配置

定时器的配置就配置好了,现在还要配置中断处理的配置

//中断配置
ET0=1; //enable time0 interrupt
EA=1; //enable global interrupt switch
PT0=0;//低优先级

中断处理程序

源代码

#include <REGX52.H> #include <INTRINS.H> unsigned char keyNum; void Timer0Init(void){ //为了不干扰定时器1 //TMOD &= 0xF0;//设置定时器模式 //TMOD |= 0x01;//设置定时器模式 TMOD = 0x01; //TL0低8位,TH0高8位 TL0=64535%256 1; TH0=64535/256; //距离65535差1000,一次1us,1000次就是1ms //TCON配置 TF0 = 0;//清除TF0标志 TR0 = 1;//定时器0开始计时 //中断配置 ET0=1; //enable time0 interrupt EA=1; //enable global interrupt switch PT0=0;//低优先级 } void main() { P2=0xFE; Timer0Init(); while(1) { } } void Timer0_Routine() interrupt 1{ static unsigned int c = 0; TL0=64535%256 1; TH0=64535/256; c ; //500ms if(c>=500){ c=0; //循环左移 P2=_crol_(P2,1);//LED输出 } }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

结果展示

51单片机定时器控制LED循环左移

(0)

相关推荐

  • 51单片机定时器的原理与使用

    定时器是单片机的重要功能模块之一,在检测.控制领域有广泛应用.定时器常用作定时时钟,以实现定时检测,定时响应.定时控制,并且可以产生ms宽的脉冲信号,驱动步进电机.定时和计数的最终功能都是通过计数实现 ...

  • 浅谈51单片机计数器、定时器的不同

    在51单片机的学习过程中,我们经常会发现中断.计数器/定时器.串口是学习单片机的难点,对于初学者来说,这几部分的内容很难理解.但是我个人觉得这几部分内容是单片机学习的重点,如果在一个学期的课堂学习或者 ...

  • 增强型51和传统51单片机外设操作的区别

    文/Edward 前面的内容,我们从传统的51单片机出发,从硬件的基础上,一步步衍生出了增强型51单片机所增强的地方.现在我们可以清楚地了解,增强型51单片机对比传统的51单片机,增强的地方在于存储器 ...

  • 增强型51单片机扩展方式

    文/Edward 大家是否思考过一个问题,为什么现在的51单片机在做宣传的时候,不外乎都是称作为"增强型51单片机"?与传统的51单片机相比,究竟哪些地方得到了扩展? 在回答这个问 ...

  • 一天入门51单片机

    本套教程共3节课程,熟悉这3节课程的话,你已经入门51单片机了. 下面是内容正文 单片机学习的第一步,什么是单片机最小系统? 我来打个比喻吧. 我们都知道,人的大脑是可以控制眼耳口鼻,手脚,全身等等, ...

  • 51单片机的存储空间梳理

    文/Edward我们在学习传统的MCS-51单片机的时候,一定学习过51单片机的存储结构.传统的MCS-51存储器有三个空间,分别是片内RAM(内部数据存储器).片外RAM(外部扩展的数据存储器) 和 ...

  • 单片机“朝花夕拾”系列——乐创增强型51单片机讲义序

    本来想的是认认真真地做一部ARM内核的MCU教程和文档,这个入口最好的芯片切入口就是STM32.然而最不凑巧的是,现在STM32无论哪一个型号都是一"芯"难求.以至于我Layout ...

  • 如何看待增强型51单片机?

    文 / Edward  1  辩证地看待51内核单片机 要回答这个问题,首先需要来看一下传统的51单片机.在有些文章或者书本中,对于51单片机的态度是全面否定的,一旦听到某人要学习或者使用51单片机, ...

  • 51单片机 4个独立按键控制LED灯 (protues仿真)(C语言版)

    一.思路及相关问题 1.逻辑思路: 当按下key1时 led1亮起来 因为按下去具有瞬时性不用while,用if语句,当松开时,用while(!key1) ,函数调用. 先在脑海里想象它的大致运行过程 ...