利用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;
}
}
}
8种常用DC-DC开关电源拓扑图汇总
警务专用手机!华为Mate9搭载EMUI5.1+神盾安全系统,真心可靠
脑机接口可以给人类带来什么?
360借条是如何利用AI技术解决难题的
正式官宣沈义人卸任OPPO全球营销总裁的信息
利用51单片机的定时器设计一个数字时钟
怎样将废旧闹钟制作成天气预报站
疫情之下,创想三维3D打印机火爆海外!
变压器的分类方法
华为预示正在开发一款相对便宜的上下折合翻盖的手机
自动驾驶最新消息:谷歌前自动驾驶工程师获刑 日本德国美国百花齐放
SOLIDWORKS曲面建模实例
工程师DIY智能灌溉器解决植物浇水难题
新紫光体系浮出水面,资产重整一周年交出怎样的答卷?
研发服务获认可 世强元件电商斩获2017中国智造金长城奖
TuyaOS Matter助您低门槛打通智能家居生态
压限器,压限器是什么意思
冰箱市场零售额实现了四年来首次增长
符合JEITA RCX-2326标准的SMT MLC
畅谈汽车产品力的养成,与ADI专家一起洞察汽车产业的热点技术与发展趋势