论文(设计)电子万年历的设计_第1页
论文(设计)电子万年历的设计_第2页
论文(设计)电子万年历的设计_第3页
论文(设计)电子万年历的设计_第4页
论文(设计)电子万年历的设计_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

1、 电子万年历的设计电子万年历的设计 目录目录 内容摘要 .1 关键词 .1 abstract .1 key words .1 1 引言.2 2 设计要求与方案论证 .2 2.1 设计要求 .2 2.2 系统基本方案选择和论证.2 2.2.1 单片机芯片的选择方案和论证.2 2.2.2 显示模块选择方案和论证.3 2.2.3 时钟芯片的选择方案和论证.3 2.2.4 温度传感器的选择方案与论证.4 2.3 电路设计最终方案决定.4 3 系统的硬件设计与实现 .4 3.1 电路设计框图.4 3.2 系统硬件概述.5 3.3 主要单元电路的设计.5 3.3.1 单片机主控制模块的设计.5 3.3.2

2、 时钟电路模块的设计.6 3.3.3 温度采集模块设计.7 3.3.4 显示模块的设计.8 3.3.5 相关电路原理及说明.8 4 系统的软件设计 .10 4.1 程序流程框图.10 4.2 阳历显示程序设计.11 4.3 时间调整程序设计.11 4.4 温度数据采集与显示程序设计.13 4.4.1 基本功能实现程序.13 4.4.2 读出温度子程序.13 4.4.3 温度转换命令子程序.13 4.4.4 温度计算子程序.14 4.4.5 显示数据刷新子程序.14 5 系统仿真与调试 .15 5.1 系统仿真.15 5.2 硬件制作与调试.16 5.2.1 硬件制作.16 5.2.2 硬件调试

3、.16 6 结束语 .17 参考文献 .18 致谢 .19 附录 1 系统电路图.20 附录 2 系统程序清单.21 内容摘要:内容摘要:电子万年历是单片机系统的一个应用,由硬件和软件 相配合使用。硬件由主控器、时钟电路、温度检测电路、显示电路、 键盘接口 5 个模块组成。本设计的主控模块使用 at89c52、时钟电路 使用时钟芯片 ds1302、显示模块使用液晶显示器 lcd1602、温度检测 使用 ds18b20 温度传感器、键盘接口电路使用普通按键接上拉电阻完 成;软件利用 c 语言编程实现单片机程序控制。单片机通过时钟芯片 ds1302 获取时间数据,ds18b20 采集温度信号送给单

4、片机处理,单片 机再把时间数据和温度数据送给液晶显示器 lcd1602,从而显示阳历 年、月、日、时、秒、闹钟、星期、温度。 关键词关键词:电子万年历;单片机;温度传感器;时钟;液晶显示器 abstractabstract:electronic perpetual calendar which is an application of the single-chip processor system, is utilized by combining hardware and software. and hardware is composed of five modules: main co

5、ntrol unit, clock circuit, temperature test circuit, display circuit, keyboard interface. main control board adopts at89s52, clock circuit adopts the ds1302 clock chip, display module adopts the liquid crystal display 1602, and temperature test adopts the ds18b20 temperature sensor, keyboard interfa

6、ce circuit is completed by connecting ordinary button with pull-up resistor. software takes advantage of c to program, so as to realize the programmed control of single-chip processor. single-chip processor gets the time data through using the ds1302 clock chip. the ds18b20 gathers temperature signa

7、ls and transmits them to single-chip processor. then,the single-chip processor transmits the time data and the temperature data to the lcd1602. lastly, the lcd displays the solar calendar year,with year, month, day, hour, minute, second, alarm clock, week and temperature. keykey wordswords:electroni

8、c perpetual calendar; single-chip processor; temperature sensor; clock; liquid crystal display 1 1 引言引言 随着微电子技术和超大规模集成电路技术的不断发展,家用电子 产品不但种类日益丰富,而且变得更加经济实用,单片微型计算机体 积小、性价比高、功能强、可靠性高等独有的特点,在各个领域得到 了广泛的应用。电子万年历是一种应用非常广泛的日常计时工具,数 字显示的日历钟已经越来越流行,特别是适合在家庭居室、办公室、 大厅、会议室、车站和广场等使用。lcd 液晶显示的日历钟显示清晰 直观、走时准确、可以

