使用内部T2定时器制作时钟

使用内部T2定时器制作时钟

 

目标:

使用89c52内部T2定时器制作时钟,每10ms中断一次,自动装载初值,向上计数溢出。

 

 

定时器2的资料:

 

 

T2的控制寄存器的功能描述如下:

T2CONT2的控制寄存器),字节地址0C8H

位地址   0CFH    0CEH   0CDH   0CCH   0CBH   0CAH   0C9H   0C8H

     TF2     EXF2   RCLK   TCLK   EXEN2  TR2    C/T2   CP/RT2

各位的定义如下:

TF2:定时/计数器2溢出标志,T2溢出时置位,并申请中断。只能用软件清除,但T2作为波特率发生器使用的时候,(RCLK=1TCLK=1),T2溢出时不对TF2置位。

EXF2:当EXEN2=1时,且T2EX引脚(P1.0)出现负跳变而造成T2的捕获或重装的时候,EXF2置位并申请中断。EXF2也是只能通过软件来清除的。

RCLK:串行接收时钟标志,只能通过软件的置位或清除;用来选择T1RCLK=0)还是T2RCLK=1)来作为串行接收的波特率产生器

TCLK:串行发送时钟标志,只能通过软件的置位或清除;用来选择T1TCLK=0)还是T2TCLK=1)来作为串行发送的波特率产生器

EXEN2T2的外部允许标志,只能通过软件的置位或清除EXEN2=0:禁止外部时钟触发T2EXEN2=1:当T2未用作串行波特率发生器时,允许外部时钟触发T2,当T2EX引脚输入一个负跳变的时候,将引起T2的捕获或重装,并置位EXF2,申请中断。

TR2T2的启动控制标志;TR2=0:停止T2TR2=1:启动T2

C/T2T2的定时方式或计数方式选择位。只能通过软件的置位或清除;C/T2=0:选择T2为定时器方式C/T2=1:选择T2为计数器方式,下降沿触发。

CP/RT2:捕获/重装载标志,只能通过软件的置位或清除CP/RT2=0时,选择重装载方式,这时若T2溢出(EXEN2=0时)或者T2EX引脚(P1.0)出现负跳变(EXEN2=1时),将会引起T2重装载;CP/RT2=1时,选择捕获方式,这时若T2EX引脚(P1.0)出现负跳变(EXEN2=1时),将会引起T2捕获操作。但是如果RCLK=1TCLK=1时,CP/RT2控制位不起作用的,被强制工作于定时器溢出自动重装载模式。

T2MOD(方式寄存器),字节地址0C9H

 

D7     D6       D5      D4       D3      D2      D1     D0

--      --      --      --       --      --      T2OE   DCEN

