带温度显示的数字万年历设计文档格式.docx
《带温度显示的数字万年历设计文档格式.docx》由会员分享,可在线阅读,更多相关《带温度显示的数字万年历设计文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
软件方面我们采用C语言编程,利用KeiluVision4软件编写C语言程序并且生成HEX文件。
通过之后再烧录到单片机中。
该设计的优点是充分利用了LCD1602的显示功能完成了万年历和温度。
不足之处是收到LCD1602显示功能的限制没能显示农历日期。
关键词:
万年历;
LCD1602;
温度传感器(DS18B20);
时钟芯片(DS1302)
目录
1.设计背景……………………………………………………………………1
1.1时钟的用途及精度的需求…………………………………………1
1.2万年历的使用现状及设计目的…………………………………………1
2.设计方案……………………………………………………………………1
2.1任务分析……………………………………………………………………1
2.2方案选择和论证……………………………………………………………2
2.2.1显示模块选择方案和论…………………………………………………2
2.2.2时钟模块的方案选择和论证……………………………………………2
2.2.3按键控制模块的方案选择和论证………………………………………2
2.2.4温度采集模块方案选择…………………………………………………3
2.2.5方案的整体框图…………………………………………………………3
2.2.6设计流程图程序部分的拟定案…………………………………………4
3.方案实施…………………………………………………………………5
3.1.1整体电路及其分析………………………………………………………5
3.1.2电源电路…………………………………………………………………6
3.1.3单片机最小系统…………………………………………………………6
3.1.4蜂鸣器及驱动电路………………………………………………………7
3.1.5时钟芯片DS1302电路…………………………………………………7
3.1.6温度采集芯片DS18B20电路……………………………………………8
3.1.7键盘控制电路……………………………………………………………8
3.1.8LCD1602控制电路………………………………………………………9
3.2软件仿真………………………………………………………………10
3.2.1Proteus仿真软件介绍…………………………………………………10
3.2.2电路仿真调试…………………………………………………………11
3.3电路的焊接与调试……………………………………………………12
4.结果与结论………………………………………………………………14
5.收获与致谢………………………………………………………………14
6.参考文献…………………………………………………………………15
7.附件………………………………………………………………………15
7.1电路原理图………………………………………………………………15
7.2Proteus仿真图…………………………………………………………16
7.3电路工作中实物图………………………………………………………17
7.4元器件清单………………………………………………………………19
7.5源程序清单……………………………………………………………20
1.设计背景
1.1时钟的用途及精度的需求
时间,对人们来说是非常宝贵的,准确的掌握时间和分配时间对人们来说至关重要。
随着时间的流逝,科学技术的不断发展和提高,人们对时间计量的精度要求越来越高,应用越来越广。
怎样让时钟更好、更方便、更精确的显示时间,这就要求人们不断设计研发出新型的时钟。
高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟,石英表,石英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校。
数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替指针进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。
1.2万年历的使用现状及设计目的
如今万年历已经在人们生活中广泛的使用,它不仅是记录日期和时间的工具,而且也成为了一种装饰品。
现在的万年历可以说是多种多样,外观精美。
放在家里既可以计时也可作为风景壁画,因此越来越受到大众消费者的喜爱。
本次课程设计通过利用STC89C52单片机和DS1302芯片以及外围的按键和LCD显示器等部件,设计一个基于单片机的电子时钟。
设计的电子时钟通过液晶显示器显示,并能通过按键对时间以及闹钟进行设置。
目的来模拟真实产品中万年历的工作原理,具有很强的实用性。
2.设计方案
2.1任务分析
目的是设计一个带温度显示的万年历电路系统,该电路具有年、月、日、星期、时、分、秒、闹钟显示和调整功能,并且还能显示温度等功能。
其中显示部分准备采用LCD1602显示,时钟部分准备采用DS1302时钟芯片,温度部分准备采用DS18B20单线温度传感器。
2.2方案选择和论证
2.2.1、显示模块选择方案和论证
方案一:
采用点阵式数码管显示。
点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且难度也相对较高,所以不用此种作为显示。
方案二:
采用LED数码管动态扫描。
LED数码管价格便宜,对于显示数字最合适,但功耗较大,且显示容量不够,所以也不用此种方案。
方案三:
采用LCD液晶显示屏。
液晶显示屏的显示功能强大,可显示大量文字,显示多样,清晰可见,且价格适中,所以采用了LCD数码管作为显示。
2.2.2时钟模块的方案选择和论证
直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。
采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。
所以不采用此方案。
采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA.
2.2.4温度采集模块方案选择(宋体四号,加粗)
DS18B20数字温度传感器接线方便,独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。
耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
因此DS18B20完全满足设计要求。
2.2.6设计流程图程序部分小组的拟定方案
Y
N
Y
N
图2设计流程图
3.方案实施
3.1.1原理图设计及工作原理分析(宋体四号,加粗)
图3整体原理图
我们首先构成单片机的最小系统,使单片机能正常工作,在程序中首先对LCD1602、DS1302、DS18B20进行初始化,由CPU完成对DS1302产生的各种时钟数据的读取,然后将数据写至LCD1602,以显示数据,达到可视化的效果。
对于课程设计的拓展部分,我们可以利用DS18B20温度传感器来测试周围环境的温度,由CPU完成对数据的读取,然后通过CPU将数据写至LCD1602,以显示温度数据,达到可视化的效果。
通过键盘扫描子程序通过测试按键是否闭合来调整各种时间数据和闹钟已达到校准和定时的目的。
3.1.2电源电路(宋体四号,加粗)
我们采用了USB和变压器双电源供电:
图4变压器供电电路
变压器输出的9V交流电经桥堆2W10后变成有较大波动的的直流电,然后经过滤波电容和微调电容后变成直流电,再经过L7805三端稳压器输出5V直流电。
7805输出端的电容起到了防干扰和微调作用。
图5USB供电电路
3.1.3单片机最小系统(宋体四号,加粗)
单片机采用了上电自动复位和按键复位的双复位,利用12MHZ晶振作为单片机的外部晶振来驱动单片机工作。
其中两个33pf的电容用于晶振的启动。
由于单片机的P0口是准双向IO口,所以需要排阻RP1作为该口的上拉电阻。
图6单片机最小系统
3.1.5时钟芯片DS1302电路(宋体四号,加粗)
时钟芯片采用双电源,当系统断电之后由3V的电源—电池供电。
保证了系统断电之后时钟继续工作,当系统再次上电之后时钟能显示正确的时间和日期。
图8时钟电路
3.1.6温度采集芯片DS18B20电路(宋体四号,加粗)
图9温度采集电路
3.1.8LCD1602控制电路(宋体四号,加粗)
LCD1602是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
第1脚:
VSS为电源地。
第2脚:
VDD接5V电源正极。
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高。
第4脚:
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:
RW为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
第6脚:
E(或EN)端为使能(enable)端。
第7~14脚:
D0~D7为8位双向数据端。
第15~16脚:
空脚或背灯电源。
15脚背光正极,16脚背光负极。
图11LCD1602液晶显示电路
3.2软件仿真
3.2.1仿真软件介绍(宋体四号,加粗)
Proteus
与其它单片机仿真软件不同的是,它不仅能仿真单片机CPU
的工作情况,也能仿真单片机外围电路或没有单片机参与的其它电路的工作情况。
因此在仿真和程序调试时,关心的不再是某些语句执行时单片机寄存器和存储器内容的改变,而是从工程的角度直接看程序运行和电路工作的过程和结果。
对于这样的仿真实验,从某种意义上讲,是弥补了实验和工程应用间脱节的矛盾和现象。
(1)proteus
的工作过程
运行proteus
的ISIS
程序后,进入该仿真软件的主界面。
在工作前,要设置view
菜单下的捕捉对齐和system下的颜色、图形界面大小等项目。
通过工具栏中的p(从库中选择元件命令)命令,在pick
devices
窗口中选择电路所需的元件,放置元件并调整其相对位置,元件参数设置,元器件间连线,编写程序;
在source
菜单的Definecode
generation
tools
菜单命令下,选择程序编译的工具、路径、扩展名等项目;
菜单的Add/removesource
files
命令下,加入单片机硬件电路的对应程序;
通过debug
菜单的相应命令仿真程序和电路的运行情况。
(2)Proteus
软件所提供的元件资源Proteus
软件所提供了30
多个元件库,数千种元件。
元件涉及到数字和模拟、交流和直流等。
(3)Proteus
软件所提供的仪表资源
对于一个仿真软件或实验室,测试的仪器仪表的数量、类型和质量,是衡量实验室是否合格的一个关键因素。
在Proteus
软件包中,不存在同类仪表使用数量的问题。
Proteus
还提供了一个图形显示功能,可以将线路上变化的信号,以图形的方式实时地显示出来,其作用与示波器相似但功能更多。
(4)Proteus
软件所提供的调试手段
提供了比较丰富的测试信号用于电路的测试。
这些测试信号包括模拟信号和数字信号。
对于单片机硬件电路和软件的调试,Proteus
提供了两种方法:
一种是系统总体执行效果,一种是对软件的分步调试以看具体的执行情况。
对于总体执行效果的调试方法,只需要执行debug
菜单下的execute
菜单项或F12
快捷键启动执行,用debug菜单下的pause
animation
菜单项或pause
键暂停系统的运行;
或用debug
菜单下的stop
菜单项或shift-break
组合键停止系统的运行。
其运行方式也可以选择工具栏中的相应工具进行。
对于软件的分步调试,应先执行debug
菜单下的start/restart
debugging
菜单项命令,此时可以选择stepover
、step
into
和
step
out
命令执行程序(可以用快捷键F10、F11
和ctrl+F11),执行的效果是单句执行、进入子程序执行和跳出子程序执行。
在执行了start
/
restart
debuging
命令后,在debug
菜单的下面要出现仿真中所涉及到的软件列表和单片机的系统资源等,可供调试时分析和查看。
3.2Proteus电路仿真与调试
图12Proteus下的仿真电路图
本次课程设计我们小组采用分工合作的方式,把任务分成了四个模块:
硬件部分、软件部分、仿真调试、实物的制作与调试。
我们首先拟定实现的功能方案,然后小组讨论制定系统的整体框图。
采用功能模块化、任务具体化、工作协调化的方式,充分发挥小组成员各自的的优势。
本次设计我主要负责仿真与调试模块,因为我之前没有接触过Proteus的仿真,因此在协调小组工作之余我开始学习Proteus仿真软件的使用。
可以说仿真是软件和硬件的组合体,首先要对硬件有充足的了解,明白其中各个模块的功能,而且对软件也要有透彻的了解。
因为当仿真结果与预期的结果不一致时,在确保硬件设计合理的基础上只能是软件的编写有误,因此需要对软件进行修改。
在仿真的时候出现的问题让我不知所措,刚开始竟然连液晶都不亮。
经检查后发现原来是液晶背光的电源与地接反了。
经调整后,液晶亮了,但是什么都不显示。
经小组商讨后,我决定用分模块的方式,首先对各个模块分开测试。
在修改程序的同时,我学会编程软件KEIL的使用,提高了我的编程能力和软件测试的技巧,第一步:
我测试单片机的最小系统,看看单片机是否工作。
我写了一个小程序,将4个IO口的电平全部拉低发现单片根本就不工作,IO口的引脚电平还是默认的高电平。
我首先判定是单片机的外部晶振出了问题,经检查后发现是晶振的起震电容选取的不合适,经修改后单片机正常工作了。
第二步:
测试液晶的初始化程序,让其开显示并且光标闪烁,然后测试液晶的写入程序,经测试后发现该模块的程序均正常。
第三步:
测试DS1302的读写程序,通过单片机读取DS1302时钟芯片的数据,然后将数据处理后送到液晶显示器液晶能够正常显示,但是与预期的显示位置有差异,经修改写入的地址后,能达到预期的目标。
第四步:
DS18B20温度传感器数据的读写,当单片机对其数据进行读入是发现根本就没反应,经过讨论和测试后发现是它的读写时序不对,于是我们对比DS18B20的数据手册,然后进行单步调试确保时序与之对应,然后再次读取它的数据,这次终于成功了。
最后将修改过的主程序载入单片机发现各个部分的功能都能实现了。
软件仿真部分圆满成功。
4结果与结论
完成了用LCD1602显示的带温度显示的万年历的预期的全部功能功能。
具有年、月、日、星期、时、分、秒、温度等显示功能;
具备年、月、日、星期、时、分、秒校准功能。
制作过程中将程序烧到板上时,LCD1602不能显示结果,经过排查,发现是接触不良,重新将其接好后,再次烧录程序。
终于显示了结果,可是现实的结果并不是自己设定的日期,后来才发现在设置初值时,将顺序搞乱了,重新整理后,上面显示正确的结果。
该设计的缺点是没能显示农历功能,这也是受到LCD1602显示功能的影响。
如果换成LCD12864显示就能充分显示农历日期。
5收获与致谢
为了完成此次课设,我再次翻阅了所学的理论知识,对题目有了一定的理解后,开始相关的设计。
整个课设的难处在于程序设计部分。
首先,这次课设我们都要用到KEIL编译软件,虽然很早就接触到了这种软件,但只是会一点皮毛。
这个课设要用到很多新的功能,运用起来有一定的困难,不过最后通过查询一些资料,能较好地掌握这些知识。
主要的困难在后面的芯片程序设计部分。
我们首先查阅芯片手册,研究其操作的时序图,然后按照时序图写程序。
首先,对于DS1302时钟芯片,其初始化设置以及CPU读取时间数据,均需要熟悉相应的引脚功能和运用相应的函数,学会运用这些函数耗费了我不少时间,为此我专门复习了一下以前学习的C语言知识。
掌握了DS1302的使用方法后,我开始学习LCD的使用方法,与前面一样,我复习了以前的知识,熟悉了其引脚功能,为后面的程序编写积累了知识。
这也在一定程度上提高了我们对时序图的了解,也提高了我们的编程能力。
另外在做拓展部分是,还掌握了DS18B20的使用方法,此次课程设计着实让我学到了很多硬件和软件方面的知识。
通过此次课设,我对单片机的C语言编程有了初步的掌握,熟悉了几种芯片的使用方法,同时提高了动手操作的能力,理论和实践都有了提高。
课设做完后,也发现了自己的一些不足,平时很少自己动手设计程序,以至于用的时候有很多困难,在以后的时间里,我会多设计一些电路,提高自己的动手实践能力。
在此还要感谢设计中帮助过我的老师和同学。
6.参考文献
7.附件
7.1电路原理图
图13整体电路原理图
7.2Proteus仿真图
图14正常工作状态下
7.3实物图
图17正常工作状态下
7.4元器件清单
元器件名称
型号规格
数量
备注
单片机
STC89C52
1
加DIP40底座
晶振1
32.768M
(DS1302外部晶振)
晶振2
11.0592MHZ
加2脚底座
排阻
4.7K(9引脚)
P0口的上拉电阻
USB
USB电源接口
加USB电源线一根
可调电阻
10K
LCD1602背光调节
电阻
6
390欧
2
1K或100
4
电解电容
1000uF
电解电容
100uF
10uF
5
非极性电容
0.1uF
33pF
发光二极管
红色LED
电源-电池
3V电池--电子
2
(1)
都需要底座
四角开关
微动(脉冲)开关
六角开关
按键(自锁式)
三极管
PNP(8550)
液晶
LCD1602
加16脚单排插座
时钟芯片
DS1302
加DIP8底座
温度传感器
DS18B20
加3脚插座
整流二极管
1N4001
桥堆
2W10
三端稳压器
7805
蜂鸣器-BELL
有源蜂鸣器
7.5源程序清单
#include<
reg52.H>
intrins.H>
math.H>
#defineucharunsignedchar
#defineucintunsignedint
sbitdula=P2^6;
sbitwela=P2^7;
sbitRS=P3^5;
sbitRW=P3^6;
sbitE=P3^4;
voidyanshi(ucharxms);
voidwritecommand(ucharx);
voidwritedate(ucharx);
voidxianshi(ucharadd,uchardate);
voidinit();
ucharmiao=0,fen=30,shi=8,t=0,num;
ucharcodeshuzu[]="
2017-12-015"
;
voiddelayUs()
{
_nop_();
}
voidyanshi(ucharxms){
uchari,j;
for(i=xms;
i>
0;
i--)
for(j=110;
j>
j--);
voidwritecommand(ucharx){
dula=wela=0;
RS=0;
E=0;
P0=x;
yanshi(5);
E=1;
voidwritedate(ucharx){
RS=1;
voidxianshi(ucharadd,uchardate){
ucharshi,ge;
shi=date/10;
ge=date%10;
writecommand(0x80+0x40+add);
writedate(0x30+shi);
writedate(0x30+ge);
voidinit(){
RW=0;
writecommand(0x38);
writecommand(0x0c);
writecommand(0x06);
writecommand(0x01);
writecommand(0x80);
for(num=0;
num<
12;
num++){
writedate(shuzu[num]);
}
writecommand(0x80+0x40+6);
writedate(