51单片机 笔记(四)定时计数器和程序设计

定时/计数器

5.1 结构和工作原理

8051单片机内部有2个16位可编程定时/计数器:

  • 定时计数器0
  • 定时计数器1。

定时/计数器的实质是加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
GATEC/TM1M0GATEC/TM1M0
  • 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 工作方式选择位
    • M1M0工作方式功能
      00方式013位计数器
      01方式116位计数器
      10方式28位自动重装载计数器,TH自动送TL
      11方式3T0分成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
TF1TR1TF0TR0IE1IT1IE0IT0
  • 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×(2LT)

  • 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定时器初值

工作的设置流程

  1. 对TMOD赋值,设置定时计数方式
  2. 向TH0、TL0写入初始值
  3. 开放中断(用于中断方式),如不开放则不触发中断
  4. 通过TR0启动定时/计数器
  5. 通过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
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wxyice

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值