T2OET2输出允许位,当T2OE=1的时候,允许时钟输出到P1.0。(仅对80C54/80C58有效

DCEN向下计数允许位DCEN=1是允许T2向下计数,否则向上计数。

 

T2的数据寄存器TH2TL2T0T1的用法一样,而捕获寄存器RCAP2HRCAP2L只是在捕获方式下,产生捕获操作时自动保存TH2TL2的值。

    以上是T2的相关寄存器的描述,其实用法上跟T0T1是差不多的,只是功能增强了,设置的东西多了而已。

定时/计数器2其实用到最多的就是T2CON这个寄存器啦,它设定的定时和计数的方式。有三种工作方式,捕获,自动重装,波特率发生器。下面我是在百度百科里面找的少许资料:

捕获方式: 

  在捕获方式下,通过T2CON 控制位EXEN2 来选择两种方式。如果EXEN2=0,定时器2 是一个16 位定时器或计数器,计数溢出时,对T2CON 的溢出标志TF2 置位,同时激活中断。如果EXEN2=1,定时器2 完成相同的操作,而当T2EX 引脚外部输入信号发生1 至0 负跳变时,也出现TH2 和TL2 中的值分别被捕获到RCAP2H 和RCAP2L 中。另外,T2EX 引脚信号的跳变使得T2CON 中的EXF2 置位,与TF2 相仿,EXF2 也会激活中断。捕获方式如图4 所示。 

自动重装载(向上或向下计数器)方式: 

  当定时器2工作于16位自动重装载方式时,能对其编程为向上或向下计数方式,这个功能可通过特殊功能寄存器T2CON(见表5)的DCEN 位(允许向下计数)来选择的。复位时,DCEN 位置“0”,定时器2 默认设置为向上计数。当DCEN置位时,定时器2 既可向上计数也可向下计数,这取决于T2EX 引脚的值,参见图5,当DCEN=0 时,定时器2 自动设置为向上计数,在这种方式下,T2CON 中的EXEN2 控制位有两种选择,若EXEN2=0,定时器2 为向上计数至0FFFFH 溢出,置位TF2 激活中断,同时把16 位计数寄存器RCAP2H 和RCAP2L重装载,RCAP2H 和RCAP2L 的值可由软件预置。若EXEN2=1,定时器2 的16 位重装载由溢出或外部输入端T2EX 从1 至0 的下降沿触发。这个脉冲使EXF2 置位,如果中断允许,同样产生中断。 

定时器2 的中断入口地址是:002BH ——0032H 。 

  当DCEN=1 时,允许定时器2 向上或向下计数,如图6 所示。这种方式下,T2EX 引脚控制计数器方向T2EX 引脚为逻辑“1”时,定时器向上计数,当计数0FFFFH 向上溢出时,置位TF2,同时把16 位计数寄存器RCAP2H 和RCAP2L重装载到TH2 和TL2 中。 T2EX 引脚为逻辑“0”时,定时器2 向下计数,当TH2 和TL2 中的数值等于RCAP2H 和RCAP2L中的值时,计数溢出,置位TF2,同时将0FFFFH 数值重新装入定时寄存器中。 

当定时/计数器2 向上溢出或向下溢出时,置位EXF2 位。 

波特率发生器: 

  当T2CON(表3)中的TCLK 和RCLK 置位时,定时/计数器2 作为波特率发生器使用。如果定时/计数器2 作为发送器或接收器,其发送和接收的波特率可以是不同的,定时器1 用于其它功能,如图7 所示。若RCLK 和TCLK 置位,则定时器2工作于波特率发生器方式。 

  波特率发生器的方式与自动重装载方式相仿,在此方式下,TH2 翻转使定时器2 的寄存器用RCAP2H 和RCAP2L 中的16位数值重新装载,该数值由软件设置。 

  在方式1 和方式3 中,波特率由定时器2 的溢出速率根据下式确定: 

方式1和3的波特率=定时器的溢出率/16

 定时器既能工作于定时方式也能工作于计数方式,在大多数的应用中,是工作在定时方式(C/T2=0)。定时器2 作为波特率发生器时,与作为定时器的操作是不同的,通常作为定时器时,在每个机器周期(1/12 振荡频率)寄存器的值加1,而作为波特率发生器使用时,在每个状态时间(1/2 振荡频率)寄存器的值加1。波特率的计算公式如下: 

  方式1和3的波特率=振荡频率/{32*[65536-(RCP2H,RCP2L)]}式中(RCAP2H,RCAP2L)是RCAP2H 和RCAP2L中的16 位无符号数。 

  定时器2 作为波特率发生器使用的电路如图7 所示。T2CON 中的RCLK 或TCLK=1 时,波特率工作方式才有效。在波特率发生器工作方式中,TH2 翻转不能使TF2 置位,故而不产生中断。但若EXEN2 置位,且T2EX 端产生由1 至0 的负跳变,则会使EXF2 置位,此时并不能将(RCAP2H,RCAP2L)的内容重新装入TH2 和TL2 中。所以,当定时器2 作为波特率发生器使用时,T2EX 可作为附加的外部中断源来使用。需要注意的是,当定时器2 工作于波特率器时,作为定时器运行(TR2=1)时,并不能访问TH2 和TL2。因为此时每个状态时间定时器都会加1,对其读写将得到一个不确定的数值。 

  然而,对RCAP2 则可读而不可写,因为写入操作将是重新装载,写入操作可能令写和/或重装载出错。在访问定时器2或RCAP2 寄存器之前,应将定时器关闭(清除TR2)。 


 

T2定时器程序编写流程

 

T2定时器设置步骤:

 

第一步:设置T2MOD确定工作方式【向下计数法】

 

 

第二步:装初值【10ms一次中断

 

第三步:中断运行方式

 

 

第四步:开中断

 

 

 

第五步:中断服务程序:

 

 

 

 


项目实测:

中断服务程序中采用定时器2自动重装初值,虽然已经完全消除了“装值”产生的时间误差,但是在进入中断,出中断这个过程中还是产生了时间上的微小误差。由此带来的软件误差为每10ms1us的时间误差出现。这在程序中已经修正!到此,在软件上这个程序是绝对精准,但是由于硬件质量及环境等因素影响,依然产生了硬件误差。

 

 

下表是统计了24个小时之后得出的汇总:

说明:在20130826日晚21:33:45开始启动时钟测试

起始时间

此时北京时间

北京时间时间差

时钟上的时间

误差

21:33:45

7:53:48

10:20:03

10:20:00

-3

21:33:45

7:58:45

10:25:00

10:24:57

-3

21:33:45

9:31:15

11:57:30

11:57:26

-4

21:33:45

9:31:45

11:58:00

11:57:56

-4

21:33:45

9:33:49

12:00:04

12:00:00

-4

21:33:45

9:34:09

12:00:24

12:00:20

-4

21:33:45

15:09:25

17:35:40

17:35:34

-6

21:33:45

15:09:41

17:35:56

17:35:50

-6

21:33:45

21:30:25

23:56:25

23:56:32

-7

21:33:45

21:30:48

23:57:03

23:56:55

-8

21:33:45

21:31:08

23:57:23

23:57:15

-8

 

由此表记录的数据及观察白天可以得出一个结论:硬件误差是每三个小时时钟慢一秒钟。此处是人眼记录,可能偏差较大,但是不会超过300ms。到此此时钟硬件误差也得到修正,实际上还可以继续修正硬件误差,只是比较费时费力,需要统计一个月,再统计一年的误差,再修正。到目前为止,此时钟已是相当精准的,未硬件误差修正之前一年的误差为48分钟6秒,修正之后,可以确保一年的时间误差在5分钟之内。

 

发布了29 篇原创文章 · 获赞 6 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览