您的位置:控制工程论坛网论坛 » 教程与手册 » MCS51定时器2的说明

常青树

常青树   |   当前状态:在线

总积分:1421  2024年可用积分:0

注册时间: 2008-09-28

最后登录时间: 2012-05-30

空间 发短消息加为好友

MCS51定时器2的说明

常青树  发表于 2008/10/7 7:28:38      795 查看 0 回复  [上一主题]  [下一主题]

手机阅读

MCS51定时器2的说明

我查了许多的51的书,包括何立民编的大学教材<<单片机初级/中级/高级教程>>发现都没有定时器2的描述,最后终于在由清华大学出版的孙育才等编著的"ATMEL新型AT89S52系列单片机及其应用"这本书中找到了关于定时器2的描述,可见国内的书籍连抄都没捡好的抄,这样怎么能提高我国的电子科技水平呢?我在这里并不是要针对某个人,而是当我遇到想查资料时,竞在许多书里找不到答案.同时我发现以前有一本北京威力姆电子技术有限公司出版的"AT89系列单片机技术手册"1996版 中也有关于定时器2的描述.我开始研究定时器2是从看了http://www.xhl.com.cn 潘琢金 翻译的 "C8051F02xVER1_4.pdf", 我感觉这份资料翻译的相当详细,使我彻底了解了UART0的波特率是用定时器2产生的,不要怀疑.当定时器2是缺省值#00H时,UART0的波特率可以用定时器1产生.在C8051F02X中,UART1的波特率是用定时器4产生的.当定时器4是缺省值#00H时,UART1的波特率也可以用定时器1产生.
附录:定时器2控制寄存器 T2CON: C8H
T2CON: TF2EXF2RCLK0TCLK0EXEN2TR2C/T2CP/RL2;复位值: 00H
位7: TF2: 定时器2溢出标志 ;0 - 未检测到定时器2溢出, 1 - 定时器2发生溢出
位6: EXF2: 定时器2外部标志 ;当T2EX 输入引脚的负跳变导致发生捕捉或重载并且EXEN2 为逻辑1 时, 该位由硬件置位。
在定时器2 中断被允许时, 该位置‘1’使CPU 转向定时器2的中断服务程序。
该位不能由硬件自动清0,必须用软件清0。
位5: RCLK0: UART0 接收时钟标志 ;选择UART0 工作在方式1 或3 时接收时钟使用的定时器。
0 - 定时器1 溢出作为接收时钟, 1 - 定时器2 溢出作为接收时钟。
位4: TCLK0: UART0 发送时钟标志 ;选择UART0 工作在方式1 或3 时发送时钟使用的定时器。
0 - 定时器1 溢出作为发送时钟, 1 - 定时器2 溢出作为发送时钟。
位3: EXEN2: 定时器2 外部允许 ;当定时器2 不是工作在波特率发生器方式时,允许T2EX 上的负跳变触发捕捉或重载。
0 - T2EX 上的负跳变被忽略, 1 - T2EX 上的负跳变导致一次捕捉或重载。
位2: TR2:定时器2 运行控制 ;该位允许/禁止定时器2。0 - 定时器2 禁止, 1 - 定时器2 允许。
位1: CT2:计数器/定时器功能选择
0 - 定时器功能: 定时器2 由T2M(CKCON.5)定义的时钟加1。
1 - 计数器功能: 定时器2 由外部输入引脚(T2)的负跳变加1。
位0: CPRL2: 捕捉/重载选择;该位选择定时器2 为捕捉还是自动重装载方式。
EXEN2 必须为逻辑1 才能使T2EX 上的负跳变能够被识别并用于触发捕捉和重载。
若RCLK0 或TCLK0 被置位, 该位将被忽略, 定时器2 将工作在自动重装载方式。
0 - 当定时器2 溢出或T2EX 上发生负跳变时将自动重装载(EXEN2=1)。
1 - 在T2EX 发生负跳变时捕捉(EXEN2=1)。
RCLK0TCLK0CP/RL2TR2方式
0011带捕捉的16位计数器/定时器
0001自动重装载的16位计数器/定时器
01X1UART0波特率发生器
10X1UART0波特率发生器
11X1UART0波特率发生器
XXX0关闭



早就知道 S52单片机中含有 定时器2 这个功能,但是一直没有用过,自从使用STC系列单片机之后,里面也含有定时器2的功能, 刚好前一段时间调试的一个程序中,定时器0 和定时器1 都占用了,系统的资源有些紧张,于是想到了开发出定时器2来,放着也是浪费,经过几个小时的努力,看资料,找程序资料,pdf文档资料,终于写出来了一个测试程序,以后单片机就可以有3个定时器使用了,真的很反方便!
下面的这个就是一个简单的测试程序,注释什么的等以后有时间再加上吧,最近的事忙得有点吃不消了!
(刚刚回来有点不适应,又感冒了。。。


#include "STC89C51RC_RD_PLUS.H"
sbit led = P2^0;
unsigned char count;
void main()
{
count =0;
T2CON=0x04;
    T2MOD=0x00;
TH2=0x3C;
      TL2=0xB0;
      RCAP2H=0x3C;
      RCAP2L=0xB0;
      TR2=1;
      ET2=1;
TL2 = (65536-50000) % 256;
TH2 = (65536-50000) / 256;
EA = 1;
TR2 = 1;
ET2 = 1;
while(1)
{
}
}
void timer2 (void) interrupt 5
{
EA = 0;
TF2 = 0;
TL2 = (65536-50000) % 256;
TH2 = (65536-50000) / 256;

count ++;
if (count == 10)
{
  count = 0;
  led = !led;
}
  
   EA = 1;
}
1楼 0 0 回复