定时/计数器
5.1 结构和工作原理
8051单片机内部有2个16位可编程定时/计数器:
定时/计数器的实质是加1计数器,每经过一个机器周期,计数器自加1
- 定时器是对内部晶振的脉冲进行计数
- 计数器是对外部1信号脉冲进行计数
最短周期:
- 作为定时器时:最短定时周期为1个机器周期。
- 作为计数器时:每个机器周期采样一次引脚电平,一次为“1”,下次为“0”时,计数器加1,为确保计数正确,高、低电平至少保持一个机器周期以上。
5.2 方式寄存器和控制寄存器
5.2.1 方式寄存器TMOD(89H)
TMOD用于控制定时/计数器的功能和工作模式。不能进行位寻址,只能通过整个字节值设定。
T
1
T_1
T1? | | | |
T
0
T_0
T0? | | | |
---|
GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
- GATE门控位
- 可以用于测量TNTO(1)出现的正脉冲宽度
- GATE=1时,INT0(1)=1(保持)且TR0(1)=1,T0(1)计数
- GATE=0时,仅由TR0(1)启动T0(1)。
- 就可以用外部电平控制计数开始
- C/T 功能选择位
- C/T=0时:定时器模式,每个机器周期计数器加1,至溢出
- C/T=1时:计数器模式,对T0, T1的外部输入信号计数
- M1, M0 工作方式选择位
-
M1 | M0 | 工作方式 | 功能 |
---|
0 | 0 | 方式0 | 13位计数器 | 0 | 1 | 方式1 | 16位计数器 | 1 | 0 | 方式2 | 8位自动重装载计数器,TH自动送TL | 1 | 1 | 方式3 | T0分成2个8位计数器 |
当为定时/计数器设置完工作方式,并启动运行后,就不用CPU继续干预,直至计数器计满溢出。所以定时/计数可与CPU同时进行
5.2.2 控制寄存器TCON(88H)
TCON用于控制定时/计数器的启动和停止(TR1, TR0),同时表明了定时/计数器的状态(TF1, TF0)。
T
1
T_1
T1? | |
T
0
T_0
T0? | | 中断相关
T
1
T_1
T1? | | 中断相关
T
0
T_0
T0? | |
---|
TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
- TF1: T1溢出标志。T1溢出时,TF1=1,申请中断(001BH)。进入中断服务程序后,由硬件自动清除。
- TR1: T1运行控制位。1时开始及计数
5.3 计时器的设置
首先,计数的工作方式是终点唯一但是开始值由人设置
起点时间的计算
t
=
T
c
×
(
2
L
-
T
初
)
t=T_c×( 2^{L}-T_{初})
t=Tc?×(2L-T初?)
-
t
t
t是定时时间
-
T
c
T_c
Tc?机器周期,有
T
c
=
12
f
o
s
c
T_c=\frac{12}{fosc}
Tc?=fosc12?
-
L
L
L是计数器位数,一般是16位
-
T
初
T_初
T初?定时器初值
工作的设置流程
- 对TMOD赋值,设置定时计数方式
- 向TH0、TL0写入初始值
- 开放中断(用于中断方式),如不开放则不触发中断
- 通过TR0启动定时/计数器
- 通过TF0判别定时计数是否结束
16位计时器12MHZ最大最小计时
t
m
i
n
=
1
μ
s
t_{min}=1 \mu s
tmin?=1μs
t
m
a
x
=
65.536
m
s
t_{max}=65.536 ms
tmax?=65.536ms
汇编程序
方法并不唯一,仅供参考~
6.1 把单片机片内的30H~7FH 单元清零
ORG 0000H
CLEAR: MOV R0,#30H ;30H 送R0寄存器
MOV R6,#50H ;50H 送R6寄存器(用作计数器)
CLR1: MOV A,#18H ;18 送累加器A
MOV @R0,A ;00 送到30H-7FH 单元
INC R0 ;R0 加1
DJNZ R6,CLR1 ;不到50H个字节,继续
WAIT: LJMP WAIT
END
6.2 片外RAM中1000H~100FH单元中的数传送到片外RAM中2000H~200FH单元
ORG 0000H
MOV DPTR,#1000H
MOV R0,#40H
MOVE1: MOVX A,@DPTR
MOV @R0,A
INC R0
INC DPTR
CJNE R0,#50H,MOVE1
MOV DPTR,#2000H
MOV R0,#40H
MOVE2: MOV A,@R0
MOVX @DPTR,A
INC R0
INC DPTR
CJNE R0,#50H,MOVE2
END
6.3 以PC为基址寄存器,查表求30H单元中BCD码的平方,结果存入31H单元
org 0000h
mov a,30h
add a,#05h
movc a,@a+pc
mov 31H,a
wait: ljmp wait
tab:db 0,1,4,9,16,25,36,49,64,81
end
6.4 2字节无符号数转换成BCD码
ORG 0000H ;get 2bit into BCD 30H,31H,6->40H,41H,42H,43H,44H,45H
MOV R1,#40H
CLR1: MOV @R1,#00H
INC R1
CJNE R1,#46H,CLR1
MOV R6,30H ;count
MOV A,31H ;A=F7H
MOV B,#100 ;B=100
DIV AB ;A/B A=2,B=47
MOV 42H,A ;42H=2
MOV A,B ;A=47
MOV B,#10 ;B=10
DIV AB ;A/B A=4,B=7
MOV 41H,A ;41H=4
MOV 40H,B ;40H=7
ADDEE: MOV A,#06H ;A=6
ADD A,40H ;A=A+40H=13
MOV B,#10 ;B=10
DIV AB ;A/B,A=1,B=3
MOV 40H,B ;40H=B=3
MOV 50H,A ;50H=1
MOV A,#05H ;A=5
ADD A,41H ;A=A+41H=5+4=9
ADD A,50H ;A=A+50H=9+1=10
MOV B,#10 ;B=10
DIV AB ;A/B,A=1,B=0
MOV 41H,B ;41H=0
MOV 50H,A
MOV A,#02H ;A=2
MOV B,#10 ;B=10
ADD A,42H ;A=A+42H=2+2=4
ADD A,50H ;A=A+50H=4+1=5
MOV B,#10
DIV AB ;A=0,B=5
MOV 50H,A ;50H=0
MOV 42H,B ;42H=5
MOV R1,#43H ;R1=43H
HADD: MOV A,@R1 ;A=(43H)
ADD A,50H ;A=A+50H
MOV B,#10 ;B=10
DIV AB ;A/B
MOV @R1,B
MOV 50H,A
INC R1
CJNE R1,#46H,HADD
DJNZ R6,ADDEE
WAIT: LJMP WAIT
END
6.5 将一个字节中的各位逆序排列
org 0000h ;
mov 30h,#82h ;82h=10000010b 0100 0001b=41h
mov a,30h
mov 31h,#00h
mov r3,#08h ;count=8
push1:
mov c,acc.0 ;
rr a
mov 30h,a
mov a,31h
rlc a ;
mov 31h,a
mov a,30h
djnz r3,push1
wait: ljmp wait ;
end
6.6 实现秒表功能
最大定时时间为99.99秒,时间分辨率为0.01秒
sec equ 30h
minsec equ 31h
count equ 33h
org 0000h ;利用定时/计数器T0,实现秒表功能。最大定时时间为99.99秒,时间分辨率为0.01秒
mov sec,#0
mov minsec,#0
mov tmod,#10h ;10minsecond d8f0
mov th1,#0d8h
mov tl1,#0f0h
mov sec,#0
mov minsec,#0
mov count,#100
setb tr1
lp1: jnb tf1,lp1
clr tf1
mov th1,#0d8h
mov tl1,#0f0h
mov a,minsec
add a,#1
da a
mov minsec,a
djnz count,lp1
mov minsec,#0
mov count,#100
mov a,sec
add a,#1
da a
mov sec,a
cjne a,#99h,lp1
mov th1,#0d8h
mov tl1,#0f0h
mov count,#99
lp2: jnb tf1,lp2
clr tf1
mov th1,#0d8h
mov tl1,#0f0h
mov a,minsec
add a,#1
da a
mov minsec,a
djnz count,lp2
mov 36h,#45
wait: ljmp wait
|