加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

定时器工作原理(二)

(2011-08-29 17:45:17)
标签:

定时器

计数器

杂谈

分类: 单片机

定时器/计数器工作方式与程序设计

通过对特殊功能寄存器TMOD中的设置M1M0两位的设置来选择四种工作方式,定时器/计数器012的工作方式相同,方式3的设置差别较大。

6.3.1        工作方式0

工作方式寄存器TMOD中的M1M0为:00。定时器/计数器T0工作在方式0时,16位计数器只用了13位,即TH0的高8位和TL0的低5位,组成一个13位定时器/计数器。当TL0的低5位计满溢出时,向TH0进位,TH0溢出时,对中断标志位TF0置位,向CPU申请中断。定时器/计数器0方式0的逻辑结构如图6.2所示。

 

 

 


1.工作在定时方式

C/ 0,定时器对机器周期计数。定时器在工作前,应先对13位的计数器赋值,开始计数时,在初值的基础上进行减1计数。

定时时间的计算公式为:

定时时间=(213计数初值)×晶振周期×12

             定时时间=(213计数初值)×机器周期

若晶振频率为12MHz,则最短定时时间为

[213(2131)]×(1/12)×106×121 μs

最长定时时间为

2130×1/12×106×128 192 μs

2.工作在计数方式

C/ 113位计数器对外部输入信号进行加1计数。

利用 0变为1时,开始计数, 1变为0时,停止计数,可以测量在 端出现的正脉冲的宽度。计数值的范围是1~213=8192 (个外部脉冲)

【例6.2】假设AT89S52单片机晶振频率为12MHz,要求定时时间8ms,使用定时器T0,工作方式0,计算定时器初值X

解: t = 213 –X×机器周期

       当单片机晶振频率为12MHz时,机器周期=1μs

    8×103 = 213 –X×1

       X = 8192-8000 = 192

       转换成二进制数为:11000000B

【例6.3】假设AT89S52单片机晶振频率为12MHz,所需定时时间为250μs,当T0工作在方式0T0计数器的初值是多少?

解: t = 213 –X×机器周期

       当单片机晶振频率为12MHz时,机器周期=1μs

    250 = 213 –X0×1

       X 0= 8192-250 = 7942

       转换成二进制数为:1111100000110B

【例6.4】利用T0方式0产生1ms的定时,在P1.2引脚上输出周期为2ms的方波。设单片机晶振频率fosc12MHz

解:(1)解题思路

要在P1.2引脚输出周期为2ms的方波,只要使P1.2每隔1ms取反一次即可。执行指令为CPL  P1.2

2)确定工作方式 方式 TMOD=00H

 

 


C/ 0T0为定时功能;(D2位)

GATE0,只要用软件使TR0(或TR1)置1就能启动定时器T0(或T1);

    M1M0 = 00,工作方式0

    TMOD的值为 = 00H

    TMOD.4~TMOD.7可取任意值,因T1不用,这里取0值。

    使用 MOV  TMOD , #00H 即可设定T0的工作方式

3)计算1 ms定时时T0的初值

机器周期  T = 1fosc×12 = 1μs

计数个数:X =1ms/lμs = 1000

T0的计数初值为x0,则 x0 (213X)s

                          8192—1000

                          7192D

  转换成二进制数为:11100000  11000B 


                                      8   5

   将高811100000 = 0E0H装入TH0

   将低511000 = 18H装入TL0

 

 

 

 

 

 


                                                 1

    EA = 1 ,CPU开放中断;

    ET0 = 1,允许T0中断;

4)编程

可采用中断和查询两种方式编写程序。

方法一:中断方式

ORG  0000H

               AJMP  MAIN         ;转主程序MAIN

               ORG  000BH

               AJMP  IT0P           ;转T0中断服务程序IT0P       

               ORG  1000H

 MAINMOV   SP#60H     ;设堆栈指针

               MOV  TH0 , #0E0H      ;给定时器T0送初值

        MOV TMOD#00H    ;设置T0为方式0,定时

        MOV  TL0 , #18H     ;送定时初值

        MOV TH0#0E0H

SETB  EA            CPU开中断

        SETB  ET0           T0允许中断

        SETB TR0             ;启动T0定时

HERE SJMP   HERE         ;等待中断

中断服务程序:

IT0P  ORG   1200H         T0中断入口

       MOV   TL0#18H     ;重新装入计数初值 

        MOV  TH0#0E0H 

        CPL   P1.2             ;输出方波

        RETI                   ;中断返回 END

