• 2008-05-09

    51编程用定时器 中断和查询的延迟方法 - [IT]

    昨天写的程序的那个延迟算法实在是太龌龊了,自己都看不下去了··

    今天补上用定时器中断和查询的延迟方法。

     这个是中断法

    #include <AT89X51.H>

    unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71,0x00};  //这个码字貌似有点问题,不过先不管这些细节了····
    unsigned char second;
    unsigned char tcount;    TMOD=0x01;
       TH0=(65536-50000)/256;
       TL0=(65536-50000)%256;    //分别对高位和地位赋初值 
       TR0=1;
       ET0=1;
       EA=1;
       tcount=0;
       second=0;
       P0=dispcode[second/10];
       P2=dispcode[second%10];
       while(1);
          }

        void t0(void) interrupt 1 using 0           //使用中断向量1,如果是用的计数器1就要用中断向量4
         {
           tcount++;
           if(tcount==20)
               {
                  tcount=0;
                  second++;
                  if(second==60)
                    {
                      second=0;
                     }
                  P0=dispcode[second/10];
                  P2=dispcode[second%10];
               }
          TH0=(65536-50000)/256;
          TL0=(65536-50000)%256;
        }

    下面是用的查询的方法,个人感觉比中断的方法简单。

    #include <AT89X51.H>

    unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71,0x00};
    unsigned char second;
    unsigned char tcount;

    void main(void)
    {
    TMOD=0x01;
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    TR0=1;
    tcount=0;
    second=0;
    P0=dispcode[second/10];
    P2=dispcode[second%10];
    while(1)
    {
      if(TF0==1)
      {
        tcount++;
        if(tcount==20)
          {
             tcount=0;
             second++;
             if(second==60)
              {
                  second=0;
              }
             P0=dispcode[second/10];
             P2=dispcode[second%10];
          }
         TF0=0;
         TH0=(65536-50000)/256;
         TL0=(65536-50000)%256;
    }
    }
    }


    收藏到:Del.icio.us