关于定时器初值的设定

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

深入理解需要精通定时器溢出原理:

晶振时钟12分频后得到机器时钟,定时器启动后会按机器时钟进位,16bit模式,定时器溢出频率就是机器时钟除以定时器多余“空间”,

例如定时器初值是0xffff,则每1个机器时钟都会溢出,产生中断

例如定时器初值是0xfffe,则每2个机器时钟会溢出

……

例如定时器初值是【65535(0xffff)-999】,则每1000个机器时钟会溢出,或

例如定时器初值是【65536-1000】,则每1000个机器时钟会溢出

……

依次类推

实例

例如:设T0工作方式1定时,定时时间为2ms,在P1.0引脚上输出周期为4ms的方波,设单片机的晶振频率为12MHz。

解:要在P1.0输出周期为4ms的方波,即要使P1.0每隔2ms取反1次。

T0方式1定时,则T0的方式字为:TMOD=01H

计算2ms定时T0的初值:

12M晶振,机器周期为1M,2ms就是X个机器周期

X=T(2ms)/T0(1s/(12M/12))=0.002/1/1000000=2000

定时器初值就是65536-X=65536-2000=63536=F830H

其中将高8位F8H赋给TH0,低8位30H赋给TL0。

采用查询方法,编程如下:

1.

0000H

3.AJMP MAIN

4.

O 0100H

6.MAIN: MOV TMOD,#01H

7.MOV TL0,#30H

8.MOV TH0,0F8H

9.SETB TR0

10.LOOP: JBC TF0,NEXT

11.SJMP LOOP

12.NEXT: MOV TL0,#30H

13.MOV TH0,#0F8H

14.CPL P1.0

15.SJMP LOOP

复制代码

采用中断的方法,编程如下:

0000H

2.AJMP MAIN

0013H

4.AJMP INT

5.

0100H

7.MAIN: MOV SP,#60H 堆栈指针

8.MOV TMOD,#01H

9.MOV TL0,#30H

10.MOV TH0,#0F8H

11.SETB TR0

12.SETB ET0

13.SETB EA

14.LOOP: SJMP LOOP

15.//中断服务程序:

0300H

17.INT: MOV TL0,#30H

18.MOV TH0,#0F8H

19.CPL P1.0

20.RETI

复制代码

1.TH0 = (65536-CLOCK/TIME_PER_SEC/12) / 256;

2.TL0 = (65536-CLOCK/TIME_PER_SEC/12) % 256;

1.TH0 = (65536-CLOCK/TIME_PER_SEC/12) / 256;

2.TL0 = (65536-CLOCK/TIME_PER_SEC/12) % 256;

如果对于任意晶振,特别是不好计算的,那么只需要先写出1ms的定时,再乘以相应的系数,例如要定时50ms,则

TH0 = (65536-50*CLOCK/1000/12) / 256;

TL0 = (65536-50*CLOCK/1000/12) % 256;

对于12M晶振来说,THO=(65536-50000)/256

对于6M晶振来说,THO=(5536-25000)/6

相关文档
最新文档