51单片机的定时器/计数器

7.2.2 定时器/计数器的结构

51单片机的定时器/计数器结构如图7-7所示。
T0由特殊功能寄存器TH0、TL0构成。
T1由特殊功能寄存器TH1、TL1构成。
在这里插入图片描述
T0 和T1都具有定时器和计数器两种工作模式,4种工作方式(方式0~3)。属于增计数器。
特殊功能寄存器TMOD用于选择T0、T1的工作模式和工作方式。特殊功能寄存器TCON用于控制T0、T1的启动和停止计数,同时包含了T0、T1的状态。T0、 T1不论是工作在定时器模式还是计数器模式,实质是对脉冲信号进行计数,只不过计数信号的来源不同。
计数器模式是对加在T0(P3.4)和T1(P3.5)两个引脚上的外部脉冲进行计数。
定时器模式是对单片机的系统时钟信号经片内12分频后的内部脉冲信号(机器周期)计数。由于时钟频率是定值,所以可根据对内部脉冲信号的计数值可计算出定时时间。
计数器的起始计数是从初值开始。单片机复位时计数器初值为0,也可用指令给计数器装入一个新的初值。

7.2.3 定时器/计数器的控制寄存器与工作方式

1. 定时/计数器工作方式控制寄存器TMOD

TMOD是一个不可以位寻址的8位特殊功能寄存器,字节地址为89H,其高4位专供T1使用的,其低4位专供T0使用的,见表7-8。
在这里插入图片描述
8位分为两组,高4位控制T1,低4位控制T0。
下面对TMOD的各位给出说明。
(1)GATE—门控位
GATE=0时,仅由运行控制位TRx(x = 0,1)来控制定时器运行。
GATE=1时,用外中断引脚INT0*(或INT1* )上的电平与运行控制位TRx共同控制定时器运行。
(2)M1、M0—工作方式选择位
M1、M0的4种编码,对应于4种工作方式的选择,如表7-9所示。
在这里插入图片描述
(3)C/T* —计数器模式和定时器模式选择位
C/T*=0,为定时器工作模式,对单片机的晶体振荡器12分频后的脉冲进行计数。
C/T*=1,为计数器工作模式,计数器对外部输入引脚T0(P3.4)或T1(P3.5)的外部脉冲(负跳变)计数。

2. 定时器/计数器控制寄存器TCON

TCON字节地址为88H,可位寻址,位地址为88H~8FH,格式如表7-10所示。
在这里插入图片描述
7.1节介绍了与外部中断有关的低4位。这里仅介绍与定时器相关的高4位功能。
(1)TF1、TF0—计数溢出标志位
当计数器计数溢出时,该位置“1”。使用查询方式时,此位作为状态位供CPU查询,但应注意查询有效后,应使用软件及时将该位清“0”。使用中断方式时,此位作为中断请求标志位,进入中断服务程序后由硬件自动清“0”。
(2)TR1、TR0—计数运行控制位
TR1位(或TR0位)=1,启动定时器工作的必要条件。
TR1位(或TR0位)=0,停止定时器工作。
该位可由软件置“1”或清“0”。

3. 定时器/计数器的4种工作方式

(1) 方式0
当M1、M0为00时,定时器/计数器被设置为工作方式0,这时定时器/计数器的等效逻辑结构框图如图7-9所示(以定时器/计数器T1为例,TMOD.5、TMOD.4 = 00)。
在这里插入图片描述
方式0时,为13位计数器,由TLx(x = 0,1)的低5位和THx的高8位构成。TLx低5位溢出则向THx进位,THx计数溢出则把TCON中的溢出标志位TFx置“1”。计数值的范围为1~8192,当溢出时其计录脉冲的个数为:
S=8192-X ,式中X为T0(或T1) 计数初值。

TLx=(213一X) /32			//	取5位的余数
THx=(213一X)/32			//	取5位的商

图7-9中, C/T*位控制的电子开关决定了定时器/计数器的两种工作模式。
①C/T*=0,电子开关打在上面位置,T1(或T0)为定时器工作模式,把时钟振荡器12分频后的脉冲作为计数信号。
②C/T*=1,电子开关打在下面位置,T1(或T0)为计数器工作模式,计数脉冲为P3.4(或P3.5)引脚上的外部输入脉冲,当引脚上发生负跳变时,计数器加1。
GATE位状态决定定时器的运行控制取决于TRx一个条件,还是取决于TRx和INTX* (x = 0,1)引脚状态这两个条件
①GATE=0时,A点(见图6-4)电位恒为1,B点电位仅取决于TRx状态。TRx = 1,B点为高电平,控制端控制电子开关闭合,允许T1(或T0)对脉冲计数。TRx = 0,B点为低电平,电子开关断开,禁止T1(或T0)计数。
②GATE=1时,B点电位由INTX*(x = 0,1)的输入电平和TRx的状态两个条件来定。当TRx=1,且INTX*=1时,B点才为1,控制端控制电子开关闭合,允许T1(或T0)计数。故这种情况下计数器是否计数是由TRx和INTX*两个条件来共同控制。

