⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 6oktime.c

📁 电子钟源程序,有需要的可以参考一下哦
💻 C
字号:
#include"reg51.h"
#define uint unsigned int
#define uchar unsigned char

int  hour=12;   //初始化。
int  minite=30;
int  sconds=0;
uint count;	   //模式切换变量
uint k=0;	  //1s标志位(k=20表示1s)
uint done;  //显示状态标志位

sbit Set=P2^5;	//定义I/O口
sbit Up=P2^6;
sbit Down=P2^7;
sbit LED1=P3^0;
sbit LED2=P3^1;
sbit LED3=P3^2;
sbit LED4=P3^3;
sbit LED5=P3^4;
sbit LED6=P3^5;

/*延时子程序*/
void mdelay(uint delay)
{	uint i;
 	for(;delay>0;delay--)
   		{for(i=0;i<124;i++) //1ms延时.
       		{;}
   		}
}

//uint code DispTab[10]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09}; //字形码(共阳)P1.7-->a---P1.0-->db
uint code DispTab[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //字形码(共阳)P1.0-->a---P1.7-->db
//uint code DispTab[10]={0x30,0xbe,0x25,0x2c,0xaa,0x68,0x60,0x3e,0x20,0x28};  //字形码(共阳)P1.7->a,p1.6->b,p1.5->db,p1.4->g,p1.3->e,p1.2->f,p1.1->d,p1.0->c
////////////////////////////////////////////////////////////////////////////////////////////////////////
void disptime(hour,minite,sconds)//显示时间
{      int td1,td2,td3,td4,td5,td6;
       td1=hour/10;
       td2=hour%10;
       td3=minite/10;
       td4=minite%10;
       td5=sconds/10;
       td6=sconds%10;
/*************************************/
     	    LED6=0;
		P1=DispTab[td1];
                if(td1<=0)  LED1=0;
                else
            LED1=1;
		mdelay(1);

            LED1=0;
               P1=(DispTab[td2]&0x7F);
            LED2=1;
  	  	mdelay(1);// 显示时
/**************************************/
            LED2=0;
		P1=DispTab[td3];
            LED3=1;
    	       mdelay(1);

            LED3=0;
                P1=(DispTab[td4]&0x7F);
            LED4=1;
    	        mdelay(1);   //显示分
/***********************************/
            LED4=0;
		P1=DispTab[td5];
            LED5=1;
		mdelay(1);

            LED5=0;
		P1=DispTab[td6];
            LED6=1;
		mdelay(1); //显示秒

}
////////////////////////////////////////////////////////////////////////////////////////////////////////
void Setkey()//模式选择按键
{
		Set=1;
	if(Set==0)
	    {
               mdelay(250);
               count=count+1;	 //Setkey按一次,count就加1
		   TR0=0;			 //关中断
		   done=1;			 //标志位置1
                   sconds=0;
               while(Set==0);
	   }

}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Upkey()//升序按键
{	    uint i;
		Up=1;
		if(Up==0)
                     {switch(count)
		         {case 1:hour=hour+1;break;
			  case 2:minite=minite+1;break;
			  default:break;
			 }
		     }
	          while(Up==0);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Downkey()//降序按键
{	    uint i;
		Down=1;
	    if(Down==0)
                {switch(count)
		   {case 1:hour=hour-1;break;
		    case 2:minite=minite-1;break;
		    default:break;
		   }
		}
		while(Down==0);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void keydone()//按键功能执行
{
		 Setkey();				            //扫描模式切换按键
		 switch(count)
		 {case 1:do						   //count=1,调整时
		  		   {Upkey();
				    Downkey();
					if(hour==24)hour=0;
					if(hour==-1)hour=23;
				    disptime(hour,minite,sconds);
				   }while(count==2);break;
		  case 2:do						   //count=2,调整分
		  		   {Upkey();
				    Downkey();
					if(minite==60)minite=0;
					if(minite==-1)minite=59;
				    disptime(hour,minite,sconds);
				   }while(count==3);break;
		  case 3: TR0=1;count=0;done=0;sconds=0;break; //count=3,开启中断,标志位置0并退出
		  default:break;

		 }
}


//////////////////////////////////////////////////////////////////////////////////////////////////////////////


void main()
{
 		TMOD=0x01;  //定时器0工作在方式1,定时值为50mS。晶振频率为11.0592MHz.
	 	TH0=0x4C;
                TL0=0x05;
 		//TL0=0x0A;
               // TL0=0x10; //快
               //TL0=0x0D;
 		count=0;
		done=0;
 		IE=0x82;   //使能time0()中断
 		TR0=1;     //开启定时器0.
		P3=1;
                P1=0;
                PCON=0x01;

	   while(1)
		    {while(done==1)
 		          {keydone();}				  //执行功能键
 	 	     while(done==0)
 			      {disptime(hour,minite,sconds);	  //默认显示时间(时/分/秒)

  			       Setkey();				 //扫描各功能键
			       Upkey();
		               Downkey();
 			      }
		   }

}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
void time0() interrupt 1 using 1//中断服务程序
{		TH0=0x4C;
                TL0=0x05;
               // TL0=0x0A;// 快
         //TL0=0x0B;
         //TL0=0x10;
          //TL0=0x0D;
		k++;
		if(k==20)
		{
		  sconds++;
		  k=0;
		}
  		if(sconds==60)//已经到60S
  		  {minite++;
   		   sconds=0;
   		   if(minite==60)//已经到60分
             {hour++;
              minite=0;
             if(hour==24)//已经到24小时
               {hour=0;
               }
             }
           }
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -