单片机之定时器/计数器总结
准备工作: 基础
(一)两种个工作方式:
1、定时工作方式,加1信号由振荡器的12分频产生,即每过一个机器周期,计数值增1,直至计满溢出为止。
2、计数工作方式,通过引脚T0和T1对外部信号计数,外部脉冲的下降沿触发计数, 当输入脉冲信号从1到0的负跳变时,计数器就自动加1,外部输入的计数脉冲的最高频率为系统振荡频率的1/24,外部输入信号脉冲宽度至少保持1个机器周期。
(二)16位的定时器/计数器分别由两个专用寄存器组成,即T0由TH0和TL0构成;T1由TH1和TL1构成,这些寄存器由于存放定时和计数初值。
(三)两个重要的寄存器:
一个是8位的TMOD,另一个是8位的TCON
TMOD 主要用于选定定时器的工作方式 TMOD GATE C/T M1 M0 GATE C/T M1 M0
TCON主要用于控制定时器的启动与停止 TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
控制计数器运行是根据 门控位gate和外部引脚Int0或Int1 以及TRX来决定
(四)定时器/计数器有四种工作方式:
T0有四种工作方式,T1有三种工作方式。
(1) 方式0:13位计数器方式
溢出值是:213=8192
(2) 方式1:16位计数器方式
溢出值是:216=65536
(3) 方式2:8位自动重装初值方式
溢出值是:28=256
(4) 方式3:T0分成两个独立的8位计数器方式
(五)接着比较重要的是定时器/计数器的初始化
初值X的计算:X = M - 计数值(计数次数)
实战:
写了两个比较简单的应用程序
1.流水灯控制程序(半秒点亮一个灯,如果你想要相隔时间更长的话则需要更换晶振,我开发板上的晶振是 12MHZ的所以就定半秒了)功能已在开发板上实现,代码:
org 0000h
ljmp main
org 000bh
ljmp loop
main:mov tmod,#01h
mov tcon,#10h
mov ie,#82h
mov th0,#3ch
mov tl0,#0b0h
mov a,#0feh
mov p1,a
sjmp $
loop:rl a
mov p1,a
mov th0,#3ch
mov tl0,#0b0h
reti
End
2.根据T0(P3.4)输入低频负脉冲,要求P3.4每次发生负调变时,P1.0输出一个1ms的方波,看书花了将近20分钟才看懂了后改编,这里的系统晶振得6MHZ才行 代码:
org 0000h
ljmp main
org 000bh
ljmp t0i
org 001bh
ljmp t1i
main: mov tmod,#25h
mov ie,#82h
mov ip,#0ah
mov tcon,#10h
mov th0,#0ffh
mov tl0,#0ffh
mov th1,#06h
mov tl1,#06h
clr f0
loop: jnz f0,loop
setb et1
setb tr1
loop1: ajmp loop1
t0i: clr tr0
setb f0
reti
t1i: cpl p1.0
reti
至于门控位它可用于计算脉冲宽度代码更简单只需设置 tmod即可 代码就不放在这了
待续…………