带温度显示的万年历 数码管显示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设计报告万年历时钟的设计班级: 09光电<2>班专业:光电子技术
姓名:阮军峰
学号: 0906010234 完成日期:
2011年06月11日
一、设计目的:
1、掌握C51程序用于实践并实现相应的功能;
2、掌握时钟程序的使用方法;
3、掌握时间函数的使用方法;
4、掌握键盘的程序使用方法;
二、设计任务:
设计一个智能化万年历时钟电路,LED数码管作为电路的显示部分,按钮开关作为调时部分,通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期、温度。并能准确计算闰年闰月的显示。
三、设计要求:
通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期等功能,并能准确计算闰年闰月的显示,三个个按钮连接P3.0、P3.1、P3.2可以精确调整每一个时间数值,通过对所设计的万年历时钟电路进行实验测试,达到了动态显示时间,随时调整时间等技术指标。
四、系统方案设计:
1、系统总体设计:
1) 原理构成框图
本设计用STC89C51作为核心控制部分,外接晶振电路和74HC154,74LS138作为位选扩展电路,P3.0、 P3.1 、P3.2接三个个按钮作为时间调整部分,以两个17个数码管作为显示部分,P2口作为位选,P0口作为数据输出部分。具体框图如图1所示:
图1 原理框图
2) 主程序的设计
系统程序采用C语言按模块化方式进行设计,然后通过KeilC51L 软件开发平台将程序转变成十六进制程序语言,得到HEX文件,接着使用Proteous进行仿真,其次,按照Proteous的仿真电路图,在Protel99SE中完成电路板的逻辑布局及布线。
3) 时间调整电路的设计
采用按键设计,独立式按键直接与单片机I/O口相连构成键盘,每个按键不会相互影响,按下模式可以选择年月日时分秒星期。按下(+)(-)进行调试,程序如下:
while(1)
{
P3_0=1;
if(P3_0==0){
delay(10);
if(P3_0==0)//如果按键被按下
{
Kdelay();
if(P3_0==0)//确定按键按下
{
while(P3_0==0); // 等待按键放开
cursor++;
if(cursor>=9){cursor=0;}//如果cursor大于9则cursor=0
if(P1_0==0){cursor=0;}
} }
}
P3_1=1;
if(P3_1==0){
delay(10);
if(P3_1==0) //如果按键被按下
{
Kdelay();
if(P3_1==0) //确定按键按下
{
if(cursor==1)
{
sec++;//如果cursor=1则按键按下秒数加一
if(sec==60)
sec=0;//如果秒数等于60秒则回到0开始
}
if(cursor==2)
{
min++;//如果cursor=2则按键按下分数加一
if(min==60)
min=0; 如果分数等于60分则回到0开始
}
if(cursor==3)
{
hour++;//如果cursor=3则按键按下时数加一
if(hour==24)
hour=0; //如果时数等于24时则回到0开始
}
if(cursor==4)
{
day++;//如果cursor=4则按键按下天数加一
if(day==31)
day=0; //如果天数等于31天则回到0开始
}
if(cursor==5)
{
month++;//如果cursor=5则按键按下月数加一
if(month==13)
month=0; //如果月数等于13月则回到0开始
}
if(cursor==6)
{
yearl++;//如果cursor=6则按键按下年数低位加一
if(yearl==100)
yearl=0; //如果年数等于100则回到0开始
}
if(cursor==7)
{
yearh++;//如果cursor=7则按键按下年数高位加一
if(yearh==30)
yearh=20; //如果年数大于30则回到0开始
}
if(cursor==8)
{
week++;//如果cursor=8则按键按下星期数加一
if(week==8)
week=1; //如果星期数等于8则回到0开始
}
}
while(P3_1==0);}
}
P3_2=1; //写入时先写1
if(P3_2==0){//按键按下
delay(10);//延时10个毫秒
if(P3_2==0)//确定按键按下
{
Kdelay();
if(P3_2==0)
{
if(cursor==1)
{
sec--;//如果cursor=1则按键按下秒数减一
if(sec==0)
sec=59; //如果秒数小于0则回到59开始
}
if(cursor==2)
{
min--;//如果cursor=2则按键按下分数减一
if(min==0)
min=59; //如果分数小于0则回到59开始
}
if(cursor==3)
{
hour--;//如果cursor=3则按键按下时数减一
if(hour==0)
hour=23; //如果时数小于0则回到23开始
}
if(cursor==4)
{
day--;//如果cursor=4则按键按下天数减一
if(day==0)
day=31; //如果天数小于0则回到31开始
}
if(cursor==5)
{
month--;//如果cursor=5则按键按下月数减一
if(month==0)
month=12; //如果月数小于0则回到12开始
}