内部资源之定时器
16位计数器:T0 分为 TH0(高八位) 和 TL0(低八位)
T1 分为TH1(高八位) 和 TL1(低八位)
(1)相关口线:T0:P3.4,定时计数器0外部脉冲输入端;如果是内部时钟,则工作时钟为fosc/12,此时P3.4作IO口使用
T1:P3.5,定时计数器1外部脉冲输入端;如果是内部时钟,则工作时钟为fosc/12,此时P3.5作IO口使用
输入信号下降沿有效,前一个机期周期为高电平 ,后一个机期周期为低电平表示有脉冲,信号周期: T>=2Tfr=2*12*Tosc,即信号的频率f
(1/f)>=(24/fosc) >> f<=fosc/24
(2)相关控制字:TMOD TCON IE IP
TH0 TL0 TH1 TL1
TH0:定时计数器0的高8位 65536 取高八位则X/2^8(256)
TL0:定时计数器0的低8位 取低八位则X%2^8(256)
TH1:定时计数器1的高8位
TL1:定时计数器1的低8位
用于存计数值,若TR0(TR1)=1,如果有脉冲信号 则自动加1
IE:EA ET0 ET1
IP:PT0 PT1
TCON:TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
TR0:定时计数器0的启动控制位
当TR0=1,允许计数,TR0=0时,停止计数
TR1:定时计数器1的启动控制位
当TR1=1,允许计数,TR1=0时,停止计数 65535
TF0:定时计数器0的溢出标志位 0000 0000 0000 0000
1111 1111 1111 1111
当TH0与TL0计数计满溢出时自动置1;
若EA&ET0=1时,即定时中断0处于开启状态,则TF0等效为定时中断0的中断请求标志位,CPU响应中断后自动清零;如果EA&ET0=0,则必须软件清零(TF0=0)。
TF1:定时计数器1的溢出标志位
当TH1与TL1计数计满溢出时自动置1;
若EA&ET1=1时,即定时中断0处于开启状态,则TF1等效为定时中断1的中断请求标志位,CPU响应中断后自动清零;如果EA&ET1=0,则必须软件清零(TF1=0)。
TMOD: 定时计数器的工作方式选择控制寄存器
GATE C/T M1 M0 GATE C/T M1 M0
T1 T0
GATE:门控位
当GATE=0,T0(T1)与外部中断脚INT0(INT1)无关;
当GATE=1时,必须INT0(INT1)=1时定时计数器T0(T1)才能工作
C/T: 定时方式与计数方式选择位
C/T=0时,定时方式,计数器的工作脉冲来自内部时钟信号,为Fosc/12(即十二个振荡脉冲向定时提供一个工作脉冲,即每个机器周期自动加1)
C/T=1时,计数方式,计数器的工作脉冲来自外部时钟信号(P3.4或是P3.5),有脉冲时自动加1)
M1M0 定时计数器的工作方式选择位
0 0 方式0,TH0(TH1)+TL0(TL1)的低五位 13位计数器
0 1 方式1,TH0(TH1)+TL0(TL1)16位计数器
1 0 方式2,8位自动重装方式,TL0(TL1)计数,TH0(TH1)存放初值(重装值)
1 1 方式3,T0具有,TH0与TL0为两个独立的八位计数器,th0占用原有T1的资源TL0即可定时亦可计数(P3.4),TH0只能定时
TR0 TL0 TF0 EA ET0 进中断1
TR1 TH0 TF1 EA ET1 进中断3
T1为波特率发生器,不能用于定时或是计数
t=P(2^n-x)Tfr t:为定时时间,x:为TH0与TL0中的初值,Tfr:机期周期
n:为计数器的长度,与工作方式有关。
机器周期:Tfr=12*1s/Fosc FOSC=24M Tfr=12*1s/(12*10)=0.5*10s=1us=10^-6s
定时时间:t=pluse*Tfr t=5ms
脉冲数:pluse=t/Tfr pluse=1ms/1us=1000
定时数初值:x=2-pluse n:表示定时计数器的长度,由工作方式决定 x=2-1000=64536
T=0.707(R1+R2)C+0.707*R2*C
F=1/T 483=1/(0.707(R1+R2)C+0.707*R2*C)>>C=1000 000 /(zi*0.707*3) nf
t=(2^n-初值)Tfr 1000=2^n-x x=2^13-1000=8192-1000=7192
f=38k T=1s/f t=T/2 13us=(2^n-x)Tfr 13=2^n-x x=2^n-13=2^8-13
定时器是什么?定时器顾名思义是用来计时的,比如led闪烁的频率可以用定时器来控制,它比延时函数更加精确,而且最重要的是它可以不占用CPU的资源单独运行。
定时器在程序中的含义就是:每隔一段时间就执行定时器中断服务函数一次,隔多久可以自行编程
接下来我们通过一个最简单的定时器实验来具体学习
定时器之一个发光二极管闪烁
首先创建一个名为定时器的一个文件夹,
然后,打开仿真,布置电路图,所需元件:AT89C51、LED-YELLOW、RES
点击保存到刚刚创建的文件夹下,
打开keil4,新建一个定时器工程,写下代码
#include <reg51.h>
void main(void)
{
//相关控制字
TMOD = 0x01; //定时方式,计数器的工作脉冲来自内部时钟信号
TCON = 0x30; //定时计数器启动
ET0 = 1; //打开定时器0中断
EA = 1; //打开总中断
TH0 = (65535-5000)/256; //设置定时器时间为50ms
TL0 = (65535-5000)%256;
while(1);
}
timer0(void) interrupt 1
{
static char n = 0; //记录中断响应次数n
n++;
TH0 = (65535-50000)/256; //响应中断后会清零,要从新赋值
TL0 = (65535-50000)%256;
if(n == 20) //记录到响应了20次 也就是1秒,执行下程序
{
n = 0; //录记响应次数清零
P1 = ~P1;
}
}
编译,烧录
代码以及仿真文件包:定时器.rar