基於51單片機的秒錶和數顯時鐘

剛剛學過51單片機最重要的兩個部分,定時器和中斷,學完後應用定時器和數碼管,首先,我們可以做出一個秒錶程序,做出後,我們再在秒錶的基礎上,做一個數顯時鐘

#include<reg52.h>


sbit k1=P3^1;   //定義四個按鍵
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;


sbit LSA=P2^2; //38譯碼器數碼管位選
sbit LSB=P2^3;
sbit LSC=P2^4;








typedef unsigned char u8;   //對數據類型進行聲明定義
typedef unsigned int u16;




u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //不帶小數點
   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


u8 code smgduan1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
                               0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};    //帶小數點




u16 intnum; //定義時間變量


/****************************延時函數**************************/
void delay(u16 t)
{
         u8 x,y;
for(x=t;x>0;x--)
{
          for(y=110;y>0;y--)
  {
  }
}
}


/**********************顯示函數*******************************/
void display()
{
u16 wei[4];
wei[0]=intnum%10; //對各個位取模
wei[1]=intnum/10%10;
wei[2]=intnum/100%10;
wei[3]=intnum/1000%10;


LSA=0; LSB=0; LSC=0; P0=smgduan[wei[0]];delay(10); P0=0x00; 
    LSA=1; LSB=0; LSC=0; P0=smgduan[wei[1]];delay(10); P0=0x00;
    LSA=0; LSB=1; LSC=0; P0=smgduan1[wei[2]];delay(10); P0=0x00; 
    LSA=1; LSB=1; LSC=0; P0=smgduan[wei[3]];delay(10); P0=0x00; 


}


/********************定時器0初始化函數************************/
void init_t0()


{
        TMOD=0x01;    
TH0=(65536-10000)/256;    //給TH0賦初值
TH1=(65526-10000)%256;    //給TH1賦初值


EA=1;    //開總中斷
ET0=1;    //開定時器中斷
TR0=0;    //關閉定時器0
}


/**********************按鍵函數******************************/
void keydown()
{
        if(k1==0)
{
     
delay(10);
if(k1==0)
{
      TR0=1; //開啓定時器
}
}


if(k2==0)
{
     
delay(10);
if(k2==0)
{
      TR0=0;    //關閉定時器
}
}
if(k3==0)
{
     
delay(10);
if(k3==0)
{
      TR0=0; //關閉定時器
  intnum=0; //時間值清零
}
}
if(k4==0)
{
   
delay(10);
if(k4==0)
{
      TR0=0; //關閉定時器
  intnum=0; //時間值清零
}
}





}


/***************定時器0中斷服務函數***************/
void int_t0() interrupt 1
{
        TH0=(65536-10000)/256;
TH1=(65526-10000)%256;


intnum++;

}


/**************主函數****************************/
void main()
{
init_t0();
intnum=0;
while(1)
{
keydown();
display();
}
}

下面,我們在秒錶的基礎上,對代碼進行改進,將它改成一個數顯時鐘
代碼如下

#include<reg52.h>


sbit k1=P3^1;   //定義四個按鍵
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;


sbit LSA=P2^2; //38譯碼器數碼管位選
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit beep=P1^5;






typedef unsigned char u8;   //對數據類型進行聲明定義
typedef unsigned int u16;




u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //不帶小數點
   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


u8 code smgduan1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
                    0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};    //帶小數點




u16 intnum,second,minute,hour; //定義時間變量


/****************************延時函數**************************/
void delay(u16 t)
{
         u8 x,y;
for(x=t;x>0;x--)
{
          for(y=110;y>0;y--)
  {
  }
}
}


/**********************顯示函數*******************************/
void display()
{



LSA=0; LSB=0; LSC=0; P0=smgduan[second%10];  delay(10); P0=0x00; 
        LSA=1; LSB=0; LSC=0; P0=smgduan[second/10];  delay(10); P0=0x00;
        LSA=0; LSB=1; LSC=0; P0=smgduan1[minute%10]; delay(10); P0=0x00; 
        LSA=1; LSB=1; LSC=0; P0=smgduan[minute/10];  delay(10); P0=0x00; 
LSA=0; LSB=0; LSC=1; P0=smgduan1[hour%10];   delay(10); P0=0x00;
        LSA=1; LSB=0; LSC=1; P0=smgduan[hour/10];    delay(10); P0=0x00;
}


/********************定時器0初始化函數************************/
void init_t0()


{
        TMOD=0x01;    
TH0=(65536-10000)/256;    //給TH0賦初值
TH1=(65526-10000)%256;    //給TH1賦初值


EA=1;    //開總中斷
ET0=1;    //開定時器中斷
TR0=1;    //開啓定時器0
}


/**********************按鍵函數******************************/
void keydown()
{
        if(k1==0)
{
     
delay(200);
if(k1==0)
{
      second=0;
  intnum=0;  
}
}


if(k2==0)
{
     
delay(200);
if(k2==0)
{
      hour++;    
}
}
if(k3==0)
{
     
delay(200);
if(k3==0)
{
      minute++;  
}
}
if(k4==0)
{
   
delay(200);
if(k4==0)
{
      minute--;
}
}





}


/***************定時器0中斷服務函數***************/
void int_t0() interrupt 1
{
        TH0=(65536-10000)/256;
TH1=(65526-10000)%256;
        intnum++;
if(intnum>=100)
{
intnum=0;
second++;
}
if(second>=60)
{
second=0;
minute++;
}
if(minute>=60)
{
     minute=0;
hour++;
}
if(hour>=24)
{
hour=0;
}

}


