找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2393|回复: 0
收起左侧

自己制作的基于STC15单片机电子钟

[复制链接]
ID:284550 发表于 2018-2-21 01:53 | 显示全部楼层 |阅读模式
#include "include.h"
uchar t0, count;
uint TimeCount;

void Timer0Init(void);  //2ms@11.0592MHz

void main()
{
Timer0Init();
IT0 = 1; //开放外部中断0
EX0 = 1;
while(1)
{
  while(Setflag==1) //设置模式
  {
   Seting();
   if(DisplayTime)
   {
    disbuf[7] = t_display[hour/10];
    disbuf[6] = t_display[hour%10];
    disbuf[5] = t_display[17];
    disbuf[4] = t_display[min/10];
    disbuf[3] = t_display[min%10];
    disbuf[2] = t_display[17];
    disbuf[1] = t_display[sec/10];
    disbuf[0] = t_display[sec%10];
   }
   else if(DisplayDate)
   {
    disbuf[7] = t_display[2];
    disbuf[6] = t_display[0];
    disbuf[5] = t_display[year/10];
    disbuf[4] = t_display[year%10];
    disbuf[3] = t_display[month/10];
    disbuf[2] = t_display[month%10];
    disbuf[1] = t_display[day/10];
    disbuf[0] = t_display[day%10];   
   }
  }
  while(Setflag==0) //工作模式
  {
   if(DisplayTime)
   {
    disbuf[7] = t_display[hour/10];
    disbuf[6] = t_display[hour%10];
    disbuf[5] = t_display[17];
    disbuf[4] = t_display[min/10];
    disbuf[3] = t_display[min%10];
    disbuf[2] = t_display[17];
    disbuf[1] = t_display[sec/10];
    disbuf[0] = t_display[sec%10];
   }
   else if(DisplayDate)
   {
    disbuf[7] = t_display[2];
    disbuf[6] = t_display[0];
    disbuf[5] = t_display[year/10];
    disbuf[4] = t_display[year%10];
    disbuf[3] = t_display[month/10];
    disbuf[2] = t_display[month%10];
    disbuf[1] = t_display[day/10];
    disbuf[0] = t_display[day%10];   
   }
  }
}
}
void Timer0Init(void)  //2ms@11.0592MHz
{
AUXR |= 0x80;  
TMOD &= 0xF0;  
TL0 = 0x9A;  
TH0 = 0xA9;  
TF0 = 0;  
TR0 = 1;   
ET0 = 1;
EA  = 1;
}
//外部中断0中断
void Init0_ISR(void) interrupt 0
{
Setflag = ~Setflag; //设置标志位取反
}
//定时器0中断
void Timer0_ISR(void) interrupt 1
{
if(++t0>7) t0 = 0;

if(Setflag==1) //设置时显示
{
  if(++count == 250) //闪烁定时
  {
   count = 0;
   Flashflag=~Flashflag;
  }
  if(DisplayDate==1) //正在设置日期
  {
   if(Flashflag)
   {
    if(SetNUM==0 && (t0==4 || t0==5))
    {
     if(t0==4) DigitalDisplay(t0, 16, 1);
     else if(t0==5) DigitalDisplay(t0, 16, 0);
    }
    else if(SetNUM==1 && (t0==2 || t0==3))
    {
     if(t0==2) DigitalDisplay(t0, 16, 1);
     else if(t0==3) DigitalDisplay(t0, 16, 0);
    }
    else if(SetNUM==2 && (t0==0 || t0==1))
    {
     DigitalDisplay(t0, 16, 0);
    }
    else
    {
     if(t0==2 || t0==4)
      TDisplay(t0,1);
     else
      TDisplay(t0,0);
    }
   }
   else
   {
    if(t0==2 || t0==4)
     TDisplay(t0,1);
    else
     TDisplay(t0,0);
   }
  }
  
  else if(DisplayTime==1) //正在设置时间
  {
   if(Flashflag)
   {
    if(SetNUM==3 && (t0==6 || t0==7))
     DigitalDisplay(t0, 16, 0);
    else if(SetNUM==4 && (t0==3 || t0==4))
     DigitalDisplay(t0, 16, 0);
    else if(SetNUM==5 && (t0==0 || t0==1))
     DigitalDisplay(t0, 16, 0);
    else TDisplay(t0, 0);
   }
   else
    TDisplay(t0, 0);
  }
}

else //工作时显示
{
  if(++TimeCount==500)
  {
   TimeCount = 0;
   if(++sec == 60) //秒加一
   {
    sec = 0;
    if(++min == 60) //分加一
    {
     min = 0;
     if(++hour == 24) //时加一
     {
      hour = 0;
      if(month==2) //如果月份等于2
      {
       if((year/4==0 && year/100!=0) || year/400==0)
       {
        if(++day>29)
        {
         day = 1; //闰年2月
         month++;
        }
       }
       else
        if(++day>28)
        {
         day = 1; //平年2月
         month++;
        }
      }
      else if(month==4 || month==6 || month==9 || month==11) //小月
      {
       if(++day>30)
       {
        day = 1;
        month++;
       }
      }
      else
      {
       if(++day>31) //大月
       {
        day = 1;
        if(++month>12)
        {
         month = 1;
         if(++year>99) //年份大于99
         {
          year = 0;
         }
        }
       }
      }
     }
    }
   }
  }
  if(sec>=55) //当秒数大于55时,显示日期
  {
   DisplayTime = 0;
   DisplayDate = 1;
   if(t0==2 || t0==4)
    TDisplay(t0,1);
   else
    TDisplay(t0,0);
  }
  else //否则显示时间
  {
   DisplayTime = 1;
   DisplayDate = 0;
   
   if(++count == 250) //闪烁定时
   {
    count = 0;
    Flashflag=~Flashflag;
   }
   //显示时间
   if((t0==2 || t0==5) && Flashflag)
    DigitalDisplay(t0, 16, 0);
   else
    TDisplay(t0, 0);
  }
}
}

Clock.rar

35.82 KB, 下载次数: 10, 下载积分: 黑币 -5

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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