找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4260|回复: 18
打印 上一主题 下一主题
收起左侧

51定时器---小白有话说

[复制链接]
跳转到指定楼层
楼主
ID:53239 发表于 2013-12-5 09:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Always_Fighting 于 2013-12-5 09:58 编辑

最近看的51定时器方面的,看的有点迷糊,源程序如下,红色字体就不明白了
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^7;
uint num;

void main ()
{
        TMOD=0x01;
        TH0=(65536-45872)/256;
        TL0=(65536-45872)%256;
        EA=1;
        ET0=1;
        TR0=1;        // 此时定时器已经开始启动,就是开始计数了吧,                                                                                                                                                                溢出就开始执行下边的中断程序,可是我的问题来了,
                                当T0 溢出之后,TH0和TL0内部都清零了嘛                                 此时的T0还继续从0开始计数吗?
                                还是等中断函数运行完再开始计数呢?
        while(1) ;                                 
}        
void AAA()interrupt 1
{
    TH0=(65536-45872)/256;
        TL0=(65536-45872)%256;
        num++;
        if(num==20)
                {
                  num=0;
                  led1=~led1;
                }
}

此程序就是让小灯间隔1秒亮灭,书中说道,定时器独立的部分,一旦启动就开始计数,
所以不明白了是否溢出后还继续从0开始继续计数还是等待!!



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:53239 发表于 2013-12-5 09:59 | 只看该作者
为什么我的文字格式是这个样子的呢?
回复

使用道具 举报

板凳
ID:57606 发表于 2013-12-5 14:52 | 只看该作者
你的这个源程序很乱,而且,我个人觉得----无法运行:

1.好几个没有定义的变量
2.有未定义的函数
3.不可控。num起始值是多少?
4.你的EA、ET定义不明

如果实在是格式不好搞,截个图看看
回复

使用道具 举报

地板
ID:53239 发表于 2013-12-5 15:09 | 只看该作者
kldaft 发表于 2013-12-5 14:52
你的这个源程序很乱,而且,我个人觉得----无法运行:

1.好几个没有定义的变量

这个是郭天祥那本书上的程序,我没改,运行没有问题,我就是不明白T0那个定时器在第一次溢出后执行什么,是等待中断函数执行完在开始继续加1计数还是 溢出后立马就计数谁也不等  Ps:num没有赋初值程序是自动默认初始值为0吧,我看有的教程是这么说的,那个EA=1不是开总中断吗?ET0=1是开定时器0中断,TR0=1就启动定时器了,这个好像没事吧
回复

使用道具 举报

5#
ID:18297 发表于 2013-12-5 15:32 | 只看该作者
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^7;
uint num;

void main ()
{
         TMOD=0x01;
         TH0=(65536-45872)/256;
         TL0=(65536-45872)%256;
         EA=1;
         ET0=1;
         TR0=1;        // 此时定时器已经开始启动,就是开始计数了吧,(这个正确)                                                                                                                                                                溢出就开始执行下边的中断程序(这个正确),可是我的问题来了,
                                当T0 溢出之后,TH0和TL0内部都清零了嘛 (没有清零),                                 此时的T0还继续从0开始计数吗?
                                还是等中断函数运行完再开始计数呢?
        while(1) ;                                                                         //空闲死循环                           
}        
void AAA()interrupt 1
{
     TH0=(65536-45872)/256;                         //这个为重新装定时器0的初值。(这样才会每次中断的定时时间一样)
         TL0=(65536-45872)%256;
         num++;
         if(num==20)
                 {
                   num=0;
                   led1=~led1;
                 }
}


回复

使用道具 举报

6#
ID:53239 发表于 2013-12-5 15:46 | 只看该作者
zjjhtony 发表于 2013-12-5 15:32
#include
#define uchar unsigned char
#define uint unsigned int

谢谢啊 第一次溢出后 TH0和TLO为什么没有全部变0啊 ?
回复

使用道具 举报

7#
ID:18297 发表于 2013-12-5 15:51 | 只看该作者
TH0和TL0在工作方式2时,能自动装载定时器的初值。
在其他工作方式时, TH0和TL0都需要软件重新写入。它不会自动清零。
回复

使用道具 举报

8#
ID:53239 发表于 2013-12-5 15:55 | 只看该作者
zjjhtony 发表于 2013-12-5 15:51
TH0和TL0在工作方式2时,能自动装载定时器的初值。
在其他工作方式时, TH0和TL0都需要软件重新写入。它不 ...

这样啊,那么在溢出时TH0和TL0内部都是 11111111 11111111 这样吗?
回复

使用道具 举报

9#
ID:53239 发表于 2013-12-5 15:55 | 只看该作者
游客 110.205.89.x 发表于 2013-12-5 15:47
zjjhtony 大神的解释非常好 我终于看懂了

说说你是怎么理解的啊
回复

使用道具 举报

10#
ID:18297 发表于 2013-12-5 16:12 | 只看该作者
各位,对不起,我搞错了,定时器在溢出后,TH0和TL0内部会自动清零。
我们为了达到每次相同的固定的定时时间,才会在中断程序中进行重写入相同的初值。
抱歉!
回复

