定时器
1.延时的方法:
其中_nop_();
:一个 NOP 的时间是一个机器周期的时间。
2.定时器的介绍
A).时钟周期
时钟周期T是时序中最小的时间单位(即1/时钟源频率)。
B).定时器
a).定时的含义
从某一个初始值开始,经过确定的时间后溢出的过程。
b).溢出
假如一个16位(即两个字节)的定时器,最大值为65535,那么等加到65535后,再加1就为溢出,溢出后,这个值就直接变为0。
C).定时器的寄存器
a).定时器存储寄存器
名称 | 描 述 | SFR地址 | 复位值 |
---|---|---|---|
TH0 | 定时器0高字节 | 0x8C | 0x00 |
TL0 | 定时器0低字节 | 0x8A | 0x00 |
TH1 | 定时器1高字节 | 0x8D | 0x00 |
TL1 | 定时器1低字节 | 0x8B | 0x00 |
注:SRF:特殊功能寄存器。
b).定时器控制寄存器TCON的位分配(地址0x88、可位寻址)
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
符号 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
复位值 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
位描述——前四位
TF1:定时器1溢出标志。一旦定时器 1 发生溢出时硬件置 1。
TR1:定时器1运行控制位。软件置位(清零)来进行启动(停止)定时器。
TF0:定时器 0 溢出标志。
TR0:定时器0运行控制位。软件置位(清零)来进行启动(停止)定时器。一旦定时器 0 发生溢出时硬件置 1。
后四位:外部中断部分,与定时器无关。
区分:硬件置1或清0和软件置1或清0
硬件:指一旦符合条件,单片机将自动完成的动作。
软件:指我们必须用程序去完成这个动作。
c).TMOD—定时器模式寄存器的位分配(地址0x89、不可位寻址)
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
符号 | GATE(T1) | C/T(T1) | M1(T1) | M0(T1) | GATE(T0) | C/T(T0) | M1(T0) | M0(T0) |
复位值 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
位描述
T1/T0:T1表示控制定时器1的位,T0表示控制定时器0的位。
GATE:该位被置为1时为门控位。仅当”INTx”脚为高并且”TRx”控制位被置 1 时使能定时器”x”,定时器开始计时,当该位被清 0 时,只要”TRx”位被置 1,定时器 x 就使能开始计时,不受到单片机引脚”INTx”外部信号的干扰,常用来测量外部信号脉冲宽度。
C/T:定时器或计数器选择位。该位被清零时用作定时器功能(内部系统时钟),被置 1 用作计数器功能。
d).TMOD——定时器模式寄存器M1/MO工作模式
M1 | M0 | 工作模式 | 描述 |
---|---|---|---|
0 | 0 | 0 | 兼容8048单片机的13位定时器、THn的8位和TLn的5位组成一个13位定时器 |
0 | 1 | 1 | THn和TLn组成一个16位的定时器 |
1 | 0 | 2 | 8位自动重装模式,定时器溢出后THn重装到TLn中 |
1 | 1 | 3 | 禁用定时器1、定时器0变成2个8位定时器 |
注:一般我们都选择模式1和模式2。
模式 1:是 THn 和 TLn 组成了一个 16 位的定时器,计数范围是 0~65535,溢出后,只要不对 THn 和 TLn 重新赋值,则从 0 开始计数。
模式 2:是 8 位自动重装载模式,只有TLn做加1计数,计数范围0~255,THn的值并不发生变化,而是保持原值,TLn溢出后,TFn就直接置1了,并且THn原先的值直接赋给TLn,然后TLn重新赋值的这个数字开始计数。
D).模式1的电路示意图
注释(以定时器0位例)
a).OSC:时钟频率,又一个机器周期为12个时钟周期,故d为12。
b).从GATE往右,先后为非门、或门和与门电路。
c).TR0和下边或门电路的结果要进行与运算,TR0如果是0的话,与运算完了肯定为0,所以为了使定时器工作,TR0=1。
d).如果要与门结果为1,则或门的结果必须为1。在GATE=1的情况下,经过非门后变成0,如果要或门电路结果为1,则INT0(即引脚P3^2)必须为1,定时器才会工作。
e).GATE=0,经过非门后为1,那么不管INT0引脚是什么电平,经过或门电路后都是1,则定时器肯定工作。
3.定时器的应用
A).使用定时器的必要步骤
第一步:设置特殊功能寄存器 TMOD,定时器方式和定时器几的设置。
第二步:开总中断EA。
第三步:ET0位,打开定时器0中断。
第四步:设置TCON,通过TR0置 1 来启动定时器。
第五步:设置计数寄存器TH0和TL0的初值。
注:使用定时器一般就要使用中断,但中断和定时器不是一码事,定时器是单片机模块的一个资源,确确实实存在的一个模块,而中断时单片机的一种运行机制。
B).通过定时器来控制LED的闪烁
unsigned int t=0;
void main()
{
TMOD=0x01;//选择模式1
EA=1;//开总中断
ET0=1;//开0中断
TR0=1;//启动定时器0
TH0=(65536-50000)/256;//赋初值,求膜
TL0=(65536-50000)%256;//赋初值,求余
while(1)
{
if(t==20)
{
t=0;
P1=0x00;
}
}
}
void timer() interrupt 1
{
TH0=(65536-50000)/256;//赋初值,求膜
TL0=(65536-50000)%256;//赋初值,求余
t++;
P1=0xff;
}