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

📄 shizhong.c

📁 接单片机8051的经典时钟C程序,包含计时,调时,及闹铃功能
💻 C
字号:
#include "reg51.h"
unsigned char  tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //显示0--9
unsigned char  time[6]={0,0,0,0,0,0};                                       //每一位控制
unsigned char  dtime[6]={0,0,0,0,0,0};                                       //定制时间
unsigned char  con[6]={0x01,0x02,0x04,0x08,0x10,0x20};                      //位选码
unsigned char j=0,i=0,m,n,mn;
char k=0;
sbit p07=P0^7;          //小数点控制
int x=0;
void delay()                         //延时
{ int j;
 for(j=0;j<=5000;j++);
}





void keyscan()                            //键盘扫描
{
  //int m,n,mn;

  P1=0x0f;
 while(P1==0x0f);
  if(P1!=0x0f)
   {
      delay();                          //消抖
      P1=0x0f;
      m=P1;
      P1=0xf0;
      n=P1;
      mn=m+n;
      switch(mn)                                          //按键实现功能
        {case 0xee:  TR0=0;      break;
         case 0xed:  TR0=1;      break;
         case 0xde:  time[0]++;  if(time[0]==10){time[0]=0;time[1]++;} if(time[1]==6){time[1]=0;}                        break;
         case 0xdd:  if(time[0]==0){time[0]=0x0a;  if(time[1]==0){time[1]=5;}else time[1]--; } time[0]--;                        break;
         case 0xbe:  time[2]++;  if(time[2]==10){time[2]=0;time[3]++;} if(time[3]==6){time[3]=0;}                        break;
         case 0xbd:  if(time[2]==0){time[2]=0x0a;  if(time[3]==0){time[3]=5;}else time[3]--; } time[2]--;                         break;
         case 0x7e:  time[4]++;  if(time[4]==10){time[4]=0;time[5]++;} if(time[4]==4&&time[5]==2){time[4]=0;time[5]=0;}  break;
         case 0x7d:  if(time[4]==0){time[4]=0x0a;if(time[5]==0){time[4]=4;time[5]=2;}else time[5]--;}  time[4]--;   break;
         case 0xeb:  k++;if(x>0)x=0;  if(k==2)k=0;    break;                                        //关闹铃
         case 0xe7:  RD=1;x++;        break;
         case 0xdb:            break;
         case 0xd7:            break;
         case 0xbb:  if(k==1){dtime[2]++;  if(dtime[2]==10){dtime[2]=0;dtime[3]++;} if(dtime[3]==6){dtime[3]=0;}}                        break;
         case 0xb7:  if(k==1){if(dtime[2]==0){dtime[2]=0x0a;  if(dtime[3]==0){dtime[3]=5;}else dtime[3]--; }dtime[2]--;}            break;
         case 0x7b:  if(k==1){dtime[4]++;  if(dtime[4]==10){dtime[4]=0;dtime[5]++;} if(dtime[4]==4&&dtime[5]==2){dtime[4]=0;dtime[5]=0;}}  break;
         case 0x77:  if(k==1)
                        {if(dtime[4]==0)
                              {dtime[4]=0x0a;
                               if(dtime[5]==0)
                                 {dtime[4]=4;dtime[5]=2;
                                 }
                               else
                                 dtime[5]--;                                      //用当K=1时,设置闹铃的时间分钟
                              }
                         dtime[4]--;
                       }
                                break;
         default:   break;

        }
     P1=0x0f;
      while(P1!=0x0f);
       delay();
       P1=0x0f;


   }

}


void T0_srv(void) interrupt 1 using 1      //中断程序,进行时钟显示
{

   TL0=-46080%256;
   TH0=-46080/256;

   j++;
   if(j==20){j=0;time[0]++;}
   if(time[0]==10){time[0]=0;time[1]++;}
   if(time[1]==6){time[1]=0;time[2]++;}
   if(time[2]==10){time[2]=0;time[3]++;}
   if(time[3]==6){time[3]=0;time[4]++;}
   if(time[4]==10){time[4]=0;time[5]++;}
   if(time[5]==2&&time[4]==4){time[5]=0;time[4]=0;}
   if(time[5]==dtime[5]&time[4]==dtime[4]&time[3]==dtime[3]&time[2]==dtime[2]&((dtime[2]+dtime[3]+dtime[4]+dtime[5])!=0)&time[1]<3&x==0)  RD=!RD;       //定时到时,响铃三十秒
   if(time[2]==0&time[3]==0&time[1]==0&time[0]<3) {RD=0;if(time[0]==2)RD=1;}   //每隔一小时响铃一次
  // if(time[0]==5)RD=1;
}

void T1_srv()interrupt 3 using 3                        //位扫描
{TH1=-500/256;
 TL1=-500%256;
 i++;
 if(i==6) i=0;
 P2=con[i];
 if(k==0)P0=tab[time[i]];
 if(k==1)P0=tab[dtime[i]];              //定时时间显示
 if(i==2||i==4)
     p07=1;

}

void main()                   //主函数
                              //采用T0定时器进行50ms定时
{TMOD=0x11;
 TL0=-46080%256;
 TH0=-46080/256;
 TH1=-500/256;                  //采用T1定时进行位扫描
 TL1=-500%256;
 EA=1;
 ET0=1;
 ET1=1;
 TR1=1;
 TR0=1;
 P0=0xff;
 while(1)
      {keyscan();delay();}

}




⌨️ 快捷键说明

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