方法二:查询方式

            MOV  TMOD#00H   ;设置T0为方式0,定时

            MOV  TL0#18H      ;送初值

            MOV  TH0#0E0H 

            SETB  TR0            ;启动T0定时

LOOP JBC   TF0NEXT     ;查询定时时间到否?

            SJMP  LOOP

NEXTMOV  TL0#18H      ;重新装入计数初值

           MOV TH0#0E0H

           CPL   P1.2             ;输出方波

       SJMP  LOOP           ;重复循环

6.3.2        工作方式1

工作方式寄存器TMOD中的M1M0为:01。定时器T0工作方式1与工作方式0类同,差别在于其中的计数器的位数。工作方式116位计数器参与计数。

定时器/计数器0方式1的逻辑结构如图6.3所示。

 


1.工作在定时方式

C/ 0,定时器对机器周期计数。定时时间的计算公式为:

定时时间=(213计数初值)×晶振周期×12

             定时时间=(213计数初值)×机器周期

若晶振频率为12MHz,则最短定时时间为

[216(2161)]×(1/12)×106×121 μs

最长定时时间为

2160×1/12×106×1265 536 μs65.5 ms

2.工作在计数方式

C/ 116位计数器对外部输入信号进行加1计数。计数值的范围是1~216=65 536 (个外部脉冲)

【例6.5】假设AT89S52单片机晶振频率为12MHz,所需定时时间为10ms,当T0工作在方式1T0计数器的初值是多少?

解: t = 216 –X0×机器周期

       当单片机晶振频率为12MHz时,机器周期=1μs

    10×103 = 213 –X0×1

       X = 65536-10000 = 55536

    转换成二进制数为:1101100011110000 B = 0D8F0H

【例6.6】假设AT89S52单片机晶振频率为12MHz,定时器T0的定时初值为9800,计算T0工作在方式1时的定时时间。

解: t = 216 –X0×机器周期

       当单片机晶振频率为12MHz时,机器周期=1μs

    t = 216 –9800×1

       t = 65536-9800 = 55736μs

【例6.7 用定时器T0产生50HZ的方波。由P1.0输出此方波(设时钟频率为12MHZ)。采用中断方式。

解:50HZ的方波周期T  T = 1/50 = 20ms

 

 

 

 

可以用定时器产生10ms的定时,每隔10ms改变一次P1.0的电平,即可得到50HZ的方波。

定时器T0应工作在方式1

1)工作在方式1时的T0初值,根据下式计算:

     t = 216 –X×机器周期

       时钟频率为12MHz,则机器周期 = 1µs

     10×103 = 216 –X× 1

     X = 65536 – 10000 = 55536

转换为二进制数:11011000   11001100B

  

                 8     8

8 = 0D8H装入TH0,低8 = 0CCH装入TL0

2)程序

ORG  0000H                 

             AJMP  MAIN

                 ORG  000BH                     T0的中断入口地址

AJMP  T0INT

                 ORG  0100H

MAIN MOV  TMOD , #01H      ;设置T0为工作方式1

MOV  TH0 , #0D8 H       ;装入定时器初值

MOV  TL0 , #0CC H

SETB  ET0                     ;设置T0允许中断

SETB  EA             CPU开中断

SETB  TR0                     ;启动T0

SJMP                         ;等待中断

 

中断服务程序;

ORG  0300H

T0INTCPL  P1.0                 P1.0取反

MOV  TH0 , #0D8H ;重新装入定时初值

MOV  TL0 , #0CCH

RETI

 

注:  SETB  ET0                     ;设置T0允许中断

SETB  EA             CPU开中断

这两条指令可以等效为  MOV  IE , #82H

6.3.3        工作方式2

定时器/计数器0方式2的逻辑结构如图6.4所示。

工作方式寄存器TMOD中的M1M0为:10

定时器/计数器在工作方式2时,16位的计数器分成了两个独立的8位计数器THTL。此时,定时器/计数器构成了一个能重复置初值的8位计数器。

其中,TL用作8位计数器,TH用来保存计数的初值。每当TL计满溢出时,自动将TH的初值再次装入TL

1.工作在定时方式

C/ 0,定时器对机器周期计数。定时时间的计算公式为:

定时时间=(28计数初值)×晶振周期×12

             定时时间=(28计数初值)×机器周期

若晶振频率为12MHz,则最短定时时间为

[28(281)]×(1/12)×106×121 μs