9、进行夜视,并且还可以扩展出多种功能,可以 实现公历年月日、时分秒、星期、温度显示等功能。但通过我们对各 种电子钟表、日历的不断观察和总结,发现目前市场的电子钟表、日 历都存在一些不足之处,比如:时钟不精确、产品成本太高、无环境 温度显示等,这都给人们的使用带来了某些不便。因此,研制一种结 构简单、价格低廉、功能齐全的电子万年历是非常有必要的,它具有 非常广阔的市场空间与发展前景,有着很大的现实意义。为此我设计 了这种基于 52 单片机的电子万年历。 2 2 设计要求与方案论证设计要求与方案论证 2.12.1 设计要求设计要求 显示部分可采用数码管或液晶显示器,可显示当前时间,用阳历 显示年、月

10、、日,时间用 24 小时制显示。 这里,可以将万年历的功能进行扩展,使其: 1、具有显示年、月、日、星期、时、分、秒的功能; 2、时间与日期能够自动关联; 3、具有温度计功能; 4、具有年、月、日、星期、时、分、秒的设置功能。 2.22.2 系统基本方案选择与论证系统基本方案选择与论证 2.2.12.2.1 单片机芯片的选择方案和论证单片机芯片的选择方案和论证 方案一:采用 at89c51 作为主控制芯片 at89c51 片内 rom 采用 flash rom,内部具有 4kb rom 存储空间, 能在 3v 的超低压下工作,而且与 mcs-51 系列单片机完全兼容,但是 在运用于电路设计时,

11、由于不具备 isp 在线编程技术,当在对电路进 行调试时,由于程序的错误需要修改或对程序进行增加功能需要烧入 程序时,对芯片的多次插拔会对芯片造成一定的损坏。 方案二:采用 at89c52 作为主控制芯片 at89c52 片内 rom 全部采用 flash rom,能在 3v 的超低压下工作, 同时也与 mcs-51 系列单片机完全兼容,该芯片内部存储器为 8kb rom 存储空间,同样具有 at89c51 的功能,且具有在线编程可擦除技术, 当在对电路进行调试时,由于程序的错误需要修改或对程序进行增加 功能需要烧入程序时,不需要对芯片多次插拔,所以不会对芯片造成 损坏。 综合考虑,选择采用

12、at89c52 芯片作为主控制芯片。 2.2.22.2.2 显示模块选择方案和论证显示模块选择方案和论证 方案一:采用 led 数码管动态扫描显示 led 数码管价格适中,对于显示数字较合适,而且采用动态扫描 法与单片机连接时,占用的单片机接口线少,但是数码管焊接太繁琐, 附带的驱动元件太多,较易出错,所以不采用此方案。 方案二:采用点阵式数码管显示 点阵式数码管是由八行八列的发光二极管组成,对于显示文字比 较合适,使用来显示数字则显得太浪费,且价格相对较高,所以不采 用此方案。 方案三:采用 lcd 液晶显示器 液晶显示器的显示功能强大,可显示大量文字、图形,显示多样、 清晰可见,焊接也较方

13、便,但是价格相对较贵,需要的接口线较多。 总体可以考虑。 综合考虑,选择采用 lcd1602 液晶显示器作为显示模块。 2.2.32.2.3 时钟芯片的选择方案和论证时钟芯片的选择方案和论证 方案一:采用单片机定时计数器 直接采用单片机定时计数器提供秒信号,使用程序实现年、月、 日、星期、时、分、秒计数。采用此方案虽然可以减少芯片的使用, 节约成本,但是实现的时间误差较大,所以不采用此方案。 方案二:采用 ds1302 时钟芯片实现时钟 ds1302 芯片是一种高性能的时钟芯片,可自动对年、月、日、星 期、时、分、秒以及闰年补偿的年进行计数,而且精度高,8 位的 ram 做为数据暂存区,工作电

14、压在 2.5v-5.5v 范围内,耗电量小, 2.5v 时耗电小于 300ua。 综合考虑,选择采用 ds1302 作为时钟芯片来实现时钟。 2.2.42.2.4 温度传感器的选择方案和论证温度传感器的选择方案和论证 方案一:采用热敏电阻作为传感器 用热敏电阻与一个相应阻值电阻相串联分压,利用热敏电阻阻值 随温度变化而变化的特性,采集这两个电阻变化的分压值,并进行 a/d 转换。此设计方案需用 a/d 转换电路,增加硬件成本而且热敏电 阻的感温特性曲线并不是严格线性的,会产生较大的测量误差。 方案二:采用数字式温度传感器 ds18b20 此类传感器为数字式传感器,而且仅需一条数据线进行数据传输

15、, 易于与单片机连接,可以去除 a/d 模块,降低硬件成本,简化系统电 路。另外,数字式温度传感器还具有测量精度高、测量范围广等优点。 综合考虑,选择采用 ds18b20 作为温度传感器。 2.32.3 电路设计最终方案决定电路设计最终方案决定 综合以上各方案所述,本设计的总体方案选定为:采用 at89c52 作为作为主控制芯片,lcd1602 液晶显示器作为显示模块,ds1302 作 为时钟芯片来实现时钟,ds18b20 作为温度传感器。 3 3 系统的硬件设计与实现系统的硬件设计与实现 3.13.1 硬件电路设计框图硬件电路设计框图 at89c52 主控制模 块 led 数码管动态 扫描显

