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循环左移