设计一个基于52单片机的单片机万年历程序序 可调整时间 一个按键控制显示年月日或时分秒 八位数码管

51单片机显示时分秒、年月日与星期的显示与调整的程序 很急 谢谢!!!_百度知道
51单片机显示时分秒、年月日与星期的显示与调整的程序 很急 谢谢!!!
51单片机显示时分秒、年月日与星期的显示与调整的程序
谢谢!!!简单的程序我刚学下图
您的回答被采纳后将获得:
系统奖励15(财富值+成长值)+难题奖励20(财富值+成长值)
我有更好的答案
复制你的代码上来,不要截图
果断看不见。你还是直接把程序发代码上来吧!
图片看不清
就是做一个简单的万年历喽
我刚学老师布置的作业
要求单片机上显示时分秒与年月日的显示与调整
还有时间的
能告诉我吗
课程设计吧
其他2条回答
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。拒绝访问 | www.renrendoc.com | 百度云加速
请打开cookies.
此网站 (www.renrendoc.com) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(f243ef-ua98).
重新安装浏览器,或使用别的浏览器豆丁微信公众号
君,已阅读到文档的结尾了呢~~
基于单片机的万年历课程设计基于,课程,设计,万年历,设计说明书,设计毕业,基于单片机,课程设计,毕业设计,单片机
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
基于单片机的万年历课程设计
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口& & 该可测温式电子万年历主要由STC89C52、时钟芯片、温度采集、显示电路、语音报警等组成。按键可以实现显示内容的切换、时间的调整以及语音报警的设置。
& & 1 硬件电路的设计
& & 该可测温式电子万年历工作时,首先初始化时钟芯片,单片机从时钟芯片读取时间和日期等信息,同时又从温度传感器采集当前环境温度,经过驱动电路送给液晶显示屏,显示相关的信息。其中,按键可以对时间、日期、星期和温度进行调整,并控制闹钟和秒表的功能。万年历又加入了语音芯片,可以实现整点报时和温度报警的功能。
& & (1)时钟芯片DS1302
& & DS1302 在时间显示方面应用非常普遍,可以对年、月、日、周、时、分、秒进行计时,并且具有闰年补偿功能,工作为2.5V ~ 5.5V。采用三线接口与单片机进行同步通,并可采用突发方式一次传送多个字节的时钟信号或RAM 数据。DS1302内部有一个用于临时性放数据的RAM 寄存器,具有主和后备电源两个引脚,并且具有对后备电源进行充电的能力。DS1302 与单片机之间采用串行数据传输,控制液晶屏显示时间信息。
& & 图1 DS1302 引脚图
& & DS1302 的引脚图如图1 所示, 其中V2 为主电源,Vcc1 为后备电源。在主电源关闭的情况下,也能保持时钟的连续运行。X1、X2 是振荡源,外接32.768k。RST 是复位/ 片选线,通过把RST输入驱动置高来启动所有的数据传送。当RST 为高电平时,所有的数据传送被初始化,允许对DS1302 进行操作。如果在传送过程中RST 置为低电平,则会终止此次数据传送,I/O 引脚变为高阻态。上电运行时,在Vcc & 2.0V 之前,RST 必须保持低电平。只有在SCLK 为低电平时,才能将RST 置为高电平。I/O 为串行数据输入输出端( 双向) ;SCLK 为时钟输入端。
& & (2)温度传感器DS18B20
& & 温度传感器DS18B20 直接与单片机连接,避免 模数转换模块,降低硬件成本,简化系统电路。DS18B20 的电压范围为:3.0 ~ 5.5V,在寄生电源方式下可由数据线供电,采用独特的单线接口方式。DS18B20 在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的内。测量温度的范围为- 55℃~+ 125℃之间,测温精度可以达到0.5℃。测量结果直接输出数字温度信号,串行传送给单片机的CPU,同时可传送CRC 校验码,具有极强的抗干扰纠错能力。
& & DS18B20 与单片机的连接方式有两种:寄生电源连接方式和外部电源连接方式。该可测温式电子万年历采用外部电源连接方式。连接方法即DS18B20 的1 脚接地,2 脚(DQ 引脚) 与单片机的一根I/O口线连接(P3.2 脚),3 脚接电源+5V。在STC89C52 的I/O 口线与+5V 之间连接一4.7K 的,以保证数据采集的正常进行。
& & (3)1602 温度显示的设计
& & 该室温报警装置液晶显示屏采用LCD1602,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。
& & 在单片机系统中应用晶液显示器作为输出器件有显示质量高、数字式接口体积小、重量轻、功耗低的优点。LCD1602 液晶模块内部的字符发生(CGROM)已经存储了160 个不同的点阵字符图形,每一个字符都有一个固定的代码,与单片机连接后通过C 语言编程就可以工作。在正常工作状态下,电子万年历的设计连接图如图2 所示。
& & 图2 LCD1620 与单片机的连线图
& & 2 软件系统设计方案
& & 该万年历的程序流程图如图3 所示,具体流程如下:首先,接通电源,上电工作,DS1302、DS18B20、LCD1602 进行初始化,通过单片机控制液晶屏显示&时分秒&、&温度&、&年月日&、&星期&,并伴随整点报时的功能;然后,进入功能设置,第一次按下按键K4 可以调整&时分秒&和&年月日&,此时K1、K2 和K3 分别对应时间和日期&加&、&减&和&移位选择&的功能,日期发生变化相应的&星期&也会跟着变化;第二次按下按键K4 可以设置闹钟的功能,此时K1、K2 和K3 分别对应时间和日期&关闭&、&开启&和&移位选择&的功能;第三次按下按键K4 可以设置秒表的功能,此时K1、K2 和K3 分别对应时间和日期&复位&、&暂停&和&计时&的功能;第四次按下按键K4 可以退出设置功能,因为该万年历加入了语音芯片,此时按下K2 键具有语音报时的功能。
& & 由于DS18B20 具有温度采集检测的功能,所以液晶屏显示的温度会随着周围环境温度的变化而变化。该万年历设置有复位电路,连接一个按键K 可以自动实现复位功能。
& & 图3 可测温式电子万年历程序流程图
& & 3 调试和分析
& & 待该可测温式电子万年历和软件编程完成后,进入调试环节,将keil4 中C 语言程序生成的hex 文件烧入到STC89C52 芯片中,连接电源后将万年历放入模拟环境中进行系统调试,调试结果如图4 所示。液晶显示屏显示&时间&、&温度&、&日期&和&星期&信息,同时可以整点报时,如图4 中A 图所示。
& & 图4 可测温式电子万年历调试结果图
& & 第一次按下K4 进入时间和日期的设置,调试结果如图4 中B 图所示;第二次按下K4 进入闹钟的设置,&Y&为开启闹钟,&N&为关闭闹钟,调试结构如图4 中C图所示;第三次按下K4 进入秒表的设置,调试结构如图4 中D 图所示;第四次按下K4 退出功能设置,此时按下K2 具有语音报时功能。
& & 4 总结
& & 电子万年历在生活中日益普遍,该设计主要利用时钟芯片DSl302、温度传感器DS18B20 和液晶屏LCD1602 构建了一个可测温式万年历装置,电路结构简单,具有语音报时功能,适用于家庭生活,使用价值高,具有较好的应用前景。
&&&&&往下看有更多相关资料
试试再找找您想看的资料
资料搜索:
查看相关资料 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
copyright & &广电电器(中国梧州) -all right reserved& 若您有什么意见或建议请mail: & &
地址: 电话:(86)774-2826670& & &&)基于 51 单片机的温湿度及万年历设计课程设计仪器设计实验课程设计名称: 专 业 班 级 : 学 生 姓 名 : 学 组 号 : 基于 51 单片机的温湿度及万年历设计 xxxxx xxx xxxxxxxxx员 :xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxxxxx xxxxxxxxxxxxxxxxx指 导 教 师 : 课程设计地点: 课程设计时间: 基于 51 单片机的温湿度及万年历设计课程设计目录1 系统概述......................................................... 1 1.1 电子万年历发展背景 .......................................... 1 1.2 电子万年历的特点 ............................................ 1 1.3 电子万年历的发展现状 ........................................ 1 2 方案论证......................................................... 2 2.1 单片机芯片的选择方案和论证 .................................. 2 2.2 显示模块的选择方案和论证 .................................... 2 2.3 时钟芯片的选择方案和论证 .................................... 3 2.4 温湿度传感器的选择方案和论证 ................................ 4 3 硬件设计 .................................................................................................................... 5 3.1 系统功能模块划分 ......................................................................................... 5 3.2 各单元模块功能分析及模块电路设计 ......................................................... 6 3.2.1 时钟模块 ...................................................................................................... 6 3.2.2 温湿度模块 .................................................................................................. 7 3.2.3 显示模块 ............................................................................................... 8 3.2.4 独立键盘模块 ..................................................................................... 13 4 软件设计.................................................................................................................. 14 4.1 万年历软件系统的流程图 ..................................... 14 4.2 温湿度信息的采集 ........................................... 16 4.3 时钟的读取 ................................................. 17 4.3.1 DS1302 控制字节的说明 ................................. 17 4.3.2 DS1302 时间日期寄存器及相应位定义 .................... 184.3.3 DS1302 数据的输入和输出 ............................... 18 4.4 温度的显示控制 ............................................. 19 5 系统调试.................................................................................................................. 20 基于 51 单片机的温湿度及万年历设计课程设计1 系统概述1.1 电子万年历发展背景随着电子技术的发展,人类不断研究,不断创新纪录。万年历目前已经不再 局限于以书本形式出现。 以电脑软件或者电子产品形式出现的万年历被称为电子 万年历。与传统书本形式的万年历相比,电子万年历得到了越来越广泛的应用, 采用电子时钟作为时间显示已经成为一种时尚。 目前市场上各式各样的电子时钟 数不胜数,但多数是只针对时间显示,功能单一不能满足人们日常生活需求。1.2 电子万年历的特点电子万年历显示功能,包括公历年、月、日,时间、温度、湿度、星期、农 历等等;附带功能有:定时闹铃、以及按钮是否可以正常调动。本文提出了一种 基于 89c51 单片机的万年历设计方案,采用 12864 液晶显示。本方案以 89c51 单 片机作为主控核心, 与时钟芯片 DS1302、 温湿度传感器芯片 DHT11、 LCD12864 显示等模块组成硬件系统。 在硬件系统中设有 3 个独立按键和一个 LCD 显示器, 能显示丰富的信息,根据使用者的需要可以随时对时间进行校准、时间、温湿度 显示等,综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成 本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。1.3 电子万年历的发展现状随着电子技术的迅速发展, 特别是随大规模集成电路出现,给人类生活带来 了根本性的改变。 尤其是单片机技术的应用产品已经走进了千家万户。电子万年 历的出现给人们的生活带来的诸多方便。 市场上有许多电子万年历的专用芯片,如:LM8363、LM8365 等,但它们1 基于 51 单片机的温湿度及万年历设计课程设计功能单一,电路连接复杂,不便于调试制作。因此本系统采用了以 89c51 单片机 技术为核心,配合 DHT11 温湿度测量模块,DS1302 时钟模块,LCD 显示模块, 键盘模块使该设计具有现实功能齐全,人机交互,节能的特点。 随着单片机的发展,电子万年历呈现了微型化 ,功能丰富化的趋势,而且 价格在不断下降, 考虑到资源问题,现在的设计设计的万年历都采用了节能设计 方案, 万年历对人们的生活有着十分重要的作用,所以电子万年历还是有很大的 发展前景的。2 方案论证2.1 单片机芯片的选择方案和论证采用 89C52 芯片作为硬件核心,89C52 是一种带 8K 字节闪烁可编程可擦除 只读存储器,采用 Flash ROM,内部具有 8KB ROM 存储空间,3 个 16 位定时 器、5 个中断源(两个中断优先级),能于 3V 的超低压工作,而且与 MCS-51 系列单片机完全兼容,与工业标准的 MCS-51 指令集和输出管脚相兼容。由于将 多功能 8 位 CPU 和闪烁存储器组合在单个芯片中, 89C52 是一种高效微控制器, 51 单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案,片上资源 已经足够进行该方案的效设计,且该芯片简单易懂,与所学课程紧密联系,也可 对所学知识进行简单的复习加深掌握,故选用该芯片进行系统方案的设计。2.2 显示模块的选择方案和论证方案一: 中文字库的 LCD12864 是一种具有 4 位/8 位并行、2 线或 3 线串行多种接 口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显 示分辨率为 128× 64, 内置 8192 个 16*16 点汉字,和 128 个 16*8 点 ASCII 字符 集。利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交 互图形界面。可以显示 8× 4 行 16× 16 点阵的汉字,也可完成图形显示,低电压2 基于 51 单片机的温湿度及万年历设计课程设计低功耗是其又一显著特点。 由该模块构成的液晶显示方案与同类型的图形 点阵液晶显示模块相比, 不论硬件电路结构或显示程序都要简洁得多,且该模块 的价格也略低于相同点阵的图形液晶模块。万年历要求显示年月日、时分秒、星 期、和农历。LCD12864 液晶可以完成设计的要求 。 方案二: 系统采用 LED 显示。LED 应用可分为两大类:一是 LED 单管应用,包 括背光源 LED,红外线 LED 等;另外就是 LED 显示屏,目前,中国在 LED 基 础材料制造方面与国际还存在着一定的差距,但就 LED 显示屏而言,中国的设 计和生产技术水平基本与国际同步。LED 显示屏是由发光二极管排列组成的显 示器件。它采用低电压扫描驱动,具有:耗电少、使用寿命长、成本低、亮度高、 故障少、视角大、可视距离远等特点。采用 LED 数码管动态扫描.价格上比较经 济实惠,但不能显示文字,性价比不是很高,操作起来比较液晶显示来说略显繁 琐,所以也不用此种作为显示。 经过综合比较最终选择方案一,即选择 LCD12864 液晶显示屏。2.3 时钟芯片的选择方案和论证方案一: 采用单片机定时。单片机集成度高、功能强、可靠性高、体积小、功耗低、 使用方便、 价格低廉等一系列优点, 单片机的应用领域已从面向工业控制、 通讯、 交通、智能仪表等迅速发展到家用消费产品、办公自动化、汽车电子、PC 机外 围以及网络通讯等广大领域。 直接采用单片机定时计数器提供秒信号,计数的脉冲由外部提供,定时的脉 冲由外部晶振提供, 定时加 1 的周期为一个机器周期;定时时间与初值和晶振频 率有关。使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案减少 芯片的使用,节约成本,但程序复杂度较高。 方案二: 采用 DS1302 时钟芯片。DS1302 是美国 DALLAS 公司推出的一种高性能、 低功耗、带 RAM 的实时时钟电路,它可以对年、月、日、星期、时、分、秒进 行计时,具有闰年补偿功能,工作电压为 2.5V~5.5V。采用双电源供电(主电3 基于 51 单片机的温湿度及万年历设计课程设计源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充 电的能力。DS1302 用于数据记录,特别是对某些具有特殊意义的数据点的记录 上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。采 用三线接口与 CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟 信号或 RAM 数据。DS1302 内部有一个 31× 8 的用于临时性存放数据的 RAM 寄 存器。采用 DS1302 只需要写出驱动程序,调用程序读出寄存器内数据经过简单 的变换就可以输出万年历的数据。 经过综合比较最终选择方案二,即采用 DS1302 时钟芯片。2.4 温湿度传感器的选择方案和论证方案一: 采用热敏电阻作为温度传感器。热敏电阻是开发早、种类多、发展较成熟的 敏感元器件。 热敏电阻由半导体陶瓷材料组成, 利用的原理是温度引起电阻变化。 使用热敏电阻作为传感器, 用热敏电阻与一个相应阻值电阻相串联分压,利用热 敏电阻阻值随温度变化而变化的特性,采集这两个电阻变化的分压值,并进行 A/D 转换。此设计方案需用 A/D 转换电路,增加硬件成本而且热敏电阻的感温 特性曲线并不是严格线性的,会产生较大的测量误差。 方案二: 采用 DS18B20 温度传感器。在应用与高精度、高可靠性的场合时 DALLAS (达拉斯)公司生产的 DS18B20 温度传感器当仁不让。超小的体积,超低的硬 件开消,抗干扰能力强,精度高,附加功能强,使得 DS18B20 更受欢迎。示信 息经过单线接口送入 DS18B20 或从 DS18B20 送出,因此从单片机到 DS18B20 仅需一条线连接即可。它可在 1 秒钟(典型值)内把温度变换成数字 方案三: 采用 DHT11 数字温湿度传感器。产品概述 DHT11 数字温湿度传感器是一款含 有已校准数字信号输出的温湿度复合传感器。 它应用专用的数字模块采集技术和 温湿度传感技术, 确保产品具有极高的可靠性与卓越的长期稳定性传感器包括一 个电阻式感湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。 每个 DHT11 传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的4 基于 51 单片机的温湿度及万年历设计课程设计形式储存在 OTP 内存中,传感器内部在检测信号的处理过程中要调用这些校准 系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗, 信号传输距离可达 20 米以上,使其成为各类应用甚至最为苛刻的应用场合的最 佳选择。 经过综合比较最终选择方案三,即采用 DHT11 温湿度传感器。3 硬件设计3.1 系统功能模块划分根据系统功能要求,可大致画出系统所需硬件结构框图如图 3-1 所示:LCD12964 液晶显示STC89C52RCDS1302 时钟模块按键时 间 调整模块DHT11 温湿度 采 集模块图 3.1 系统原理方框图 主控模块采用性价比较高的 STC189c52 单片机芯片, 可通过程序的运行控制 温湿度测量模块 DHT11 进行温湿的数据采集,而所测得的温湿度和时钟芯片测 得的实时日历将通过显示模块的液晶显示器以数字形式显示;单片机调用程序, 读取 DS1302 内寄存器,可以得到万年历的时间数据,经过程序处理就可以输出5 基于 51 单片机的温湿度及万年历设计课程设计在 LCD 上;键盘电路可对实时日历进行调整。3.2 各单元模块功能分析及模块电路设计3.2.1 时钟模块 DS1302的工作原理和单片机的接口: DS1302为美国DALLAS公司的一种实时时钟芯片,主要特点是采用串行数 据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。 采用32.768Hz晶振。它可以对年、月、日、星期、时、分、秒进行计时,且具有 闰年补偿等多种功能。DS1302 用于数据记录,特别是对某些具有特殊意义的数 据点的记录上,能实现数据与出现该数据的时间同时记录。这种记录对长时间 的连续测控系统结果的分析以及对异常数据出现的原因的查找有重要意义。在 本设计中,它的实际电路图如图3-2所示:图 3-2 DS1302 与单片机的连接 DS1302 需要外接 32.768K 的晶振,1 号引脚接主电源 VCC(5V)电源,8 号引脚接备用电池(3V) ,当主电源掉电后,备用电源为 DS1302 提供电源,维 持 DS1302 内数据不丢失,这正是时钟芯片所必须的特性。6 基于 51 单片机的温湿度及万年历设计课程设计3.2.2 温湿度模块 传统的温度传感器系统大都采用放大、调理、A/D 转换,转换后的数字信号 送入计算机处理,处理电路复杂、可靠性相对较差,占用计算机的资源比较多, 本设计测温模块采用数字温湿度传感器 DHT11,可将温湿度信号直接转换成数 字信号送给微处理器,电路简单,成本低,其电路原理图如图 3-3 所示:图 3-3 DHT11 温湿度模块 DHT11的供电电压为 3-5.5V。传感器上电后,要等待 1s 以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。 DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一 次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小 数部分用于以后扩展,现读出为零.操作流程如下: 一次完整的数据传输为40bit,高位先出。 数据格式:8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据 +8bit校验和 数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据”所得结果的末8位。 用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主 机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采7 基于 51 单片机的温湿度及万年历设计课程设计集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度 采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集 数据后转换到低速模式。 3.2.3 显示模块 本设计显示模块主要采用 LCD12864 液晶显示器,其电路原理图如下:图3-5LCD12864模块LCD12864 液 晶 显 示 器 通 过 数 据 端 口 也 即 端 口 7 ~ 14 与 主 控 芯 片 STC12C5A60S2 的 I/O 端口 P2 相连接实现数据与指令的传输, 再通过控制端口 RS、RW、EN 也即端口 4~6 与主控芯片 P3.6,P3.7,P4.0 端口相接实现对数 据和指令传输的控制 。显示模块采用 12864 液晶显示器可实现对温度和时间的 直接显示,清晰明了。 带中文字库的 LCD12864 是一种具有 4 位/8 位并行、 2 线或 3 线串行多种 接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块其 显示分辨率为 128× 64, 内置 8192 个 16*16 点汉字和 128 个 16*8 点 ASCII 字符 集。利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机 交互图形界面。可以显示 8× 4 行 16× 16 点阵的汉字,也可完成图形显示。低电压 低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵 液晶显示模块相比,不论硬件电路结构或显示程序都要简得多,且该模块的价 格也略低于相同点阵的图形液晶模块。 1.模块管脚是连接外部电路的纽带 ,在此模块中管脚主要由控制管脚和 数据管脚等构成,现将其组成情况及相关功能介绍如下: 表 3-1 12864 液晶模块接口说明8 基于 51 单片机的温湿度及万年历设计课程设计管脚号 1 2 3 4管脚名称 VSS VCC V0 RS(CS)电平 0V 3.0V/5V H/L管脚功能描述 电源地 电源正 对比度(亮度)调整 RS=“H”,表示 DB7~DB0 为显示数据 RS=“L”,表示 DB7~DB0 为显示指令数据 R/W=“H”,E=“H”,数据被读到 DB7~DB0 R/W=“L”,E=“H→L”, DB7~DB0 的数据被写 到 IR 或 DR 使能信号 三态数据线 H:8 位或 4 位并口方式,L:串口方式 空脚 复位端,低电平有效 LCD 驱动电压输出端 背光源正端 背光源负端5 6 7~14 15 16 17 18 19 20R/W E(SCLK) DB0~DB7 PSB NC RESET VOUT A KH/L H/L H/L H/L H/L VDD VSS2.控制器控制着模块内部指令的发出与否,存储器则对指令和数据进行存 储与更换,现将分别介绍控制器各接口及各存储器的功能。 1) RS,R/W 的配合选择决定控制界面的 4 种模式 表 3-2 RS,R/W 配合功能说明RS L L H H R/W L H L H 功能说明 MPU 写指令到指令暂存器(IR) 读出忙标志(BF)及地址记数器(AC)的状态 MPU 写入数据到数据暂存器(DR) MPU 从数据暂存器(DR)中读出数据2)E 信号 表 3-3 E 信号功能说明E 状态 高——&低 高 低/低——&高 执行动作 I/O 缓冲——&DR DR——&I/O 缓冲 无动作 结果 配合/W 进行写数据或指令 配合 R 进行读数据或指令显示数据 RAM(DDRAM ):模块内部显示数据 RAM 提供 64× 2 个位元组 的空间,最多可控制 4 行各 16 字的中文字型显示,当写入显示数据 RAM 时, 可分别显示 CGROM 与 CGRAM 的字型;此模块可显示三种字型,分别是半 角英数字型(16*8)、CGRAM 字型及 CGROM 的中文字型。三种字型的选择,9 基于 51 单片机的温湿度及万年历设计课程设计由在 DDRAM 中写入的编码选择,在 0000H—0006H 的编码中将选择 CGRAM 的自定义字型,02H—7FH 的编码中将选择半角英数字的字型,至于 A1 以上的 编码将自动的结合下一个位元组,组成两个位元组编码形成中文字型的编码。 字型产生 RAM(CGRAM):字型产生 RAM 提供图象定义(造字)功能,可以提 供四组 16× 16 点的自定义图象空间,使用者可以将内部字型没有提供的图象字 型自行定义到 CGRAM 中,便可和 CGROM 中的定义一样地通过 DDRAM 显 示在屏幕中。 地址计数器 AC: 地址计数器是用来贮存 DDRAM/CGRAM 之一的地址,可 由设定指令暂存器来改变,之后只要读取或写入 DDRAM/CGRAM 的值时, 地址 计数器的值就会自动加一。当 RS =0 且 R/W=1 时,地址计数器的值会被读取到 DB6—DB0 中。 光标/闪烁控制电路:此模块提供硬体光标及闪烁控制电路,由地址计数器 的值来指定 DDRAM 中的光标或闪烁位置。 3.模块控制芯片提供两套控制指令:基本指令和扩充指令,这些由各控制 端口和寄存器组合而成的指令可对液晶显示器自身模式、状态、功能等进行设 置,也可控制与其他芯片进行数据和指令的通信。其指令分别如下: 表 3-4 基本指令集(RE=0)指 令 清除 显示 地址 归位 指 令 码 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 0 0 0 0 0 0 1 功 能 将 DDRAM 填满&20H&,并且设定 DDRAM 的 地址计数器(AC)到&00H&000000001设定 DDRAM 的地址计数器(AC)到&00H&,并 X 且将游标移到开头原点位置;这个指令不改变 DDRAM 的内容 B D=1: 整体显示 ON C=1: 游标 ON B=1:游标位置反白允许 指定在数据的读取与写入时,设定游标的移动 方向及指定显示的移位 设定游标的移动与显示的移位控制位;这个指 令不改变 DDRAM 的内容 DL=0/1:4/8 位数据 RE=1: 扩充指令操作 RE=0: 基本指令操作显示状 0 态开/关 进入点 0 设定 游标或 显示移 0 位控制 功能 设定 0000001DC0000001I/DS00001 S/C R/L XX0001DL X RE XX10 基于 51 单片机的温湿度及万年历设计课程设计设定 CGRAM 0 地址 设定 DDRAM 0 地址 读取忙 标志和 0 地址 写数据 1 到 RAM 读出 RAM 的 1 值001 AC5 AC4 AC3 AC2 AC1 AC0设定 CGRAM 地址 设定 DDRAM 地址(显示位址) 第一行:80H-87H 第二行:90H-97H 读取忙标志(BF)可以确认内部动作是否完成, 同时可以读出地址计数器(AC)的值 将数据 D7——D0 写入到内部的 RAM (DDRAM/CGRAM/IRAM/GRAM) 从内部 RAM 读取数据 D7——D0 (DDRAM/CGRAM/IRAM/GRAM010 AC5 AC4 AC3 AC2 AC1 AC01 BF AC6 AC5 AC4 AC3 AC2 AC1 AC00数据1数据表 3-5 扩展指令集(RE=1)指 指 令 码 功 能令 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 待 命 0 模 式 卷 动 地 址 0 开 关 开 启 反 白 0 选 择 睡 眠 0 模 式 扩 0 充000000001进入待命模式,执行其他指令都棵终止 待命模式00000001SRSR=1:允许输入垂直卷动地址 SR=0:允许输入 IRAM 和 CGRAM 地址0000001选择 2 行中的任一行作反白显示,并可决定反白 与否。初始值 R1R0=00,第一次设定为反白显 R1 R0 示,再次设定变回正常 SL=0:进入睡眠模式 SL=1:脱离睡眠模式000001SLXX0001CL X RE G0CL=0/1:4/8 位数据 RE=1: 扩充指令操作 11 基于 51 单片机的温湿度及万年历设计课程设计功 能 设 定 设 定 绘 图 0 RA M 地 址RE=0: 基本指令操作 G=1/0:绘图开关010 0 0 AC3 AC2 AC1 AC0 AC6 AC5 AC4 AC3 AC2 AC1 AC0设定绘图 RAM 先设定垂直(列)地址 AC6AC5…AC0 再设定水平(行)地址 AC3AC2AC1AC0 将以上 16 位地址连续写入即可当 IC1 在接受指令前,微处理器先确认其内部处于非忙碌状态,即读取 BF 标 志时,BF 需为零方可接受新的指令;如果在送出一个指令前不检查 BF 标志, 那么 在前一个指令和这个指令中间必须延长一段较长的时间,即等待前一个指令确实 执行完成。 4.12864 液晶显示器不仅可以显示字符同时也可以图形,因此可以满足不 同使用者更多的要求,如显示一幅图画或者一个曲线图等。使用者在使用时便 可根据自身需求进行不同的显示。 1) 字符显示:带中文字库的 128X64-0402B 每屏可显示 4 行 8 列共 32 个 16× 16 点阵的汉字,每个显示 RAM 可显示 1 个中文字符或 2 个 16× 8 点阵全高 ASCII 码字符,即每屏最多可实现 32 个中文字符或 64 个 ASCII 码字符的显示。带中 文字库的 128X64-0402B 内部提供 128× 2 字节的字符显示 RAM 缓冲区 (DDRAM) 。字符显示是通过将字符显示编码写入该字符显示 RAM 实现的。 根据写入内容的不同, 可分别在液晶屏上显示 CGROM (中文字库) 、 HCGROM (ASCII 码字库)及 CGRAM(自定义字形)的内容。三种不同字符/字型的选 择编码范围为: H (其代码分别是 0000、 0002、 0004、 0006 共 4 个) 显示自定义字型,02H~7FH 显示半宽 ASCII 码字符,A1A0H~F7FFH 显示 8192 种 GB2312 中文字库字形。字符显示 RAM 在液晶模块中的地址 80H~ 9FH。字符显示的 RAM 的地址与 32 个字符显示区域有着一一对应的关系,其 对应关系如下表所示: 表 3-6 字符 RAM 与显示区域对应关系12 基于 51 单片机的温湿度及万年历设计课程设计80H 90H 88H 98H81H 91H 89H 99H82H 92H 8AH 9AH83H 93H 8BH 9BH84H 94H 8CH 9CH85H 95H 8DH 9DH86H 96H 8EH 9EH87H 97H 8FH 9FH2)图形显示:先设垂直地址再设水平地址(连续写入两个字节的资料来完成 垂直与水平的坐标地址)。垂直地址范围 AC5...AC0,水平地址范围 AC3...AC0。 绘图 RAM 的地址计数器(AC)只会对水平地址(X 轴) 自动加一,当水平地址 =0FH 时会重新设为 00H 但并不会对垂直地址做进位自动加一, 故当连续写入多 笔资料时,程序需自行判断垂直地址是否需要重新设定。 GDRAM 的坐标地址 与资料排列顺序如下图:图 3-6 GDRAM 的坐标地址与资料排列顺序 3.2.4 独立键盘模块 键盘是人与万年历实现信息交互的接口, 本设计中, 我们采用 3 个独立键盘, 电路原理如下图 3-7:13 基于 51 单片机的温湿度及万年历设计课程设计图 3.8 按键模块 考虑到系统的简洁性,所以采用最少的按键来实现时间的全部调整功能,如 上图所示按键 key1 来实现功能选择,根据按下的次数不同来分别实现年、月、 日、周、时、分、秒、星期的选择和暂停,开始。key2 根据选择来进行该位上 的加 1 功能, 同理 key3 来实现减 1 功能。 按键的引入使万年历显得更加人性化, 智能化。4 软件设计在系统软件设计中, 我们使用了 Keil μVision3, 它是 2006 年 1 月 30 日 ARM 推出全新的针对各种嵌入式处理器的软件开发工具,集成 Keil μVision3 的 RealView MDK 开发环境。 RealView MDK 开发工具 KeilμVision3 源自 Keil 公 司。 RealView MDK 集成了业内领先的技术,包括 Keil μVision3 集成开发环境 与 RealView 编译器。Keil C51 生成的目标代码效率非常之高,多数语句生成的 汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势,所以 我们选择该软件来开发我们的万年历程序。4.1 万年历软件系统的流程图开始 14 液晶 LCD12864 初始化 基于 51 单片机的温湿度及万年历设计课程设计时钟芯片 DS1302 初始化温湿度传感器 DHT11 初始化 否向芯片写入时间对 12864 写指令,写数据是否与单片 机取得通信 是 依次接收温湿度数据等待与 单片机 进行通 信对时 进行延时大约 5s是 进行数据 校验时间处理显示12864 进行显示(显示温湿 度及当前的日期与时间)进行温湿度数据的转换否 扫描按键等待按键按下 是 时钟时间停止并判断当前需要调整的时间位置继续扫描按键等待按键按下通过上下键进行日期调整重新对时并显示当接通电源开始工作后,单片机中的程序开始运行,将对 DHT11进行初始 化,以便和单片机芯片达成通信协议。完成初始化后,启动温湿度测量程序,测 量过程完成后, 发出温湿度度转换指令,从而便可将温湿度转化成数字模式进行 显示读取;同时DS1302将读取时分秒星期以及年月日寄存器然后通过液晶显示 实时时间、星期及日期;键盘电路中按键可对实时日历时钟进行调整。15 基于 51 单片机的温湿度及万年历设计课程设计4.2 温湿度信息的采集1.通讯过程如图1所示图1总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必 须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后, 等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束 后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换 到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。 总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉 高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定 了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有 响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线 50us,随后总线由上拉电阻拉高进入空闲状态。数字0信号表示方法如图3所示16 基于 51 单片机的温湿度及万年历设计课程设计图3 数字1信号表示方法.如图4所示图44.3 时钟的读取4.3.1 DS1302 控制字节的说明 控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写 入到 DS1302 中位6 如果为0,则表示存取日历时钟数据,为1 表示存取 RAM 数据;位5至位1 指示操作单元的地址;最低有效位 (位0) 如为0 表示要进行写操 作,为1 表示进行读操作,控制字节总是从最低位开始输出。17 基于 51 单片机的温湿度及万年历设计课程设计图4-5 DS1302控制字节 4.3.2 DS1302 时间日期寄存器及相应位定义 表 4-1 为 DS1302 时间寄存器信息: 表 4-1 DS1302 时间日期寄存器4.3.3 DS1302 数据的输入和输出 在控制指令字输入后的下一个SCLK 时钟的上升沿时数据被写入DS1302, 数据输入从低位即位0 开始。同样,在紧跟8 位的控制指令字后的下一个SCLK 脉冲的下降沿读出DS1302 的数据,读出数据时从低位0 位至高位7。图4-6 DS1302的时序18 基于 51 单片机的温湿度及万年历设计课程设计4.4 温度的显示控制当所测的温湿度输送到单片机上之后, 下一步就是要将其在液晶显示器上显 示出来。 首先对液晶进行初始化,液晶显示器 12864 的初始化过程如下: 先将复位引脚置高位即 RST=1、数据传输方式设为并口方式即 PSB=1(在 设计中,我们将 LCD 的该引脚接 VCC),然后将指令集调到基本指令集上来即 写指令 30H,再将显示打开、关光标、清除液晶里先前的显示内容即分别写指令 0CH、01H,写指令时需分别延时 5ms。 然后就是数据的传送过程, 要使数据在液晶显示器上显示必须要按照其读写 操作时序来进行,其读、写操作时序图为: 写操作时序:图 4-8 12864 读操作时序:液晶显示器写时序图19 基于 51 单片机的温湿度及万年历设计课程设计图 4-9 12864 液晶显示器读时序图5 系统调试在硬件电路焊接和软件程序设计分别完成的基础之上, 进行软硬件的结合与 调试。 通过下载将在电脑上已完成的程序下载到单片机芯片中。在调试中发现软 件中存在的问题,及时解决问题,确保系统能正常工作并达到设计要求。通过反 复的调试与实验, 可以证明该系统能够较好地完成设计所需的基本要求。即能够 正确的显示万年历。 在设计中, 因为考虑到闹钟定时功能,我们希望我们设置的闹钟时刻不会因 为系统的掉电而丢失,考虑到DS1302是有锂电池作为电源的,不会因为主系统 掉电丢失内部数据,所以我们将闹钟的定时时刻放到了DS1302内的空余寄存器 里面, 像这些灵活的技巧就需要我们认真的阅读元件的数据手册,从中索取对自 己有用的信息。 经过万年历的设计, 让我学到了很多, 让我认识到了学习基础知识的重要性, 当设计完整的系统时,要考虑到硬件和软件两者的结合,有时硬件的不足,我们 可以用软件程序来弥补,从而节约硬件成本,在设计软件程序时要模块化,可以20 基于 51 单片机的温湿度及万年历设计课程设计提高程序的可读性。能会发生因为意见不同而又争执的情况,但是我们都是为了把本次设计做 好,所以最后都能很好的解决这些问题。参考文献[1] 江志红.51 单片机技术与应用系统开发案例精选.北京:清华大学出版社,2009 [2] 谭浩强.C 语言程序设计.北京:清华大学出版社,2006 [3] 白延敏.51 单片机典型系统开发实例精讲.北京:电子工业出版社,2009 [4] 王为青,程国钢.单片机 Keil C× 51 应用开发技术.北京:人民邮电出版社,2007 [5] 周丽娜.Protel99SE 电路设计技术.北京:中国铁道出版社,2009 [6] 刘坤,宋戈,赵红波等.51 单片机 C 语言应用技术开发技术大全.北京:人民邮电 出版社,200821 基于 51 单片机的温湿度及万年历设计课程设计附录:正常显示是采集温湿度显示及万年历显示(第一行可显示任意汉字)设计程序如下: #include&reg52.h& #include&intrins.h& #define uchar unsigned char #define uint unsigned int uchar x,y; //清屏时定义的起始地址 uchar flag,flag1,flag2; //标志位 温湿度传感器时使用 //位定义 // 字节定义 uchar wdzs,wdxs,sdzs,sdxs, uchar WZ,WX,SZ,SX,JY; sbit sbit sbit sbit rs=P0^0; rw=P0^1; e =P0^2; SJ= P0^3; //温湿度传感器接口//液晶 3 个端口的定义22 基于 51 单片机的温湿度及万年历设计课程设计sbit sck=P0^4; sbit io=P0^5; sbit rst=P0^6; sbit key1=P2^2; sbit key2=P2^1; sbit key3=P2^0; uchar time_data[7]={13,1,11,11,00,00,00};//年,周,月,日,时,分,秒 uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80}; uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81}; uchar disp[13]=&&; uchar time_data1[7]=&&; //用来存放从 1302 中读出的时间 uchar time_data2[7]=&&; uchar table1[]=&温度&; uchar table2[]=&湿度&; uchar table3[4]=&&; uchar table4[4]=&&; uchar table5[]=&可显示五字!&; //可显示任意汉字数字及字符 uchar code image[]= { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x01,0x80,0x00, 0x00,0x60,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0xE0,0x00,0x01,0x80,0x00, 0x00,0x63,0xE0,0x18,0x00,0x0E,0x01,0xB0,0x00,0xC0,0x07,0xE0,0x00,0x03,0x40,0x00, 0x00,0x3F,0x80,0x7C,0x01,0xF8,0x00,0xF0,0x00,0xC0,0x00,0xF8,0x00,0x02,0x40,0x00, 0x00,0xC7,0x80,0x33,0x80,0x30,0x00,0xF0,0x01,0x98,0x1F,0x98,0x00,0x02,0x40,0x00, 0x00,0x3F,0x80,0xFF,0x80,0x30,0x06,0xFC,0x0F,0xF0,0x1F,0xC0,0x00,0x02,0x40,0x00, 0x00,0x1F,0x81,0xF9,0x80,0x30,0x03,0xF8,0x01,0x80,0x01,0x80,0x00,0x06,0x20,0x00, 0x00,0x6D,0x81,0xF9,0x80,0x30,0x03,0xF0,0x01,0xC0,0x01,0xF8,0x00,0x38,0x1C,0x00, 0x00,0xC1,0x81,0xBF,0x80,0x30,0x00,0xF0,0x01,0xE0,0x1F,0x80,0x01,0xE0,0x03,0x80, 0x00,0xC1,0x81,0xF9,0x83,0xFF,0x80,0xFF,0x03,0x30,0x01,0x80,0x00,0xC0,0x03,0x00, 23 基于 51 单片机的温湿度及万年历设计课程设计0x00,0x03,0x81,0xB7,0x80,0x00,0x07,0xE0,0x06,0x38,0x01,0x80,0x00,0x38,0x3E,0x00, 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x0C,0x03,0x80,0x00,0x04,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00, 0x00,0x00,0xE0,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00, 0x00,0xFE,0xC0,0xC6,0x01,0x81,0x83,0xC1,0x80,0x00,0x00,0x00,0x00,0x01,0x00,0x00, 0x00,0x1F,0xC0,0xC3,0xC3,0x83,0x86,0xC3,0x80,0x00,0x00,0x00,0xE0,0x0F,0x80,0x00, 0x01,0xBF,0xC0,0xFF,0x87,0x87,0x86,0x67,0x80,0x00,0x00,0x01,0x98,0x18,0x80,0x00, 0x00,0xFF,0xC0,0xFF,0x01,0x81,0x8E,0x61,0x80,0x00,0x00,0x02,0x04,0x20,0x60,0x00, 0x00,0xFF,0xC0,0xF9,0x81,0x81,0x8C,0x61,0x80,0x00,0x00,0x04,0x04,0x20,0x20,0x00, 0x00,0xFE,0xC1,0xF3,0x01,0x81,0x8E,0x61,0x80,0x00,0x00,0x04,0x02,0xE0,0x20,0x00, 0x01,0x9C,0xC3,0xDE,0x01,0x81,0x86,0x61,0x80,0x00,0x00,0x04,0x01,0x80,0x20,0x00, 0x00,0x36,0xC0,0xCC,0x01,0x81,0x86,0xC1,0x80,0x00,0x00,0x08,0x01,0x80,0x30,0x00, 0x00,0x00,0xC1,0xFF,0xC1,0x81,0x83,0x81,0x80,0x00,0x00,0x08,0x19,0xE0,0x10,0x00, 0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x2E,0x90,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x43,0x10,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x43,0x08,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x43,0x08,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x40,0x08,0x30,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x40,0x08,0x20,0x00, 0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x40,0x08,0x20,0x00, 0x00,0x0C,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x40,0x08,0x20,0x00, 0x00,0x7E,0x00,0xDE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x18,0x60,0x00, 0x00,0x1E,0x00,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x10,0x40,0x00, 0x00,0x3F,0x81,0xDE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x30,0x20,0x40,0x00, 0x00,0x66,0xC0,0xDB,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x20,0x80,0x00, 0x00,0x3E,0x00,0xDF,0x87,0xFC,0x00,0x00,0x00,0x00,0x00,0x01,0x88,0x60,0x80,0x00, 0x00,0x0C,0xC1,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x41,0x00,0x00, 0x01,0xFF,0x83,0xFB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4E,0x82,0x00,0x00, 0x00,0x0C,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x02,0x00,0x00, 0x00,0x0C,0x00,0xCC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x0E,0x00,0x00, 0x00,0x1C,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x30,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xC0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, };//显示一幅图片(可以是任意一张图片) void delay_50us(uchar z); 24 基于 51 单片机的温湿度及万年历设计课程设计void delay_50ms(uchar z); void delay_1s(uchar z); void write_12864com(uchar com); void write_12864dat(uchar dat); void ini(); void clear(); void picture( uchar*p); void display1(); void display2(); //显示温湿度 void Delay (uint z) ; void delay_10us() ; void jieshou (void) ; void read (void) ; void write_1302_byte(uchar dat); void write_1302(uchar add,uchar dat); uchar read_1302(uchar add); void set_rct(); void read_rct(void) void time_pros(void); void display3();//显示日期 void display4();//显示时间 void tiaoshi();//时间调整 void main() { ini() ; //液晶初始化 set_rct(); //对时 clear(); //清屏 picture(image); // 显示图片 delay_1s(100); clear(); //清屏 while(1) { //display1();//显示第一行汉字 read(); //读取温湿度 display2() ;//显示温湿度(第二行) tiaoshi (); read_rct();//读取时间 time_pros(); //时间处理函数 display3(); //用来显示日期 (第三行) display4(); //用来显示时间(第四行) } void delay_50us(uchar z) { 25;} 基于 51 单片机的温湿度及万年历设计课程设计 for(;z&0;z--) for (j=19;j&0;j--); } void delay_50ms(uchar z) { for(;z&0;z--) for (j=6000;j&0;j--); } void delay_1s(uchar z) { uint i,j,k; for (i=z;i&0;i--) for(j=600;j&0;j--) for(k=10;k&0;k--); } void write_12864com(uchar com)//写指令 { rw=0; rs=0; delay_50us(1); P1=//数据接口 e=1; delay_50us(10); e=0; delay_50us(2); } void write_12864dat(uchar dat)//写数据 { rw=0; rs=1; delay_50us(1); P1=//数据接口 e=1; delay_50us(10); e=0; delay_50us(2); } void ini()//初始化 { delay_50ms(2); write_12864com(0x30);// delay_50us(4); write_12864com(0x30); delay_50us(4); write_12864com(0x0c);//显示游标 ,反写 ,光标 delay_50us(4); write_12864com(0x01); //清除显示 26 基于 51 单片机的温湿度及万年历设计课程设计delay_50us(240); //write_12864com(0x06); //模式设置 //delay_50us(10); } void clear(void) { uchar i,j,k; x=0x80; y=0x80; write_12864com(0x34); //打开扩展指令集 for (i=0;i&2;i++) { for (j=0;j&32;j++) { write_12864com(y+j); write_12864com(x); for (k=0;k&16;k++) { write_12864dat(0x00); } } x=0x88; } write_12864com(0x36);//打开绘图显示 write_12864com(0x30); } void picture( uchar*p) { uchar i,j,k; x=0x80; y=0x80; write_12864com(0x34); for (i=0;i&2;i++) { for (j=0;j&32;j++) { write_12864com(y+j); write_12864com(x); for (k=0;k&16;k++) { write_12864dat(*p++); } } x=0x88; } 27 基于 51 单片机的温湿度及万年历设计课程设计write_12864com(0x36); write_12864com(0x30); } void display1() //显示汉字 { uchar i,a; a=0; write_12864com(0x80);//地址 write_12864dat(0x20); write_12864dat(0x01); write_12864dat(0x01); write_12864dat(0x20); for (i=4;i&16;i++) { write_12864dat(table5[a]); a++; delay_50us(1); } } void display2()//显示汉字 用数组 { uchar i,a,b,c,d; a=0; b=0; c=0; d=0; write_12864com(0x90);//地址 for (i=0;i&4;i++) { write_12864dat(table1[a]); a++; delay_50us(1); } for (i=4;i&8;i++) { write_12864dat(table3[b]); b++; delay_50us(1); } for (i=8;i&12;i++) { write_12864dat(table2[c]); c++; delay_50us(1); } 28 基于 51 单片机的温湿度及万年历设计课程设计for (i=12;i&16;i++) { write_12864dat(table4[d]); d++; delay_50us(1); } } void display3() { if (disp[10]==0x31) a=0; if (disp[10]==0x32) a=1; if (disp[10]==0x33) a=2; if (disp[10]==0x34) a=3; if (disp[10]==0x35) a=4; if (disp[10]==0x36) a=5; if (disp[10]==0x37) a=6; write_12864com(0x88); write_12864dat(0x32); write_12864dat(0x30); write_12864dat(disp[12]); write_12864dat(disp[11]); write_12864dat(0xa3); write_12864dat(0xad); write_12864dat(disp[9]); write_12864dat(disp[8]); write_12864dat(0xa3); write_12864dat(0xad); write_12864dat(disp[7]); write_12864dat(disp[6]); write_12864dat(0x20); write_12864dat(0x20); write_12864dat(0xa2); write_12864dat(0xe5+a); } void display4() { write_12864com(0x98); write_12864dat(0x20); write_12864dat(0x20); write_12864dat(disp[5]); write_12864dat(disp[4]); write_12864dat(0xa1); write_12864dat(0xc3); 29 //显示日期//2 //0//显示时间 基于 51 单片机的温湿度及万年历设计课程设计write_12864dat(disp[3]); write_12864dat(disp[2]); write_12864dat(0xa1); write_12864dat(0xc3); write_12864dat(disp[1]); write_12864dat(disp[0]); write_12864dat(0x20); write_12864dat(0x20); write_12864dat(0x20); write_12864dat(0x20); } /****************DHT11 程序****************/ void Delay (uint z) { uchar x,y; for(x=z;x&0;x--) For(y=110;y&0;y--); } void delay_10us() { i--; i--; i--; i--; i--; i--; } void jieshou (void) //数据 0 1 确认 { zijie=0; for(i=0;i&8;i++) { flag=2; while((!SJ)&&flag++); //1bit 是否结束 delay_10us(); delay_10us(); delay_10us(); if(SJ) { wei=1; // 超过 28us 依然为高电平 表示为 1 flag=2; 30 基于 51 单片机的温湿度及万年历设计课程设计while((SJ)&&flag++); } else wei=0; zijie&&=1; zijie|= } } void read (void) { SJ=0; Delay(34); //主机拉低高于 18ms SJ=1; delay_10us(); delay_10us(); delay_10us(); delay_10us(); SJ=1; //主机设为输入 判断从机响应信号 if(!SJ) { flag=2; while((!SJ)&&flag++);//判断从机是否发出 80us 的低电平响应号是否结束 flag=2; while((SJ)&&flag++); //判断从机是否发出 80us 如发据接收状态 jieshou(); //数据接收状态 sdzs= //湿度整数 8 位 jieshou(); sdxs=//湿度小数 8 位 jieshou(); wdzs= //温度整数 8 位 jieshou(); wdxs= //温度小数 8 位 jieshou(); jiaoyan= //校验位 SJ=1; JY=(sdzs+sdxs+wdzs+wdxs); if(JY==jiaoyan) //数据校验 正确执行 { SZ= SX= WZ= WX= //JY= } 31 基于 51 单片机的温湿度及万年历设计课程设计} table3[0]=0x3a; table3[1]=(char)(0x30+WZ/10); table3[2]=(char)(0x30+WZ%10); table3[3]=0x63; table4[0]=0x3a; table4[1]=(char)(0x30+SZ/10); table4[2]=(char)(0x30+SZ%10); table4[3]=0x25; } /***************DS1302 程序*********************/ void write_1302_byte(uchar dat) //写字节 { for (i=0;i&8;i++) { sck=0; io=dat&0x01; dat&&=1; sck=1; } } void write_1302(uchar add,uchar dat) { rst=0; _nop_(); sck=0; _nop_(); rst=1; _nop_(); write_1302_byte(add); write_1302_byte(dat); rst=0; _nop_(); io=1; sck=1; } uchar read_1302(uchar add) { uchar i, rst=0; _nop_(); sck=0; _nop_(); 32 基于 51 单片机的温湿度及万年历设计课程设计rst=1; _nop_(); write_1302_byte(add); for (i=0;i&8;i++) { value&&=1; sck=0; if(io) value=value|0x80; sck=1; } rst=0; _nop_(); sck=0; _nop_(); sck=1; io=1; } void set_rct(void)//设置时间 { for(i=0;i&7;i++) //10 进制转换 16 进制 { t ime_data1[i]=time_data[i]%10+time_data[i]/10*16; } write_e,0x00);//去除写保护 for(i=0;i&7;i++) { write_1302(write_add[i],time_data1[i]); } write_e,0x80);//添加写保护 } void read_rct(void) //对时间 { for(i=0;i&7;i++) { time_data2[i]=read_1302(read_add[i]); //此时数组里面是从里面读出来的时间 (16 进制的) } } void time_pros(void) //处理函数 { disp[0]=(char)(time_data2[6]%16+0x30); //6 表示秒 disp[1]=(char)(time_data2[6]/16+0x30); disp[2]=(char)(time_data2[5]%16+0x30); //5 表示分 33 基于 51 单片机的温湿度及万年历设计课程设计disp[3]=(char)(time_data2[5]/16+0x30); disp[4]=(char)(time_data2[4]%16+0x30); //4 表示时 disp[5]=(char)(time_data2[4]/16+0x30); disp[6]=(char)(time_data2[3]%16+0x30); //3 表示日 disp[7]=(char)(time_data2[3]/16+0x30); disp[8]=(char)(time_data2[2]%16+0x30); //2 表示月 disp[9]=(char)(time_data2[2]/16+0x30); d isp[10]=(char)(time_data2[1]%16+0x30); //1 表示周 disp[11]=(char)(time_data2[0]%16+0x30); //0 表示年 disp[12]=(char)(time_data2[0]/16+0x30); } void tiaoshi () //时间调整 { if (key1==0) { Delay(10); if(key1==0; { flag1++; if (flag1==1|flag1==2|flag1==3|flag1==4|flag1==5|flag1==6) { write_e,0x00);//允许写 write_,0x80); //时钟停止 } if(flag1==7) { flag1=0; write_,0x00); //启动时钟 write_e,0x80);// 进制写(添加写保护) } } while(!key1); //Delay(10); //while(!key1); } if (key2==0) { Delay(10); if (key2==0) { switch(flag1) { case 1: { 34 基于 51 单片机的温湿度及万年历设计课程设计time_data[0]=time_data[0]+1; if(time_data[0]==100) time_data[0]=0; } case 2: { time_data[2]=time_data[2]+1; if(time_data[2]==13) time_data[2]=1; } case 3: { time_data[3]=time_data[3]+1; if(time_data[3]==32) time_data[3]=1; } case 4: { time_data[1]=time_data[1]+1; if(time_data[1]==8) time_data[1]=1; } case 5: { time_data[4]=time_data[4]+1; if(time_data[4]==24) time_data[4]=00; } case 6: { time_data[5]=time_data[5]+1; if(time_data[5]==60) time_data[5]=00; } } } while(!key2); set_rct(); } if (key3==0) { Delay(10); if (key3==0) { 35 基于 51 单片机的温湿度及万年历设计课程设计switch(flag1) { case 1: { time_data[0]=time_data[0]-1; if(time_data[0]==-1) time_data[0]=99; } case 2: { time_data[2]=time_data[2]-1; if(time_data[2]==0) time_data[2]=12; } case 3: { time_data[3]=time_data[3]-1; if(time_data[3]==0) time_data[3]=31; } case 4: { time_data[1]=time_data[1]-1; if(time_data[1]==0) time_data[1]=7; } case 5: { time_data[4]=time_data[4]-1; if(time_data[4]==-1) time_data[4]=23; } case 6: { time_data[5]=time_data[5]-1; if(time_data[5]==-1) time_data[5]=59; } } while(!key3); set_rct(); } } } 36

我要回帖

更多关于 单片机程序设计实例 的文章

 

随机推荐