最长定时时间为

280×1/12×106×12256 μs

 

 


2.工作在计数方式

C/ 18位计数器对外部输入信号进行加1计数。计数值的范围是1~28=256 (个外部脉冲)

【例6.8】利用T0方式2实现以下功能:

T0(P3.4)引脚每输入一个负脉冲时,使P1.0输出一个500μs的同步脉冲。设晶振频率为6MHz,请编程实现该功能。其波形如图6.5所示。

 

6.5  6.6波形图

(1) 确定工作方式

首先选T0为方式2,外部事件计数方式。当P3.4引脚上的电平发生负跳变时,T0计数器加1,溢出标志TF01;然后改变T0500μs定时工作方式,并使P1.0输出由1变为0T0定时到产生溢出,使P1.0引脚恢复输出高电平。T0先计数,后定时,分时操作。

根据题目要求方式控制字TMOD是:

计数时:(TMOD) = 0000 0110B = 06H

定时时:(TMOD) = 0000 0010B = 02H

2)计算初值

机器周期T = 12fosc = 12/6MHZ =2μs

计数时:计数个数  X = 1

计数初值 = (256X) = (2561) =255=0FFH(TH0)=(TL0)=0FFH

定时时:计数个数  X =Т/ Tm= 500μs2μs =250

定时初值 = 256X = 256250 = 6

(TH0) = (TL0) = 06H    

3)编程方法

采用查询方法

STARTMOV  TMOD#06H       T0方式2,外部计数方式

            MOV  TH0#0FFH        T0计数初值

            MOV  TL0#0FFH

            SETB  TR0                ;启动T0计数

LOOPlJBC  TF0PTF01    ;查询T0溢出标志,TF01时转移,

TF00(P3.4负跳变)

            SJMP LOOPl

PTF01CLR TR0             ;停止计数

            MOV  TMOD#02H  T0方式2,定时

            MOV  TH0#06H    T0定时500μs初值

            MOV  TL0#06H

            CLR   P1.0           P1.00

            SETB  TR0           ;启动定时500μs

LOOP2JBC  TF0PTF02     ;查询溢出标志,定时到TF0=l 转移,

TF00(第一个500μs到否?)

            SJMP  LOOP2

PTF02SETB  P1     P1.01(到了第一个500μs)

            CLR  TR0                       ;停止计数

            SJMP  START

6.3.4        工作方式3

工作方式寄存器TMOD中的M1M0为:11。工作方式3仅对定时器/计数器0有效,此时,将16位的计数器分为两个独立的8位计数器TH0TL0。当定时器/计数器0工作在方式3时,定时器/计数器1只能工作在方式02,并且工作在不需要中断的场合。

在一般情况下,当定时器/计数器1用作串行口波特率发生器时,定时器/计数器0才设置为工作方式3。此时常把定时器/计数器1设置为方式2,用作波特率发生器。

定时器/计数器0在方式3下的逻辑结构如图6.6所示。

 


【例6.9】设某用户系统中已使用了两个外部中断源,并置定时器T1工作在方式2,作串行口波特率发生器用。现要求再增加一个外部中断源,并由P1.0引脚输出一个5kHz的方波。fosc=12MHz

(1) 确定工作方式

T0方式3下,TL0作计数用,而TH0可用作8位的定时器,定时控制P1.0引脚输出5kHz的方波信号。T1为方式2,定时。

TMOD是: 0010 0111B = 27H

(2) 计算初值

TL0初值:FFHTH0初值X0计算如下:

P1.0的方波频率为5kHz,故周期

T1/(5kHz)=0.2ms=200μs

TH0定时100μs时,

X0256100×1212=156

3)程序如下:

MOV  TMOD#27H     T0为方式3,计数;T1为方式2,定时

         MOV  TL0 #0FFH     ;置TL0计数初值

         MOV  TH0 #156      ;置TH0计数初值

         MOV  THl #data      data是根据波特率要求设置的常数(即初值)

         MOV  TLl #data 

         MOV  TCON#55H     ;外中断0,外中断1边沿触发,启动T0T1

         MOV IE#9FH          ;开放全部中断

      

         TL0溢出中断服务程序(000BH转来)

TL0INT MOV TL0#0FFH      TL0重赋初值(中断处理)

         RETI

 

         TH0溢出中断服务程序(001BH转来)

TH0INTMOV TH0#156        TH0重新装入初值

         CPL    P1.0           ;输出波形

         RETI

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有