1927_基于单片机的万年历设计
1927_基于单片机的万年历设计,基于,单片机,万年历,设计
黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 1 页1 绪论万年历就是记录一定时间范围内的具体阳历与阴历的日期的年历,方便有需要的人查询使用。随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命。电子万年历的出现带来了钟表计时业界跨跃性的进步。近年来,电子钟已成为人们日常生活中必不可少的物品,广泛用于个人家庭以及车站、码头、剧院、办公室等公共场所,给人们的生活、学习、工作、娱乐带来了极大的方便。随着技术的发展,人们已不再满足于钟表原先简单的计时功能,希望出现一些新的功能,诸如日历的显示、闹钟的应用等,以带来更大的方便,而所有这些,又都是以数字化的电子时钟为基础的。因此,研究实用电子时钟及其扩展应用,有着非常现实的意义,具有很大的实用价值。由于数字集成电路技术的发展和采用了先进的石英技术,现代电子钟具有走时准确、性能稳定、制作简单等优点,弥补了传统钟表的许多不足之处。我们利用单片机技术设计制作的电子万年历,可以很方便的由软件编程进行功能的调整和改进,使其在能够准确显示年、月、日、时间、星期的同时,还能具有其他的功能。如设定闹钟、语单报时、阴阳历的转换、二十四节气的显示等,有一定的新颖性和实用性,同时体积小,携带方便,使用也更为方便,具有技术更新周期短、成本低、开放灵活等优点,具备一定的市场前景。以基于单片机的万年历作为设计课题,因为它具有很好的开放性和可发挥性,要求比较高,不仅考察了对单片机的掌握能力而且强调了对单片机的扩展的应用。另外液晶显示的万年历已经越来越流行,具有显示清晰直观、走时准确、可以进行夜视等功能,并且还可以扩展出其它多钟功能。所以,电子万年历作设计课题很有价值。 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 2 页2 系统设计方案2.1 方案选择和论证2.1.1 单片机芯片的选择方案和论证方案一: 采用 89C51 芯片作为硬件核心,采用 Flash ROM,内部具有 4KB ROM 存储空间,能于 3V 的超低压工作,而且与 MCS-51 系列单片机完全兼容,但是运用于电路设计中时由于不具备 ISP 在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。方案三:采用 STC12C5A60S2 单片机,定时器与传统 8051 完全兼容,是标准的5V 工作电压,内部程序存储器为 60K 存储空间,不需要外扩存储器。同样具有 89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。STC12C5A60S2 的灌电流是 20mA,驱动能力超强,驱动大电流时不容易烧坏。相比之下,STC12C5A60S2 单片机具有在线编程可擦除技术和大容量存储空间,利于设计及调试,所以选择采用 STC12C5A60S2 单片机作为主控制系统。2.1.2 时钟芯片的选择方案和论证方案一:直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。所以不采用此方案。方案二:采用 DS1302 时钟芯片来实现时钟,DS1302 芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的 RAM 做为数据暂存区,工作电压 2.5V5.5V 范围内,2.5V 时耗电小于 300nA.相比单片机定时计数器,DS1302 芯片可自动计数且精度更高,所以选择采用 DS1302作为时钟芯片。2.1.3 显示模块的选择方案和论证方案一:采用 LED 数码管动态扫描 ,LED 数码管价格适中 ,对于显示数字最合适。 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 3 页采用动态扫描法与单片机连接时,虽然占用的单片机口线少,但电路中的线路相对多,电路过于庞大。方案二:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示。方案三:采用 LCD 液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字、图形,显示多样,清晰可见, 虽然价格贵,但却免了一些线路的麻烦,外观优美,且可以显示内容多。相比方案一和方案二,方案三可显示大量内容,且线路简单,所以采用了 LCD液晶显示屏作为显示。2.1.4 温度传感器的选择方案和论证方案一:使用热敏电阻作为传感器,用热敏电阻与一个相应阻值电阻相串联分压,利用热敏电阻阻值随温度变化而变化的特性,采集这两个电阻变化的分压值,并进行A/D 转换。 。此设计方案需用 A/D 转换电路,增加硬件成本而且热敏电阻的感温特性曲线并不是严格线性的,会产生较大的测量误差。方案二:采用数字式温度传感器 DS18B20,此类传感器为数字式传感器而且仅需要一条数据线进行数据传输,易于与单片机连接,可以去除 A/D 模块,降低硬件成本,简化系统电路。另外,数字式温度传感器还具有测量精度高、测量范围广等优点。相比方案一,方案二不需要 A/D,可简化电路,精度更高,所以采用了 DS18B20作为温度传感器。2.2 系统最终方案综上各方案所述,对此次设计的方案选定: 采用 STC12C5A60S2 单片机作为主控制系统; DS1302 提供时钟;采用数字式温度传感器 DS18B20;LCD 液晶显示屏动态扫描作为显示。 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 4 页3 系统的硬件和软件设计3.1 系统的硬件设计3.1.1 系统设计框图S T C 1 2 C 5 A 6 0 S 2主 主 主 主 主L E D 主 主 主 主 主 主 主 主主 主 主 主 主D S 1 3 0 2 主 主 主 主主 主 主 主主 主 主 主 主 主图 3-1 系统框图3.1.2 硬件概述本电路是由 STC12C5A60S52 单片机为控制核心,具有在线编程功能,低功耗,能在 3V 超低压工作;时钟电路由 DS1302 提供,它是一种高性能、低功耗、带 RAM 的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为 2.5V5.5V。采用三线接口与 CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或 RAM 数据。DS1302 内部有一个 31*8 的用于临时性存放数据的 RAM 寄存器。可产生年、月、日、周日、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能;温度的采集由 DS18B20 构成;显示部份由 LCD 液晶显示屏显示。 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 5 页3.1.3 单元电路的设计3.1.3.1 单片机主控模块设计单片机控制系统及其外围电路设计采用由 STC12C5A60S2 单片机为控制核心。STC12C5A60S2 单片机是宏晶科技生产的单时钟单片机,是高速、低功耗、超强抗干扰的新一代 8051 单片机,具有 60K 的可编程 Flash 存储器,指令代码完全兼容传统8051,但速度快 8-12 倍。片上 Flash 允许程序存储器在线编程,亦适于常规编程器。STC12C5A60S2 具有以下标准功能: 60K 字节 Flash,1280 字节 RAM,36/40/44 个 I/O口线,看门狗定时器,4 个 16 位定时器,片内晶振及时钟电路。(1)单片机控制系统复位电路如图 1 所示。SR20KC6uFV图 3-2 复位电路设计(2)本次设计单片机采用 DIP 封装,晶振为 12MHZ。其中 P3.0-P3.1 为 ISP 下载程序使用,其最小系统电路如图 3-3 所示。18 引脚和 19 引脚接时钟电路,XTAL1 接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2 接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出.第 9 引脚为复位输入端,接上电容,电阻及开关后形成电复位电路,20 引脚为接地端,40 引脚为电源端。 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 6 页CRY21MHzP0.735489VALENX_D/OSIKTWGUF图 3-3 单片机主控模块3.1.3.2 时钟电路模块设计时钟芯片采用 DS1302,晶振使用 32.768KHZ。DS1302 是 DALLAS 公司推出的涓流充电时钟芯片 内含有一个实时时钟 /日历和 31 字节静态 RAM 通过简单的串行接口与单片机进行通信 实时时钟/日历电路提供年、月、日、时、分、秒、星期的信息,每月的天数和闰年的天数可自动调整,时钟操作可通过 AM/PM 指示决定采用 24 或12 小时格式。DS1302 与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线: RES 复位、 I/O 数据线和 SCLK 串行时钟。时钟 RAM 的读写数据以一个字节或多达 31 个字节的字符组方式通信。DS1302 工作时功耗很低,保持数据和 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 7 页时钟信息时功率小于 1mW。图 3-4 显示出 DS1302 的引脚排列,其中 Vcc1 为后备电源,Vcc2 为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302 由 Vcc1或 Vcc2 两者中的较大者供电。当 Vcc2 大于 Vcc1+0.2V 时,Vcc2 给 DS1302 供电。当Vcc2 小于 Vcc1 时,DS1302 由 Vcc1 供电。X1 和 X2 是振荡源,外接 32.768 KHz 晶振。RST 是复位/片选线,通过把 RST 输入驱动置高电平来启动所有的数据传送。上电动行时,在 Vcc 大于等于 2.5V 之前,RST 必须保持低电平。在 SCLK 为低电平时,才能将 RST 置为高电平。 I/O 为串行数据输入端(双向) 。SCLK 始终是输入端。VC12Y3.68KHZBTXGND4RS5IOLU0图 3-4 时钟电路模块3.1.3.3 显示电路模块设计KNY12864M 是一种图形点阵液晶显示器,它主要由行驱动器、列驱动器及12864 全点阵液晶显示器组成。可完成图形显示,也可以显示 84 个(1616 点阵)汉字。与外部 CPU 接口可采用串行或并行方式控制。其显示分辨率为 12864,内置8192 个中文汉字(1616 点阵) 、128 个字符(168 点阵)及 64X256 点阵显示RAM(GDRAM) 。利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。其与单片机的接口电路如图 3-5 所示。 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 8 页VS1C2O3R4/W5E(LK)6DB079PNTUA图 3-5 显示电路模块3.1.3.4 温度采集模块设计温度采集采用 Dallas 半导体公司的数字化温度传感器 DS18B20,DS18B20 是单总线器件,线路简单,体积小的特点,具有 9-12 为可编程分辨率,精度为0.5。声音功能采用 5V 蜂鸣器作为声音报警器件,通过三极管进行放大输出特定声音。 QGI.图 3-6 温度采集模块 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 9 页3.1.3.5 双电源供电电路设计系统采用双电源,可以使用外接电源,也可直接使用 USB 5V 电源,由自锁开关切换输入。电源电路如图 3-7 所示。 R61KL8+C0uF2PO5VGND4AT3USB-W图 3-7 双电源模块3.1.3.6 RS-232 电路设计STC12C5A60S2 单片机具有在线编程可擦除技术,连接串口,通过电脑端的 STC-ISP 软件控制下载用户程序到 STC 单片机,即可实现程序的烧写。如图 3-8 所示即为RS-232 转换电路。 7IMXf图 3-8 RS-232 转换电路 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 10 页3.1.4 电路原理及说明(1)时钟芯片 DS1302 的工作原理DS1302 在每次进行读、写程序前都必须初始化,先把 SCLK 端置 “0”,接着把RST 端置“1 ”,最后才给予 SCLK 脉冲;读/写时序如下图 4 所示。图 5 为 DS1302 的控制字,此控制字的位 7 必须置 1,若为 0 则不能把对 DS1302 进行读写数据。对于位6,若对程序进行读/写时 RAM=1,对时间进行读 /写时,CK=0 。位 1 至位 5 指操作单元的地址。位 0 是读/写操作位,进行读操作时,该位为 1;该位为 0 则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。表 6 为 DS1302 的日历、时间寄存器内容:“CH”是时钟暂停标志位,当该位为 1 时,时钟振荡器停止,DS1302 处于低功耗状态;当该位为 0 时,时钟开始运行。 “WP”是写保护位,在任何的对时钟和RAM 的写操作之前,WP 必须为 0。当“WP”为 1 时,写保护位防止对任一寄存器的写操作。(2)DS1302 的控制字节DS1302 的控制字如表-1 所示。控制字节的高有效位(位 7)必须是逻辑 1,如果它为 0,则不能把数据写入 DS1302 中,位 6 如果 0,则表示存取日历时钟数据,为 1表示存取 RAM 数据;位 5 至位 1 指示操作单元的地址;最低有效位(位 0)如为 0 表示要进行写操作,为 1 表示进行读操作,控制字节总是从最低位开始输出。表 3-1 DS1302 的控制字格式RAM RD1 /CK A4 A3 A2 A1 A0 /WR(3)数据输入输出(I/O)在控制指令字输入后的下一个 SCLK 时钟的上升沿时,数据被写入 DS1302,数据输入从低位即位 0 开始。同样,在紧跟 8 位的控制指令字后的下一个 SCLK 脉冲的下降沿读出 DS1302 的数据,读出数据时从低位 0 位到高位 7。如下图 3-9 所示 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 11 页图S C L KI / OREST R/W A 0A 1A 2 A 3 A 4R/C 1D 0D 1D 2单字节读S C L KI / OREST R/W A 0A 1A 2 A 3 A 4R/C 1D 0D 1D 2单字节写3-9 DS1302 读/写时序图(4)DS1302 的寄存器DS1302 有 12 个寄存器,其中有 7 个寄存器与日历、时钟相关,存放的数据位为BCD 码形式, 其日历、时间寄存器及其控制字见表 3-2。表 3-2 DS1302 的日历、时间寄存器写寄存器读寄存器Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit080H 81H CH 10 秒 秒82H 83H 10 分 分1084H 85H 12/24 0AM/PM时 时86H 87H 0 0 10 日 日88H 89H 0 0 0 10 月 月8AH 8BH 0 0 0 0 0 星期8CH 8DH 10 年 年8EH 8FH WP 0 0 0 0 0 0 0此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与 RAM 相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302 与 RAM 相关的寄存器分为两类:一类是单个 RAM 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 12 页单元,共 31 个,每个单元组态为一个 8 位的字节,其命令控制字为 C0HFDH ,其中奇数为读操作,偶数为写操作;另一类为突发方式下的 RAM 寄存器,此方式下可一次性读写所有的 RAM 的 31 个字节,命令控制字为 FEH(写)、FFH( 读)。 3.2 系统软件设计程序开始时先对系统初始化,并设置好各种中断。首先要给时钟芯片设置初值,时钟芯片便自行计数。此时检测是否有按键按下,按键是为了调整时钟。有按键按下则执行按键处理程序,没有按键按下则执行下一步的操作,即取时钟芯片中的时钟值,然后送显示。程序流程图如下。系统初始化1 2 8 6 4 初始化显示按键是否按下 按键处理程序取时钟 、 温度数据送 1 2 8 6 4 显示图 3-10 程序流程图Yesno 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 13 页4 仿真与调试4.1 调试仪器表 4-1 测试仪器表序 号 名 称1 PC 机2 ISP 在线编程器3 V8 通用单片机仿真器4 数字万用表4.2 硬件测试电子万年历的电路系统较大,对电路的要求比较高,尤其是焊接方面更是不可轻视,只要存在一处错误,就会对检测造成很大的不便,而且电路的交线较多,对于各种锋利的引脚要注意处理,否则会对电路造成短路现象。在本次电子万年历的设计调试中遇到了很多的问题。如果认真小心,这些都是可以避免的,以下为主要的问题:(1)上电之后,温度传感器温度立刻升高,原因在于没有分清 DS18B20 的1、2、3 引脚,导致温度传感器短路,温度迅速升高。解决:按正确的引脚接法重新焊接 DS18B20,即可正常。(2)电源电路中的 USB 接口采用的是 B 型 USB,但购买元器件时采用的是 A 型USB,电路不可更改的情况下就变得不能正常供电。解决:采用重新打孔,将 B 型接口改装成 A 型接口,并用导线将电源线调整。(3)串口方向在画 PCB 过程中没有注意到方向,使得不能正常使用串口下载。解决:首先尝试用排针外接跳线连接到串口线上,方便简单,但是在使用过程中总是出现断线问题,使得下载变得很麻烦,后来改用打孔,用跳线将串口方向改过来,焊接在万年历板上,即可 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 14 页正常下载和调试。4.3 软件测试电子成年历是多功能的数字型万年历,可查看当前日期(阴、阳历) 、时间,还有温度的仪器。因其功能很多,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多的问题。最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。在软件的调试过程中主要遇到的问题如下:1烧入程序后,LCD 只亮不显示字符。解决:首先只写 LCD 程序,让其显示一个基本的静态字符,如果正常显示可显示屏正常。其次将静态量变为动态量,使其逐渐开始显示字符,解决了只显示空白的问题。2时间和温度不能自动对应。解决:把不相关的程序暂时屏蔽,地农历的子程序独立调试,发现在调用农历自动更新时,对十进制和十六进制处理不好,所以会造成错乱。最后把相应的十进制进行修改,使得可以与十六进制对应,最后解决了此问题.3加入农历的程序后,按键不能正常使用。解决:由于 DS18B20 是串行通信数据,只用一个口线传输,在处理采集的模拟信号时需要一定的时间,当把万年历的程序相接入时,会对延时有很大的影响。所以在调用温度子程序时,先关闭定时器 1 中断允许,在温度子程序反回时再打开定时器 1中断允许。最终解决了此问题。4.4 测试结果分析经过多次的反复测试与分析,加强对电路的原理及功能的熟悉感,同时提高了设计能力与及对电路的分析能力。同时在软件的编程方面得到更大的提高,编程能力得到加强,当然,对所学的知识得到很大的提高与巩固。 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 15 页结论至此,关于毕业设计的所有内容就介绍完了,进行这次毕业设计一切都是从头开始,从最简单的查资料、了解各个元件的功能起步,再确定设计方案、画流程图,编写程序到最后进行调试,在我的个人角度下,这次毕业设计可以说是成功完成。系统的硬件、软件设计合理,功能完备,运行稳定、可靠。实验结果表明此万年历实现后具有读取方便、显示直观、功能多样、电路简洁等诸多优点。在整个设计过程中,充分发挥了主观能动性,自主学习,学到了许多没学到的知识。程序编写中,由于思路不清晰,开始时遇到了许多问题,经过静下心来思考,并请教了同学,理清了思路,才完成了对程序的编写。但是由于时间和个人能力的原因,整个系统看起来还是显得非常的简单,只实现了一些基本的功能,还有许多不足之处和可以扩展的地方,例如实现闹钟报时等,这些有待以后来弥补,还望各位老师予以指正和修改。 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 16 页致谢经过这么长时间的设计,从选题、设计到现在的终稿完成;由于所设计的课题涉及到专业领域较广,要用到很多陌生的知识,在整个过程中,得到许多老师和同学们的帮助。在这两个月来的设计过程中我请教了系中的老师,特别是我的导师蔡超峰老师,他对我的毕业设计提供了很多条件,同时也有许多同学帮我收集了大量的资料,在设计上给予我很大的帮助,尤其是软件上。现在设计已结束,在这里一并向这些老师和同学们表示感谢。同时感谢关心我的和我关心的人。再次,我要感谢一直陪我走完大学四年求学之路的同宿舍的姐妹位,和其他在我学习和生活中帮助过我的人,谢谢他们平时对我无微不致的照顾和关心。我很兴能生活在这样一个充满活力的集体中,从他们的身上我学到了很多,看到了自己的不足,在不断的发现和改正错误中成长,同时他们给我的大学生活留下了许多美好的回忆,让我受益终生。鉴于本人水平有限,难免存在一些错误和漏洞,望各位老师、同学不吝赐教,在此再次向大家表示衷心的感谢。 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 17 页参考文献1 王法能 单片机原理及应用 科学出版社 20042 张毅刚 单片机原理及应用 高等教育出版社 20063 李宗吾.中国万年历 .北京:中国科学技术出版社.2006:115-1914 夏墨英.中国天文年历.北京:科学出版社.1984:1256-25815 周慈航.单片机应用程序设计技术H. 北京:北京航空航天大学出版社,19926 Anastasios Alexiadis,Ioannis Refanidis.Defining a Tasks Temporal Domain for Intelligent Calendar Applications7 余永权.ATMEL89 系列单片机原理及应用M. 西安:电子工业出版社,1999.8 王毅平. MCS-51 单片机原理及应用H.北京:人民邮电出版社, 19999 陈坚,李昕,黄樱.CHEN Jian.LI Xin.HUAN Ying 51 单片机最小化应用系统的Proteus 仿真-电脑知识与技术.2008,2(18)10 陈正振 电子电路设计与制作 广西交通职业技术学院信息工程系 200711 窦振中 单片机外围器件实用手册存储器分册 北京航空航天大学出版社 200612 Joe Tullio,Elizabeth D.Mynatt.Use and Implications of a Shared,Forecasting Calendar.13 王威,刘佳,张志雄等.基于 Proteus 和 Keil 的单片机虚拟仿真平台的设计-上海电力学院学报.2009,25(6).14 闫小坤编 数字电路 吉林大学出版社 200415 朱定华,戴汝平 .单片机微机原理与应用M.北京:北京交通大学出版社,2003.16 Ashraf Khalil,Kay Connelly.Improving Cell Phone Awareness by Using Calendar Information.17 51 单片机 C 语言应用开发技术大全 龙脉工作室 刘坤 宁戈 赵红波 张宪栋 人民邮电出版社 2008 年 9 月 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 18 页附录 A 原理图P0.732654189VCLE/ROGSNMIKTXDWUYHzF位uZBQ+-()f 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 19 页附录 B 程序清单#include #include #include #define uchar unsigned char#define uint unsigned intbit w = 0; /调时标志位 sbit ACC0 = ACC0;sbit ACC7 = ACC7;unsigned char YEAR,MONTH,DATE,WEEK,HR,MIN,SEC,SEC100;/DS1302 子程序sbit DS1302_CLK = P35; sbit DS1302_IO = P36; sbit DS1302_RST = P37; void DS1302InputByte(uchar d) uchar i;ACC = d;for(i=8; i0; i-)DS1302_IO = ACC0; DS1302_CLK = 1;DS1302_CLK = 0;ACC = ACC 1; uchar DS1302OutputByte(void) 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 20 页uchar i;for(i=8; i0; i-)ACC = ACC 1; ACC7 = DS1302_IO;DS1302_CLK = 1;DS1302_CLK = 0; return(ACC); void Write1302(uchar ucAddr, uchar ucDa)DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr); / 地址,命令 DS1302InputByte(ucDa);/ 写 1Byte 数据DS1302_CLK = 1;DS1302_RST = 0; uchar Read1302(uchar ucAddr)/读取某地址的数据uchar ucData;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr); ucData = DS1302OutputByte(); DS1302_CLK = 1; 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 21 页DS1302_RST = 0;return(ucData);void init1302(void) /设置 1302 的初始时间 uchar cctt;cctt=Read1302(0x80);if(cctt&0x80)Write1302(0x8e,0x00);/允许写操作Write1302(0x8c,0x0b);/年Write1302(0x8a,0x01);/星期Write1302(0x88,0x06);/月Write1302(0x86,0x06);/日Write1302(0x84,0x00);/小时Write1302(0x82,0x00);/分钟Write1302(0x80,0x00);/秒Write1302(0x8e,0x80);/禁止写操作/*温度*/#define SKIP_ROM 0xF0#define CONVERT_T 0x44#define READ_SCRATCHPAD 0xBEsbit DQ = P24;/ds18B20 信号线定义uchar TPH;uchar TPL;void DelayT(int num)/延时函数 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 22 页while(num-);unsigned Init_DS18B20(void)/初始化 ds1820uint answer_flag; DQ = 0; /单片机将 DQ 拉低DelayT(480); DQ = 1; DelayT(15);answer_flag=DQ; DelayT(240);DelayT(180);return(answer_flag);uchar ReadBit(void)bit s;DQ=1;_nop_();DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();DQ=1;s=DQ;DelayT(60);return(s); 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 23 页uchar ReadByte(void)/读一个字节uchar i,j;uchar dat = 0;for (i=1;i1);return(dat);void WriteByte(uchar dat)/写一个字节uint i;bit n;for (i=1; i1;if(n)/写 1DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 24 页DQ=1;DelayT(60);else/写 0DQ=0;DelayT(90);DQ=1;_nop_();_nop_();_nop_();_nop_();void convert(void)/温度转换Init_DS18B20();if(Init_DS18B20()DelayT(100);WriteByte(SKIP_ROM);WriteByte(CONVERT_T);uint ReadTemp(void)/读取温度uint t=0;float tt=0;convert(); 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 25 页DelayT(100000);Init_DS18B20();if(Init_DS18B20()DelayT(100);WriteByte(0xcc);WriteByte(0xbe);TPL=ReadByte();TPH=ReadByte();t=TPH;t= 0x04 & HR = 0x06 & HR = 0x08 & HR = 0x13 & HR = 0x18 & HR = 0x22 & HR = 0x00 & HR 0x2)&(year%0x4=0)temp4+=1;if (temp4=temp3)temp4-=temp3;MONTHnth=0x1;MONTHnth_p=0x1; flag2=get_MONTHon_day(MONTHnth_p,table_aDATEr); flag_y=0; 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 42 页if(flag2=0)temp1=0x1d; else temp1=0x1e; temp2=year_codetable_aDATEr&0xf0;temp2=_cror_(temp2,4); while(temp4=temp1)temp4-=temp1;MONTHnth_p+=1;if(MONTHnth=temp2)flag_y=flag_y;if(flag_y=0)MONTHnth+=1;else MONTHnth+=1;flag2=get_MONTHon_day(MONTHnth_p,table_aDATEr);if(flag2=0)temp1=0x1d;else temp1=0x1e;day=temp4+1;else temp3-=temp4;if (year=0x0)year=0x63;c=1;else year-=1;table_aDATEr-=0x3;MONTHnth=0xc;temp2=year_codetable_aDATEr&0xf0;temp2=_cror_(temp2,4);if (temp2=0)MONTHnth_p=0xc; else MONTHnth_p=0xd; / 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 43 页flag_y=0;flag2=get_MONTHon_day(MONTHnth_p,table_aDATEr);if(flag2=0)temp1=0x1d;else temp1=0x1e;while(temp3temp1)temp3-=temp1;MONTHnth_p-=1;if(flag_y=0)MONTHnth-=1;if(MONTHnth=temp2)flag_y=flag_y;flag2=get_MONTHon_day(MONTHnth_p,table_aDATEr);if(flag2=0)temp1=0x1d;else temp1=0x1e;day=temp1-temp3+1;c_MONTHon=c; temp1=year/10;temp1=_crol_(temp1,4);temp2=year%10;year_MONTHon=temp1|temp2;temp1=MONTHnth/10;temp1=_crol_(temp1,4);temp2=MONTHnth%10;MONTHnth_MONTHon=temp1|temp2;temp1=day/10;temp1=_crol_(temp1,4);temp2=day%10;day_MONTHon=temp1|temp2; 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 44 页void nl()unsigned char yy1,yy2;Conversion(0,YEAR,MONTH,DATE);writecom(0x90);writestring(20);writedat(year_MONTHon/16+0);writedat(year_MONTHon%16+0);writedat(/);writedat(MONTHnth_MONTHon/16+0);writedat(MONTHnth_MONTHon%16+0);writedat(/);writedat(day_MONTHon/16+0);writedat(day_MONTHon%16+0);yy1=(year_MONTHon/16)*10+year_MONTHon%16;yy2=yy1%12;switch(yy2)case 0: writecom(0x87);writestring(龙);break;case 1: writecom(0x87);writestring(蛇);break;case 2: writecom(0x87);writestring(马);break;case 3: writecom(0x87);writestring(羊);break;case 4: writecom(0x87);writestring(猴); 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 45 页break;case 5: writecom(0x87);writestring(鸡);break;case 6: writecom(0x87);writestring(狗);break;case 7: writecom(0x87);writestring(猪);break;case 8: writecom(0x87);writestring(鼠);break;case 9: writecom(0x87);writestring(牛);break;case 10: writecom(0x87);writestring(虎);break;case 11: writecom(0x87);writestring(兔);break;/向 LCD 中填写 年 数据void writeyear(void)YEAR= Read1302(0x8d);writecom(0x80);writestring(20);writecom(0x81);writedat(YEAR/16)+0x30);writedat(YEAR%16+0x30);writecom(0x82);writestring(年); 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 46 页nl(); /向 LCD 中填写 月 数据void writemonth(void)MONTH = Read1302(0x89);writecom(0x83);if(MONTH/16 != 0)writedat(MONTH/16)+0x30); /十位消隐elsewritedat(0x20);/同上writedat(MONTH%16+0x30);writecom(0x84);writestring(月);nl();/星期处理并送入 LCM 的指定区域void writeweek(void)uchar sel;WEEK = Read1302(0x8b);sel = (Read1302(0x8b)%16; writecom(0x97);if(sel=7) writestring(日); /if(sel=6) writestring(六); /if(sel=5) writestring(五); /if(sel=4) writestring(四); /if(sel=3) writestring(三);/writedat(0xc8);LCM_WriteDatOrCom(1,0xfd); /此指令等于LCM_WriteString(三); 因为 三的内码失效。 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 47 页if(sel=2) writestring(二); /if(sel=1) writestring(一); /星期一writecom(0x95);writestring(星期);/向 LCM 中填写 日 数据void writedate(void)DATE = Read1302(0x87);writecom(0x85);if(DATE/16 != 0)writedat(DATE/16)+0x30); /十位消隐elsewritedat(0x20);/同上writedat(DATE%16+0x30);writecom(0x86);writestring(日);nl();/向 LCM 中填写 小时 数据void writehr(void)if(Read1302(0x85)!= HR)HR = Read1302(0x85);if (HR 0x07 & HR max) item=mini;if(item= 6 )e = 0;Set_time(e);/调整if(KEY_4 = 0 & w = 0) clrlcd();/清屏w=1; /进入调时while(KEY_4 = 0);/等待键松开 else if (KEY_1 = 0) DelayM(20);if(KEY_1 = 0 & w = 1)w = 0; e = 0;if(KEY_1 = 0 & w = 0)clrlcd();/清屏display(dis_char);while(KEY_1 = 0); clrlcd();/清屏days(); /节日显示 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 53 页updata (); /刷新数据writemin();/刷新 分nl();while(KEY_1 = 0);/等待键松开 else if (KEY_2 = 0 & w = 1)/ 加减调整 DelayM(20);if(KEY_2 = 0 & w = 1)Set_time(e);/调整while(KEY_2 = 0);/等待键松开else if (KEY_3 = 0 & w = 1)/ 加减调整 DelayM(20);if(KEY_3 = 0 & w = 1)Set_time(e);/调整while(KEY_3 = 0);/等待键松开main() uchar e=0;KEY_1 = 10;KEY_2 = 0;KEY_3 = 0;KEY_4 = 0;/初始键盘YEAR=0xff;MONTH=0xff;DATE=0xff;WEEK=0xff;HR=0xff;MIN=0xff;SEC=0xff; /各数据刷新beep = 0; 黄 河 科 技 学 院 毕 业 设 计 说 明 书 第 54 页DelayM(900);beep = 1;initlcd();/初始化液晶显示器clrlcd();/清屏display(dis_char);/显示欢迎字DelayM(8000); /显示等留 3 秒clrlcd();/清屏 init1302();Init_DS18B20();while(1)Keydone();(程序不在论文里给出来,太长了!)
收藏