本文共 2317 字,大约阅读时间需要 7 分钟。
其中
_nop_();
:一个 NOP 的时间是一个机器周期的时间。 时钟周期T是时序中最小的时间单位(即1/时钟源频率)。
从某一个初始值开始,经过确定的时间后溢出的过程。
假如一个16位(即两个字节)的定时器,最大值为65535,那么等加到65535后,再加1就为溢出,溢出后,这个值就直接变为0。
名称 | 描 述 | SFR地址 | 复位值 |
---|---|---|---|
TH0 | 定时器0高字节 | 0x8C | 0x00 |
TL0 | 定时器0低字节 | 0x8A | 0x00 |
TH1 | 定时器1高字节 | 0x8D | 0x00 |
TL1 | 定时器1低字节 | 0x8B | 0x00 |
注:SRF:特殊功能寄存器。
位 | 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 硬件:指一旦符合条件,单片机将自动完成的动作。 软件:指我们必须用程序去完成这个动作。位 | 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 用作计数器功能。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重新赋值的这个数字开始计数。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,则定时器肯定工作。第一步:设置特殊功能寄存器 TMOD,定时器方式和定时器几的设置。
第二步:开总中断EA。 第三步:ET0位,打开定时器0中断。 第四步:设置TCON,通过TR0置 1 来启动定时器。 第五步:设置计数寄存器TH0和TL0的初值。 注:使用定时器一般就要使用中断,但中断和定时器不是一码事,定时器是单片机模块的一个资源,确确实实存在的一个模块,而中断时单片机的一种运行机制。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;}