16、示模块 ds1302 时钟模块 键盘控制模块 温度采集模块 图 1 硬件电路设计框图 3.23.2 系统硬件概述系统硬件概述 本电路以 at89c52 单片机为控制核心,具有在线编程功能,低功 耗,能在 3v 的超低压下工作;时钟电路由 ds1302 提供,它是一种高 性能、高精度、低功耗、带 ram 的实时时钟电路,可以对年、月、日、 星期、时、分、秒进行计时,并具有闰年补偿功能,工作电压为 2.5v-5.5v,采用三线接口与 cpu 进行同步通信,并可采用突发方式 一次传送多个字节的时钟信号或 ram 数据,同时具有掉电自动保存功 能;温度采集电路由 ds18b20 构成;显示部分由液晶显

17、示器 lcd1602 构成。 3.33.3 主要单元电路的设计主要单元电路的设计 3.3.13.3.1 单片机主控制模块的设计单片机主控制模块的设计 at89c52 为 8 位通用微处理器,采用工业标准的 c51 内核,在内 部功能及管脚排布上与通用的 8xc52 相同,其主要用于会聚调整时的 功能控制。功能包括对会聚主 ic 内部寄存器、数据 ram 及外部接口 等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信 号 ir 的接收解码及与主板 cpu 通信等。主要管脚有:xtal1(19 脚) 和 xtal2(18 脚)为振荡器输入输出端口,外接 12mhz 晶振; rst/vpd

18、(9 脚)为复位输入端口,外接电阻电容组成的复位电路; vcc(40 脚)和 vss(20 脚)为供电端口,分别接+5v 电源的正负端; p0-p3 为可编程通用 i/o 口,其功能用途由软件定义,在本设计中, p0 端口(32-39 脚)定义为 n1 功能控制端口,分别与 n1 的相应功能 管脚相连接,13 脚定义为 ir 输入端,10 脚和 11 脚定义为 i2c 总线 控制端口,分别连接 n1 的 sdas(18 脚)和 scls(19 脚)端口,12 脚、27 脚及 28 脚定义为握手信号功能端口,连接主板 cpu 的相应功 能端,用于当前制式的检测及会聚调整状态进入的控制功能。 图

19、2 at89c52 主控制系统 at89c52 单片机为 40 引脚双列直插芯片,有四个 8 位 i/o 口 p1、p2、p3 和 p4,每一条 i/o 线都能独立地作为输出或输入。 单片机的最小系统如上图所示,18 引脚和 19 引脚接时钟电路, xtal1 接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器 的输入,xtal2 接外部晶振和微调电容的另一端,在片内它是振荡器 倒相放大器的输出。第 9 引脚为复位输入端,接上电容,电阻及开关 构成上电复位电路,20 引脚为接地端,40 引脚为电源端。 3.3.23.3.2 时钟电路模块的设计时钟电路模块的设计 图 3 ds1302 引脚连

20、线图 图 3 表示出 ds1302 的引脚排列,其中 vcc1 为后备电源,vcc2 为 主电源。在主电源关闭的情况下,也能保持时钟的连续运行。ds1302 由 vcc1 和 vcc2 两者中的较大者供电。当 vcc2 大于 vcc1+0.2v 时, vcc2 给 ds1302 供电;当 vcc2 小于 vcc1 时,ds1302 由 vcc1 供电。 x1 和 x2 为振荡源,外接 32.768khz 晶振。rst 是复位/片选线,通过 把 rst 输入驱动置高电平来启动所有的数据传送。rst 输入有两种功 能:首先,rst 接通控制逻辑,允许地址/命令序列送入移位寄存器; 其次,rst 提

21、供终止单字节或多字节数据的传送手段。当 rst 为高电 平时,所有的数据传送被初始化,允许对 ds1302 进行操作。如果在 传送过程中 rst 置为低电平,则会终止此次数据传送,i/o 引脚变为 高阻态。上电运行时,在 vcc 大于等于 2.5v 之前,rst 必须保持低电 平。只有在 sclk 为低电平时,才能将 rst 置为高电平,i/o 为串行数 据输入端(双向)。sclk 始终为输入端。 3.3.33.3.3 温度采集模块的设计温度采集模块的设计 图 4 ds18b20 温度采集引脚连线图 如图 4 所示,采用数字式温度传感器 ds18b20,它是数字式温度 传感器,具有测量精度高,

