当前位置:首页 » 多媒体相关

高分求助,关于定时器(在线等待)(急)


几年前曾学过51系列,也编过程,但现在已几乎全忘,现在想做一个定时器,比如可以定2分钟叫一次,5分钟叫一次,等等,请问程序如何编

推荐阅读

  • 德仪保驾中国WLAN标准 6月前推出相关芯片 [详细内容]
  • 激情无限 DDR2和256MB七彩虹GF66售799 [详细内容]
  • S508严重的问题解决 [详细内容]
  • 美在线销售额超千亿美元 圣诞引发购物潮 [详细内容]
  • 256MB和DDR2 小影霸R300ST爆发价599元 [详细内容]
  • 电池之激活完全篇 [详细内容]
  • 设计理念应用方式双变革 PC要搭宽带顺风车 [详细内容]
  • 网友回答:
    网友:crazygentleman

    问题太大  
      编程不难,  
       
      要先设计硬件:需要输入设置,到底是“定时叫醒”还是“间隔叫醒”?输出用蜂鸣器即可。如果要求在指定时间叫,需要用rtc。  
      软件思路:用系统定时器,累加到指定时间值后动作。  
      如此而已。

    网友:zhou_huanxi

    51的定时器直接定时最长只能到ms级,编程时要外扩计数值。  
     

    网友:newmanzxk

    当外接晶体振荡器的频率是12mhz时,则每过一微秒定时器自动加一,直至溢出,也就可以实现“叫”一次,但是51定时器最多是16位计数,所以要把计数脉冲再分频,也就是“外扩技术值”

    网友:hermit

    可以通过寄存器设置。具体的寄存器查看datasheet.  
     

    网友:abadcat

    用几个变量对定时器计数到设定的时间间隔就可以了

    网友:sansan5688

    我感觉用中断方式  
       
      先将定时器设为一个整数值,如60ms,然后在中断程序中,设定一个数值,如2000,进一次  
      中断减一,到0输出控制信号,就是2分钟。5分钟一样,只是设定数不同。

    网友:nomit

    ;定时器计数器0设置  
      ldi       rx,$02  
      out       timsk,rx ;定时器计数器t0溢出中断使能  
      ldi       rx,$04      
      out       tccr0,rx ;定时器计数器t0选择3.6864hz/256  
      ldi       rx,$70  
      out       tcnt0,rx ;设置t0中断时间为10ms,初值为70  
      ;t0溢出中断子程序(10ms)  
      t0ovf:     push     rx ;保存中断前rx状态  
      push     ry ;保存中断前ry状态  
      push     acc ;保存中断前acc状态  
      in         ssreg,sreg ;保存中断前sreg状态  
      wdr ;看门狗处理  
      dec       count1  
      ;  
      iexit: ldi       rx,$70  
      out       tcnt0,rx ;重新设置定时器0初值  
      out       sreg,ssreg ;恢复中断前sreg状态  
      pop       acc ;恢复中断前acc状态  
      pop       ry ;恢复中断前ry状态  
      pop       rx ;恢复中断前rx状态  
      reti  
      ;==================================  
      dl002s: ldi       count1,$02 ;延时20ms  
      d1: cpi       count1,$00  
      brne     d1  
      ret  
       
     

    网友:ormus

    自己做一个长延时的软件定时器。一个全局变量、   一个timer就可以搞定了。更方便的是用ds12887、   pcf8583、ds1302等rtc

    网友:herop

    再把51系列的书看一边,既然你以前用过,应该很快就可以重新捡起来!

    网友:babylovecon

    51的t2是16位自装载的,可以精确读出th2和tl2。去atmel下载个52的datasheet吧。至于你说的功能,用t0   t1都可以做到。建议用自装载的方式。这样比较高精度。用c也很容易实现。  
      #include   <reg52.h>  
      uchar   timer_0;  
      uchar   timer_1;  
      uchar   sec;  
      uchar   min;  
      uchar   hour;  
      void   timer(void)  
      {  
              timer_0+=1;  
              if(timer_0==200)timer_0=0;//中断1次的时间timer_0改变一次。例   100us一次则  
      }  
      void   main(void)  
      {  
              bit   c;  
              if(timer_0/100!=c)  
              {  
                      c=timer_0/100;//中断100次改变一次  
                      timer_1+=1;  
                      if(timer_1==100)timer_1=0;  
              }  
              if(timer_1==99)  
              {  
                      sec+=1;  
                      if(sec==60)sec=0;  
                      if(sec==59)min+=1;  
                      if(min==60)min=0;  
                      if(min==59)hour+=1;  
                      if(hour==24)hour=0;  
                      ;//中断10,000次执行一次。此处为1s  
              }  
      }

    .

    讨论区

    Login