你的位置: 首页 > 家电弱电 > 单片机

51单片机的定时/计数器(CTC)及应用

2016-11-02 12:18:50 | 人围观 | 评论:

51单片机内有两个定时/计数器,称为T0和T1,是16位的,所以它们各由两个8位的特殊功能寄存器(SFR)组成,即T0=TH0+TL0,T1=TH1+TL1,默认情况下,通电后它们是不启动的。

一、定时/计数器的应用

1.计数功能:

2.定时功能:

二、定时/计数器的工作原理

定时/计数器中的核心部件为可预置初值计数器。预置初值后开始计数,直至计数值产生溢出,可查询判断此溢出;也可申请中断。

  • 定时/计数器的结构示意图

 

2.定时器的控制、模式寄存器

TMOD定时器方式寄存器(89H)         TCON定时器控制/状态寄存器(88H)

  • 定时实验(采用查询法)

如图,P0口接了8只发光管,高电平亮。用定时器实现50ms延时,轮流点亮。(注:实验时用短路帽短路JMP2的2-3脚和JMP3的2-3脚)

参考程序:

         Org    0000H

Main:    mov    tmod,#00000001B   ;选T0,定时,方式1

         Mov    th0,#3ch

         Mov    tl0,#0b0h          ;预置初值15536

         Setb    tr0                ;启动T0

         Mov    a,#00000001B      ;设置显示模式

Loop:    mov     p0,a

         RL      a

         Jnb      tf0,$             ;等候50ms的溢出

         Clr      tf0

         Mov    th0,#3ch

         Mov    tl0,#0b0h          ;预置初值15536

         Sjmp    loop

思考题:⑴  若定时30ms,怎样修改程序?

⑵  若定时1秒,怎样修改程序?

⑶  若定时任意长时间,怎样修改程序?

  • 计数实验

如图,计数器T0的计数引脚(P3.4脚)接有一开关,每按一次开关,理论上计数器T0就会计一个数(若考虑抖动问题,实际上可能会计多个数),读出该数送P0口,通过P0口的发光管的亮灭情况,读出计数值(设T0计数、用方式2)。

 

参考程序:

         Org    0000H

Main:    mov    P0,#0

mov    tmod,#00000110B    ;选T0,计数,方式2

         Setb    tr0                ;启动T0

Loop:    mov    a,tl0               ;读出T0的低8位值送A寄存器

         Mov   P0,a               ;送P0口显示

         Sjmp   loop

思考题:⑴  若计数100,然后声光指示,怎样修改程序?

⑵  若计数500,然后声光指示,怎样修改程序?

  • 定时、计数联合实验(采用查询法)

任务:定时器T0产生2000Hz方波信号,从P3.6脚输出,再从T1的计数脚P3.5引入;T0还产生1秒的定时信号,定期打开和关闭T1计数器。打开T1时,方波信号输入并计数;关闭T1时,读出T1的值送P0口和P1口显示(注:P1口的值是反相的,即低电平亮,高电平灭。当然可以取反后送P1口)。

参考程序:

;*********************************************************

;*************       数字频率计程序        ***************

;*********************************************************

;任务:利用定时器T0定时,产生2KHz方波,从P3.6脚输出,

;并送P3.5脚(T1的计数脚)进行计数;T0还产生1秒定时,不断地

;打开和关闭T1计数器,并将读取到的频率值送P0口和P1口显示。

 

;分析:2KHz方波,设占空比为50%,则高低电平的时间各为250uS,

;可用T0定时,选方式2,自动重新装载初始值6。T1计数,方式1。

 

;硬件上,将P3.6脚与P3.5脚相连(注意从排针上相连或短路帽短接)即可。

 

               org     0000h

               ljmp    main

;*********************************************************

;主程序

               org     0030h

main:          mov     p0,#0

               mov     p1,#0ffh

                        mov     p3,#0ffh             ;初始化,关闭所有发光管

                        mov     r3,#0

                        mov     r4,#0                     ;r3-r4组成1秒计数器

                        mov     tmod,#01010010B ;T1计数,方式1;

                                                ;T0定时,方式2。

                        mov     th0,#6

                        mov     tl0,#6                 ;预置初始值6,准备计数250

                        mov     th1,#0

                        mov     tl1,#0

                        setb      tr0                    ;启动定时器T0

main_disp:      jnb      tf0,  main_disp

               clr      tf0

                        cpl      p3.6                ;输出方波

                        inc      r3

                        cjne     r3,#0,next

                        inc      r4

               sjmp    main_disp

next:           cjne     r3,#0a0h,main_disp

               cjne     r4,#0fh,main_disp ;判断够4000次计数吗?

                                                 ;因为中断4000次为1秒。

                        mov      r3,#0

                        mov      r4,#0                    ;1秒计数器清0

                        cpl       tr1                       ;启动或关闭T1计数器

                        jb        tr1,main_disp    ;若T1启动则返回,否则去读取频率值

                        mov      a,tl1

                        mov      P0,a            ;将频率值的低8位送P0口显示

                        mov      a,th1

               cpl       a               ;考虑P1口是低电平点亮,故取反

                        mov      P1,a            ; 将频率值的高8位送P1口显示

                        mov      tl1,#0

                        mov      th1,#0                  ;T1计数器清0

                        ljmp      main_disp

               end

;注:以上送P1和P0口的数据为16进制。经实验,得到的16进制值为07H、0D0H。

;***************************************************************





标签: