基于LCD1602电子时钟课程设计报告_第1页
基于LCD1602电子时钟课程设计报告_第2页
基于LCD1602电子时钟课程设计报告_第3页
基于LCD1602电子时钟课程设计报告_第4页
基于LCD1602电子时钟课程设计报告_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、0 / 47 文档可自由编辑打印信息与电子工程学院信息与电子工程学院课程设计报告课程设计报告课课 程程单片机技术应用单片机技术应用设计题目设计题目基于基于 LCD1602LCD1602 电子时钟电子时钟专专 业业班班 级级姓姓 名名学学 号号分工分工成成 绩绩成成 员员指导老师指导老师答辩日期答辩日期 目 录1 / 47 文档可自由编辑打印一、一、 课程设计概述课程设计概述 .2 21.1 课程设计背景.21.2 课程设计内容.21.3 课程设计技术指标.2二、二、 方案的选择及确定方案的选择及确定 .2 22.1 单片机芯片的选择.22.2 显示模块的选择.32.3 实时时间计算模块的选择.

2、32.4 实时环境温度采集模块选择.32.5 电路设计最终方案决定.4三、三、 系统硬件设计系统硬件设计 .4 43.1 主控模块.43.2 LCD 显示模块设计 .53.3 时间计算模块设计.53.4 实时环境温度检测模块.63.5 报警模块.63.6 设置模块.73.7 电源接口部分.7四、四、 系统软件设计系统软件设计 .7 74.1 主函数.74.2 设置模块 .84.3 1602 液晶屏 .94.4 软件原理图.10五、五、 系统调试过程系统调试过程 .10105.1 软件调试 .105.2 硬件调试 .11六、六、 结论结论 .1111七、七、 遇到的问题及解决方法和总结遇到的问题

3、及解决方法和总结 .11117.1 硬件方面 .117.2 软件方面 .127.3 总结 .122 / 47 文档可自由编辑打印八、八、 参考文献参考文献 .1212九、九、 附附 录录 .13133 / 47 文档可自由编辑打印一、一、 课程设计概述课程设计概述1.11.1 课程设计背景课程设计背景随着微电子技术的高速发展,单片机在国民经济的个人领域得到了广泛的运用。单片机以体积小、功能全、性价比高等诸多优点,在工业控制、家用电器、通信设备、信息处理、尖端武器等各种测控领域的应用中独占鳌头,单片机开发技术已成为电子信息、电气、通信、自动化、机电一体化等专业技术人员必须掌握的技术。而电子万年历

4、作为电子类小设计不仅是市场上的宠儿,也是是单片机实验中一个很常用的题目。因为它有很好的开放性和可发挥性,因此对作者的要求比较高,不仅考察了对单片机的掌握能力更加强调了对单片机扩展的应用。而且在操作的设计上要力求简洁,功能上尽量齐全,显示界面也要出色。1.21.2 课程设计内容课程设计内容利用单片机、时钟芯片 DS1302、温度传感器 DS18B20、1602 液晶屏等实现日期、时间、温度的显示,即是一个电子时钟。具体的功能如下:(1)通过 DS1302 能够准确的计时,时间可调并在液晶屏上显示出来。(2)通过 DS18B20 能够实时、准确的检测当前环境温度。(3)利用程序控制单片机实现闹钟功

5、能。1.31.3 课程设计技术指标课程设计技术指标(1)LCD 液晶每行刷新显示。(2)实时时钟可提供年、月、日、时、分和秒,每月的天数可以自动调整,且具有闰年补偿功能。(3)时间是 24 小时制;年限 2000 年2099 年。(4)测量温度范围为 0 + 60 ,误差为 0.5C 。二、二、 方案的选择及确定方案的选择及确定2.12.1 单片机芯片的选择单片机芯片的选择方案(1): 采用 AT89S51 芯片作为硬件核心 该芯片采用 Flash ROM,内部具有 4KB ROM 存储空间,而且与 MCS-51 系列单片机完全兼容,但是需要通过下载板来下载,比较不方便。4 / 47 文档可自

6、由编辑打印方案(2):采用传统的 STC89C52RC 芯片作为硬件核心该芯片具有 8KB 在线系统可编程 Flash 存储器。STC89C52RC 使用经典的 MCS-51 内核,但做了很多的改进使得芯片具有传统 51 单片机不具备的功能,并且可直接使用串口下载。 因 AT89S51 需要通过下载板下载,而 STC89C52RC 可直接使用串口下载,所以选择采用方案(2)STC89C52RC 作为主控制系统.2.22.2 显示模块显示模块的选择的选择方案(1): 8 段数码管显示8 段数码管是利用发光二极管的特性组合而成数字显示器件,通过控制相应的二极管的状态显示相应的数字。采用数码管显示,

