51单片机有2个独立的定时/计数器T0、T1,52有3个(T2),它们都有定时或计数的功能,可以用于定时控制、延时、对外部事件计数和检测等场合。
一.定时/计数器相关寄存器
以51为例:
TCON
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
前文介绍过外部中断0、1的启动,TR1、(TR0)则是定时器T1、(T0)的启动(运行控制位),TF1、(TF0)则是定时器T1、(T0)的溢出标志位,当用作查询时,要用软件清0,中断则不用。
TMOD
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
GATE | C/ | M1 | M0 | GATE | C/ | M1 | M0 |
GATE:当GATE=1时,只有在或
引脚位高电平时,且由软件使TR0或TR1置1,才能启动定时器T0或T1,可以实现对脉宽的测量
当GATE=0时,只需使用软件将TR0或TR1置1,就能启动定时器T0或T1,所以一般GATE取为0
C/:为1时,C有效,作为计数器,为0时,
有效,作为定时器
M1M0:定时/计数器的工作方式
M1M0 | 工作方式 | 说明 |
00 | 方式0 | 13位计数器 |
01 | 方式1 | 16位计数器 |
10 | 方式2 | 8位自动重装计数器(初值自动装入,不要重新赋初值) |
11 | 方式3 | 定时器0:2个独立8位计数器 定时器1:对外停止计数 |
二.汇编例子
定时器初值计算:
例如:10ms的方波(晶振位6MHz)
高低电平则各位5ms,1个脉冲周期位2us,则低电平需要2500个脉冲周期,利用预定值的负数表示,则为-2500,再利用伪指令HIGH提取-2500(0xF6H)的高八位,LOW提取-2500的低八位
用T1方式1定时,要求在P1.0引脚上输出周期位10ms的方波,单片机晶振位6MHz
查询方式:
ORG 0000H
AJMP MAIN
MAIN: LCALL CSH //初始化设置定时器初值、TMOD、启动定时器
LCALL LOOP
CSH: SETB P1.0
MOV TMOD,#10H //定时器T1工作在方式1定时
MOV TH1,#HIGH(-2500)
MOV TL1,#LOW(-2500)
SETB TR1
RET
LOOP: JNB TF1,$ //等待T1溢出
CLR TR1 //关闭定时器1
CLR TF1 //由于是查询方式,TF1软件清0
CPL P1.0 //开始方波的低电平
MOV TH1,#HIGH(-2500)
MOV TL1,#LOW(-2500)
SETB TR1 //启动定时器1
JMP LOOP
END
中断方式:
ORG 0000H
AJMP MAIN
ORG 001BH //定时器T1的中断入口地址
AJMP CL
MAIN: LCALL CSH //初始化设置定时器初值、TMOD、启动定时器
JMP $
CSH: SETB P1.0
MOV TMOD,#10H //定时器T1工作在方式1定时
MOV TH1,#HIGH(-2500)
MOV TL1,#LOW(-2500)
SETB TR1 //打开定时器T1
SETB ET1 //打开定时器T1的中断允许
SETB EA //中断总允许
RET
CL: CLR TR1 //关闭定时器1
CPL P1.0 //开始方波的低电平
MOV TH1,#HIGH(-2500)
MOV TL1,#LOW(-2500)
SETB TR1 //启动定时器1
RETI
END
从P1.0引脚输出一个脉冲波形,高电平持续时间5ms,低电平持续时间12ms,晶振12MHz,用工作方式1编程
查询方法:
ORG 0000H
AJMP MAIN
MAIN: LCALL CSH //初始化设置定时器初值、TMOD、启动定时器
LCALL LOOP
CSH: SETB P1.0
MOV TMOD,#01H //定时器T0工作在方式1定时
MOV TH0,#HIGH(-5000)
MOV TL0,#LOW(-5000)
SETB TR0
RET
LOOP: JNB TF0,$ //等待T0溢出
CLR TR0 //关闭定时器0
CLR TF0 //由于是查询方式,TF0软件清0
CPL P1.0 //开始方波的低电平
MOV TH0,#HIGH(-12000)
MOV TL0,#LOW(-12000)
SETB TR0 //启动定时器0
JNB TF0,$
CLR TR0
CLR TF0
CPL P1.0
MOV TH0,#HIGH(-5000)
MOV TL0,#LOW(-5000)
SETB TR0 //启动定时器0
JMP LOOP
END
中断方法:
ORG 0000H
AJMP MAIN
ORG 001BH
AJMP CL
MAIN: LCALL CSH
JMP $
CSH: MOV R0, #1
SETB P1.0
MOV TMOD,#10H
MOV TH1,#HIGH(-5000)
MOV TL1,#LOW(-5000)
SETB TR1
SETB ET1
SETB EA
RET
CL: CJNE R0,#0,CL1
CLR TR1
SETB P1.0
MOV TH1,#HIGH(-5000)
MOV TL1,#LOW(-5000)
SETB TR1
MOV R0,#1
RETI
CL1: CLR TR1
CLR P1.0
MOV TH1,#HIGH(-12000)
MOV TL1,#LOW(-12000)
SETB TR1
MOV R0,#0
RETI
END