找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1741|回复: 0
打印 上一主题 下一主题
收起左侧

52单片机时钟程序

[复制链接]
跳转到指定楼层
楼主
ID:224362 发表于 2017-8-3 14:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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;
}
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表