7、数码管亮度高、体积小、重量轻,但其显示信息简单、有限,操作比较液晶显示来说略显繁琐。方案(2):1602 液晶屏显示1602 液晶也叫 1602 字符型液晶 它是一种专门用来显示字母、数字、符号等的点阵型液晶模块采用液晶显示。液晶显示功耗低,轻便防震。由于设计显示信息比较多,占用的系统资源少,操作方便。因本设计显示的字符较多,1602LCD 可以显示 32 个字符,而 8 段数码管显示的字符较少,且操作比液晶显示略显繁琐,所以采用方案(2)1602 液晶屏组成本设计的显示模块。2.32.3 实时时间计算模块实时时间计算模块的选择的选择方案(1):采用 STC89C52RC 芯片STC89C52

8、RC 单片机内部带有定时/计数功能,此定时功能是通过对外部晶振的脉冲进行计数,从而达到计时功能,只要使用 12MHZ 实现零误差的计时,因此可以利用此功能实现计时,但因为只有单一的计时功能,要实现“电子时钟”的功能需要较复杂的程序,时间计算逻辑较困难,所以使用不便。 方案(2):采用 DS1302 芯片DS1302 是美国 DALLAS 公司推出的一种高性能、低功耗、带 RAM 的实时时钟芯片。该芯片采用 3 线串行接口方式,可提供年月日、星期、时分秒等时间信息,并可根据月份和闰年的情况自动调整月份的结束日期。内部带有 31 个字节 RAM,用于存放临时性数据,同时具有可编程涓细电流充电能力。

9、因 STC89C52RC 芯片时间计算逻辑较困难,而 DS1302 可根据月份和闰年的情况自动调整月份的结束日期且具有编程涓细电流充电能力,所以采用方案(2)实现实时计时功能。5 / 47 文档可自由编辑打印2.42.4 实时环境温度采集模块实时环境温度采集模块选择选择方案(1):采用热敏电阻热敏电阻是开发早、种类多、发展较成熟的敏感元器件热敏电阻由半导体陶瓷材料组成,利用的原理是温度引起电阻变化。通过一定的电路可以将周围环境的温度变化转化成电压的变化,通过 AD 转化器件将信号传输给单片机进行分析,所以热敏电阻需要的外部器件较多。方案(2):采用 DS18B20DS18B20 是美国 DAL

10、LAS 公司生产的数字温度传感器,采用单总线的接口方式与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。在使用中可以不接任何外围元件,或者在单总线上接一个 4.7K 的上拉电阻,支持多点组网功能 多个 DS18B20 可以并联在惟一的单线上,实现多点测温,供电方式灵活 DS18B20 可以通过内部寄生电路从数据线上获取电源,因此非常适合本系统使用。因热敏电阻需要的外部器件较多,而 DS18B20 在使用中可以不接任何外围元件,或者在单总线上接一个 4.7K 的上拉电阻,所以采用方案(2)构成本设计的实时温度采集模块。2.52.5 电路设计最终方案决定电路设计最终方案

11、决定综上各方案所述,本系统以 STC89C52RC 单片机为控制核心,通过与 DS1302 和DS18B20 通信获取实时时间和实时环境温度,并将得到的数据通过 1602 液晶显示出来,同时通过对应的按键调整相应的值,并且通过蜂鸣器实现报警功能。因此本设计的总体方案组成框图如图 2-1 所示:显示模块(1602 液晶)STC89C52RC报警模块(蜂鸣)时间计算模块(DS1302)实时温度采集模块(DS18B20)设置模块(独立按键)图 2-1 总体方案组成框图6 / 47 文档可自由编辑打印三、三、 系统硬件设计系统硬件设计3.13.1 主控模块主控模块本次课程设计主要用到 STC89C52