22、电路连接简单等特点。此类传感器仅需要 一条数据线进行数据传输,使用 p0.7 与 ds18b20 的 i/o 口连接,加 上一个上拉电阻,vcc 接电源,gnd 接地。 3.3.43.3.4 显示模块的设计显示模块的设计 如下图 5 所示,使用液晶显示器 lcd1602 作为显示模块,vdd 接 +5v 电源驱动,vss 接地,d0-d7 分别接 10k 的上拉电阻,并与单片机 接口中的 p0 口对应连接。rs、rw、e 分别与单片机接口中的 p2.5、p2.6、p2.7 连接。此外,vee 接一个 10k 的滑动变阻器,这样 就可以对液晶显示器的亮度进行调节。 图 5 lcd1602 显示电

23、路连接图 3.3.53.3.5 相关电路原理及说明相关电路原理及说明 (1)时钟芯片 ds1302 的工作原理 ds1302 在每次进行读、写程序前都必须初始化先把 sclk 端置 “0”,接着把 rst 端置“1”,最后才给予 sclk 脉冲。读、写时序 如下图 6 所示。表 1 为 ds1302 的控制字。表 2 为 ds1302 的日历、时 间寄存器内容。 (2)ds1302 的控制字节 ds1302 的控制字如表 1 所示。此控制字的位 7 必须置“1”,若 为“0”,则不能对 ds1302 进行读写数据。对于位 6,若对程序进行 读、写时,ram=1;对时间进行读、写时,ck=0。位

24、 1 至位 5 指操作 单元的地址。位 0 是读、写操作位,进行读操作时,该位为“1”; 进行写操作时,该位为“0”。控制字节总是从最低位开始输入/输出 的。 ram rd 1 a4 a3 a2 a1 a0 /ck /wr 表 1 ds1302 的控制字格式 (3)数据输入与输出(i/o) 在控制指令字输入后的下一个 sclk 时钟的上升沿时,数据被写 入 ds1302,数据输入从低位即位 0 开始。同时,在紧跟 8 位的控制指 令字节后的下一个 sclk 脉冲的下降沿读出 ds1302 的数据,读出数据 时从低位 0 位到高位 7。如下图 6 所示。 图 6 ds1302 读/写时序图 (4

25、)ds1302 的寄存器 ds1302 有 12 个寄存器,其中 7 个寄存器与日历、时钟相关,存 放的数据位为 bcd 码形式,其日历、时间寄存器及控制字见下表 2。 其中“ch”是时钟暂停标志位,当该位为“1”时,时钟振荡器停止, ds1302 处于低功耗状态;当该位为“0”时,时钟开始运行。wp 是写 保护位,在任何对时钟和 ram 的写操作之前,wp 必须为“0”。当 wp 为“1”时,写保护位防止对任一寄存器的写操作。 表 2 ds1302 的日历、时间寄存器 此外,ds1302 还有年份寄存器、控制寄存器、充电寄存器、时钟 突发寄存器及与 ram 相关的寄存器等。时钟突发寄存器可一

26、次性顺序 读写除充电寄存器之外的所有寄存器内容。ds1302 与 ram 相关的寄存 器分为两类:一类是单个 ram 单元,共 31 个,每个单元组态为一个 8 位的字节,其命令控制字为 coh-fdh,其中奇数为读操作,偶数为 写操作;另一类为突发方式下的 ram 寄存器,此方式下可一次性读写 所有的 ram 的 31 个字节,命令控制字为 feh(写)、ffh(读)。 4 4 系统的软件设计系统的软件设计 软件设计是本设计的关键,软件程序编写的好坏直接影响着系统 运行情况的良好。因本程序涉及的模块较多,所以程序编写也采用模 块化设计,c 语言具有编写灵活、移植方便、便于模块化设计的特点,

27、所以本系统的软件采用 c51 编写。 4.14.1 主程序流程框图主程序流程框图 开始 初始化 读/写日期、时间和温度 分离日期/时间/温度显示 显示子程序 日期、时间修改程序 返回 图 7 主程序流程图 4.24.2 阳历显示程序设计阳历显示程序设计 因为使用了时钟芯片 ds1302,阳历程序只需从 ds1302 各寄存器 中读出年、月、日、星期、时、分、秒等数据,再处理即可。在首次 对 ds1302 进行操作之前,必须对它进行初始化,然后从 ds1302 中读 出数据,再经过处理,送给显示缓冲单元。阳历显示流程图如下图 8 所示。 开始 初始化ds1302 ds1302开始振荡 从ds13

