51模块_定时器与中断
定时器 寄存器相关
表 ① 定时具体值
名称 | 描述 | SFR地址 |
---|---|---|
TH0 | 定时器 0 高字节 | 8CH |
TL0 | 定时器 0 低字节 | 8AH |
TH1 | 定时器 1 高字节 | 8DH |
TL1 | 定时器 1 低字节 | 8BH |
表 ② TCON-定时器/计数器控制寄存器的位分配(地址:88H)
可位寻址;复位值:0x00;复位源:任何复位
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
符号 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
表 2.1 TCON-位描述
位 | 符号 | 描述 |
---|---|---|
7 | TF1 | 定时器1溢出标志:一旦定时器1发生溢出时硬件置1,它不会对定时器是否继续运行产生任何影响。 清零有两种方式:软件清零,或者进入定时器中断时硬件清零。 |
6 | TR1 | 定时1运行控制位。 软件置位/清零来进行启动/关闭定时器。 |
5 | TF0 | 定时器0溢出标志。一旦定时器0发生溢出时硬件置1,它不会对定时器是否继续运行产生任何影响。 清零有两种方式:软件清零,或者进入定时器中断时硬件清零。 |
4 | TR0 | 定时1运行控制位。 软件置位/清零来进行启动/关闭定时器。 |
3 | IE1 | |
2 | IT1 | |
1 | IE0 | |
0 | IT0 |
表 ③ TMOD–定时器方式控制寄存器的位分配(地址 89H)
不可位寻址;复位值:0x00;复位源:任何复位
位 | 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) |
表 3.1 TMOD-位描述
位 | 符号 | 描述 |
---|---|---|
7 / 4 | GATE | 该位被置1时为门控位,仅当’INTx’脚为高,且’TRx’控制位被置1时使能定时器’x’,定时器开始计时; 当该位被清0时,只要’TRx’位被置1,定时器x就使能开始计时,不受到单片机引脚’INTx’外部信号的干扰,常用来测量外部信号脉冲宽度。 这是定时器一个额外功能,即GATE为1时,定时器需要TRx和外部中断INTx同时启用才运行。 |
6 / 3 | C/T | 定时器或计数器选择位。该位被清零时用作定时器功能(内部系统时钟),被置1用作计数器功能。 |
M1 | M0 | 工作模式 | 描述 |
---|---|---|---|
0 | 0 | 0 | THn的8位和TLn的5位组成一个13位定时器, 兼容8048单片机的13位定时器 |
0 | 1 | 1 | THn和TLn组成一个16位的定时器 |
1 | 0 | 2 | 8位自动重装模式,定时器溢出后THn重装到TLn中 |
1 | 1 | 3 | 禁用定时器1,定时器0变成2个8位定时器 |
以上这4种模式的配置,
①、模式 0 是为了兼容老的8048单片机而设的,现在的51几乎不会用到这种模式;
②、模式 1 就是THn和TLn组成了一个16位的定时器,取值范围是0到65535,
溢出后,只要不对THn和TLn重新赋值,则从0开始计数。
③、模式 2 的功能是自动装载,就是TLn溢出后,TFn就直接置1了,并且THn的值直接赋给TLn,然后TLn从新赋值的这个数字开始计数。
④、模式 3 他的功能模式2完全可以取代,所以基本上也是不用
定时器程序应用
使用步骤
第一步:设置特殊功能寄存器TMOD,配置好工作模式;
第二步:设置计数寄存器TH0和TL0的初值;
第三步:设置TCON,通过打开TR0位来让定时器开始计数。
第四步:判断TCON寄存器的TF0位,监测定时器溢出情况。
如何用定时器定时时间。
我们的晶振是11.0592M,时钟周期就是1/11059200,机器周期就是12/11059200,我们假如要定时20ms,就是0.02秒,要经过x个机器周期得到0.02秒,我们来算一下x*12/11059200=0.02,得到x= 18432。那么我们现在16位的定时器溢出值是65536,我们可以这样,先给TH0和TL0一个初值,让他们经过18432个机器周期后刚好溢出,溢出后我们可以通过检测TF0位得知,就刚好是0.02秒。
这个初值y = 65536 - 18432 = 47104,转成16进制就是0xB800,那么就是TH0 = 0xB8,TL0 = 0x00。
那0.02秒我们已经定时出来了,细心的同学会发现,我们如果初值直接给一个0x0000,一直到65536溢出,定时器定时值最大也就是71ms左右,那么我们想定时更长时间怎么办呢?用你小学学过的逻辑,倍数关系就可以解决此问题。
中断寄存器
表 ① 中断使能
不可位寻址;复位值:0x00;复位源:任何复位
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
符号 | EA | ET2 | ES | ET1 | EX1 | ET0 | EX0 |
表 1.1 IE-位描述
位 | 符号 | 描述 |
---|---|---|
7 | EA | 总中断使能位,相当于总开关 |
6 | ||
5 | ET2 | 定时器2中断使能 |
4 | ES | 串口中断使能 |
3 | ET1 | 定时器1溢出中断使能 |
2 | EX1 | 外部中断1使能 |
1 | ET0 | 定时器0溢出中断使能 |
0 | EX0 | 外部中断0使能 |
表 ② 中断函数
描述 | 中断标志 | 中断使能 | 中断使能 | 中断使能 |
---|---|---|---|---|
外部中断0 | IE0 | EX0 | 0003H | 1(最高) |
T0中断 | TF0 | ET0 | 000BH | 2 |
外部中断1 | IE1 | EX1 | 0013H | 3 |
T1中断 | TF1 | ET1 | 001BH | 4 |
UART中断 | TI/RI | ES | 0023H | 5 |
T2中断 | TF2/EXF2 | ET2 | 002BH | 6 |
这个表格同样不需要大家记住,需要的时候过来查就可以了。我们现在看第二行T0中断,它的中断标志是TF0,也就是当TF0变成1的时候,就会触发中断。而在interrupt后边的数字x的计算方法是 x*8+3=向量地址,T0的向量地址是000BH,那么我们可以求得x的值是1。这样这个中断函数名字我们就彻底明白了。
表 ③ 中断优先级
- 可位寻址;复位值:0x00;复位源:任何复位*
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
符号 | PT2 | PS | PT1 | PX1 | PT0 | PX0 |
表 1.1 IP-位描述
位 | 符号 | 描述 |
---|---|---|
7 | ||
6 | ||
5 | PT2 | 定时器2中断优先级控制位 |
4 | PS | 串口中断优先级控制位 |
3 | PT1 | 定时器1中断优先级控制位 |
2 | PX1 | 外部中断1中断优先级控制位 |
1 | PT0 | 定时器0… |
0 | PX0 | 外部中断0… |