定时器解决方案备忘录

  • 浙江工业大学信息工程学院单片机实验

P2.0接LED模块J12的A

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    ORG     0000H
RESET:
LJMP MAIN
ORG 000BH //定时器中断0入口
LJMP T0_INT
ORG 0100H

MAIN:
MOV SP,#60H
MOV TMOD,#01H //计时工作方式1
MOV 30H,#00H //定时器超时一百次,达到64h即一秒
//12MHz,机器周期1μs,需要10000个计数,初值=65536-10000=55536=D8F0H
MOV TH0,#0D8H
MOV TL0,#0F0H
SETB P2.0
SETB ET0 //开放T0中断和总中断
SETB EA
SETB TR0 //启动T0
JNB TF0,$ //wait for TF0

T0_INT:
PUSH PSW //保护状态字寄存器
PUSH ACC
CLR EA //关闭总中断
MOV TH0,#0D8H
MOV TL0,#0F0H
INC 30H
MOV A,30H
CJNE A,#100,CONTINUE_T0
MOV 30H,#00H //定时器超时一百次,达到64h即一秒
CPL P2.0

CONTINUE_T0:
SETB EA //开总中断
POP ACC
POP PSW //保护状态字寄存器
RETI

END

Tips

定时器0还是定时器1
晶振频率是6Mhz还是12Mhz(这里使用的是12MHz,则12个晶振周期—>机器周期1μs)
方式1:最多2^16=65536*1μs=65.5ms
方式2:最多2^8=256μs但自动重装载


定时器调试

  • 设置一百次10ms定时器溢出后断点调试,发现右下角时间刚好为1s
  • (不精准,由于时钟实际11.0592)

请我喝杯咖啡吧~