• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

小白关于定时器的白痴问题 大侠勿笑

开心的马骝 2015-03-05 浏览量:2028
#include "reg52.h"

void timerms();
void main()
{
	TMOD = 0x01;
	TL0  = 0xf0;
	TH0  = 0xd8;
	ET0  = 1;
	EA   = 1;
	timerms();
}

void timerms()
{
 TR0  = 1;    //定时器/计数器0启动
 while(TF0!=1)
 {}
 TF0 = 0;
 TL0  = 0xf0;
 TH0  = 0xd8;
}


请教 这段程序有什么问题 为什么不能正常启动定时器呢

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 需要TL0、TH0计满数,TF才置1,你可以全速运行观察一下TF值的变化,或者写个简单的程序下载到板子上验证

    • 发布于 2015-03-05
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:48
  • #include "reg52.h"


    void timerms (); 
    void main()
    {

     P0=0x00;     //点亮led
     TMOD = 0x01;
     TL0  = 0xf0;
     TH0  = 0xd8;
     ET0  = 1;
     EA   = 1;
        TR0  = 1;    //定时器/计数器0启动
     
    }

    void timerms (void) interrupt 1
    {
     P0=0xff;
     TL0  = 0xf0;
     TH0  = 0xd8;
    }

    这样写对吧 为什么 灯关不上啊

    • 发布于2015-03-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 第一:我用Proteus测试没有问题。

    第二:我用keil软件仿真没有问题。

    第三:你设定值太大了,你监控TH0和TL0,那要好久。

    你把值改大点,相当与运行时间小。

    看图

    • 发布于2015-03-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 你把带监控定时器那图截出来。
    • 发布于2015-03-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 懂了?我走啦!有问题来Proteus提问哈!
    • 发布于2015-03-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 不知道是不是我的方法不对  已经加8次了 还没溢出

    • 发布于2015-03-05
    • 举报
    • 评论 0
    • 0
    • 0

  • #include "reg52.h"


    void timerms (); 
    void main()
    {

     P0=0x00;     //点亮led
     TMOD = 0x01;
     TL0  = 0xf0;
     TH0  = 0xd8;
     ET0  = 1;
     EA   = 1;
        TR0  = 1;    //定时器/计数器0启动
     
    }

    void timerms (void) interrupt 1
    {
     P0=0xff;
     TL0  = 0xf0;
     TH0  = 0xd8;
    }

    麻烦再帮忙看看 这个中断这样用对吗  为什么 P0点亮灯后 就关不上了呢

    • 发布于2015-03-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 还在吗?我又仔细看了一下 我的溢出后 程序直接跳到主程序的ET0=1了 TH0  TL0没有恢复到初值 这是为什么呢
    • 发布于2015-03-05
    • 举报
    • 评论 0
    • 0
    • 0


  • main()函数末尾要加while(1);不然会一直重复执行main()函数

    尝试这样

    #include "reg52.h"

    unsigned char num;
    void main()
    {

    P0=0x00;     //点亮led
    TMOD = 0x01;
    TL0  = 0xf0;
    TH0  = 0xd8;
    ET0  = 1;
    EA   = 1;
    TR0  = 1;    //定时器/计数器0启动
    while(1);      //此时开始等待中断
    }

    void timerms (void) interrupt 1
    {

    num++;

    if(num == 20)

    {
    P0=0xff;

    num = 0;

    }
    TL0  = 0xf0;
    TH0  = 0xd8;
    }

    • 发布于2015-03-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 你跳几部?还有32楼说的对,应该加while或者for。
    • 发布于2015-03-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 加死循环。否则速度太快
    • 发布于2015-03-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 就是 第一次 Tf=1 后, 程序就跳回主程序 ET0=1 处   th 和 tl 都没恢复成初值 然后 又进循环  tl从零附近开始累加

    • 发布于2015-03-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 呵呵,你程序跳的步骤太多了,不是一步步调试的!

    我确定一定以及肯定!

    • 发布于2015-03-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 还有,

    //www.icxbk.com/group-topic-id-45240.html

    你要是新手,你试试这个板子。

    里面的讲解不仅仅是定时器0,1,2

    还有计数器,和他们的配合使用。

    当然其他的程序也是最丰富的,和适合你。

    尤其类似指针问题,如果实用指针跳转,函数指针,指针结构体之类的问题。

    走了,手头还有点活,明天有时间在看你回复!

    • 发布于2015-03-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 好像我们版本不同,但是你放上去,有提示!

    现在咋样了。不行我远程帮你。

    • 发布于2015-03-06
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

小白关于定时器的白痴问题 大侠勿笑