1. 定时器的使用步骤
1)主函数;
2)对中断和定时器进行初始化=>先设置计数器的工作方式,设定TH0、TL0或TH1、TL0的初值,即:TH0=(8192-C)/32,TL0=(8192-C)%32,开启中断和定时器,即:TR=1;
3)设置中断服务程序-》执行对应中断需要做的内容。
51单片机拥有两个定时器,分别为T0,T1;52单片机比51单片机多一个定时器T2。
2. 寄存器TMOD
TMOD寄存器的值决定了定时器的工作方式。
工作方式0,13位定时器;工作方式1为16位定时器;工作方式方式2位8位自动重载定时器。
下述表格为此寄存器的数据格式:
定时器 |
定时器1 |
定时器0 |
||||||
位序号 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
位符号 |
GATE |
C/T |
M1 |
M0 |
GATE |
C/T |
M1 |
M0 |
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::决定使用定时器的工作方式及哪个定时器。
工作方式选择:
00表示方式0 13位计数器 TMOD=0x00
01 表示方式1 16位计数器 TMOD=0x01
10表示 方式2 自动重装8位计数器 TMOD=0x02
11表示方式3 T0分为2个8位独立计数器,T1为无中断重装8位计数器
如:TMOD=0x03表示定时器0工作方式为方式三定时器功能。
3. 定时器的工作原理
定时器的工作原理:TH0为高八位,TL0为低八位,组成了16位的定时器,当低位TL0计满就向高位TH0移一个数,然后清零。
例:以12Mhz的晶振来说,机器周期是1us,计满TH0、TL0就需要216-1个数,再来一个数就“溢出”产生中断,一次溢出也就是65536us,约等于65.5ms,如果要定时50ms的话就要给他们装一个预装值(初值),总值-需要值=预装值,
也就是65536-50000=15536,预装后,定时器从预装值开始加值,定时器溢出中断后,会重新从预装值开始加值加到50ms就再产生中断,从而达到了定时的目的。如果要定时1s就可以让定时器中断1000ms/50ms=20次。
另外一点,TH0和TL0中应该装入的总数是15536,然后把15536对256求模:15536/256=60装入TH0中,把15536对256求余:15536%256=176装入TL0中,因为这是两个八位28*28的容器。
所以就有了
TH0=(65535-50000)/256
TL0=(65535-50000)%256
4. 定时器的使用注意事项
定时器中断需要:
总中断EA:用来开启全局中断
ET0、1、2:各个定时器中断位,使用中断位只需将其置一即可。
开启对应的定时器只需将对应的TR为置一即开启了定时器。
5. TCON状态寄存器
位序号 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
位符号 |
TF1 |
TR1 |
TF0 |
TR0 |
IE1 |
IT1 |
IE0 |
IT0 |
位地址 |
8FH |
8EH |
8DH |
8CH |
8BH |
8AH |
89H |
88H |
TCON为定时器/计数器控制寄存器
TF1/TF0:表示定时器1/定时器0的溢出标志位。
TF1/TF0=1表示定时器1/定时器0溢出
TF1/TF0=0表示定时器1/定时器0未溢出
TR1/TR0:表示定时器1/定时器0的中断使能位
TR1/TR0=1表示定时器1/定时器0开启中断
TR1/TR0=0表示定时器1/定时器0关闭中断
IE0/IE1:外中断请求标志位
IE0/IE1=1:开启定时器0/定时器1外部中断
IE0/IE1=0:关闭定时器0/定时器1外部中断
IT0/IT1:外中断请求信号方式控制位
IT0/IT1=1:定时器0/定时器1触发条件为下降沿触发
IT0/IT1=0:定时器0/定时器1触发条件为上升+下降沿触发
6. 定时器工作方式的详细介绍
定时器工作方式0:
方式0是13位的定时器,它的低位TL0是五位的,所以它的总值是28*25=8192。它能装的值也不能那么多了,于是就装入5ms:
TH0=(8192-5000)/32;
TL0=(8192-5000)%32;
32是5位寄存器的容量。
所以要中断200次才能达到1s。
这个方式0可以用来做短时间中断
定时器工作方式2:
如图,其中低位TL0是8位定时器,而TH0是常数缓冲器,当低位TL0溢出时,在溢出标志位TF0置1的同时,自动将高位TH0的常数重新装入TL0中,让TL0从初值开始重新计数,这样就不用人为软件重新装入初值带来的误差,从而提高精度。
由于两个是分开的,所以计算初值可以不用求余取模:
TL0=总值-要计数的个数;
TH0=总值-要计数的个数;
定时器工作方式3:
接下来介绍方式3,方式3不同于其他三个方式,它只能用于T0,也就是定时器0,和方式2差不多,也是把TL0、TH0分成两个独立的寄存器,但是TH0也参与计数,也就是两个独立的8位定时器/计数器。
普通的使用一样,TL0计数溢出后置位TF0,并申请中断,之后重装。但是由于TL0占用了TR0和TF0,所以TH0只能占用定时器 T1的TR1和TF1。所以定时器T1一定不要用在有中断的场合,当然,T1同样可以正常工作在方式0、1、2下。通常这种情况,T1都被用来当做串行口的波特率发生器。
首先把T0、T1的中断位和控制位打开:
52单片机的中断级别
中断源 |
默认中断级别 |
序号(c语言) |
入口地址(汇编) |
INT0-外部中断0 |
最高 |
0 |
0003H |
T0-定时器0中断 |
第2 |
1 |
000BH |
INT1-外部中断1 |
第3 |
2 |
0013H |
T1-定时器1中断 |
第4 |
3 |
001BH |
T1/R1串行口中断 |
第5 |
4 |
0023H |
T2-定时器2中断 |
最低 |
5文章来源:https://www.toymoban.com/news/detail-473192.html |
002BH文章来源地址https://www.toymoban.com/news/detail-473192.html |
到了这里,关于单片机中定时器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!