12、RC 单片机,硬件原理图(见附录图一)。端口分配表如 3-1 所示: 表 3-1 端口分配表引脚序号引脚名称作用及功能1P1.0DS1302 时钟输入2P1.1时钟串行数据输入、输出端3P1.2时钟芯片复位端58P1.4P1.7按键设置9RST芯片复位端口13P3.3实现 18B20 温度的输入16P3.6接蜂鸣器,实现闹钟功能18、19XTAL1、XTAL2外部晶振端口26P2.5实现 1602 数据和指令选择控制端27P2.61602 读写控制端28P2.71602 数据读写操作控制位30、31ALE、EA地址锁存端口,烧写程序的端口3239P0输出数据,控制 1602 液晶屏的显示3.2

13、3.2 LCDLCD 显示模块设计显示模块设计1602 液晶功耗较小可直接与单片机接口相接,电源直接与电源电路相接为+5V,对比度可调。本设计使用单片机的 P0 口和 P2 口与 1602 进行通信。另外 1602 有 2 行显示,每行显示的字符数为 16 个,可以用于显示字母、数字、符号等,并具有简单且功能较强的指令集,可以实现字符显示、移动、闪烁等功能。1602 液晶与单片机接口电路如图 3-1 所示:图 3-1 1602 液晶与单片机接口7 / 47 文档可自由编辑打印3.33.3 时间计算模块设计时间计算模块设计DS1302 通过三根 I/O 线实现与单片机的通信,依靠 2、3 脚外接

14、的晶振与其内部的电容配合来产生时钟脉冲的。当外接晶振电路振荡时,DS1302 计时正确;当外接晶振电路停振时,DS1302 计时停止。因此 32.768kHz 晶振是造成 DS1302 工作不稳定的主要因素。因其功耗很小,当 1 脚的主电源超过 8 脚接的备用电源加 0.2V 时,由主电源对芯片供电;否则,有备用电源对芯片供电,所以即使电源掉电后通过 3V 的电池仍能维持芯片精确走时。DS1302 与单片机接口电路如图 3-2 所示:图 3-2 DS1302 与单片机接口 3.43.4 实时环境温度检测模块实时环境温度检测模块DS18B20 通过单总线实现与单片机的通信,系统中的数据交换,控制

15、都由这根线完成。在使用中 DS18B20 没有用到任何外围元件,可工作在 15+100内。DS18B20 与单片机接口电路如图 3-3 所示:图 3-3 DS18B20 与单片机接口 3.53.5 报警模块报警模块在本设计中蜂鸣器直接接在单片机 P3.6 上。报警模块采用单片机输出 1.25KHZ 的频率从而使蜂鸣器发出声音。方波图如图 3-4 所示:8 / 47 文档可自由编辑打印图 3-4 方波图3.63.6 设置模块设置模块设置模块采用四个按键 K1-K4 与单片机 P1.4、P1.5、P1.6、P1.7 接口相接,其中 K1为设置模块的选择位,K2 是增加键,K3 是减少键,K4 为退

16、出按键。独立按键与单片机接口电路如图 3-5 所示:图 3-5 独立按键与单片机接口3.73.7 电源接口部分电源接口部分采用 USB 接口从电脑接到电源接口中,拨动开关可控制电路的接通和关闭,并用一个发光二极管作电源指示。电源接口如图 3-6 所示:图 3-6 电源接口四、四、 系统软件设计系统软件设计软件设计是本设计的关键,软件程序编写的好坏直接影响着系统运行情况的良好。本系统采用具有编写灵活、移植方便、便于模块化设计的 C 语言编写,并通过 Proteus9 / 47 文档可自由编辑打印软件进行仿真,完成各种实质性功能的设计。4.14.1 主函数主函数主函数是程序功能总结显示的函数,其主

17、要显示的是时间主要部分和当前实时时间,当按下按键 2 时 1602 显示当前温度状态,并延时 5s,后返回当前时间显示状态;当闹钟功能打开,实时时间又和闹钟时间相等就会发出嘀嘀的响声并且在液晶屏上有相应的提示,此时按按键 4 退出;当进入设置状态完成后退出就回到当前时间显示状态。主函数程序框图如图 4-1 所示:显示欢迎界面按 K2?显示时间主要部分清屏显示实时时间设 置 模 块清屏显示当前温度清屏显示时间主要部分清屏显示TIME UP清屏显示时间主要部分实时=闹钟? 闹钟开? 报 警 按 K4?是是是是否否否AA否初始化开 始图 4-1 主函数程序框图4.24.2 设置模块设置模块设置模块分

