单片机定时器实现的数字时钟

利用51单片机的定时器,设计一个数字时钟,具有时间、年月日和星期显示功能,并且可以通过按键设置调整年时间年月日和星期的功能。

1.系统功能模块图

  系统主要有LED灯显示模块、电源模块、单片机最小系统、LCD1602液晶显示电路、按键设置模块。

图片

2.系统原理图

图片

   按键控制电路中共有4个按键,按键1的功能是进行日期,时间的设置。按下1次,进入“秒”设置;按下2次,进入“分”设置;按下3次,进入“时”设置;按下4次,进入“星期”设置;按下5次,进入“日”设计;按下6次;进入“月”设置;按下7次,进入“年”设置。按键2的功能是增加时间或日期。按键3的功能是减少时间或日期。按键4的功能是数码管显示的相应时间进行加或减。

      LED灯用来是指示当前设置参数:D1亮起表示设置秒,D2亮起表示设置分,D3亮起表示设置时,D4亮起表示设置星期,D5亮起表示设置日,D6亮起表示设置月,D7亮起表示设置年。

3.系统主程序流程图

  系统上电首先初始化LCD1602和定时器,设置定时器模式、开启定时器中断,然后循环执行更新显示时间,实时扫描按键状态。当单片机上电以后,LCD上会立即显示出2021. 12.12  SUN 7  21:42:00即2021年12月12号,周日,21 时 42 分 0 秒,通过与实时扫描单片机 IO 口相连接的按键的控制可以实现对时间以及模式的调整,以调整到正确的时间和模式。主程序流程图如下:

图片

void main()
{InitLcd1602();
    init();
    LcdShowStr(4,0, "00:00:00");
    LcdShowStr(0,1, "0000.00.00");
    while(1)
    {
        show();
        key();
  }
}

4.系统运行展示见连接--------------单片机定时器实现的数字时钟

5.关键代码(完整代码,可发送公众号消息《数字时钟代码》获取下载连接

定时器中断处理:

void timer0() interrupt 1
{ TH0=0XB8;TL0=0X00;
    m++;
    if(m>=50)
    {m=0;second++;}
    if(second==60)
    {second=0;minute++;}
    if(minute==60)
    {minute=0;hour++;}
    if(hour==24)
    {hour=0;week++;day++;}
    if(week==8)
    {week=1;}
    if(day==31)
    {day=1;month++;}
    if(month==13)
    {month=1;year++;}
}

按键的处理

void jia()
{if(second==60)
    {second=0;minute++;}
    if(minute==60)
    {minute=0;hour++;}
    if(hour==24)
    {hour=0;week++;day++;}
    if(week==8)
    {week=1;}
    if(day==31)
    {day=1;month++;}
    if(month==13)
    {month=1;year++;}
}
void jian()
{if(second==-1)
    {second=59;minute--;}
    if(minute==-1)
    {minute=59;hour--;}
    if(hour==-1)
    {hour=23;week--;day--;}
    if(week==0)
    {week=7;}
    if(day==0)
    {day=31;month--;}
    if(month==0)
    {month=12;year--;}
}
void key()
{if(K0==0)
    {delay(1000);
        if(K0==0)
        {s1num++;
        while(!K0);di();
        switch(s1num) //光标闪烁点定位
            { case 1: P1=0xFE;break;
                case 2: P1=0xFD;break;
                case 3: P1=0xFB;break;
                case 4: P1=0xF7;break;
                case 5: P1=0xEF;break;
                case 6: P1=0xDF;break;
                case 7: P1=0xBF;break;
                case 8: s1num=0;P1=0xFF;break;
        }            
    }        
}
if(s1num!=0)
{
    if(K1==0)
    {delay(1000);
        if(K1==0)
            while(!K1); di();
        switch(s1num)
            { case 1: second++; jia();break;
                case 2: minute++; jia();break;
                case 3: hour++;   jia();break;
                case 4: week++;   jia();break;
                case 5: day++;    jia();break;
                case 6: month++;  jia();break;
                case 7: year++;   jia();break;
                            }
    }
}
if(K2==0)
    {delay(1000);
        if(K2==0)
            while(!K2); di();
        switch(s1num) //根据功能键次数调节相应数值
            { case 1: second--;jian();break;
                case 2: minute--;jian();break;
                case 3: hour--;  jian();break;
                case 4: week--;  jian();break;
                case 5: day--;   jian();break;
                case 6: month--; jian();break;
                case 7: year--;  jian();break;
                }
        }
if(K3==0)
   {delay(100);
       if(K3==0)
        {s1num=0;P1=0XFF;
                    }
   }
}

猜你喜欢

转载自blog.csdn.net/chanchairen/article/details/121897302