51单片机,计时器与中断

  • s0不减小唉,应该是倒计时开始那里有问题
    烧录之后可以输入数字,但无法开始倒计时

img


代码



#include 
#define uchar unsigned char
#define uint unsigned int
sbit we=P2^7;
sbit du=P2^6;
sbit LED=P1;
sbit beep=P2^3;
int KeyValue=10,temp,s0=0,ge,shi,flag=-1;
int count1,count2;
char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,          
              0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,
                            0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x00};
char list[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//0~9是数字0~910~15是字母a~f,16~25是在数字0~9的基础上加小数点
//list[]数组0~7为打开对应的数码管

void delay(int z)  //延时函数
{
    int m,n;
    for(m=z;m>0;m--)
    {
        for(n=120;n>0;n--)
        ;
    }
}
void KeyScan()  //按键扫描
{
  P3 = 0xf0;
  if(P3!=0xf0)
  {
    delay(5);
    if( P3 != 0xf0)
    {
      switch(P3)
      {
        case 0xe0:  KeyValue = 0;  break;
        case 0xd0:  KeyValue = 1;  break;
        case 0xb0:  KeyValue = 2;  break;
        case 0x70:  KeyValue = 3;  break;
      }
      P3 = 0x0f;
      switch(P3)
      {
        case 0x0e:  KeyValue = KeyValue;  break;
        case 0x0d:  KeyValue += 4;  break;
        case 0x0b:  KeyValue += 8;  break;
        case 0x07:  KeyValue += 12;  break;
      }
      while(P3 != 0x0f);
    }   
  }
  P3 = 0xff;
  if(P3 != 0xff)
  {
    delay(5);
    if( P3 != 0xff)
    {
      switch(P3)
      {
        case 0xfe:  KeyValue = 16;  break;
        case 0xfd:  KeyValue = 17;  break;
        case 0xfb:  KeyValue = 18;  break;
        case 0xf7:  KeyValue = 19;  break;
      }
      while(P3 != 0xff);
    }  
  }  
}

void timer0init()
{
    TMOD=0x01;
    TR0=1;
    TH0=0x4c;
    TL0=0xd1;   //50ms;
    ET0=1;
    EA=1;
}

void time0()interrupt 1
{
    TH0=0x4c;
    TL0=0xd1;
    count1++;
    count2++;
    
}

void main()
{
    while(1)
    {    
        KeyScan();
        if(KeyValue!=10&&P3==0xff)
        {
            if(KeyValue>=0&&KeyValue<=9)        //数字输入
            {
                s0=KeyValue;
                shi=ge;
                ge=KeyValue;
                s0=shi*10+ge;
            }
            else if(KeyValue==16)
            flag=-flag;
        }
        KeyValue=10;
    
        shi=s0/10;
        ge=s0%10;
            
        P0=0xff;                  // 数码管显示
        we=1;
        P0=list[0];
        we=0;
        du=1;
        P0=table[shi];
        du=0;
        delay(5);
            
        P0=0xff;
        we=1;
        P0=list[1];
        we=0;
        du=1;
        P0=table[ge];
        du=0;
        delay(5);
        
        while(flag==1)
        {            
            timer0init();
            if(count1==20)//当定时到1秒时执行
            {
                 s0--;
                 count1=0;
            }
            if(s0<=5&&s0>0)
            {
                if(count2==10)
                {
                    beep=0;
                }
                if(count2==20)
                {
                    beep=1;
                    count2=0;
                }
            }
            if (s0==0)    //
            {
        TR0=0;  //停止计时
                P0=0xff;   //消影 ?                      
        while(1)
        {
          LED=0;      //灯亮
                    P0=0xff;  //计时结束 熄灭数码管
        }
      }
            
            shi=s0/10;
            ge=s0%10;
                
            P0=0xff;                  // 数码管显示
            we=1;
            P0=list[0];
            we=0;
            du=1;
            P0=table[shi];
            du=0;
            delay(5);
                
            P0=0xff;
            we=1;
            P0=list[1];
            we=0;
            du=1;
            P0=table[ge];
            du=0;
            delay(5);
    
            KeyScan();
            if(KeyValue==16)
            flag=-flag;
    }
    }
}