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

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

     这个是中断法

    #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;
    }
    }
    }

  • 下午玩我的51开发板,想到一个很简单的流水灯算法。。。

    拿出来晒一下···

     #include<AT89X52.h>

    void delay20ms()
    {
      unsigned char ii,jj,kk;
       for(ii=0;ii<20;ii++)
          for(jj=0;jj<20;jj++)
             for(kk=0;kk<248;kk++)
                 {;}
    }     //这个延时写的比较龌龊,大家不要学我就是了····主要是用定时器中断延迟我还没想

    //好怎样返回。就让芯片做点无用功吧···(其实定时器的原理也是在做无用功)

    void main()
    {  
       unsigned char temp,i,a,b;

      while(1)
     {
       temp=0xfe;
       P0=temp;
       for(i=0;i<8;i++)
       {
          a=temp>>i;
          b=temp<<(8-i);
          P0=a|b;   
     //这就是我说的比较经典的地方。用看来位运算也是一个很

                 //强大的东西呀···(可能是我比较菜,老鸟们别笑偶啊··)
          delay20ms();
       }
     }
    }