/**************主函數****************************/
void main()
{
init_t0();
intnum=minute=second=hour=0;


while(1)
{
keydown();
display();
}
}





















#include<reg52.h>


sbit k1=P3^1;   //定義四個按鍵
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;


sbit LSA=P2^2; //38譯碼器數碼管位選
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit beep=P1^5;






typedef unsigned char u8;   //對數據類型進行聲明定義
typedef unsigned int u16;




u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //不帶小數點
   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


u8 code smgduan1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
                                   0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};    //帶小數點




u16 intnum,second,minute,hour; //定義時間變量


/****************************延時函數**************************/
void delay(u16 t)
{
         u8 x,y;
for(x=t;x>0;x--)
{
          for(y=110;y>0;y--)
  {
  }
}
}


/**********************顯示函數*******************************/
void display()
{



LSA=0; LSB=0; LSC=0; P0=smgduan[second%10];  delay(10); P0=0x00; 
    LSA=1; LSB=0; LSC=0; P0=smgduan[second/10];  delay(10); P0=0x00;
    LSA=0; LSB=1; LSC=0; P0=smgduan1[minute%10]; delay(10); P0=0x00; 
    LSA=1; LSB=1; LSC=0; P0=smgduan[minute/10];  delay(10); P0=0x00; 
LSA=0; LSB=0; LSC=1; P0=smgduan1[hour%10];   delay(10); P0=0x00;
    LSA=1; LSB=0; LSC=1; P0=smgduan[hour/10];    delay(10); P0=0x00;
}


/********************定時器0初始化函數************************/
void init_t0()


{
        TMOD=0x01;    
TH0=(65536-10000)/256;    //給TH0賦初值
TH1=(65526-10000)%256;    //給TH1賦初值


EA=1;    //開總中斷
ET0=1;    //開定時器中斷
TR0=1;    //開啓定時器0
}


/**********************按鍵函數******************************/
void keydown()
{
        if(k1==0)
{
     
delay(200);
if(k1==0)
{
      second=0;
  intnum=0;  
}
}


if(k2==0)
{
     
delay(200);
if(k2==0)
{
      hour++;    
}
}
if(k3==0)
{
     
delay(200);
if(k3==0)
{
      minute++;  
}
}
if(k4==0)
{
   
delay(200);
if(k4==0)
{
      minute--;
}
}





}


/***************定時器0中斷服務函數***************/
void int_t0() interrupt 1
{
        TH0=(65536-10000)/256;
TH1=(65526-10000)%256;
        intnum++;
if(intnum>=100)
{
intnum=0;
second++;
}
if(second>=60)
{
second=0;
minute++;
}
if(minute>=60)
{
     minute=0;
hour++;
}
if(hour>=24)
{
hour=0;
}

}


/**************主函數****************************/
void main()
{
init_t0();
intnum=minute=second=hour=0;


while(1)
{
keydown();
display();
}
}




















#include<reg52.h>


sbit k1=P3^1;   //定義四個按鍵
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;


sbit LSA=P2^2; //38譯碼器數碼管位選
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit beep=P1^5;






typedef unsigned char u8;   //對數據類型進行聲明定義
typedef unsigned int u16;




u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //不帶小數點
   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


u8 code smgduan1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
                    0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};    //帶小數點




u16 intnum,second,minute,hour; //定義時間變量


/****************************延時函數**************************/
void delay(u16 t)
{
         u8 x,y;
for(x=t;x>0;x--)
{
          for(y=110;y>0;y--)
  {
  }
}
}


/**********************顯示函數*******************************/
void display()
{



LSA=0; LSB=0; LSC=0; P0=smgduan[second%10];  delay(10); P0=0x00; 
        LSA=1; LSB=0; LSC=0; P0=smgduan[second/10];  delay(10); P0=0x00;
        LSA=0; LSB=1; LSC=0; P0=smgduan1[minute%10]; delay(10); P0=0x00; 
        LSA=1; LSB=1; LSC=0; P0=smgduan[minute/10];  delay(10); P0=0x00; 
LSA=0; LSB=0; LSC=1; P0=smgduan1[hour%10];   delay(10); P0=0x00;
        LSA=1; LSB=0; LSC=1; P0=smgduan[hour/10];    delay(10); P0=0x00;
}


/********************定時器0初始化函數************************/
void init_t0()


{
        TMOD=0x01;    
TH0=(65536-10000)/256;    //給TH0賦初值
TH1=(65526-10000)%256;    //給TH1賦初值


EA=1;    //開總中斷
ET0=1;    //開定時器中斷
TR0=1;    //開啓定時器0
}


/**********************按鍵函數******************************/
void keydown()
{
        if(k1==0)
{
     
delay(200);
if(k1==0)
{
      second=0;
  intnum=0;  
}
}


if(k2==0)
{
     
delay(200);
if(k2==0)
{
      hour++;    
}
}
if(k3==0)
{
     
delay(200);
if(k3==0)
{
      minute++;  
}
}
if(k4==0)
{
   
delay(200);
if(k4==0)
{
      minute--;
}
}





}


/***************定時器0中斷服務函數***************/
void int_t0() interrupt 1
{
        TH0=(65536-10000)/256;
TH1=(65526-10000)%256;
        intnum++;
if(intnum>=100)
{
intnum=0;
second++;
}
if(second>=60)
{
second=0;
minute++;
}
if(minute>=60)
{
     minute=0;
hour++;
}
if(hour>=24)
{
hour=0;
}

}


/**************主函數****************************/
void main()
{
init_t0();
intnum=minute=second=hour=0;


while(1)
{
keydown();
display();
}
}























 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章