28、02中读出年、月、 日、星期、时、分、秒 读出的数据都为bcd码,将其 高低位分离,送显示缓冲单元 图 8 阳历显示流程图 4.34.3 时间调整程序设计时间调整程序设计 调整时间使用 4 个调整按钮,1 个作为进入设置、移位、控制使 用,2 个作为加、减使用,还有 1 个作为退出设置使用,分别定义为 控制按钮、加按钮、减按钮、退出按纽。在调整时间过程中,要调整 的位与别的位应该有区别,所以增加了闪烁功能,即调整的位一直在 闪烁,直到调整下一位。闪烁原理就是,让要调整的一位每隔一定时 间熄灭一次,比如说 50ms。利用定时器计时,当达到 50ms 溢出时, 就送给该位熄灭符,在下一次溢出时,再

29、送正常显示的值,不断交替, 直到调整该位结束。此时送正常显示值给该位,再进入下一位调整闪 烁程序。时间调整程序流程图如下图 9 所示。 图 9 时间调整程序流程图 4.44.4 温度数据采集与显示程序设计温度数据采集与显示程序设计 此程序主要包括基本功能实现程序、读出温度子程序、温度转换 命令子程序、温度计算子程序、显示数据刷新子程序。 4.4.14.4.1 基本功能实现程序基本功能实现程序 此段程序的主要功能是实现温度的实时显示、读出并处理 ds18b20 的测量温度值,温度测量每 1s 进行一次。程序流程图如下图 10 所示。 初始化 调用显示子程序 1s 到? 初次上电? 读出温度值 温

30、度计算处理 显示数据刷新 发温度转换开始命令 n y y n 图 10 基本功能实现流程图 图 11 读出温度子程序流程图 4.4.24.4.2 读出温度子程序读出温度子程序 此段程序的主要功能读出 ram 中的 9 字节,在读出时需进行 crc 校验,校验有错时不进行温度数据的改写。程序流程图如上图 11 所 示。 4.4.34.4.3 温度转换命令子程序温度转换命令子程序 此段程序主要功能是发出温度转换开始命令。当采用 12 位分辨 率时,转换时间约为 750ms。在本程序设计中采用 1s 显示程序延时法 等待转换的完成。程序流程图如下图 12 所示。 开始 温度零下? 温度值取补码 置“

31、”标志 置“+”标志 结束 计算小数位 bcd 值 计算整数位 bcd 值 n y 图 12 温度转换命令子程序流程图 图 13 温度计算子程序流程图 4.4.44.4.4 温度计算子程序温度计算子程序 此段程序主要功能是将 ram 中的读取值进行 bcd 码的转换运算, 并进行温度值正负的判定。程序流程图如上图 13 所示。 4.4.54.4.5 显示数据刷新子程序显示数据刷新子程序 此段程序主要功能是对显示缓冲器中的显示数据进行刷新操作, 当最高显示位为“0”时,将符号显示位移入下一位。程序流程图如 下图 14 所示。 图 14 显示数据刷新子程序流程图 5 5 系统仿真与调试系统仿真与调

32、试 5.15.1 系统仿真系统仿真 本设计使用的仿真软件为 proteus 软件和 keil c51 软件。 protues 软件是由英国 labcenter electronics 公司开发的 eda 工具 软件,由 isis 和 ares 两个软件构成,其中 isis 是一款便捷的电子 系统仿真平台软件,通过 proteus isis 软件的 vsm(虚拟仿真技术), 用户可以对模拟电路、数字电路、模数混合电路,以及基于微控制器 的系统连同所有外围接口电子元器件一起仿真;ares 是一款高级的布 线编辑软件,它集成了高级原理布线图、混合模式 spice 电路仿真、 pcb 设计以及自动布线

33、来实现一个完整的电子设计。keil c51 软件是 美国 keil software 公司出品的 51 系列兼容单片机 c 语言软件开发 系统。keil 提供了包括 c 编译器、宏汇编、连接器、库管理和一个功 能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境 (uvision)将这些部分组合在一起。 首先,按设计方案在 isis 软件中连接好电路,如下图 15 所示。 图 15 系统总体电路 然后,使用 keil c51 软件对系统程序进行编译和查错。系统程 序见附录 2。经检查无误之后,对程序进行编译、连接、运行,生成. hex 文件。 最后,在 isis 软件中将.hex 文件

34、加载进单片机中,对系统总体 电路进行仿真调试,检查各按键是否有效、查看显示结果是否与实际 相符。如有不相符的结果,则再返回 keil c51 软件中对程序进行改 进,直到显示结果正确无误。 5.25.2 硬件制作与调试硬件制作与调试 5.2.15.2.1 硬件制作硬件制作 (1)整理元器件,重点辩别认清电阻器阻值及相应代号,对电 阻、电容等要用万用表一一检测。 (2)按照系统仿真电路图对硬件电路进行安装焊接时,电阻器 采用卧式插装,并近贴电路板;瓷介电容器、电解电容器等采用立式 插装,也要近贴电路板。其余元件必须按正确的极性插装,否则电路 不会正常工作。 (3)焊完元器件后,在覆铜面剪掉多余元

