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

📄 时钟2.c

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

//sbit rect_wave=P1^0;
//void timelover(void);

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};//   时钟显示置0
//uchar dbuffer[]={0,0,0,0,0,0};//闹钟显示置0
uchar hour,minute,second,count;
uchar dhour=0,dminute=0,dsecond=0;
uchar i,a,b,j=0,R,T;
void ding(void) ;
void delay(uchar c,uchar d)       //延时程序
{for(a=c;a>0;a--)
  for(b=d;b>0;b--);
}

void warning(void)               //闹钟报警程序
{
   uchar p=2;
//   TR0=0;
   while(p--!=0)
    { P1=0;
      P0=0;
      delay(100,100);
      P1=0xff;
      P0=0xff;
      delay(100,100);
      }   
//   TR0=1;
} 
void main(void)
{
  TMOD=0x11;//选择定时器的模式
  TH0=0xd8; //定的时间高8位     
  TL0=0xf0; //定的时间低8位
//  TH1=0xff; //定的时间高8位,想想为什么?
//  TL1=0xff; //定的时间低8位,想想为什么?
  IE=0x82;  //中断触发的设定
//IP=0X04;
  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;   //???????????????
      while(P3_6==0);
        T=1;
        R=1;
      }
     if(T==1)
      ding(); 
   }
}

void tim(void) interrupt 1 //int0    t0  int1  t1   rs
{                          //  0     1    2     3    4
 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)
     {
      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)  
     {for(i=0;i<6;i++)
       {
        P2=dispbit[i];
        P0=table[buffer[i]];
         for(a=4;a>0;a--)
          for(b=248;b>0;b--);
        }
      }     
if((hour==dhour && minute==dminute && second==dsecond)&&(hour!=0||minute!=0||second!=0))
   {warning();}    //闹钟报警部分
}

void ding(void) //interrupt 3 //int0    t0  int1  t1   rs
{  int ii,aa,bb;                        //  0     1    2     3    4
  //R=1;
  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);
         }
//    display();
    if(R==1)
     {
       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(ii=0;ii<6;ii++)
      {
       P2=dispbit[ii];
       P0=table[buffer[ii]];
       for(aa=4;aa>0;aa--)
         for(bb=248;bb>0;bb--);
       }
      
  if (P3_6==0)           //定时退出部分
    {delay(1,100);
     while (P3_6==0);
	 T=0;
     R=0;
     break;
    }
  }   //TR0=1; //TIME0开始计时
}
   



/*void timelover(void)
{
   TH1=0xff;
   TL1=0xff;
   TF1=0;
   rect_wave=!rect_wave;
}*/

⌨️ 快捷键说明

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