18、时间设置、闹钟设置、最高温度报警设置。要先按下按键 1 才能进入设置模块,然后按下按键 1 进入设置时间模块;按键 2 进入最高温度报警模块;按键 3 进10 / 47 文档可自由编辑打印入设置闹钟模块,最后按下按键 4 退出当前状态。设置步骤流程图如图 4-2 所示:按 K1?进入设置模块进入时间调整按 K2?按 K3?进入高温报警设置按 K4?进入闹钟时间设置是是是是否否否否AA按 K1?是否退 出图 4-2 设置步骤流程图4.34.3 16021602 液晶屏液晶屏1602 液晶屏是此设计的主要输出部分,有 2 行显示,每行 16 个字符,根据写入的位置而显示,当显示欢迎界面时是流动的,

19、整个屏幕向右移动。 1602LCD 流程图如图 4-3 所示:开 始11 / 47 文档可自由编辑打印1602 初始化刷新显示第一行数据刷新显示第二行数据结 束开 始图 4-3 1602LCD 流程图4.4 软件原理软件原理图图软件原理图如附录图二所示:这个设计中,STC89C52RC 主要功能是储存程序、根据程序的内容对各个端口进行判断并作出相应的处理;DS1302 主要功能是控制年,月,日,时,分,秒的显示效果;LCD1602 主要功能是将所要显示的显示出来;DS18B20 主要功能是控制温度的显示效果。通电后,进入欢迎界面,前后延时 2.8s,,后显示当前实时时间,若按下按键 1 就进入

20、调节状态,此时在按下按键 1 为设置时间状态,按下按键 2 为设置最大温度报警状态,按按键 3 为设置闹钟状态,按下按键 4 为退出调节状态;若按下按键 2 则是显示当前温度,5s 后自动跳回显示当前实时时间。五、五、 系统调试过程系统调试过程系统调试共分为两大部分:一个是软件调试,另一个是硬件调试。其中软件仿真通过 Protues 实现;硬件部分现在 Protel99SE 上设计出硬件电路图,画出 PCB 图,然后再制造出实物。调试方法采用先分别调试各单元模块,调通后再进行整体调试的方法,以提高调试效率。 5.15.1 软件调试软件调试先根据仿真检测当中的元件是否符合电路的设计,在 Keil

21、C51 写入程序并且修改至编译正确,在将写好的程序入入到 Protues 软件单片机芯片上,进行仿真。仿真结果如下所示:图 a : 显示实时时间 图 b: 显示当前温度 图 c : 当达到设置的最高温度 图 d: 当达到设置的闹钟时间 图 e : ,当进入调节状态 图 f: 当调节时间12 / 47 文档可自由编辑打印 图 g : 当调节最高温度 图 h: 当调节闹钟 5.25.2 硬件调试硬件调试根据仿真后的电路图进行做板,先用万用表检测各元器件是否正确,再焊接电路,完成后检查无误就将程序用单片机板下载到芯片上,后把芯片拔下插入实物板上,即可工作。上电后,拨动电源开关就进入欢迎界面 ,2.8

22、s 后进入当前实时时间状态,按下按键 1 进入调节状态,此时按下按键 1 为设置时间状态,按下按键 2 为设置最大温度报警状态,按按键 3 为设置闹钟状态,按下按键 4 为退出调节状态;在调节状态时按键 2 为对应增加键,按键 3 为对应减键,K4 为退出按键;按下按键 2 后用手捏住 DS18B20 芯片,在液晶屏上显示的温度有明显的变化,所以判断芯片是良好的。六、六、 结论结论这次课程设计达到了预期的 90%,有显示实时时间和实时温度,但是温度的显示不完全正确,在负数时有三个温度值显示错误,时间的设置逻辑比较啰嗦,没有做到简单化。例外还加了欢迎界面、闹钟功能、最高温度报警功能。下面从软件和

23、硬件两个方面具体说明。硬件的制作要涉及到 protel 软件的运用,在画原理图的时候如果连错了就直接导致硬件的出错,所以画图的时候要特别注意。到导入 PCB 时也是要特别注意的,布板不当也是直接影响实物的制作。对于电子时钟的制作,我们基于小系板来实现,外接显示部分的 1602LCD 液晶屏、温度传感部分 DS18B20、提供实时时间部分 DS1302、蜂鸣器、电源接口部分等。总之,一步步制作下来我们完成的还是比较可观的。软件的编写上我们出现了较大的困难,电子时钟的程序有些复杂,一开始对于我们来说毫无头绪。后来下了很大的功夫且在老师及同学的指导下慢慢的进入了状态。虽然过程出现很多困难,但结果还是