35、器件的引线,工具最好 用斜口钳,可防止因剪线而使覆铜皮损坏。 (4)焊接完后,再认真对照电路原理图、安装图检查电路板上 有无漏焊、错焊、短路、断路等错误现象,确认无误后才能通电。 5.2.25.2.2 硬件调试硬件调试 硬件电路检查无误后,使用单片机开发板将系统程序下载到单片 机中。然后通电,观察硬件运行情况。 在硬件调试运行过程中,发现以下问题并解决: (1) 烧入程序后,液晶显示器显示不稳定,亮度不够 解决办法:首先,对调用的延时子程序进行修改,可以解决显示 闪动问题。其次,由于本设计用动态扫描方式显示数字,动态扫描很 快,人的肉眼是无法看出,但是调用显示程序时,如果不在返回时屏 蔽掉最后

36、的附值,则会出现很亮的现象,所以在显示程序的后面加了 屏蔽指令,最后解决了显示不稳定问题。亮度不够问题可以通过调节 滑动变阻器来解决。 (2)修改时间、日期时没有自动对应。 解决办法:把不相关的程序暂时屏蔽,将设置时间子程序进行独 立调试,发现在调用设置时间自动更新时,对数据处理不好,所以会 造成错乱。最后把相应的处理程序进行修改,使得可以自动对应时间、 日期,从而解决了此问题。 至此,整个系统软件、硬件的编写、制作与调试结束,各项指标 和目的全部实现,本设计任务基本完成。 6 6 结束语结束语 电子万年历是一种应用非常广泛的日常计时工具,而且将越来越 流行和实用。本设计是基于 51 系列的单

37、片机进行的电子万年历设计, 可以显示年、月、日、时、分、秒及星期信息,还具有温度显示和时 间校准等多种功能。本电路采用 at89c52 单片机作为核心,功耗小, 能在 3v 的低压工作,可选用 3-5v 电压供电。时钟芯片 ds1302 的使 用寿命长,误差小。lcd1602 液晶显示器效果清晰,而且亮度可调。 温度传感器 ds18b20 精度较高,电路连接简单。按键电路只包含 4 个 按键,操作简单实用。 此电子万年历的设计具有结构简单、使用便捷、显示精确、功能 齐全等优点,对于改善目前市场上电子钟表、日历等存在的一些不足 之处,比如:时钟不精确、产品成本太高、无环境温度显示等,具有 很重要

38、的意义。因此,此种电子万年历的生产和发展是非常有必要的, 它具有非常广阔的市场空间与发展前景,有着很大的现实意义。 参考文献参考文献 1童诗白,华成英主编.模拟电子技术基础(第四版)m.北京:高等 教育出版社.2009-7 2阎石.数字电路技术基础(第五版)m.北京:高等教育出版社. 2009-7 3林立等编著.单片机原理及应用:基于 proteus 和 keil cm.北 京:电子工业出版社.2009-7 4王化祥,张淑英编著.传感器原理及应用(第三版)m.天津:天津 大学出版社.2010-7 5王港元.电工电子实践指导m.南昌:江西科学技术出版社.2006- 7 6张斌武.单片机系统 pr

39、oteus 设计与仿真m.北京:电子工业出版 社.2005 7谢自美.电子线路设计实验测试m.武汉:华中科技大学出版 社.2006 8彭伟.单片机 c 语言程序设计实训 100 例m.北京:电子工业出版 社.2009 9杨子文.单片机原理及应用m.西安:西安电子科技大学出版社. 2006 10苏平.单片机的原理与接口技术m.北京:电子工业出版社.2006 致谢致谢 经过了几个月的设计制作与调试,终于顺利完成毕业设计的所有 要求,将电子万年历制作出来。在这段时间里,我学到了很多的专业 知识也充分感受到了指导老师和同学们的关心与帮助,正是因为有他 们的关心和帮助,本次设计才能顺利的完成。由于之前对

40、其接触较少, 对它的性能要求了解不多,还有对它的相关技术要求也不是很清楚。 正是如此,我开始查看相关的资料和书籍,让自己头脑中模糊的概念 逐渐清晰;独立地设计与制作作品,认真地对各部分硬件模块进行调 试,使自己的作品一步步完善起来,每一次改进都是我学习的收获。 这次毕业论文能够得以顺利完成,并非我一人之功劳,是所有指 导过我的老师和帮助过我的同学对我的教诲、帮助和鼓励的结果,我 要在这里对他们表示深深的谢意。 在此我要特别感谢我的指导老师:杨汉祥老师。作为一个本科生 的毕业设计,从论文选题、实验研究到最后的成稿,由于经验的匮乏, 难免有许多考虑不周全的地方,他都耐心地对我进行悉心指导,凝聚 了