使用道具 举报

11#
ID:18297 发表于 2013-12-5 16:15 | 只看该作者
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^7;
uint num;

void main ()
{
         TMOD=0x01;
         TH0=(65536-45872)/256;
         TL0=(65536-45872)%256;
         EA=1;
        // ET0=1;     //不产生中断。
         TR0=1;
                while(1)
                {
                        P1=TH0;
                        P2=TL0;
                }                                 
}     
使用以上程序,在仿真软件可以看出,P1,P2是不停循环变换的,单步仿真能看到TH0和TL0被清零。
抱歉。
回复

使用道具 举报

12#
ID:1 发表于 2013-12-5 21:52 | 只看该作者
工作方式2

在介绍这种式方式之前先让我们思考一个问题:上一次课我们提到过任意计数及任意定时的问题,比如我要计1000个数,可是16位的计数器要计到65536才满,怎么办呢?我们讨论后得出的办法是用预置数,先在计数器里放上64536,再来1000个脉冲,不就行了吗?是的,但是计满了之后我们又该怎么办呢?要知道,计数总是持续重复的,流水线上计满后马上又要开始下一次计数,下一次的计数还是1000吗?当计满并溢出后,计数器里面的值变成了0(为什么,能参考前面课程的说明),因此下一次将要计满65536后才会溢出,这可不符合要求,怎么办?当然办法很简单,就是每次一溢出时执行一段程序(这常常是需要的,要不然要溢出干吗?)能在这段程序中做把预置数64536送入计数器中的事情。所以采用工作方式0或1都要在溢出后做一个重置预置数的工作,做工作当然就得要时间,一般来说这点时间不算什么,可是有一些场合我们还是要计较的,所以就有了第三种工作方式&#0;&#0;自动再装入预置数的工作方式。

既然要自动得新装入预置数,那么预置数就得放在一个地方,要不然装什么呢?那么预置数放在什么地方呢?它放在T(0/1)的高8位,那么这样高8位不就不能参与计数了吗?是的,在工作方式2,只有低8位参与计数,而高8位不参与计数,用作预置数的存放,这样计数范围就小多了,当然做任可事总有代价的,关键是看值不值,如果我根本不需要计那么多数,那么就能用这种方式。看图4,每当计数溢出,就会打开T(0/1)的高、低8位之间的开关,计预置数进入低8位。这是由硬件自动完成的,不需要由人工干预。

常常这种式作方式用于波特率发生器(我们将在串行接口中讲解),用于这种用途时,定时器就是为了供给一个时间基准。计数溢出后不需要做事情,要做的仅仅只有一件,就是重新装入预置数,再开始计数,而且中间不要任何延迟,可见这个任务用工作方式2来完成是最妙不过了。

出至:http://www.51hei.com/mcuteach/235.html
回复

使用道具 举报

13#
ID:53239 发表于 2013-12-6 12:41 | 只看该作者
zjjhtony 发表于 2013-12-5 16:12
各位,对不起,我搞错了,定时器在溢出后,TH0和TL0内部会自动清零。
我们为了达到每次相同的固定的定时时 ...

原来如此,谢谢!
回复

使用道具 举报

14#
ID:53239 发表于 2013-12-6 12:41 | 只看该作者
zjjhtony 发表于 2013-12-5 16:15
#include
#define uchar unsigned char
#define uint unsigned int

好的,回去试试看
回复

使用道具 举报

15#
ID:53239 发表于 2013-12-6 12:42 | 只看该作者
admin 发表于 2013-12-5 21:52
工作方式2

在介绍这种式方式之前先让我们思考一个问题:上一次课我们提到过任意计数及任意定时的问题, ...

,谢谢老大!
回复

使用道具 举报

16#
ID:7485 发表于 2013-12-7 15:02 | 只看该作者
计数器/定时器在计数到0FFFFH后,再加1就是0000H,再加1就是0001H。

所以应该是有“清零”的。

中断源产生中断请求后,在中断入口处一般是由一个跳转指令到中断服务程序。在中断程序中,重新给计数器THx、TLx赋初值,这时计数器TLx已经不是“0”了,而是4或5了。所以如果对精准要求严格的话,应考虑这一点。

当然自动重装载不存在这个问题,所以是很精准的。
回复

使用道具 举报

17#
ID:53239 发表于 2013-12-9 11:05 | 只看该作者
ahshmj 发表于 2013-12-7 15:02
计数器/定时器在计数到0FFFFH后,再加1就是0000H,再加1就是0001H。

所以应该是有“清零”的。

谢谢!
回复

使用道具 举报

18#
ID:7485 发表于 2013-12-9 13:10 | 只看该作者
Always_Fighting 发表于 2013-12-5 15:55
这样啊,那么在溢出时TH0和TL0内部都是 11111111 11111111 这样吗?

TH0和TL0内部都是 11111111 11111111时,并不是溢出,再加1变成1 0000 0000 0000 0000时,才产生溢出。由于定时器只有16为,16位全为0,第17位为1,但是被舍弃了,所以只能是0.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表