24、实现了电子时钟的功能,不过在显示温度负数时有三个数值显示错误,分别是-16,-32,-48;另外设置模块的逻辑没有做到简单化,在设置模块时只能退出本级的设置,而不能直接退出到当前实时时间显示状态。13 / 47 文档可自由编辑打印七、七、 遇到的问题及解决方法和总结遇到的问题及解决方法和总结7.17.1 硬件方面硬件方面画的 PCB 板焊盘不够大,又没有相应大小的砖针,而且在融板过程中出现了差错,最后导致 PCB 板不完美.解决方案:最终决定自己用万能板焊接。7.27.2 软件方面软件方面由于对 C 语言程序的认知不深入,在修改程序时,出现了以下几点问题。(1)欢迎界面的时间太长。解决方案;修

25、改欢迎界面的延时时间。(2)温度显示错乱,并且在显示时高位自动补零。解决方案:通过修改温度函数使其高位的零自动隐藏,但是温度在-16,-32,-48 度时仍然会出现错误,比实际的温度高 16 度,其余温度值时显示正确。(3)秒钟调节时会自动转零。解决方案:把自动转零部分的程序改为秒钟调节功能。(4)进入调节时间状态时字符闪烁以至于看不清楚调节的大小。解决方案:把 1602 的字符闪烁指令改为光标指令。(5)在报警时无声音。解决方案:修改报警模块,利用控制 P3.6 脚电源的通断,使蜂鸣器发出嘀嘀的响声。7.37.3 总结总结课程设计的完成,为我们的大二下学期学习生活画下了最后一笔。在做课程设计

26、的日子里得到了大量课内外的知识巩固,使得我们的动手能力和专业技能都有了很大的提高。让我们认识到脚踏实地,认真严谨是学习的态度,不怕困难、坚持不懈、吃苦耐劳的精神是我们在这次设计中最大的收益。我想这是一次意志的磨练,是对我实际能力的一次提升,也会对我未来的学习和工作有很大的帮助。在这次设计中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助我们的同学。14 / 47 文档可自由编辑打印八、八、 参考文献参考文献【1】.常敏.王涵单片机应用程序开发与实践P219【2】.江志红. 51 单片机技术与应用系统开发案例精

27、选【3】.赵明明、索世文、王守中51 单片机应用开发手册指令、模块、实例【4】.王守中.51 单片机开发入门与典型实例P149【5】.天津锐志单片机开发网【6】.杨黎基于 C 语音的单片机应用技术与 Proteus 仿真 P21九、九、 附附 录录1、仪器与设备清单工具、设备和耗材数量电脑1 台KeiluKision41 套Proteus7.7 软件1 套单片机实训板1 块杜邦导线16 条Protel99SE1 套 万用表1 套2、元器件清单元件名称型号数量(个)编号价格(元/个)单片机STC89C52RC1A14液晶LMD16L1Y118芯片DS13021Y23温度芯片DS18B201Y31

28、3晶振12MHZ,32.768KHZ2JZ1,JZ21瓷片电容22pF2C1,C2电解电容22u10uf1C3排阻10k1RP1按钮6*6*55K1K50.1电阻10k,1k2R1,r2可调电阻1k1POT1电池1.5V2DC0.5电源插座1DY2拨动开关0.9*0.3*1.1cm1KG0.3发光二极管LED1LED0.1蜂鸣器TMB12A051LB0.815 / 47 文档可自由编辑打印排针1*40PIN2.54mm2(排)CON03、原理图(见图一)4、PCB 图(见图三)5、实物图(见图四)6、操作说明书a、正常显示时按下 K1 进入调节状态,此时按下 K1 为设置时间状态;按下 K2

29、为设置最大温度报警状态;按 K3 为设置闹钟状态;按下 K4 为退出调节状态;在调节状态时K2 为对应增加键,K3 为对应减键,K4 为退出按键。b、正常显示时按下 K2 显示当前温度并延时 5 秒;报警时按 K4 退出。图 1(硬件原理图)图 2(软件原理图)图 3(PCB)16 / 47 文档可自由编辑打印程序:#include#includeunsigned char code displaywelcome= Welcome To My Lcd Timer;/欢迎界面unsigned char code displaywish= Happy Every Day _; /欢迎界面unsig

