打印

c51单片机定时器问题

[复制链接]
3679|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
thgww|  楼主 | 2012-2-21 21:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用89c51设计59秒定时器,代码如下:
#include <reg51.h>
#define SEG P2
#define SCANP P1
sbit LED=P0^0;
#define count_M1 5000
#define TH_M1 (65536-count_M1)/256
#define TL_M1 (65536-count_M1)%256
int count_T0=0;
#define count_M2 25
#define TH_M2 (256-count_M2)
#define TL_M2 (256-count_M2)
char count_T1=0;
char TAB[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x83,0xF8,0x80,0x98};
char disp[2]={0xC0,0xC0};
char seconds=0;
char scan=0;

void main()
{
    IE=0x8A;
    TMOD=0x21;
    TH0=TH_M1;TL0=TL_M1;
    TR0=1;
    TH1=TH_M2;TL1=TL_M2;
    TR1=1;
    LED=1;
    while(1);
}

void T0_1s()interrupt 1
{   TH0=TH_M1;TL0=TL_M1;
    if(++count_T0==20)
    {
        count_T0=0;
        seconds++;
        if(seconds==60)
        {seconds=0;LED=~LED;}
    }
    disp[1]=TAB[seconds/10];
    disp[0]=TAB[seconds%10];
}


void T1_8ms()interrupt 3
{
    if(++count_T1==32)
    {
        count_T1=0;
        if(++scan==3) scan=1;
        SEG=0xFF;
        SCANP=~scan;
        SEG=disp[scan-1];
    }
}

我很奇怪,main函数里已经指定了TL0和TH0的数值,为何timer0的中断函数还要再次指定?

而且还有一点,如果去掉timer0里指定TL0和TH0的这句代码,在define里更改TL0和TH0的大小,timer0里不会体现出这个变化来??

相关帖子

沙发
NE5532| | 2012-2-21 21:34 | 只看该作者
楼主的问题源于对单片机定时器工作原理的不知道。

1.Define里定义的是TH_M1和TL_M1,而不是TL0和TH0,前者是寄存器里的值,后者是寄存器的名称。
2.进入中断服务程序的时候,TL0和TH0是都为0的,如果不定义,Timer这次的计数就要计满FFFF,这可能不是你要的定时长度,所以要重新设置TL0和TH0寄存器的值,这个值叫“定时器的底数”

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
thgww + 1
板凳
thgww|  楼主 | 2012-2-21 21:40 | 只看该作者
本帖最后由 thgww 于 2012-2-21 21:44 编辑

2# NE5532
谢谢您的回复
我还有疑问,main函数里不是已经定义过一次TL0和TH0的值了么?随即开了TF0定时,这个定义不起作用?
而且我去掉Main函数里定义TL0和TH0的语句后,Timer0可以正常运行,这个自然没有疑问。但是Timer1的计数起始值定义也是在main函数里完成的,中断子程序里没有再次定义,为何后者又能生效呢?

使用特权

评论回复
地板
NE5532| | 2012-2-21 21:46 | 只看该作者
那个是初始化的时候给定时器写入底数,保证第一次溢出的定时长度正确,后面每次溢出都必须重新设置,楼主你还是没搞懂定时器是怎么工作的,建议你找个软件仿真看一下,底数设大一点,比如FFF0,然后单步执行看结果,底数不要设小,要不你要按半天才能看到结果。

使用特权

评论回复
5
thgww|  楼主 | 2012-2-21 22:08 | 只看该作者
4# NE5532
太感谢您了!
T1定时器由于是模式2,所以TH1里保存了计数初值。
T0定时器在模式1下,所以一次溢出后,就要重新赋值。
我单步运行看出端倪来了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

3

帖子

0

粉丝