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

下载本文档

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

文档简介

信息与电子工程学院信息与电子工程学院 课程设计报告课程设计报告 课课 程程单片机技术应用单片机技术应用 设计题目设计题目基于基于 lcd1602lcd1602 电子时钟电子时钟 专专 业业 班班 级级 姓姓 名名学学 号号分工分工成成 绩绩 成成 员员 指导老师指导老师 答辩日期答辩日期 目 录 1 一、一、 课程设计概述课程设计概述 2 2 1.1 课程设计背景.2 1.2 课程设计内容.2 1.3 课程设计技术指标.2 二、二、 方案的选择及确定方案的选择及确定 2 2 2.1 单片机芯片的选择.2 2.2 显示模块的选择.3 2.3 实时时间计算模块的选择.3 2.4 实时环境温度采集模块选择.3 2.5 电路设计最终方案决定.4 三、三、 系统硬件设计系统硬件设计 4 4 3.1 主控模块.4 3.2 lcd 显示模块设计 .5 3.3 时间计算模块设计.5 3.4 实时环境温度检测模块.6 3.5 报警模块.6 3.6 设置模块.7 3.7 电源接口部分.7 四、四、 系统软件设计系统软件设计 7 7 4.1 主函数.7 4.2 设置模块 .8 4.3 1602 液晶屏 9 4.4 软件原理图10 五、五、 系统调试过程系统调试过程 1010 5.1 软件调试 10 5.2 硬件调试 11 六、六、 结论结论 1111 七、七、 遇到的问题及解决方法和总结遇到的问题及解决方法和总结 1111 7.1 硬件方面 11 7.2 软件方面 12 7.3 总结 12 2 八、八、 参考文献参考文献 1212 九、九、 附附 录录 1313 3 一、一、 课程设计概述课程设计概述 1.11.1 课程设计背景课程设计背景 随着微电子技术的高速发展,单片机在国民经济的个人领域得到了广泛的运用。单 片机以体积小、功能全、性价比高等诸多优点,在工业控制、家用电器、通信设备、信 息处理、尖端武器等各种测控领域的应用中独占鳌头,单片机开发技术已成为电子信息、 电气、通信、自动化、机电一体化等专业技术人员必须掌握的技术。 而电子万年历作为电子类小设计不仅是市场上的宠儿,也是是单片机实验中一个很 常用的题目。因为它有很好的开放性和可发挥性,因此对作者的要求比较高,不仅考察 了对单片机的掌握能力更加强调了对单片机扩展的应用。而且在操作的设计上要力求简 洁,功能上尽量齐全,显示界面也要出色。 1.21.2 课程设计内容课程设计内容 利用单片机、时钟芯片 ds1302、温度传感器 ds18b20、1602 液晶屏等实现日期、时 间、温度的显示,即是一个电子时钟。具体的功能如下: (1)通过 ds1302 能够准确的计时,时间可调并在液晶屏上显示出来。 (2)通过 ds18b20 能够实时、准确的检测当前环境温度。 (3)利用程序控制单片机实现闹钟功能。 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 系列单片机完 全兼容,但是需要通过下载板来下载,比较不方便。 方案(2):采用传统的 stc89c52rc 芯片作为硬件核心 4 该芯片具有 8kb 在线系统可编程 flash 存储器。stc89c52rc 使用经典的 mcs-51 内 核,但做了很多的改进使得芯片具有传统 51 单片机不具备的功能,并且可直接使用串口 下载。 因 at89s51 需要通过下载板下载,而 stc89c52rc 可直接使用串口下载,所以选择采 用方案(2)stc89c52rc 作为主控制系统. 2.22.2 显示模块显示模块的选择的选择 方案(1): 8 段数码管显示 8 段数码管是利用发光二极管的特性组合而成数字显示器件,通过控制相应的二极管 的状态显示相应的数字。采用数码管显示,数码管亮度高、体积小、重量轻,但其显示信 息简单、有限,操作比较液晶显示来说略显繁琐。 方案(2):1602 液晶屏显示 1602 液晶也叫 1602 字符型液晶 它是一种专门用来显示字母、数字、符号等的点阵 型液晶模块采用液晶显示。液晶显示功耗低,轻便防震。由于设计显示信息比较多,占 用的系统资源少,操作方便。 因本设计显示的字符较多,1602lcd 可以显示 32 个字符,而 8 段数码管显示的字符 较少,且操作比液晶显示略显繁琐,所以采用方案(2)1602 液晶屏组成本设计的显示模 块。 2.32.3 实时时间计算模块实时时间计算模块的选择的选择 方案(1):采用 stc89c52rc 芯片 stc89c52rc 单片机内部带有定时/计数功能,此定时功能是通过对外部晶振的脉冲进 行计数,从而达到计时功能,只要使用 12mhz 实现零误差的计时,因此可以利用此功能 实现计时,但因为只有单一的计时功能,要实现“电子时钟”的功能需要较复杂的程序, 时间计算逻辑较困难,所以使用不便。 方案(2):采用 ds1302 芯片 ds1302 是美国 dallas 公司推出的一种高性能、低功耗、带 ram 的实时时钟芯片。该 芯片采用 3 线串行接口方式,可提供年月日、星期、时分秒等时间信息,并可根据月份 和闰年的情况自动调整月份的结束日期。内部带有 31 个字节 ram,用于存放临时性数据, 同时具有可编程涓细电流充电能力。 因 stc89c52rc 芯片时间计算逻辑较困难,而 ds1302 可根据月份和闰年的情况自动 调整月份的结束日期且具有编程涓细电流充电能力,所以采用方案(2)实现实时计时功能。 5 2.42.4 实时环境温度采集模块实时环境温度采集模块选择选择 方案(1):采用热敏电阻 热敏电阻是开发早、种类多、发展较成熟的敏感元器件热敏电阻由半导体陶瓷材 料组成,利用的原理是温度引起电阻变化。通过一定的电路可以将周围环境的温度变化 转化成电压的变化,通过 ad 转化器件将信号传输给单片机进行分析,所以热敏电阻需要 的外部器件较多。 方案(2):采用 ds18b20 ds18b20 是美国 dallas 公司生产的数字温度传感器,采用单总线的接口方式与微处 理器连接时仅需要一条口线即可实现微处理器与 ds18b20 的双向通讯。在使用中可以不 接任何外围元件,或者在单总线上接一个 4.7k 的上拉电阻,支持多点组网功能 多个 ds18b20 可以并联在惟一的单线上,实现多点测温,供电方式灵活 ds18b20 可以通过内 部寄生电路从数据线上获取电源,因此非常适合本系统使用。 因热敏电阻需要的外部器件较多,而 ds18b20 在使用中可以不接任何外围元件,或 者在单总线上接一个 4.7k 的上拉电阻,所以采用方案(2)构成本设计的实时温度采集 模块。 2.52.5 电路设计最终方案决定电路设计最终方案决定 综上各方案所述,本系统以 stc89c52rc 单片机为控制核心,通过与 ds1302 和 ds18b20 通信获取实时时间和实时环境温度,并将得到的数据通过 1602 液晶显示出来, 同时通过对应的按键调整相应的值,并且通过蜂鸣器实现报警功能。因此本设计的总体 方案组成框图如图 2-1 所示: 显示模块(1602 液晶) s t c 8 9 c 5 2 r c 报警模块(蜂鸣) 时间计算模块 (ds1302) 实时温度采集模块 (ds18b20) 设置模块 (独立按键) 图 2-1 总体方案组成框图 6 三、三、 系统硬件设计系统硬件设计 3.13.1 主控模块主控模块 本次课程设计主要用到 stc89c52rc 单片机,硬件原理图(见附录图一)。端口分配 表如 3-1 所示: 表 3-1 端口分配表 引脚序号引脚名称作用及功能 1p1.0 ds1302 时钟输入 2p1.1 时钟串行数据输入、输出端 3p1.2 时钟芯片复位端 58p1.4p1.7 按键设置 9rst 芯片复位端口 13p3.3 实现 18b20 温度的输入 16p3.6 接蜂鸣器,实现闹钟功能 18、19xtal1、xtal2外部晶振端口 26p2.5 实现 1602 数据和指令选择控制端 27p2.6 1602 读写控制端 28p2.7 1602 数据读写操作控制位 30、31ale、ea地址锁存端口,烧写程序的端口 3239p0 输出数据,控制 1602 液晶屏的显示 3.23.2 lcdlcd 显示模块设计显示模块设计 1602 液晶功耗较小可直接与单片机接口相接,电源直接与电源电路相接为+5v,对比 度可调。本设计使用单片机的 p0 口和 p2 口与 1602 进行通信。另外 1602 有 2 行显示, 每行显示的字符数为 16 个,可以用于显示字母、数字、符号等,并具有简单且功能较强 的指令集,可以实现字符显示、移动、闪烁等功能。 1602 液晶与单片机接口电路如图 3-1 所示: 图 3-1 1602 液晶与单片机接口 7 3.33.3 时间计算模块设计时间计算模块设计 ds1302 通过三根 i/o 线实现与单片机的通信,依靠 2、3 脚外接的晶振与其内部的电 容配合来产生时钟脉冲的。当外接晶振电路振荡时,ds1302 计时正确;当外接晶振电路 停振时,ds1302 计时停止。因此 32.768khz 晶振是造成 ds1302 工作不稳定的主要因素。 因其功耗很小,当 1 脚的主电源超过 8 脚接的备用电源加 0.2v 时,由主电源对芯片供电; 否则,有备用电源对芯片供电,所以即使电源掉电后通过 3v 的电池仍能维持芯片精确走 时。 ds1302 与单片机接口电路如图 3-2 所示: 图 3-2 ds1302 与单片机接口 3.43.4 实时环境温度检测模块实时环境温度检测模块 ds18b20 通过单总线实现与单片机的通信,系统中的数据交换,控制都由这根线完成。 在使用中 ds18b20 没有用到任何外围元件,可工作在 15+100内。 ds18b20 与单片机接口电路如图 3-3 所示: 图 3-3 ds18b20 与单片机接口 3.53.5 报警模块报警模块 在本设计中蜂鸣器直接接在单片机 p3.6 上。报警模块采用单片机输出 1.25khz 的频 率从而使蜂鸣器发出声音。 方波图如图 3-4 所示: 8 图 3-4 方波图 3.63.6 设置模块设置模块 设置模块采用四个按键 k1-k4 与单片机 p1.4、p1.5、p1.6、p1.7 接口相接,其中 k1 为设置模块的选择位,k2 是增加键,k3 是减少键,k4 为退出按键。 独立按键与单片机接口电路如图 3-5 所示: 图 3-5 独立按键与单片机接口 3.73.7 电源接口部分电源接口部分 采用 usb 接口从电脑接到电源接口中,拨动开关可控制电路的接通和关闭,并用一 个发光二极管作电源指示。 电源接口如图 3-6 所示: 图 3-6 电源接口 四、四、 系统软件设计系统软件设计 软件设计是本设计的关键,软件程序编写的好坏直接影响着系统运行情况的良好。 本系统采用具有编写灵活、移植方便、便于模块化设计的 c 语言编写,并通过 proteus 9 软件进行仿真,完成各种实质性功能的设计。 4.14.1 主函数主函数 主函数是程序功能总结显示的函数,其主要显示的是时间主要部分和当前实时时间, 当按下按键 2 时 1602 显示当前温度状态,并延时 5s,后返回当前时间显示状态;当闹钟 功能打开,实时时间又和闹钟时间相等就会发出嘀嘀的响声并且在液晶屏上有相应的提 示,此时按按键 4 退出;当进入设置状态完成后退出就回到当前时间显示状态。 主函数程序框图如图 4-1 所示: 显示欢迎界面 按 k2? 显示时间主要部分 清屏显示实时时间 设 置 模 块 清屏显示当前温度 清屏显示时间主要部分 清屏显示time up 清屏显示时间主要部分 实时=闹钟? 闹钟开? 报 警 按 k4? 是 是 是 是 否 否 否 a a 否 初始化 开 始 图 4-1 主函数程序框图 4.24.2 设置模块设置模块 设置模块分时间设置、闹钟设置、最高温度报警设置。要先按下按键 1 才能进入设 置模块,然后按下按键 1 进入设置时间模块;按键 2 进入最高温度报警模块;按键 3 进 10 入设置闹钟模块,最后按下按键 4 退出当前状态。 设置步骤流程图如图 4-2 所示: 按 k1? 进入设置模块 进入时间调整 按 k2? 按 k3? 进入高温报警设置 按 k4? 进入闹钟时间设置 是 是 是 是 否 否 否 否 a a 按 k1? 是 否 退 出 图 4-2 设置步骤流程图 4.34.3 16021602 液晶屏液晶屏 1602 液晶屏是此设计的主要输出部分,有 2 行显示,每行 16 个字符,根据写入的位 置而显示,当显示欢迎界面时是流动的,整个屏幕向右移动。 1602lcd 流程图如图 4-3 所示: 开 始 11 1602 初始化 刷新显示第一行 数据 刷新显示第二行 数据 结 束 开 始 图 4-3 1602lcd 流程图 4.4 软件原理软件原理图图 软件原理图如附录图二所示:这个设计中,stc89c52rc 主要功能是储存程序、根据 程序的内容对各个端口进行判断并作出相应的处理;ds1302 主要功能是控制年,月,日, 时,分,秒的显示效果;lcd1602 主要功能是将所要显示的显示出来;ds18b20 主要功能 是控制温度的显示效果。 通电后,进入欢迎界面,前后延时 2.8s,,后显示当前实时时间,若按下按键 1 就进 入调节状态,此时在按下按键 1 为设置时间状态,按下按键 2 为设置最大温度报警状态, 按按键 3 为设置闹钟状态,按下按键 4 为退出调节状态;若按下按键 2 则是显示当前温 度,5s 后自动跳回显示当前实时时间。 五、五、 系统调试过程系统调试过程 系统调试共分为两大部分:一个是软件调试,另一个是硬件调试。其中软件仿真通 过 protues 实现;硬件部分现在 protel99se 上设计出硬件电路图,画出 pcb 图,然后再 制造出实物。调试方法采用先分别调试各单元模块,调通后再进行整体调试的方法,以 提高调试效率。 5.15.1 软件调试软件调试 先根据仿真检测当中的元件是否符合电路的设计,在 keilc51 写入程序并且修改至 编译正确,在将写好的程序入入到 protues 软件单片机芯片上,进行仿真。 仿真结果如下所示: 图 a : 显示实时时间 图 b: 显示当前温度 图 c : 当达到设置的最高温度 图 d: 当达到设置的闹钟时间 图 e : ,当进入调节状态 图 f: 当调节时间 12 图 g : 当调节最高温度 图 h: 当调节闹钟 5.25.2 硬件调试硬件调试 根据仿真后的电路图进行做板,先用万用表检测各元器件是否正确,再焊接电路, 完成后检查无误就将程序用单片机板下载到芯片上,后把芯片拔下插入实物板上,即可 工作。上电后,拨动电源开关就进入欢迎界面 ,2.8s 后进入当前实时时间状态,按下按 键 1 进入调节状态,此时按下按键 1 为设置时间状态,按下按键 2 为设置最大温度报警 状态,按按键 3 为设置闹钟状态,按下按键 4 为退出调节状态;在调节状态时按键 2 为 对应增加键,按键 3 为对应减键,k4 为退出按键;按下按键 2 后用手捏住 ds18b20 芯片, 在液晶屏上显示的温度有明显的变化,所以判断芯片是良好的。 六、六、 结论结论 这次课程设计达到了预期的 90%,有显示实时时间和实时温度,但是温度的显示不完 全正确,在负数时有三个温度值显示错误,时间的设置逻辑比较啰嗦,没有做到简单化。 例外还加了欢迎界面、闹钟功能、最高温度报警功能。下面从软件和硬件两个方面具体 说明。 硬件的制作要涉及到 protel 软件的运用,在画原理图的时候如果连错了就直接导致 硬件的出错,所以画图的时候要特别注意。到导入 pcb 时也是要特别注意的,布板不当 也是直接影响实物的制作。对于电子时钟的制作,我们基于小系板来实现,外接显示部 分的 1602lcd 液晶屏、温度传感部分 ds18b20、提供实时时间部分 ds1302、蜂鸣器、电 源接口部分等。总之,一步步制作下来我们完成的还是比较可观的。 软件的编写上我们出现了较大的困难,电子时钟的程序有些复杂,一开始对于我们 来说毫无头绪。后来下了很大的功夫且在老师及同学的指导下慢慢的进入了状态。虽然 过程出现很多困难,但结果还是实现了电子时钟的功能,不过在显示温度负数时有三个 数值显示错误,分别是-16,-32,-48;另外设置模块的逻辑没有做到简单化,在 设置模块时只能退出本级的设置,而不能直接退出到当前实时时间显示状态。 13 七、七、 遇到的问题及解决方法和总结遇到的问题及解决方法和总结 7.17.1 硬件方面硬件方面 画的 pcb 板焊盘不够大,又没有相应大小的砖针,而且在融板过程中出现了差错, 最后导致 pcb 板不完美. 解决方案:最终决定自己用万能板焊接。 7.27.2 软件方面软件方面 由于对 c 语言程序的认知不深入,在修改程序时,出现了以下几点问题。 (1)欢迎界面的时间太长。 解决方案;修改欢迎界面的延时时间。 (2)温度显示错乱,并且在显示时高位自动补零。 解决方案:通过修改温度函数使其高位的零自动隐藏,但是温度在-16,-32,-48 度 时仍然会出现错误,比实际的温度高 16 度,其余温度值时显示正确。 (3)秒钟调节时会自动转零。 解决方案:把自动转零部分的程序改为秒钟调节功能。 (4)进入调节时间状态时字符闪烁以至于看不清楚调节的大小。 解决方案:把 1602 的字符闪烁指令改为光标指令。 (5)在报警时无声音。 解决方案:修改报警模块,利用控制 p3.6 脚电源的通断,使蜂鸣器发出嘀嘀的响声。 7.37.3 总结总结 课程设计的完成,为我们的大二下学期学习生活画下了最后一笔。 在做课程设计的日子里得到了大量课内外的知识巩固,使得我们的动手能力和专业技 能都有了很大的提高。让我们认识到脚踏实地,认真严谨是学习的态度,不怕困难、坚持不懈、 吃苦耐劳的精神是我们在这次设计中最大的收益。我想这是一次意志的磨练,是对我实际能力的一次 提升,也会对我未来的学习和工作有很大的帮助。在这次设计中也使我们的同学关系更进一步了,同 学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这 里非常感谢帮助我们的同学。 14 八、八、 参考文献参考文献 【1】.常敏.王涵单片机应用程序开发与实践p219 【2】.江志红. 51 单片机技术与应用系统开发案例精选 【3】.赵明明、索世文、王守中51 单片机应用开发手册指令、模块、实例 【4】.王守中.51 单片机开发入门与典型实例p149 【5】.天津锐志单片机开发网 【6】.杨黎基于 c 语音的单片机应用技术与 proteus 仿真 p21 九、九、 附附 录录 1、仪器与设备清单 工具、设备和耗材数量 电脑1 台 keilukision41 套 proteus7.7 软件1 套 单片机实训板1 块 杜邦导线16 条 protel99se1 套 万用表1 套 2、元器件清单 元件名称型号数量(个)编号价格(元/个) 单片机stc89c52rc1a14 液晶lmd16l1y118 芯片ds13021y23 温度芯片ds18b201y313 晶振12mhz,32.768 khz 2jz1,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.8 15 排针1*40pin2.54mm2(排)con0 3、原理图(见图一) 4、pcb 图(见图三) 5、实物图(见图四) 6、操作说明书 a、正常显示时按下 k1 进入调节状态,此时按下 k1 为设置时间状态;按下 k2 为设 置最大温度报警状态;按 k3 为设置闹钟状态;按下 k4 为退出调节状态;在调节状态时 k2 为对应增加键,k3 为对应减键,k4 为退出按键。 b、正常显示时按下 k2 显示当前温度并延时 5 秒;报警时按 k4 退出。 图 1(硬件原理图) 图 2(软件原理图) 图 3(pcb) 16 程序: #include #include unsigned char code displaywelcome=“ welcome to my lcd timer“;/欢迎界面 unsigned char code displaywish=“ happy every day _“; /欢迎界面 unsigned 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设置模式选择位 sbit add=p15; /增加 sbit red=p16; /减小 sbit canl=p17; sbit beep=p36;/位定义,定义p.6位fmp void 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;h=1; void writeset1302(unsigned char cmd,unsigned char date) /根据相应的命令输入相应的数 据 rest=0; sclk=0; rest=1; write1302(cmd); delaynus(5); 18 write1302(date); sclk=1; rest=0; unsigned char read1302(void) /读取1302数据 unsigned char i,date; delaynus(2); for(i=0;i=1; if(date=1) date|=0x80; 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(2); date=read1302(); sclk=1; rest=0; return date; void intds1302(void) /ds1302初始化 unsigned char flag; flag= readset1302(0x81); if(flag /根据写状态寄存器命令字,写入不保护指令 writeset1302(0x80,(0/10)4)*10+(value display_second(seconds); value=readset1302(0x83); minutes=(value display_minute(minutes); value=readset1302(0x85); hours=(value display_hour(hours); value=readset1302(0x87); day=(value display_day(day); value=readset1302(0x89); month=(value display_month(month); value=readset1302(0x8d); year=(value display_year(year); void displaystar(void) /显示欢迎界面 unsigned char i,j; write_address(0x0f); while(displaywelcomei!=0) write_date(displaywelcomei); i+; delay1ms(1); 24 i=0; write_address(0x4f); while(displaywishi!=0) write_date(displaywishi); i+; delay1ms(1); j=40; while(j-) write_com(0x18);/循环左移 delay1ms(70); write_com(0x01); delay1ms(10); void gbdisplay(unsigned char address) /时间调整时光标闪烁 write_address(address); delay1ms(5); write_com(0x0e); delay1ms(5); void displaymaxt(unsigned char x) /显示最大温度 unsigned char i,j,k; write_com(0x0c); delay1ms(2); write_address(0x44); 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(0x8e,0x00);/将写保护去掉,确保能正常将调整后的数值写入ds1302 timevalue=readset1302(0x85); /读取此时的数值 25 hour=(timevalue 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(canl=0) mode=0; write_com(0x0c); break; writeset1302(0x8e,0x80); void minuteset(void) /调分 unsigned char timevalue,minute; 26 delay1ms(500); writeset1302(0x8e,0x00); timevalue=readset1302(0x83); minute=(timevalue while(1) if(add=0) delay1ms(10); if(add=0) minute+; 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(0x0c); break; writeset1302(0x8e,0x80); void secondset(void) /调秒 27 unsigned char second,timevalue; delay1ms(500); writeset1302(0x8e,0x00); timevalue=readset1302(0x81); second=(timevalue 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=(second/10)=60) second=0; delay1ms(5); if(canl=0) mode=0; write_com(0x0c); break; writeset1302(0x8e,0x80); void yearset(void)/调年 unsigned char datevalue,year; 28 delay1ms(500); writeset1302(0x8e,0x00); datevalue=readset1302(0x8d); year=(datevalue while(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 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(month=0) month=12; while(red=0); datevalue=(month/10)4)*10+(datevalue 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=0) value-; if(value=0) value=23; while(red=0); houra=value; display_houra(houra); gbdisplay(0x45); 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 if(red=0) delay1ms(20); if(red=0) minutea-; if(minutea=0) minutea=59; while(red=0) ; display_minutea(minutea); gbdisplay(0x48); 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(0x48);hourset(); delay1ms(500); case(2):gbdisplay(0x4c);minuteset();delay1ms(500); case(3):gbdisplay(0x4f);secondset();delay1ms(500); case(4):gbdisplay(0x09);yearset();delay1ms(500); case(5):gbdisplay(0x0c);monthset();delay1ms(500); case(6):gbdisplay(0x0f);dayset();delay1ms(500); default:break; 33 /*显示温度模块*/ unsigned char code displayexplain=“digit 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(time=0;time=1; if(dq=1) dat=dat|0x80; else dat=dat|0x00; 34 for(time=0;time=1; for(time=0;time0;length-) for(i=0;i255) th+=1; tn=th*16+tl/16; td=(tl%16)*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(0x03); delay1ms(5); displayovert(); while(1) baojing(); if(canl=0) write_com(0x01); delay1ms(5); break; if(canl=0) break; void tempset(void) if(add=0) delay1ms(10); 39 if(add=0) maxtemp+; while(add=0); if(red=0) delay1ms(10); if(red=0) maxtemp-; while(red=0); void maxtempset(void) /高温报警设置 write_com(0x01); delay1ms(10); write_address(0x03); delay1ms(10); write_date(t); write_date(e); write_date(m); write_date(p); write_address(0x09); write_date(s); write_date(e); write_date(t); write_address(0x40); write_date(m); write_date(a); write_date(x); write_date(:); while(1) if(set=0) delay1ms(20); if(set=0) write_address(0x4e); write_com(0x0f); while(1) 40 if(add=0) delay1ms(20); if(add=0) write_address(0x4b); delay1ms(5); write_date(o); write_date(n); write_date( ); tempswitch=1; if(red=0) delay1ms(20); if(red=0) write_address(0x4b); write_date(o); write_date(f); write_date(f); tempswitch=0; if(canl=0) delay1ms(500); break; if(tempswitch=1) write_address(0x4b); write_date(o); write_date(n); write_date( ); write_address(0x45); write_com(0x0e); tempset(); displaymaxt(maxtemp); if(canl=0) 41 write_com(0x01); displaymainpart(); break; if(tempswitch=0) write_com(0x0c); write_address(0x4b); write_date(o); write_date(f); write_date(f); if(canl=0) write_com(0x01); displaymainpart(); break; void alarmswitchset(void) while(1) if(add=0) delay1ms(100); if(add=0) alarmmode=1; write_address(0x4c); write_date(o); write_date(n); write_date( ); if(red=0) alarmmode=0; write_address(0x4c); write_date(o); write_date(f); write_date(f); 42 if(canl=0) delay1ms(500); break; /* 设置模块 */ void set(vo

温馨提示

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

评论

0/150

提交评论