30、ned char code overtemperature=OVERTEMPERATURE!;unsigned char code digit=0123456789; /数字代码unsigned char mode,TH,TL,TN,TD,length,tempswitch,Maxtemp=40,amode,alarmmode,minutes,hours,minutea,seconds,houra=12;sbit SCLK=P10;/DS1302时钟输入sbit DATE=P11;/DS1302数据输入sbit REST=P12;/DS1302复位端口sbit SET=P14; /DS1302

31、设置模式选择位sbit ADD=P15; /增加sbit RED=P16; /减小sbit CANL=P17; sbit beep=P36;/位定义,定义P.6位fmpvoid delay1ms(int i)/1毫秒延时 int j,k; while(i-) for(j=76;j1;j-); for(k=29;k1;k-); void delaynus(unsigned char n) /延时若干微秒 unsigned char i; for(i=0;i0;i-) _nop_(); void baojing()/报警 unsigned int j,h,y;for(h=0;h3;h+)for(y

32、=0;y10;y+)beep=beep;for(j=0;j50;j+);dely500(); /*DS1302模块*/ void Write1302(unsigned char date)/向1302写数据 unsigned char i;SCLK=0;delaynus(2);for(i=0;i=1; void WriteSet1302(unsigned char cmd,unsigned char date) /根据相应的命令输入相应的数据 REST=0;SCLK=0;REST=1;Write1302(cmd);delaynus(5);18 / 47 文档可自由编辑打印Write1302(d

33、ate);SCLK=1;REST=0; unsigned char Read1302(void) /读取1302数据 unsigned char i,date;delaynus(2);for(i=0;i=1;if(DATE=1)date|=0 x80;SCLK=1;delaynus(2);SCLK=0;delaynus(2);return date; unsigned char ReadSet1302(unsigned char cmd)/根据命令读取1302相应的值unsigned char date;REST=0;SCLK=0;REST=1;Write1302(cmd);delaynus(

34、2);date=Read1302();SCLK=1;REST=0;return date;void IntDS1302(void) /DS1302初始化 unsigned char flag; flag= ReadSet1302(0 x81);if(flag&0 x80) /判断时钟芯片是否关闭 WriteSet1302(0 x8E,0 x00); /根据写状态寄存器命令字,写入不保护指令 WriteSet1302(0 x80,(0/10)4|(0%10); /根据写秒寄存器命令字,写入秒的初始值WriteSet1302(0 x82,(0/10)4|(0%10); /根据写分寄存器命令

35、字,写入分的初始值WriteSet1302(0 x84,(0/10)4|(0%10); /根据写小时寄存器命令字,写入小时的初始值WriteSet1302(0 x86,(0/10)4|(0%10); /根据写日寄存器命令字,写入日的初始值WriteSet1302(0 x88,(0/10)4|(0%10); /根据写月寄存器命令字,写入月的初始值19 / 47 文档可自由编辑打印WriteSet1302(0 x8c,(10/10)4)*10+(value&0 x0f);display_Second(seconds);value=ReadSet1302(0 x83);minutes=(va

36、lue&0 x70)4)*10+(value&0 x0f);display_Minute(minutes);value=ReadSet1302(0 x85);hours=(value&0 x70)4)*10+(value&0 x0f);display_Hour(hours);value=ReadSet1302(0 x87);day=(value&0 x70)4)*10+(value&0 x0f);display_Day(day);value=ReadSet1302(0 x89);month=(value&0 x70)4)*10+(valu

37、e&0 x0f);display_Month(month);value=ReadSet1302(0 x8D);year=(value&0 xf0)4)*10+(value&0 x0f);display_Year(year);void displaystar(void) /显示欢迎界面unsigned char i,j;Write_Address(0 x0f);while(displaywelcomei!=0)Write_Date(displaywelcomei);i+;delay1ms(1);24 / 47 文档可自由编辑打印i=0;Write_Address(0 x4

38、f);while(displaywishi!=0)Write_Date(displaywishi);i+;delay1ms(1);j=40;while(j-)Write_com(0 x18);/循环左移delay1ms(70); Write_com(0 x01);delay1ms(10);void gbdisplay(unsigned char address) /时间调整时光标闪烁Write_Address(address);delay1ms(5);Write_com(0 x0e); delay1ms(5); void displaymaxt(unsigned char x) /显示最大温度

39、unsigned char i,j,k;Write_com(0 x0c);delay1ms(2);Write_Address(0 x44);i=x/100;j=x/10;k=x%10;Write_Date(digiti);Write_Date(digitj);Write_Date(digitk);/*时间调整部分*/void hourset(void)/调时unsigned char timevalue,hour;delay1ms(500); /防止多次触发WriteSet1302(0 x8e,0 x00);/将写保护去掉,确保能正常将调整后的数值写入DS1302timevalue=ReadS

40、et1302(0 x85); /读取此时的数值25 / 47 文档可自由编辑打印hour=(timevalue&0 x70)4)*10+(timevalue&0 x0f);while(1)if(ADD=0)delay1ms(50);if(ADD=0)hour+;delay1ms(300);while(ADD=0);if(RED=0)delay1ms(50);if(RED=0)hour-;delay1ms(300);if(hour=0) hour=23;while(RED=0); timevalue=(hour)/10)=24) hour=0;delay1ms(5);if(CAN

41、L=0)mode=0;Write_com(0 x0c); break; WriteSet1302(0 x8e,0 x80);void minuteset(void) /调分unsigned char timevalue,minute;26 / 47 文档可自由编辑打印delay1ms(500);WriteSet1302(0 x8e,0 x00);timevalue=ReadSet1302(0 x83);minute=(timevalue&0 x70)4)*10+(timevalue&0 x0f);while(1)if(ADD=0)delay1ms(10);if(ADD=0)mi

