电子万年历的设计.docx
《电子万年历的设计.docx》由会员分享,可在线阅读,更多相关《电子万年历的设计.docx(15页珍藏版)》请在冰豆网上搜索。
电子万年历的设计
目录
摘要1
前言2
第一章总体方案3
§1.1方案比较3
§1.2方案论证3
§1.3方案选择3
第二章硬件设计4
§2.1单片机系统及显示电路4
§2.2温度显示电路5
第三章系统调试6
§3.1硬件调试6
§3.2软件调试6
第四章系统功能、指标参数7
第五章设计总结8
参考文献9
附录A10
附录B10
附录C10
摘要
电子万年历是一种应用非常广泛的日常计时工具,数字显示的日历钟已经越来越流行,特别是适合在家庭居室、办公室、大厅、会议室、车站和广场等使用,壁挂式LED数码管显示的日历钟逐渐受到人们的欢迎。
LED数字显示的日历钟显示清晰直观、走时准确、可以进行夜视,本设计仅利用一个芯片制作了一个运用简单的电子万年历。
以单片机作为本设计的核心,实现时钟日历的显示:
用八段LED数码管分别显示年、月、日、时、分、秒,用DS18B20作为该设计的温度传感器。
关键词:
单片机、温度传感器、数码管
前言
年历,是指印有一年的月份、日期、节气等的印刷品。
人们习惯把单张年历、月历、日历都划入广义的年历范畴内。
几十年来,年历的发展见证了科技的发展和时代的变迁。
年历工艺的进步显示了科技的发展和人民生活水平的提高。
随着科学技术的发展,以前的年历已发展成现代的电子万年历,它一开始是采用数字电路实现的,电路复杂,精确度差,每天都需要调时,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得它的电路越来越简单,精度也越来越高,现在的电子万年历一般都用集成芯片和软件结合实现,电路简单,制作方便,耗电少而又不失美观,适应低碳经济的发展趋势同时,给人们生产生活都来了极大的便利,它已成为我们生活中不可缺少的家居用品。
第一章总体方案
§1.1方案比较
目前,常见的万年历有三种形式,一是液晶显示,二是数码管显示,三是点阵显示。
在此三者之间,液晶显示的成本最高,耗电也最高,而且存储空间有限,大大影响了电子万年历的性能。
虽然显示的效果出众,但是在显示时,屏幕会有明显的闪烁。
不利于广大群众的使用!
其次,点阵显示缺点就是散热不好,容易出现死灯,且分辨率不同高,不适合近距离观看!
§1.2方案论证
数码管显示相比液晶显示和点阵显示,采用七段数码管既经济实惠,在效果上也可以加温度显示功能,操作比较液晶显示来说虽然略显繁琐,但总体也还可以做到比较人性化。
由于其低耗能,低成本且适合大众化等特点,所以在未来的市场上仍然会有很大的竞争力!
§1.3方案选择
综合以上所述,数码管显示的确有突出之处,尤其是经济实惠,适合大众化,耗能低,适合全球低碳经济的潮流!
所以本作品经多方面综合考虑后,选择七段数码管作为显示模块!
第二章硬件设计
§2.1单片机系统及显示电路设计
硬件电路主要分为单片机系统及显示电路和按键电路两部分组成。
其功能是通过89C51的控制,从而显示出年,月,日,时,分,秒。
另外有按钮开关用作时间的调整!
图2.1单片机系统及显示电路设计框图
单片机采用89C51利用它的最小应用系统设计,如图2.1.3所示,电容起稳定振荡频率、快速起振的作用,其电容值一般在5-30pF,本作品采用了30pF的电容。
然后在单片机的9脚接一个100K有电阻保护电路。
由于内部振荡方式所得的时钟信号需要比较稳定时,用12MHz高精度的晶振,以获得较稳定的时钟频率,减小时差。
所以在本设计中用12MHz的晶振。
显示电路采用简单实用的共阴七段数码管,电阻选用330欧姆排阻作为驱动,即可获得合适的亮度效果,显示电路如图2.1.2所示。
图2.1.2显示电路图
图2.1.3最小系统电路图
§2.2温度传感器的应用
本作品采用了特殊温度传感器DS18B20,通过温度传感器DS18B20
感受外界温度,把信息传到单片机,再通过程序把温度通过七段数码管
显示出来!
第三章系统调试
§3.1硬件调试
焊接的时候为了不把元器件弄错,需十分细心细操作,焊接时注意不要出现虚焊。
等完全焊接好后经认真检查多遍,确定无误后就开始接上电源,先检测一下单片机的电源脚(40脚)是否有电源,如果有适当的电压说明电源部分没有问题。
在硬件调试时先在芯片中烧一个简单的显示程序,数码管显示部分能不能全部正常工作。
若数码管显示不正常或者断码时检查一下数码管的管脚有没有虚焊,直到七段数码管全部能正常工作!
§3.2软件调试
确定硬件没有了错误后,根据原理连接图在KeiluVision3中编写程序。
编译无误后先在仿真器Preteus上仿真一下,看一下程序是否按自己编写的效果显示出来。
若出现乱码或者没有显示,即查看仿真元器件参数是否正确,若不正确即更改参数再仿真;其次,观察接线口高低电频的变化,观察导线是否连在与程序相对应的端口。
当能显示时间和温度的时候再通过三个按钮开关进行二次调试!
经过反复多次观察和调试,得出下图的软件仿真效果。
软件仿真图
第四章系统功能、指标参数
系统功能
通过以单片机89c51组成的最小系统作为为控制核心,从而控制三个按钮开关来调节时间的显示和实现温度的显示。
最终实现电子万年历的功能,以及温度计的功能。
使用万用表测得电源电压和数码管的工作电流、电压如下:
电源电压
数码管工作总电流
单个数码管工作电压
5V
770mA
3.1V
指标参数分析
根据资料数据,一般单个数码管的工作电流为20mA以内,工作电压为3V~5V!
综合上表显示的数据,可以说明这个电子万年工作在正常范围内。
第五章设计总结
通过这次制作使我们了解了整个万年历的工作过程和各个部分的工作过程,使我体会到利用单片机设计的电子万年历便于操作、直观。
经实际使用观察证明,该万年历能达到基本的要求,能正确的显示年、月、日、时、分、秒,同时能显示温度;能通过按键切换调时,误差为12秒/天,达到了设计的要求,总的来说制作还是成功的!
在本次制作中,碰到了很多问题,但经过了老师、同学的指导和帮助,这些问题基本上得到了解决。
另外软件部分还需要多多向老师和同学学习。
在这个设计中还有待提高的地方,由于时间紧迫,外观不是很理想!
总之,通过这次的电子万年历的制作使我们对本门专业知识有了进一步的学习,提高了我们收集资料的能力,动手的能力。
对书本中学到的知识也有了进一步的认识。
同时提高了我们程序设计能力!
参考文献
[1]、余永权等.单片机在控制系统中的应用:
北京电子工业出版社,2004。
[2]、李华.MCS-51系列单片机实用接口技术:
北京航空航天大学出版社,2004。
[3]、李光飞等.单片机课程设计实例指导:
北京航空航天大学出版社,2004。
[5]、刘文涛等.MCS-51单片机培训教程:
电子工业出版社,2005.8。
[6]、张义和等.例说51单片机:
人民邮电出版社,2010。
附录A
实物图
附录B
电路原理图
附录C
作品程序
#defineucharunsignedchar
#defineuintunsignedint
#defineDQP3_7
#include
uintsec;
uintmin=20;
uinthour=22;
uintday=17;
uintmonth=5;
uintyearl=11;
uintyearh=20;
uinttcnt;
uintcursor=0;
uchara=0xff;
ucharcodeSeg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
voiddelay(uintt)
{
uinti;
while(t--)
{for(i=0;i<125;i++);}
}
voidTdelay(unsignedinti)
{
while(i--);
}
voidKdelay()
{
uchari,j;
for(i=100;i>0;i--)
for(j=248;j>0;j--);
}
Init_DS18B20(void)
{
unsignedcharx=0;
DQ=1;
Tdelay(8);
DQ=0;
Tdelay(80);
DQ=1;
Tdelay(14);
Tdelay(20);
}
//读一个字节
ReadOneChar(void)
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
Tdelay(4);
}
return(dat);
}
//写一个字节
WriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
Tdelay(5);
DQ=1;
dat>>=1;
}
}
//读取温度
ReadTemperature(void)
{
unsignedchara=0;
unsignedcharb=0;
unsignedintt=0;
floattt=0;
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t=tt*10+0.5;
return(t);
}
voiddisplay(ucharL1,ucharL2,ucharL3,ucharL4,ucharL5,ucharL6,ucharL7,ucharL8,ucharL9,ucharL10,ucharL11,ucharL12,ucharL13,ucharL14,ucharL15,ucharL16)
{
P2=0x7F;P0=L1;delay
(1);//yearh
P2=0xBF;P0=L2;delay
(1);//yearh
if(cursor==6){P2=0xDF|a;P0=L3;delay
(1);}else{P2=0xDF;P0=L3;delay
(1);}//yearl
if(cursor==6){P2=0xEF|a;P0=L4;delay
(1);}else{P2=0xEF;P0=L4;delay
(1);}//yearl
if(cursor==5){P2=0xF7|a;P0=L5;delay
(1);}else{P2=0xF7;P0=L5;delay
(1);}//month
if(cursor==5){P2=0xFB|a;P0=L6;delay
(1);}else{P2=0xFB;P0=L6;delay
(1);}//month
if(cursor==4){P2=0xFD|a;P0=L7;delay
(1);}else{P2=0xFD;P0=L7;delay
(1);}//day
if(cursor==4){P2=0xFE|a;P0=L8;delay
(1);}else{P2=0xFE;P0=L8;delay
(1);}//day
P2=0xFF;
if(cursor==3){P1=0x7F|a;P0=L9;delay
(1);}else{P1=0x7F;P0=L9;delay
(1);}//hour
if(cursor==3){P1=0xBF|a;P0=L10;delay
(1);}else{P1=0xBF;P0=L10;delay
(1);}//hour
if(cursor==2){P1=0xDF|a;P0=L11;delay
(1);}else{P1=0xDF;P0=L11;delay
(1);}//min
if(cursor==2){P1=0xEF|a;P0=L12;delay
(1);}else{P1=0xEF;P0=L12;delay
(1);}//min
if(cursor==1){P1=0xF7|a;P0=L13;delay
(1);}else{P1=0xF7;P0=L13;delay
(1);}//sec
if(cursor==1){P1=0xFB|a;P0=L14;delay
(1);}else{P1=0xFB;P0=L14;delay
(1);}//sec
P1=0xFD;P0=L15;delay
(1);//temp
P1=0xFE;P0=L16;delay
(1);//temp
P1=0xFF;
}
main()
{
uinti;
TMOD=0x02;//设置模式为定时器T0的模式2(8位自动重装计数初值的计数值)
TH0=0x06;//设置计数器初值,靠TH0存储重装的计数值X0=256-250=6
TL0=0x06;
TR0=1;//启动T0
ET0=1;//开启定时器T0中断允许
EA=1;//开启中断总控制
while
(1)
{
if(P3_0==0)
{
Kdelay();
if(P3_0==0)
{
cursor++;
if(cursor>=7){cursor=0;}
}
}
if(P3_1==0)
{
Kdelay();
if(P3_1==0)
{
if(cursor==1){sec++;if(sec==60)sec=0;}
if(cursor==2){min++;if(min==60)min=0;}
if(cursor==3){hour++;if(hour==24)hour=0;}
if(cursor==4){day++;if(day==31)day=0;}
if(cursor==5){month++;if(month==12)month=0;}
if(cursor==6){yearl++;if(yearl==100)yearl=0;}
if(cursor==7){yearh++;if(yearh==30)yearh=20;}
}
}
if(P3_2==0)
{
Kdelay();
if(P3_2==0)
{
if(cursor==1){sec--;}
if(cursor==2){min--;}
if(cursor==3){hour--;}
if(cursor==4){day--;}
if(cursor==5){month--;}
if(cursor==6){yearl--;}
if(cursor==7){yearh--;}
}
}
i=ReadTemperature();
display(Seg[yearh/10],Seg[yearh%10],Seg[yearl/10],Seg[yearl%10],Seg[month/10],Seg[month%10],Seg[day/10],Seg[day%10],Seg[hour/10],Seg[hour%10],Seg[min/10],Seg[min%10],Seg[sec/10],Seg[sec%10],Seg[i/100],Seg[i/10%10]);
}
}
voidt0(void)interrupt1using0//t0的中断程序
{
tcnt++;
if(tcnt==4000)//定时器的定时计数,4000次250us为1秒
{
tcnt=0;
P3_3=~P3_3;
a=~a;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{
hour=0;
day++;
if(month==2&&((yearl==0&&yearh%4==0)||(yearl!
=0&&yearl%4==0))&&day==30)day=1;
elseif(month==2&&day==29)day=1;
elseif((month==4||month==6||month==9||month==11)&&day==31)day=1;
elseif(day==32)day=1;
if(day==1)
{
month++;
if(month==13)
{
month=1;
yearl++;
if(yearl==100)
{
yearl=0;
yearh++;
if(yearh==100)
{
yearh=20;
}
}
}
}
}
}
}
}