使用51单片机实现数字时钟

我们学单片机,一般都会写数字时钟编程。它能帮助我们:

a. 能够系统性地总结掌握的知识,将单元模块知识有机的结合在一起。

b. 能够充分协调好硬件与软件之间的相互结合,合理设计硬件电路。

c. 掌握单片机 C 语言判断语句、分支语句以及子程序调用等编程知识。

我们学单片机都要做实物与仿真。接下来我先简单讲一下数字时钟在仿真中的作用。

 仿真中我写了简单的选位调时、分、秒,根据我选的时、分、秒。进行加减。

也可以在实物打板中,实现数字时钟。

这是小编做的简易51单片机板,而且这种10×10以下规格的打板是不用花费钱的。感兴趣的读者可以打板玩玩。想知道怎么打板的读者留言告诉小编,小编出一个打板教程。

接下来小编的代码有需要的读者自取。 

#include<reg52.h>
sbit key1 = P3^0;//换位
sbit key2 = P3^1;//加
sbit key3 = P3^2;//减

sbit LED  = P1^7;
unsigned char kz1,kz2,kz3,kz4,kz5,w,k,nz,h;
unsigned char ss = 2, sg = 3, fs = 5, fg = 9, ms = 5, mg = 5;

//char SMG[18] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0x00,0X02} ;//实物
char SMG[12] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00} ;//仿真
char are[] = {0Xfe,0Xfd,0Xfb,0Xf7,0Xef,0Xdf,0Xbf,0X7f};

void zhongduan();
void keykongzhi();
void naoshizhong();
void LedDriver();
 void delay(unsigned int i)
 {
  while(i--);
 }

 void main()
 {
  zhongduan(); 
  while(1)
  {
    naoshizhong();
	 keykongzhi();
	 LedDriver();
  }

 }

void naoshizhong()
  {

      P0 = SMG[ss];P2 = are[0]; delay(500); P2 = 0Xff;
      P0 = SMG[sg];P2 = are[1]; delay(500); P2 = 0Xff; 
      P0 = SMG[10];P2 = are[2]; delay(500); P2 = 0Xff;
      P0 = SMG[fs];P2 = are[3]; delay(500); P2 = 0Xff;
      P0 = SMG[fg];P2 = are[4]; delay(500); P2 = 0Xff;
      P0 = SMG[10];P2 = are[5]; delay(500); P2 = 0Xff;
      P0 = SMG[ms];P2 = are[6]; delay(500); P2 = 0Xff;
      P0 = SMG[mg];P2 = are[7]; delay(500); P2 = 0Xff;
  
  }

 void keykongzhi()
 {
   
      if(key1 == 0 && kz1 == 0)
	  {
	     kz1 = 1;
	  }
	  else if(key1 == 1 && kz1 == 1)
	  {
	  	 kz1 = 0;
		 w++;
		 w &= 0x03;
	  } 
	  
    
	     if(key2 == 0 && kz2 == 0)
	    {
	       kz2 = 1;
	    }
	    else if(key2 == 1 && kz2 == 1)
	    {
			kz2 = 0;
		   
		   	  switch(w)
			  {	 
			     case 1: mg = 0; ms = 0; break;
			  	 case 2: fg ++; break;
				 case 3: sg ++; break;		  
			  }
		 
	    }
		if(key3 == 0 && kz3 == 0)
	    {
	       kz3 = 1;
	    }
	    else if(key3 == 1 && kz3 == 1)
	    {
			kz3 = 0;
		  
		   	  switch(w)
			  {	 
			     case 1: mg = 0; ms = 0; break;
			  	 case 2: fg --; break;
				 case 3: sg --; break;		  
			  }
	
	    }
	   if(w == 1 && nz == 0)   //时钟调秒
	  {
	    P0 = SMG[ms]+128;P2 = are[6]; delay(800); P2 = 0Xff;
        P0 = SMG[mg]+128;P2 = are[7]; delay(800); P2 = 0Xff;
	  }
	  if(w == 2 && nz == 0)	   //时钟调分
	  {
	    P0 = SMG[fs]+128;P2 = are[3]; delay(800); P2 = 0Xff;
        P0 = SMG[fg]+128;P2 = are[4]; delay(800); P2 = 0Xff;
	  }
	  if(w == 3 && nz == 0)	   //时钟调时
	  {
	      P0 = SMG[ss]+128;P2 = are[0]; delay(800); P2 = 0Xff;
          P0 = SMG[sg]+128;P2 = are[1]; delay(800); P2 = 0Xff;
	  }
 }
 void zhongduan()
 {
  TMOD=0X01;
	TH0=0X3C;//50ms
	TL0=0XB0;
	ET0=1;
	TR0=1;
	EA=1;
 }

 void LedDriver()
 {
 if (k >= 40)
    {
		k = 0;
		mg ++;
    }
  
 if (mg >= 10)
    {
	mg = 0;
	ms ++;
    }
  if (ms >= 6)
    {
	 ms = 0;
	 fg ++;
    }
   if (fg >= 10)
     {	
       fg = 0;
	   fs ++;
     }

    if (fs >= 6)
     {
        fs = 0;
     	sg ++;
     }				
    if (sg >= 10)
    {
       sg = 0;
	   ss ++ ;
    }										
    if (ss ==2 && sg == 4)
    { 
	   ss = 0;
       sg = 0;
    }	 
 }
 void time0() interrupt 1 using 0
 {
  TH0=0X3C;
  TL0=0XB0;
  k ++;	
 }

物联沃分享整理
物联沃-IOTWORD物联网 » 使用51单片机实现数字时钟

发表评论