42、nute+;if(minute=60) timevalue=0;while(ADD=0);if(RED=0)delay1ms(10);if(RED=0)minute-;delay1ms(300);if(minute=0) minute=59;while(RED=0);timevalue=(minute/10)=60) minute=0;delay1ms(5);if(CANL=0)mode=0;Write_com(0 x0c); break;WriteSet1302(0 x8e,0 x80);void secondset(void) /调秒27 / 47 文档可自由编辑打印unsigned ch

43、ar second,timevalue;delay1ms(500);WriteSet1302(0 x8e,0 x00);timevalue=ReadSet1302(0 x81);second=(timevalue&0 x70)4)*10+(timevalue&0 x0f);while(1)if(ADD=0)delay1ms(50);if(ADD=0) second+;delay1ms(300);while(ADD=0);if(RED=0)delay1ms(10);if(RED=0)if(-second=0) second=59;while(RED=0); timevalue=(

44、second/10)=60) second=0; delay1ms(5);if(CANL=0)mode=0;Write_com(0 x0c); break;WriteSet1302(0 x8e,0 x80);void yearset(void)/调年unsigned char datevalue,year;28 / 47 文档可自由编辑打印delay1ms(500);WriteSet1302(0 x8e,0 x00);datevalue=ReadSet1302(0 x8d);year=(datevalue&0 x70)4)*10+(datevalue&0 x0f);while(

45、1)if(ADD=0)delay1ms(10);if(ADD=0)year+;while(ADD=0);if(RED=0)delay1ms(10);if(RED=0)year-;delay1ms(300);while(RED=0);datevalue=(year/10)4)*10+(datevalue&0 x0f);while(1)if(ADD=0)delay1ms(10);if(ADD=0)month+;if(month12) month=1;while(ADD=0);if(RED=0)delay1ms(10);if(RED=0)month-;delay1ms(300);if(mon

46、th=0) month=12;while(RED=0);datevalue=(month/10)4)*10+(datevalue&0 x0f);while(1)if(ADD=0)delay1ms(10);if(ADD=0)day+;if(day31) day=1;while(ADD=0);if(RED=0)delay1ms(10);if(RED=0)day-;delay1ms(300);if(day=0) day=31;while(RED=0);datevalue=(day/10)23) value=0;while(ADD=0);if(RED=0)delay1ms(20);if(RED

47、=0)value-;if(value=0) value=23;while(RED=0);houra=value;display_houra(houra);gbdisplay(0 x45);if(CANL=0) delay1ms(500);break; void alarmminuteset(void)/闹钟分钟调整 while(1) if(ADD=0)delay1ms(20);if(ADD=0)minutea+;if(minutea59) minutea=0;while(ADD=0) ;32 / 47 文档可自由编辑打印if(RED=0)delay1ms(20);if(RED=0)minute

48、a-;if(minutea=0) minutea=59;while(RED=0) ;display_minutea(minutea);gbdisplay(0 x48);if(CANL=0)delay1ms(500);break; void TimeSet(void) /时间调整函数display_Time();if(SET=0)delay1ms(10);if(SET=0)mode+;delay1ms(20);switch(mode)case(1):gbdisplay(0 x48);hourset(); delay1ms(500);case(2):gbdisplay(0 x4c);minutes

