控制/MCU
利用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;
}
}
}
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !