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

📄 c51-timer.txt

📁 c51 电子钟 功能完善 闹钟 秒表 整点报时等功能
💻 TXT
字号:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char 
#define uint unsigned int
sbit beep=P1^3;
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
bit run,set,nlg,clg;		   // 运行状态;设置状态;闹钟状态;秒表状态
bit bplg,dlg,slg=0,startlg=0; //蜂鸣器;整点标志;设置状态0.1s闪烁控制标志
bit klg1=0;					   //按键1状态
bit klg2=0;					   //按键2状态
bit klg3=0;					   //按键3状态
uchar d,e,f,g,h,i,j;		   // 设置状态;闹钟状态;秒表状态对应传递数据变量
uchar m,bpnum;				   //闹钟时间;整点响铃次数
uchar count=0;				   //定时器中断次数
uchar code seg[11]={0x3f,0x06,0x5b,0x4f,0x66,
                    0x6d,0x7d,0x07,0x7f,0x6f,0x00};
uchar disdata[3]={14,59,55};   //时,分,秒;初值14:59:55					
uchar disbuf[6]={0,0,0,0,0,0}; //数码管显示数据

void delayus0(uint r)
{ while(r)
  {r--;}
}

void delayus(uchar t)			
{ do
  { _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
  }while(--t);
}

void delayms(uint tt)				
{ do delayus(131);
  while(--tt);
}
void timetobuf(uchar a,uchar b,uchar c)				
{ disbuf[0]=a/10;				
  disbuf[1]=a%10;				
  disbuf[2]=b/10;				
  disbuf[3]=b%10;				
  disbuf[4]=c/10;				
  disbuf[5]=c%10;			
}
void timedisplay()	
{ uchar i,sel;
  sel=0x01;
  for(i=0;i<6;i++)
  { P0=seg[disbuf[i]];
    P2=sel;
    sel<<=1;
    delayus0(80);
  }
}

void timedisplay2()	
{ uchar i,sel;
  sel=0x01;
  for(i=0;i<6;i++)
  { P0=seg[10];
    P2=sel;
    sel<<=1;
    delayus0(80);
  }
}

void timeinc()
{ disdata[2]++;
  if(disdata[2]==60)
  { disdata[2]=0;
    disdata[1]++;
    if(disdata[1]==60)
    { disdata[1]=0;
      disdata[0]++;
   	  dlg=1;
	  bpnum=disdata[0]%12*2;
      if(disdata[0]==24)
      {  disdata[0]=0;
      }
    }
  }
}

void timer0(void) interrupt 1
{   TH0=(65536-10000)/256;
    TL0=(65536-10000)%256;
    count++;
	if(count%10==0)
	{  slg=~slg;
	}

	if(count==100)
    {  count=0;
       if(bplg==1)
	   { m++;
		 beep=~beep;
		 if(m==15)
		 {  beep=1;
		    bplg=0;
		 }
	   }
	   if(dlg==1)
	   {  beep=~beep;
		  bpnum--;
		  if(bpnum==0)
		  {  beep=1;
			 dlg=0;
		  }
	   }
	   if(clg==1&&startlg==1)
	   {
	       j++;
           if(j==60)
           { j=0;
             i++;
             if(i==30)
             { i=0;
             }
           }
	   }
	timeinc();
	}
}

void checkkey(void)
{
  if(k1==0)
  {	  delayms(5);
      if(k1==0)
	  	delayms(8);
	      if(k1==1)
		    klg1=1;
  }
  if(k2==0)
  {	  delayms(5);
      if(k2==0)
	     delayms(8);
	     if(k2==1)
		 klg2=1;
  }
  if(k3==0)
  {	  delayms(5);
      if(k3==0)
	     delayms(8);
	      if(k3==1)
		 klg3=1;
  }
    
}


void main()
{ TMOD=0x01;
  TH0=(65536-10000)/256;
  TL0=(65536-10000)%256;
  IE=0x82;
  TR0=1;
  run=1;
  set=0;
  clg=0;
  klg1=0;
  klg2=0;
  klg3=0;
  while(1)
  {  if(run==1)
	 {	checkkey();
		do{   checkkey();
		      timetobuf(disdata[0],disdata[1],disdata[2]);
		      timedisplay();
			  if (disdata[0]==f&&disdata[1]==g&&disdata[2]==3)
	          {  beep=0;
	 	         bplg=1;
	          }
		}while(klg1==0 && klg2==0 && klg3==0);
        if(klg1==1)
		{ run=0;
		  set=1;
		  klg1=0;
		}
		if(klg2==1)
		{ run=0;
		  nlg=1;
		  klg2=0;
		}
		if(klg3==1)
		{ run=0;
		  clg=1;
		  klg3=0;
		}
	 } 

	 if(set==1)
	 {	d=disdata[0];
		e=disdata[1];
		checkkey();
		do
		{ checkkey(); 
		  if(klg2==1)
		  {   d=d+1;
		      if(d==24) d=0;
		      klg2=0;
		  }
		  if(klg3==1)
		  {  e=e+1;
		     if(e==60) e=0;
		     klg3=0;
		  }
		  timetobuf(d,e,disdata[2]);
		  if(slg==1)
		  {  timedisplay();
		  }
		  else timedisplay2();
        }while(klg1==0);
	 	run=1;
		disdata[0]=d;
	 	disdata[1]=e;
		set=0;
		klg1=0;
	 }
	 
	 if(nlg==1)
	 { f=12;
	   g=0;
	   checkkey();
		do
		{ checkkey(); 
		  if(klg2==1)
		  {   f=f+1;
		      if(f==24) d=0;
		      klg2=0;
		  }
		if(klg3==1)
		{  g=g+1;
		   if(g==60) g=0;
		   klg3=0;
		}
		timetobuf(f,g,0);
		timedisplay();
		}while(klg1==0);
		nlg=0;
		run=1;
		klg1=0;
	 }
     
	 if(clg==1)
	 {	h=0;
	    i=0;
		j=0;
	    checkkey();
path:	do
		{ checkkey();
		  if(klg2==1)
		  { startlg=1;
		  }
		  if(klg3==1)
		  { h=0;i=0;j=0;
		    klg2=0;
			klg3=0;
		  }
		  timetobuf(h,i,j);
		  timedisplay();
		}while(klg1==0);
		klg1=0;
		klg2=0;
		startlg=0;
		do 
		{ checkkey();
		  if(klg3==1){goto path;}
		  timetobuf(h,i,j);
		  timedisplay();
		}while(klg1==0);
		klg1=0;
		clg=0;
		run=1;
		
	 }
  }
}
























⌨️ 快捷键说明

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