(2) 方式1
当M1、M0为01时,工作于方式1,方式1的等效电路逻辑结构如下图所示。
在这里插入图片描述
方式1和方式0的差别仅仅在于计数器的位数不同,方式1为16位计数器,由THx高8位和TLx低8位构成(x = 0,1),方式0则为13位计数器,有关控制状态位的含义(GATE、C/T*、TFx、TRx)与方式0相同。
在方式1下当为定时工作方式时,定时时间的计算公式为:

T=(2^16-X)× Ts 

其中X为T0(或T1) 计数初值,Ts为机器周期。当为计数工作方式时, S=216一X ,式中X为T0(或T1) 计数初值, 计数值的范围为1~65536(216)。在方式1中TLx和THx计数寄存器各使用8位,而28=256,所以把计数起点的值除以256,其余数放入TLx计数寄存器,其商放入THx寄存器中。

TLx=(2^16-X) /256	//取8位的余数
THx=(2^16-X)/256	//取8位的商

(3) 方式2
方式0和方式1的最大特点是计数溢出后,计数器为全0。因此在循环定时或循环计数应用时就存在用指令反复装入计数初值的问题。这不仅影响定时精度,也给程序设计带来麻烦。方式2就是解决此问题而设置的。
当M1、M0为10时,定时器/计数器处于工作方式2,这时定时器/计数器的等效逻辑结构如图7-10所示(以定时器T1为例,x = 1)。
在这里插入图片描述
定时器/计数器的方式2为自动恢复初值(初值自动装入)的8位定时器/计数器,TLx(x = 0,1)作为常数缓冲器,当TLx计数溢出时,在溢出标志TFx置“1”的同时,还自动将THx中的初值送至TLx,使TLx从初值开始重新计数。定时器/计数器的方式2工作过程如右图所示。
此工作方式可省去用户软件中
重装初值的指令的执行时间,
简化定时初值的计算方法,
可相当精确地确定定时时间。
在这里插入图片描述
(4) 方式3
方式3是为了增加一个附加的8位定时器/计数器而设置的,从而使AT89S51单片机具有3个定时器/计数器。方式3只适用于定时器/计数器T0,定时器/计数器T1不能工作在方式3。T1处于方式3时相当于TR1 = 0,停止计数(此时T1可用来作为串行口波特率产生器)。
在这里插入图片描述
①工作方式3下的T0
当TMOD的低2位为11时,T0的工作方式被选为方式3,各引脚与T0的逻辑关系如图7-11所示。
T0分为两个独立的8位计数器TL0和TH0,TL0使用T0的状态控制位C/T*、GATE、TR0,而TH0被固定为一个8位定时器(不能作为外部计数模式),并使用T1的状态控制位TR1和TF1,同时占用T1的中断请求源TF1。
当T0设置在方式3时,再把T1也设置成方式3,此时T1停止计数。

4. 对外部输入的计数信号的要求

当定时器/计数器工作在计数器模式时,计数脉冲来自外部输入引脚T0或T1。当输入信号产生由1至0的跳变(即负跳变)时,计数器值增1。每个机器周期的S5P2期间,都对外部输入引脚T0或T1进行采样。如在第一个机器周期中采得的值为1,而在下一个机器周期中采得的值为0,则在紧跟着的再下一个机器周期S3P1期间,计数器加1。
由于确认一次负跳变花2个机器周期,即24个振荡周期,因此外部输入的计数脉冲的最高频率为系统振荡器频率的1/24

51计算器程序#include #include #define uchar unsigned char #define uint unsigned int sbit lcden=P3^4; sbit lcdrw=P3^6; sbit lcdrs=P3^5; uchar num,temp,jia=0,cheng=0,chu=0,jian=0,qing=0; uint key,key1,shu; uchar fuhao,flag1,flag=0; uchar table[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,}; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=114;y>0;y--); } bit lcd_bz() { bit result; lcdrs = 0; lcdrw= 1; lcden = 1; _nop_(); _nop_(); _nop_(); _nop_(); result=(bit)(P0&0x80;); lcden=0; return result; } void write_com(uchar com) { while(lcd_bz()); lcdrs=0; lcden=0; lcdrw=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } void write_date(uchar date) { while(lcd_bz()); lcdrs=1; lcden=0; lcdrw=0; P0=date; delay(5); lcden=1; delay(5); lcden=0; } void lcd_init() { lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); } void keyscan() { P3=0xfe; temp=P3; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; while(temp!=0xf0) { temp=P3; switch(temp) { case 0xee:key=1;num=0;break; case 0xde:key=2;num=0;break; case 0xbe:key=3;num=0;break; case 0x7e:num=1;break; //¼ÓºÅ } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xfd; temp=P3; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; while(temp!=0xf0) { temp=P3; switch(temp) { case 0xed:key=4;num=0;break; case 0xdd:key=5;num=0;break; case 0xbd:key=6;num=0;break; case 0x7d:num=2;break; //¼õºÅ } while( temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xfb; temp=P3; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; while(temp!=0xf0) { temp=P3; switch(temp) { case 0xeb:key=7;num=0;break; case 0xdb:key=8;num=0;break; case 0xbb:key=9;num=0;break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值