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

📄 时钟over.c

📁 基于8051的单片机时钟源代码
💻 C
字号:
//////////////////////////////////////////////////
//                                              //           
//              AT89C51时钟程序                 //
//                                              //
//                    作者: 吴鹏                //
//                    时间;2006年2月3日        //
//                              大年初六  完成  //
//////////////////////////////////////////////////    
#include <reg52.H>
#define uchar unsigned char
sbit P3_6=P3^6;
sbit P3_7=P3^7;
sbit P2_6=P2^6;
sbit P2_7=P2^7;

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//  0-9 十个数字显示
uchar code dispbit[]={0x7f,0xbf,0xf7,0xfb,0xfd,0xfe};//   点亮 数码管
uchar code rjg[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//   点亮  跑马灯
uchar buffer[]={0,0,0,0,0,0};//   时钟and定时显示置
uchar hour,minute,second,count;
uchar dhour=0,dminute=0,dsecond=0;
uchar j=0,R,T;                  

void ding(void) ;                 //定时程序

void delay(uchar c,uchar d)       //延时程序
{uchar x,y;
 for(x=c;x>0;x--)
  for(y=d;y>0;y--);
}

void warning(void)               //闹钟报警程序
{
   uchar p=2;
   while(p--!=0)
    { P1=0;
      P0=0;
      delay(100,100);
      P1=0xff;
      P0=0xff;
      delay(100,100);
      }   
} 


void main(void)
{
  TMOD=0x11;//选择定时器的模式
  TH0=0xd8; //定的时间高8位     
  TL0=0xf0; //定的时间低8位
  IE=0x82;  //中断触发的设定
  TR0=1;    //TIMER0开始计时
  count=0;
  second=0;
  minute=0;
  hour=0;
 while(1)
  {if(P3_7==0)     //按下P3_7?
    {delay(1,100); //延时
      hour++;
       if(hour==24)
         hour=0;
        while(P3_7==0);//判断是否被按下
     }
   if(P2_7==0)
     {delay(1,100);
        minute++;
         if(minute==60)
           {minute=0;}
         while(P2_7==0);
      }
    if(P2_6==0)
      {delay(1,100);
          second++;
          if(second==60)
             {second=0;}
          while(P2_6==0);
       }

	 if(P3_6==0)    
     {delay(1,100);
//       TR0=0;   //???   //注意: 在做显示时,要慎用全局变量,如在做本程序的两个显示部分时,
                          //    原来都统一用的是一个全局变量,那么这就会出现冲突,后来两部分
                          //    分别改为局部变量,这就OK了!!!!
      while(P3_6==0);
        T=1;              //作标志,使其进入"ding()"
        R=1;              //作标志,因为两部分显示都存在"buffer[]"里,所以加以区分,否则会出现冲突
      }
     if(T==1)             //检测T值
      ding(); 
   }
}


void tim(void) interrupt 1 //int0    t0  int1  t1   rs
{ 
                           //  0     1    2     3    4
 uchar   a1,b1,i1;         //这里我使用局部变量               
 TH0=0xd8;                 
 TL0=0xf0;
 count++;        //由于其是全局函数,当程序运行100次后,秒加1
 R=0;

 if (count==100)
   {
     count=0;
     second++;
     j++;
     P1=rjg[j%8];  //由于有8个LED所以对8取余,使其逐个且有序的亮起来,很巧吧!!
    if(second>=60)
      {
	    second=0;
        minute++;
       if (minute>=60)
         {
		   minute=0;
           hour++;
          if (hour>=24)
              {
			   second=0;
               hour=0;
               minute=0;
               }
          }
       }

    if(R==0)                  //检测R值
     {
      buffer[0]=second%10;
      buffer[1]=second/10;
      buffer[2]=minute%10;
      buffer[3]=minute/10;
      buffer[4]=hour%10;
      buffer[5]=hour/10;
	 }
   }
    if(R==0)                  //检测R值
     {for(i1=0;i1<6;i1++)
       {
        P2=dispbit[i1];
        P0=table[buffer[i1]];
         for(a1=4;a1>0;a1--)
          for(b1=248;b1>0;b1--);
        }
      }     
if((hour==dhour && minute==dminute && second==dsecond)&&(hour!=0||minute!=0||second!=0))
   {warning();}            //闹钟报警部分
}


void ding(void) //interrupt 3 //int0    t0  int1  t1   rs
{                             //  0     1    2     3    4
  int i2,a2,b2;                       
  P2=0xff;
  while(1)                //闹钟调时
  {
     if(P3_7==0)
      {delay(1,100);
         dhour++;
          if(dhour==24)
          {dhour=0;}
         while(P3_7==0);
       }
     if(P2_7==0)
       {delay(1,100);
          dminute++;
           if(dminute==60)
           {dminute=0;}
          while(P2_7==0);
        }
      if(P2_6==0)
        {delay(1,100);
           dsecond++;
          if(dsecond==60)
           {dsecond=0;}
          while(P2_6==0);
         }
    if(R==1)                   //检测R值
     {
       buffer[0]=dsecond%10;
       buffer[1]=dsecond/10;
       buffer[2]=dminute%10;
       buffer[3]=dminute/10;
       buffer[4]=dhour%10;
       buffer[5]=dhour/10;
      }
    for(i2=0;i2<6;i2++)
      {
       P2=dispbit[i2];
       P0=table[buffer[i2]];
       for(a2=4;a2>0;a2--)
         for(b2=248;b2>0;b2--);
       }
      
  if (P3_6==0)           //定时退出部分
    {delay(1,100);
     while (P3_6==0);
	 T=0;                //使T归0 
     R=0;                //使R归0 
     break;              //从while(1)循环中跳出
    }
  }   
}

⌨️ 快捷键说明

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