41、恩师许多心血,没有他的悉心指导就没有这篇论文的顺利完成。 另外,对百忙之中评阅本论文的答辩委员会的各位老师致以最诚 挚的谢意。 最后,再次对关心、帮助我的老师和同学表示衷心地感谢。 附录附录 1 1 系统电路图系统电路图 附录附录 2 2 系统程序清单系统程序清单 #include #include /#include lcd1602.h /#include ds1302.h #define uint unsigned int #define uchar unsigned char sbit ds1302_clk = p17;/p36; /实时时钟时钟线引脚 sbit ds1302_io =

42、p16;/p34; /实时时钟数据线引脚 sbit ds1302_rst = p15;/p35; /实时时钟复位线引脚 sbit wireless_1 = p30; sbit wireless_2 = p31; sbit wireless_3 = p32; sbit wireless_4 = p33; sbit acc0 = acc0; sbit acc7 = acc7; char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; /秒,分,时到日,月,年位闪的计数 sbit set = p20; /模式切

43、换键 sbit up = p21; /加法按钮 sbit down = p22; /减法按钮 sbit out = p23; /立刻跳出调整模式按钮 sbit dq =p10; /p37; /温度传送数据 io 口 char done,count,temp,flag,up_flag,down_flag; uchar temp_value; /温度值 uchar tempbuffer5,week_value2; void show_time(); /液晶显示程序 /*1602 液晶显示部分子程序*/ /port definitions* sbit lcdrs=p25; /p26; sbit lc

44、drw=p26; /p25; sbit lcden =p27;/p27; sfr dbport = 0 x80; /p0=0 x80,p1=0 x90,p2=0 xa0,p3=0 xb0.数据端口 /内部等待函数 * * unsigned char lcd_wait(void) lcdrs=0; lcdrw=1;_nop_(); lcden=1;_nop_(); lcden=0; return dbport; /向 lcd 写入命令或数据 * #define lcd_command0 / command #define lcd_data1 / data #define lcd_clear_sc

45、reen0 x01 / 清屏 #define lcd_homing 0 x02 / 光标返回原点 void lcd_write(bit style, unsigned char input) lcden=0; lcdrs=style; lcdrw=0;_nop_(); dbport=input;_nop_();/注意顺序 lcden=1;_nop_();/注意顺序 lcden=0;_nop_(); lcd_wait(); /设置显示模式 * #define lcd_show0 x04 /显示开 #define lcd_hide0 x00 /显示关 #define lcd_cursor0 x02

46、 /显示光标 #define lcd_no_cursor0 x00 /无光标 #define lcd_flash0 x01 /光标闪动 #define lcd_no_flash0 x00 /光标不闪动 void lcd_setdisplay(unsigned char displaymode) lcd_write(lcd_command, 0 x08|displaymode); /设置输入模式 * #define lcd_ac_up0 x02 #define lcd_ac_down0 x00 / default #define lcd_move0 x01 / 画面可平移 #define lcd

