标题: 52单片机时钟程序 [打印本页]

作者: hujunhua    时间: 2017-8-3 14:01
标题: 52单片机时钟程序
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code duan[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,};
uchar code wei[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar sec=0,min=0,hour=0,sec1=0,min1=1,hour1=0;
uchar tick0=0,count=0,count1=0;
uchar flag=0;
uchar i=0;
sbit D1=P3^7;
void delay(uint z);
void display();
void init();
void settime();
void keyscan();
void increase();
void decrease();
void setalarm();
void main()
{
init();
while(1)
{
   if((hour1==hour)&&(min1==min)&&(sec1==sec))
     {
       for(i=0;i<10;i++)
       {
        D1=0;
        if(flag==0)
        {
          display();
          keyscan();
        }
        else if(flag==1)
        {
          display();
          keyscan();
        }
       }
     }
  else
  {
   D1=1;
   if(flag==0)
    {
     display();
     keyscan();
    }
    else if(flag==1)
    {
     display();
     keyscan();
    }  
  }
}
}
/*******延时1ms函数*******/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
/*******初始化函数*******/
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
/*******显示函数*******/
void display()
{
  P2=wei[0];
if(flag==0)
P0=duan[hour/10];
else if(flag==1)
P0=duan[hour1/10];
delay(5);
P2=wei[1];
if(flag==0)
{
  if(count==3)
  P0=duan[hour%10]|0x80;
  else
  P0=duan[hour%10];
}
else if(flag==1)
{
  if(count1==3)
  P0=duan[hour1%10]|0x80;
  else
  P0=duan[hour1%10];
}
delay(5);
P2=wei[2];
if(flag==0)
P0=duan[min/10];
else if(flag==1)
P0=duan[min1/10];
delay(5);
P2=wei[3];
if(flag==0)
{
  if(count==2)
  P0=duan[min%10]|0x80;
  else
  P0=duan[min%10];
}
else if(flag==1)
{
  if(count1==2)
  P0=duan[min1%10]|0x80;
  else
  P0=duan[min1%10];
}
delay(5);
P2=wei[4];
if(flag==0)
P0=duan[sec/10];
else if(flag==1)
P0=duan[sec1/10];
delay(5);
P2=wei[5];
if(flag==0)
{
  if(count==1)
  P0=duan[sec%10]|0x80;
  else
  P0=duan[sec%10];
}
else if(flag==1)
{
  if(count1==1)
  P0=duan[sec1%10]|0x80;
  else
  P0=duan[sec1%10];
}
delay(5);
}
/*******键盘函数*******/
void keyscan()
{
   if((P1&0X0F)!=0X0F)
  {         
   if((P1&0X0F)!=0X0F)
   {
    switch(P1&0X0F)
    {
       case 0x0e:settime();break;
     case 0x0b:increase();break;
     case 0x0d:setalarm();break;
     case 0x07:decrease();break;
    }
    while((P1&0X0F)!=0X0F)display();     
   }
  }
}
/*******调时函数*******/
void settime()
{
count++;
if(count==1)//改秒
{
  ET0=0;
  TR0=0;
}
else if(count==2) //改分
{
  ET0=0;
  TR0=0;
}
else if(count==3)  //改时
{
  ET0=0;
  TR0=0;
}
else if(count>=4)  //挺止调时,继续计时
{
  count=0;
  ET0=1;
  TR0=1;
}
}
/*******加1函数*******/
void increase()
{
if((count==1)||(count1==1))
{
  if(count==1)
  {
   if(sec<59)
   sec++;
   else
   sec=0;
  }
  else if(count1==1)
  {
   
   if(sec1<59)
   sec1++;
   else
   sec1=0;
  }
}
else if((count==2)||(count1==2))
{
  if(count==2)
  {
   if(min<59)
   min++;
   else
   min=0;
  }
  else if(count1==2)
  {
   if(min1<59)
   min1++;
   else
   min1=0;
  }
}
else if((count==3)||(count1==3))
{
  if(count==3)
  {
   if(hour<23)
   hour++;
   else
   hour=0;
  }
  else if(count1==3)
  {
   if(hour1<23)
   hour1++;
   else
   hour1=0;
  }
}
}
/*******减1函数*******/
void decrease()
{
if((count==1)||(count1==1))
{
  if(count==1)
  {
   if(sec>0)
   sec--;
   else
   sec=0;
  }
  else if(count1==1)
  {
   
   if(sec1>0)
   sec1--;
   else
   sec1=0;
  }
}
else if((count==2)||(count1==2))
{
  if(count==2)
  {
   if(min>0)
   min--;
   else
   min=59;
  }
  else if(count1==2)
  {
   
   if(min1>0)
   min1--;
   else
   min1=59;
  }
}
else if((count==3)||(count1==3))
{
  if(count==3)
  {
   if(hour>0)
   hour--;
   else
   hour=23;
  }
  else if(count1==3)
  {
   if(hour1>0)
   hour1--;
   else
   hour1=23;
  }
}
}
/*******定时器0中断函数*******/
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tick0++;
if(tick0==20)
{
  tick0=0;
  sec++;
  if(sec==60)
  {
   sec=0;
   min++;
   if(min==60)
   {
    min=0;
    hour++;
    if(hour==24)
    {
     hour=0;
    }
     
   }
  }

}
}
/*******闹钟设置函数*******/
void setalarm()
{
count1++;
flag=1;
if(count1==1)
{
   
}
else if(count1==2)
{

}
else if(count1==3)
{
  
}
else if(count1>=4)
{
  count1=0;
  flag=0;
}
}






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1