49、et();delay1ms(500);case(3):gbdisplay(0 x4f);secondset();delay1ms(500); case(4):gbdisplay(0 x09);yearset();delay1ms(500); case(5):gbdisplay(0 x0c);monthset();delay1ms(500);case(6):gbdisplay(0 x0f);dayset();delay1ms(500);default:break;33 / 47 文档可自由编辑打印 /*显示温度模块*/unsigned char code displayexplain=Digit

50、 thermometer;unsigned char code displayerror=DS18B20 ERROR;unsigned char code displayerror1=PLEASE CHECK ;unsigned char code displaypart1=WenDu:;unsigned char code displaypart2=Cent;unsigned char flag;/*操作DS18B20模块*/sbit DQ=P33;unsigned char time;/*DS18B20初始化*/bit IntDS18B20(void)bit temp;DQ=1;for(t

51、ime=0;time2;time+);DQ=0;for(time=0;time200;time+);DQ=1;for(time=0;time10;time+);temp=DQ;for(time=0;time200;time+);return temp;/*读DS18B20*/ unsigned char ReadDS18B20(void) unsigned char i;unsigned char dat;for(i=0;i8;i+)DQ=1;_nop_();DQ=0;_nop_();DQ=1;for(time=0;time=1;if(DQ=1)dat=dat|0 x80;elsedat=da

52、t|0 x00;34 / 47 文档可自由编辑打印for(time=0;time10;time+);return dat; /*向DS18B20写数据*/ void WriteDS18B20(unsigned char date) unsigned char i;for(i=0;i8;i+)DQ=1;_nop_();DQ=0;DQ=date&0 x01;for(time=0;time10;time+);DQ=1;for(time=0;time=1;for(time=0;time0;length-)for(i=0;i255) TH+=1;TN=TH*16+TL/16;TD=(TL%16)

53、*10/16;TN=TH*16+TL/16;TD=(TL%16)*10/16;Display_Integer(TN);Display_Decimal(TD);delay1ms(10);if(tempswitch=1)if(TN=Maxtemp) Write_Address(0 x03);delay1ms(5);displayovert();while(1)baojing();if(CANL=0) Write_com(0 x01);delay1ms(5);break;if(CANL=0) break; void tempset(void) if(ADD=0) delay1ms(10);39 /

54、47 文档可自由编辑打印if(ADD=0) Maxtemp+;while(ADD=0);if(RED=0) delay1ms(10);if(RED=0) Maxtemp-;while(RED=0); void Maxtempset(void) /高温报警设置 Write_com(0 x01);delay1ms(10);Write_Address(0 x03);delay1ms(10);Write_Date(T);Write_Date(E);Write_Date(M);Write_Date(P);Write_Address(0 x09);Write_Date(S);Write_Date(E);W

55、rite_Date(T);Write_Address(0 x40);Write_Date(M);Write_Date(A);Write_Date(X);Write_Date(:);while(1)if(SET=0)delay1ms(20);if(SET=0)Write_Address(0 x4e);Write_com(0 x0f);while(1)40 / 47 文档可自由编辑打印if(ADD=0)delay1ms(20);if(ADD=0)Write_Address(0 x4b);delay1ms(5);Write_Date(O);Write_Date(N);Write_Date( );te

56、mpswitch=1;if(RED=0)delay1ms(20);if(RED=0)Write_Address(0 x4b);Write_Date(O);Write_Date(F);Write_Date(F);tempswitch=0;if(CANL=0) delay1ms(500);break;if(tempswitch=1)Write_Address(0 x4b);Write_Date(O);Write_Date(N);Write_Date( );Write_Address(0 x45);Write_com(0 x0e);tempset();displaymaxt(Maxtemp);if(

57、CANL=0) 41 / 47 文档可自由编辑打印Write_com(0 x01);displaymainpart();break;if(tempswitch=0)Write_com(0 x0c);Write_Address(0 x4b);Write_Date(O);Write_Date(F);Write_Date(F);if(CANL=0) Write_com(0 x01);displaymainpart();break; void alarmswitchset(void) while(1)if(ADD=0)delay1ms(100);if(ADD=0)alarmmode=1;Write_Address(0 x4c);Write_Date(O);Write_Date(N);Write_Date( );if(RED=0)alarmmode=0;Write_Address(0 x4c);Write_Date(O);Write_Date(F);Write_Date(F);42 / 47 文档可自由编辑打印i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论