47、_no_move0 x00 /default void lcd_setinput(unsigned char inputmode) lcd_write(lcd_command, 0 x04|inputmode); /初始化 lcd* void lcd_initial() lcden=0; lcd_write(lcd_command,0 x38); /8 位数据端口,2 行显示,5*7 点阵 lcd_write(lcd_command,0 x38); lcd_setdisplay(lcd_show|lcd_no_cursor); /开启显示, 无光标 lcd_write(lcd_command,

48、lcd_clear_screen); /清屏 lcd_setinput(lcd_ac_up|lcd_no_move); /ac 递增, 画面不动 /液晶字符输入的位置* void gotoxy(unsigned char x, unsigned char y) if(y=0) lcd_write(lcd_command,0 x80|x); if(y=1) lcd_write(lcd_command,0 x80|(x-0 x40); /将字符输出到液晶显示 void print(unsigned char *str) while(*str!=0) lcd_write(lcd_data,*str)

49、; str+; /*ds1302 时钟部分子程序*/ typedef struct _systemtime_ unsigned char second; unsigned char minute; unsigned char hour; unsigned char week; unsigned char day; unsigned char month; unsigned char year; unsigned char datestring11; unsigned char timestring9; systemtime;/定义的时间类型 systemtime currenttime; #d

50、efine am(x)x #define pm(x)(x+12) / 转成 24 小时制 #define ds1302_second0 x80 /时钟芯片的寄存器位置,存放时间 #define ds1302_minute0 x82 #define ds1302_hour0 x84 #define ds1302_week0 x8a #define ds1302_day0 x86 #define ds1302_month0 x88 #define ds1302_year0 x8c void ds1302inputbyte(unsigned char d) /实时时钟写入一字节(内部函数) unsi

51、gned char i; acc = d; for(i=8; i0; i-) ds1302_io = acc0; /相当于汇编中的 rrc ds1302_clk = 1; ds1302_clk = 0; acc = acc 1; unsigned char ds1302outputbyte(void) /实时时钟读取一字节(内部函数) unsigned char i; for(i=8; i0; i-) acc = acc 1; /相当于汇编中的 rrc acc7 = ds1302_io; ds1302_clk = 1; ds1302_clk = 0; return(acc); void wri

52、te1302(unsigned char ucaddr, unsigned char ucda) /ucaddr: ds1302 地址, ucdata: 要写的数据 ds1302_rst = 0; ds1302_clk = 0; ds1302_rst = 1; ds1302inputbyte(ucaddr); / 地址,命令 ds1302inputbyte(ucda); / 写 1byte 数据 ds1302_clk = 1; ds1302_rst = 0; unsigned char read1302(unsigned char ucaddr)/读取 ds1302 某地址的数据 unsign

53、ed char ucdata; ds1302_rst = 0; ds1302_clk = 0; ds1302_rst = 1; ds1302inputbyte(ucaddr|0 x01); / 地址,命令 ucdata = ds1302outputbyte(); / 读 1byte 数据 ds1302_clk = 1; ds1302_rst = 0; return(ucdata); void ds1302_gettime(systemtime *time) /获取时钟芯片的时钟数据到自定 义的结构型数组 unsigned char readvalue; readvalue = read1302

54、(ds1302_second); time-second = (readvalue readvalue = read1302(ds1302_minute); time-minute = (readvalue readvalue = read1302(ds1302_hour); time-hour = (readvalue readvalue = read1302(ds1302_day); time-day = (readvalue readvalue = read1302(ds1302_week); time-week = (readvalue readvalue = read1302(ds1

55、302_month); time-month = (readvalue readvalue = read1302(ds1302_year); time-year = (readvalue void datetostr(systemtime *time) /将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里 datestring if(hide_year2) /这里的 if,else 语句都是判断位闪烁,2 就不显示,输出字符串 为 2007/07/22 time-datestring0 = 2; time-datestring1 = 0; time-datestring2 = time

56、-year/10 + 0; time-datestring3 = time-year%10 + 0; else time-datestring0 = ; time-datestring1 = ; time-datestring2 = ; time-datestring3 = ; time-datestring4 = /; if(hide_monthdatestring5 = time-month/10 + 0; time-datestring6 = time-month%10 + 0; else time-datestring5 = ; time-datestring6 = ; time-da

57、testring7 = /; if(hide_daydatestring8 = time-day/10 + 0; time-datestring9 = time-day%10 + 0; else time-datestring8 = ; time-datestring9 = ; if(hide_weekweek%7 + 0; /星期的数据另外放到 week_value数组里,跟年,月,日的分开存放,因为等一 下要在最后显示 else week_value0 = ; week_value1 = 0; time-datestring10 = 0; /字符串末尾加 0 ,判断结束字符 void ti

58、metostr(systemtime *time) /将时,分,秒数据转换成液晶显示字符放到数组 timestring; if(hide_hourtimestring0 = time-hour/10 + 0; time-timestring1 = time-hour%10 + 0; else time-timestring0 = ; time-timestring1 = ; time-timestring2 = :; if(hide_mintimestring3 = time-minute/10 + 0; time-timestring4 = time-minute%10 + 0; else

59、time-timestring3 = ; time-timestring4 = ; time-timestring5 = :; if(hide_sectimestring6 = time-second/10 + 0; time-timestring7 = time-second%10 + 0; else time-timestring6 = ; time-timestring7 = ; time-datestring8 = 0; void initial_ds1302(void) /时钟芯片初始化 unsigned char second=read1302(ds1302_second); if

60、(second /写入允许 write1302(0 x8c,0 x09); /以下写入初始化时间 日期:09/01/01.星期: 4. 时间: 00:00:00 write1302(0 x88,0 x01); write1302(0 x86,0 x01); write1302(0 x8a,0 x04); write1302(0 x84,0 x00); write1302(0 x82,0 x00); write1302(0 x80,0 x00); write1302(0 x8e,0 x80); /禁止写入 /*ds18b20 子程序*/ /*ds18b20 延迟子函数(晶振 12mhz )*/

温馨提示

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

评论

0/150

提交评论