51学习之中断(四)

技术 · 2018-12-07 · 39 人浏览

定时/计数器的控制

80C51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。

一、工作方式寄存器TMOD

工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。其格式如下:

中断11.png

GATE:门控位。GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。即此时定时器的启动多了一条件。

C/T:定时/计数模式选择位。C/T=0;为定时模式,C/T=1;为计数模式。

M1M0:工作方式设置位。定时/计数器有四种工作方式,由M1M0进行设置。

中断13.png

二、控制寄存器TCON

TCON的低4位用于控制外部中断,已在前面介绍。TCON的高4位用于控制定时/计数器的启动和中断申请。其格式如下:

中断12.png

*TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。

*TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。

*TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。

*TR0(TCON.4):T0运行控制位,其功能与TR1类同。

定时/计数器的工作方式

一、方式0

方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。

中断14.png

定时器模式时有:N=t/ Tcy

计数初值计算的公式为: X=213-N

定时器的初值还可以采用计数个数直接取补法获得。

计数模式时,计数脉冲是T0引脚上的外部脉冲。


门控位GATE具有特殊的作用。当GATE=0时,经反相后使或门输出为1,此时仅由TR0控制与门的开启,与门输出1时,控制开关接通,计数开始;当GATE=1时,由外中断引脚信号控制或门的输出,此时控制与门的开启由外中断引脚信号和TR0共同控制。当TR0=1时,外中断引脚信号引脚的高电平启动计数,外中断引脚信号引脚的低电平停止计数。这种方式常用来测量外中断引脚上正脉冲的宽度。

二、方式1

方式1的计数位数是16位,由TL0作为低8位、TH0作为高8位,组成了16位加1计数器 。

中断14.png

计数个数与计数初值的关系为: X=216-N

三、方式2

方式2为自动重装初值的8位计数方式。

中断14.png

计数个数与计数初值的关系为: X=28-N

工作方式2特别适合于用作较精确的脉冲信号发生器。

四、方式3

方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。

中断14.png

工作方式3将T0分成为两个独立的8位计数器TL0和TH0 。

定时/计数器应用举例

初始化程序应完成如下工作:

*对TMOD赋值,以确定T0和T1的工作方式。

*计算初值,并将其写入TH0、TL0或TH1、TL1。

*中断方式时,则对IE赋值,开放中断。

*使TR0或TR1置位,启动定时/计数器定时或计数。



例 利用定时/计数器T1的方式1,产生10ms的定时,并使P1.0引脚上输出周期为20ms的方波,采用中断方式,设系统时钟频率为12 MHz。

解:1、计算计数初值X:
由于晶振为12 MHz,所以机器周期Tcy为1 μs。
所以:

N=t/ Tcy =10000/1=10000
X=65536-10000=55536=D8F0H

即应将D8H送入TH0中,F0H送入TL0中

2、求T1的方式控制字TMOD:

M1M0=01,GATE=0,C/T=0,可取方式控制字为01H;

1、利用定时/计数器T0从P1.0输出周期为1s的方波,让发光二极管以1HZ闪烁,设晶振频率为12MHz。
2、利用定时/计数器T1产生定时时钟,由P1口控制8个发光二极管,使8个指示灯依次一个一个闪动,闪动频率为10次/秒(8个灯依次亮一遍为一个周期),循环。
3、同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔300ms依次输出1,10,50,100,200,400,800,
1k(hz)的方波。
4、用定时器以间隔500MS在6位数码管上依次显示0、1、2、3….C、D、E、F,重复。

51的中断样例代码

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void init()//初始化
{
TMOD=0x11;//设置定时器0为工作方式1
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=(65536-20000)/256;
TL1=(65536-20000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
ET1=1;
TR0=1;//启动定时器0
TR1=1;
}
void main()
{


}
void time0() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
tt++;
}
void time1() interrupt 3
{
TH1=(65536-20000)/256;
TL1=(65536-20000)%256;
num1++;
}
中断 讲解
Theme Jasmine by Kent Liao