
本科毕业论文(设计)
(20XX届)
火车站广场数字钟显示系统设计
院 系 电子信息工程学院
专 业 电气工程及其自动化
姓 名 XX
指导教师 XX 讲师
XX 助教
20XX年5月
摘 要
本文介绍了一种基于AT89S52单片机的硬件架构的多功能电子日历的硬件
和软件的设计方法。该电子钟设计主要是由数据显示模块、温度采集模块、时间
处理模块和调整设置模块四个模块组成。AT89S52单片机被用来作为控制器,以
串行时钟芯片DS1302来记录日历和时间,也可以对年、月、日、小时、分钟和
秒进行计时,还具有闰年补偿等功能。温度芯片DS18B20被用来采集温度数据,
电子钟采用直观的数字显示,数字显示模块被用来显示数据,可以在数据显示上
同时显示年、月、日、时、分、秒,还具有一个时间校准功能。这种日历具有读
取方便、显示直观、多功能、电路简单、成本低廉等诸多优点,具有广阔的市场
前景。
关键字:万年历 温度计 数码管显示
XX学院20XX届本科毕业论文(设计)
Abstract
This paper introduces the design of multi-function electronic calendarAT89S52
microcontroller hardware, software and hardware bad design
of the data display module, the acquisition temperature module, processing
module and tting module, four the rial clock calendar modules. And
chip DS1302 calendar and time controller of AT89S52 system, it can be the date and
time, minutes and conds, also has a leap year compensation function. DS18B20
chip temperatureacquisition, display data display of the object, the u of
digital calendar,digital liquid crystal display module, can be carried out, at the same
timeevery year, month, day, hour, minute, cond Sunday,, and timealignment
function. The calendar is easy to read, intuitive display, flexible,simple circuit, low
cost and other advantages, has broad market prospects.
Key words:Perpetual Calendar thermometer display
II
XX学院20XX届本科毕业论文(设计)
目 录
摘 要 ..................................... 错误!未定义书签。
ABSTRACT ................................... 错误!未定义书签。
目 录 ... 错误!未定义书签。错误!未定义书签。错误!未定义书签。
1 绪论 ..................................................... 1
1.1研究背景 ................................................. 1
1.2国内外研究现状 ........................................... 1
1.3研究意义和目的 ........................................... 1
2 系统总体设计 ............................................. 2
2.1设计要求 ................................................. 2
2.2系统设计方案 ............................................. 2
3 系统硬件设计 ............................................. 3
3.1时钟芯片DS1302的性能简介及接口电路设计 .................. 3
3.2温度芯片DS18B20接口设计与性能分析 ....................... 4
3.3数码管显示 ............................................... 5
3.4按键设计 ................................................. 5
3.5复位电路的设计 ........................................... 6
4 系统软件设计
................................................ 7
4.1软件功能概述 ............................................. 7
4.2主程序流程图的设计 ....................................... 8
5 联调与测试 ............................................... 9
5.1调试过程 ................................................. 9
5.2硬件调试 ................................................. 9
5.3软件调试 ................................................ 10
III
XX学院20XX届本科毕业论文(设计)
结论 ...................................................... 11
致谢 ...................................................... 12
参考文献 .................................................. 13
附录A:系统的原理图 ....................................... 14
附录B:系统的PCB图 ....................................... 15
附录C:系统的源程序 ....................................... 16
IV
XX学院20XX届本科毕业论文(设计)
1 绪论
1.1 研究背景
随着技术的快速发展通道,从观看太阳来判断时间到摆钟再到现在的数字电子钟,是
人类的智慧的不断创新和突破。数字电子钟可以显示年、月、日、时、分和秒,而且还有
闰年补偿等功能,而且该时钟芯片的寿命较长,误差相对较小。使用直观的数字显示,可
以显示年、月、日、时、分、秒和温度等信息,它还具有一个时间校准功能。数字电子时
钟的电路采用的是单片机AT89S52,具有耗能低的优点,可以在3V的低电压下工作。
这个日历具有方便阅读、显示直观、功能多样、电路简单、成本低等诸多优势,在发
展迅速的信息时代,具有很好的市场前景和研究价值。
1.2 国内外研究现状
电子技术是20世纪第十九年代末的一种新技术,从上世纪二十年代开始发展最迅速,
得到了广泛的应用,电子技术的发展已经成为了科学发展的一个重要的标志。电子技术的
功能多样化,体积小,低功耗等特点,促进社会生产力的发展。郭沫若先生曾把时间比喻
成生命以及速度和力量,可见时间对于我们来说是非常之宝贵的,在我们的日常工作,学
习当中时间观越来越重要。在信息技术高速发达的二十一世纪,时间对于我们来说似乎消
费的特别快,时间在工作中,学习中,上下班的路上不知不觉的就消逝了, 工业生产,
每一步都有严格的时间限制,要做到技术精确,时间是重中之重。准确理解和实时知道时
间,是我们学习,工作,生活中不可缺少的组成部分。机械的钟表虽然也可以告知人们时
间和显示日期,但是由于其机械结构,功率和尺寸的限制,相比于性能更好的数字电子钟
而言是注定要被淘汰的。电子时钟通常被应用于电子电路,计时装置,也广泛应用于家庭,
户外广场,公交站和火车站。由于数字集成电路和石英晶体振荡被广泛应用数字电路,使
得数字钟的精度更加准确,给人们的生产和生活带来了极大的方便。如scheduleautomatic
自动报警系统,定时打铃,灯炉定时开关,电源设备,甚至所有的时间自动启用设备的基
础都是数字钟表。因此,更先进的电子数字钟的设计,其市场的前景费长的广阔。实时温
度显示系统的技术已经成熟,如在室温下显示,空调远程控制显示温度,热水器。如果我
们能准确显示电子时钟以及其它电子设备的实时温度,无疑将会对我们的生活地阿莱极大
的帮助,可以让我们了解周围的环境和必要的措施的变化。
1.3 研究目的与意义
XX学院20XX届本科毕业论文(设计)
法与电子时钟进行比较,从而其发展必然会受到限制。当电子电路,定时装置,秒数字显
示被应用于电子时钟后,促进了电子时钟被广泛广泛用于个人家庭,户外广场,公交站和
火车站,同时也大大扩大了原来的手表报时功能。如定时自动报警,定时广播,自动启动
和关闭的照明工具,定时开关箱,以及其他各种定时自动设备,所有这些的基础都是数字
时钟的应用。随着社会的进步,人们越来越多地转向产品功能多样化。你还可以将温度实
时显示应用于电子钟以准确的显示环境温度,那么将给生活,工作和工业生产带来了极大
的方便,同时也让我们明白的变化,根据环境温度的实时性采取相应的措施。
这次毕业设计的实物操作,通过把理论与实践的融合在一起,使我进一步加深了对单
片机的结构的理解,编程的能力也得到了提高。在实践过程中学习到新的知识,也遇到过
一些问题,经过老师的指导和同学的帮助,问题也被一一解决。同时,希望我们的劳动的
结晶能够对读者有一定的帮助,并能从中得到一些启发。
2 系统总体设计
2.1 设计要求
系统的总体设计要求是利用四个模块以及时钟芯片来实现数据的显示、实时环境温度
的数据采集、时间的处理和调整的功能。时钟芯片可以记录日历并显示日历和时间,也可
以对年、月、日、小时、分钟和秒进行计时,而且还有闰年补偿等多种功能,还具有时间
校准功能。考虑到该设计的实际应用环境,应该使该电子钟显示比较直观、读取相对方便、
功能多样化、价格也比较低廉、具有良好的实用性、普及起来比较方便。
2.2 系统设计方案
数字电子钟总体设计方案应该在系统功能可以实现的前提下,充分考虑该电子钟系统
使用的环境,所选的结构要简单使用、易于实现,器件的选用着眼于合适的参数、稳定的
性能、较低的功耗以及低廉的成本。综合考虑,系统硬件设计框图如图1所示:
2
XX学院20XX届本科毕业论文(设计)
电源模块时钟模块
AT89S52温度模块显示模块
图1硬件电路框图
独立按键闹钟模块
3系统硬件设计
3.1时钟芯片DS1302的性能简介及接口电路设计
3.1.1 时钟芯片DS1302的性能简介
时钟芯片DS1302是通过与微控制器的连接来实现其功能的,微控制器能够提供包括
秒、分、实时信息、日、月、年等信息,并且可以实现闰年天数的自动调整功能,它也具
有用于主电源和备用电源的双电源引脚,在主电源被关闭的状态下,也能维持该时钟连续
运行,此外,它还可以提供31个字节的缓冲高速RAM中的数据。
3.1.2 时钟芯片DS1302接口电路设计
DS1302时钟芯片的工作原理是选择VCC1和VCC2两个当中的较大者来供给时钟芯片
的用电需要。
时钟芯片的的接口电路如图2所示:
3
XX学院20XX届本科毕业论文(设计)
图2 DS1302的接口电路
3.2温度芯片DS18B20接口设计与性能分析
3.2.1温度芯片的性能简介
DS18B20温度传感器是最新智能温度传感器,与一般的热电阻有的区别在于测得的实
时温度可以被直接读取出来,可以通过简单的编程实现数字读取。应用“一线总线”传输
现场的实时温度,提高了抗干扰性。该芯片可以被应用于相对比较恶劣的环境中,而且具
有功耗低、所需电压范围低、分辨率高等特点。因此是很好的选择。
3.2.2 温度芯片的接口电路的设计
该系统采用数字温度传感器DS18B20,具有精度高,操作简单的电路连接特性,这种
传感器需要进行数据传输,与DS18B20 DQ P3.7口连接只有一个数据线。其接口电路如图3
所示:
4
XX学院20XX届本科毕业论文(设计)
图3 温度传感器的接口电路
3.3 数码管显示模块
该数字电子钟设计采用的显示模块是八段数码管显示模块,所谓八段数码管就是指数
码管里面有八个晓得LED发光二极管,LED亮灭被用来显示不同的字形。数码管的类型
有两种,他们分别是共阳极和共阴极。其中共阴极的发光原理是将八个LED的阴极连在一
起并接地,然后给八个LED其中一个的另一端输入高电平,它便能被点亮。显而易见,共
阳极的点亮原理是将八个LED的阳极连在一起,然后给八个LED其中一个的另一端输入
高电平,它便能够被点亮。综上所述,数码管显示模块及其接口电路如图4所示:
图4 数码管显示
3.4按键模块设计
该系统使用五个按钮,其中一个被用于手动复位,其他的被用于独立按钮,查询相对
比较简单,占用CPU资源低,四个独立的按钮,分别与单片机的P3.4、P3.5、P3.6、P3.7接
5
XX学院20XX届本科毕业论文(设计)
口连接。按键电路如图5所示:
图5 按键电路
3.5复位电路的设计
当单片机的复位引脚出现两个以上的高电平周期时,复位操作即可被完成。如果复位
RST持续处于高电平的状态,那么程序将无法被执行。所以单片机复位后要脱离复位状态。
在实际的应用中,考虑到电源的稳定时间不同、参数会发生漂移、以及晶振稳定时间和其
他因素的影响,单片机必须有足够的裕度。
根据该设计的要求,复位操作的基本形式有上电复位和手动复位两种。
对上电复位操作中,复位会在接通电源后完成。 AT89S52单片机上电复位本质上是一
个上电延时复位。在单偏激初始上电后,第一个工作的是复位电路。复位电路把单片机锁
定在复位状态,并且保持一个延迟,让电压拥有一个达到稳定的时间,当电压稳定后,再
插入一个延迟,给时钟振荡器一个达到稳定的时间; 在单片机进入运行状态之前,还要至
少推迟两个机器周期的延迟。
这种设计的复位电路采用了电且开关,通电后,因为电容保持充电状态使电路处于高
电平。当微控制器正在运行之中,按下复位按钮还使得RST高电平一段时间,实现了开关
的复位操作。综上所诉选用电容值为10μF和电阻值为4.7K的的电容。复位电路如图6所示:
6
XX学院20XX届本科毕业论文(设计)
图6 复位电路
4系统软件设计
4.1软件功能概述
自动控制系统的一个重要的组成部分就是软件功能,它的功能的完善程度直接影响了
一个系统是否能够最大化的发挥作用,在一个系统确定下来硬件以后,软件的指导和系统
的严密监控是硬件能够实现稳定工作的关键,同时,优异的软件对系统后期的升级优化有
相当大的帮助。
数字电子钟的功能是在程序控制下实现的。软件设计和系统相对应的硬件设计,根据
其在程序的总体功能中实现功能的不同将它们分为几个不同的模块,用于设计、编程以及
调试,最终被主程序连接起来实现整体功能。这是一个很好的方案,增强了程序的可移植
性。
公历计算程序、温度测量程序以及键扫描输入等被应用于该系统的软件部分。当程序
开始运行时最先要做的是初始化,各单片机的引脚初始化状态是根据程序的初始化命令而
进行的,初始化完成后进行温度的测量与数据收集,然后运行公历计算程序,获得日历时
间和日期信息,然后运行程序键扫描,检测有没有按下按钮,如果没有按钮被按下,则按
节日计算程序得到的公历日期信息来计算节日,如果按下一个按钮,则将按键修改后的更
新的关键变量递送给节日计算程序从而计算出节日。显示程序将在计算完成后将得到的公
历信息、温度数据、节日信息送给对应的数码管将其显示出来。
XX学院20XX届本科毕业论文(设计)
4.2主程序流程图的设计
数字电子钟系统的总体设计要求是利用四个模块以及时钟芯片来实现数据的显示、实
时环境温度的数据采集、时间的处理和调整的功能。所以数字电子钟的主程序流程图如图
7所示:
开始
DS1302初始化
设置DS302
读取年、月、日、
星期、时、分、秒
将读取的数据处理
后送数码管显示
返回
图7 主程序流程图
4.2.1 DS1302读写程序设计
该系统对时间的读取主要是通过对时钟芯片DS1302的操作来实现的,在硬件设计上
的时钟芯片连接到控制器时需要三线,即SCLK(7),I / O(6),RST(5),具体连接
图查看系统的硬件设计原理图。
当时钟芯片与处理器的数据交换的时候,首先是一个命令字节由处理器向电路发出,
最高位的命令字节必须是逻辑1,如果是逻辑0,则命令字节禁止被发出;当 D6等于0时,
时钟数据被指定,当D6等于1时,RAM数据被指定; D5〜D1特殊寄存器指定的输入或输
出;最低位D0为逻辑0时,指定写操作为输入,当D0为逻辑1时,指定读操作为输出 。
8
XX学院20XX届本科毕业论文(设计)
4.2.2 温度程序的设计
初始化、读和写是单总线上最基本的三种操作,所有其他操作都是由这三种基本操作
的组合来完成的,初始化被用于设备在总线上的状态复位,写被用于主节点向总线上传入
一位数据,读被用于总线上数据的读取。在这三种类型的操作,写操作是单向的,初始化
和读操作是双向的。
5联调与测试
5.1调试过程
对于一个自控系统而言,调试一般需要进行硬件调试和软件调试,在一定的分析与
设计的基础上,可以一边进行硬件制作,一边进行相应的调试,这样对问题的及时分析和
解决有很大帮助,不容易出现太多问题积累的现象,不至于后期出现一个问题导致整个设
计全部需要被检查,甚至出现设计需要重新开始的问题,所以做好前期的硬件调试工作,
可以避免在调试这一环节浪费大量时间。而在软件编写过程中,最好是分模块编写,在硬
件调试成功的基础上,就可以做系统整体的调试,而本设计成功的关键就是运用了联机调
试。
5.2硬件调试
系统通电后观察系统是否能正常运行,如果不能,则根据原理图对电路进行分模块检
测,看是否存在不正常焊接问题,如果焊接不存在问题,则再进一步检测下一环节,直到
找出问题并解决问题。单个芯片的编译目标代码,可连接到该开始调试硬件电路的5V电压
源。如果结果不符合设计要求,再次检查是否正确连接电路,硬件电路的调试工作的连接
点,或检查代码程序符合硬件电路设计,如果它是错的,使相应的修改,编译,则调试硬
XX学院20XX届本科毕业论文(设计)
5.3软件调试
(1)上的计算机程序调试软件的Keil,程序调试运行时,如果显示为0的错误(S),
0个警告(S)证明代码是正确的。
(2)在负载Proteus软件绘制电路中的程序代码的示意图,以AT89S52单芯片中,
进行模拟。如果发生错误,调试,然后相应地修改仿真,调试直到正确的结果后查看错误。
10
XX学院20XX届本科毕业论文(设计)
结论
在整个设计过程中,硬件系统主要由AT89S52单片机、DS1302接口电路、DS18B20接口
电路、闹钟系统以及显示系统组成;软件通过各种渠道的信息手段,主要的设计由公历数
据读取程序、公历农历转程序、温度采集程序,数字显示程序和闹钟程序组成;调试系统
主要是通过AT89S52的开发板,再经Keil公司,STC的手段,为自己建了一个小的外围电路
实现;再由分步调试将阳历的日期及时间显示出来,以及实时的温度。此电子钟具有显示
直观、功能多样、电路简单、成本低廉的优点,因此发展前景非常广阔。
整个设计过程中学到了很多新的知识,知道了电路的焊接虽然不是什么大问题,但在
整个作品中也具有相当重要的地位。电路工程师一个心细的活并不能着急,这样才能布局
清晰、美观大方。在本设计中,让我明白了做什么事情都不能投机取巧,要一步一个脚印,
这样才能把事情做好。能学习到新的知识这永远是最重要的。总之,此次毕业设计的过程,
使我的能力得到了全方位的提高,当然此次的设计尚有很多需要改进的地方,这也是我不
断学习新知识的动力。
11
XX学院20XX届本科毕业论文(设计)
致谢
能够顺利完成此次毕业设计,首先我要感谢我的知道老师XX老师,还有同样给予很大
帮助的XX老师,是他们的悉心指导和严格要求,才让我圆满完成了任务。谨向导师和所有
帮助过我的老师致以崇高的敬意和衷心的感谢。
也感谢我的家人,朋友和所有宿舍的室友,他们给我创造一个良好的学习环境,在
学习和生活中给予了我莫大的支持和帮助。我会一直督促自己更加努力,不辜负老师、亲
戚、朋友对我的期望。
特别感谢我的第一个毕业设计导师老师,从论文的选题到设计到最终定稿,每一步
XX
都有老师辛勤的汗水。研究细致,勤奋和不懈的工作态度,扎实勤勉的他也会一直激励着
我努力学习,推动我前进,这将是我终身受益。同时也为所有教师表达我深深的谢意!正
是他们的教导丰富了我的知识面、拓展了我的视野,谢谢你们的知道,这将是我一生的财
富,谢谢你们!
XX
作者:
20XX
5
年月日
12
XX学院20XX届本科毕业论文(设计)
参考文献
[1]陈明荧. 8051单片机课程设计实训教程[M].北京:清华大学出版社
[2]苏平.单片机的原理与接口技术[M].北京:电子工业出版社,2006:1-113.
[3]王忠民.微型计算机原理[M].西安:西安科技大学出版社,2003:15-55.
[4]何立民.单片机高级教程[M].北京:北京航空航天大学出版社,2003年
[5]纪宗南.单片机外围器件使用手册[M].北京:北京航空航天大学出版社,622-655.
[6]周雪.模拟电子技术[M]西安: 西安电子科技大学出版社,2005:81-95.
[7]左金生.电子与模拟电子技术[M].北京:电子工业出版社,2004:105-131.
[8]新编单片机原理与应用(第二版).西安电子科技大学出版社,2007.2
[9]张萌.单片机应用系统开发综合实例[M]. 北京:清华大学出版社,2007.7
[10]王越明.电子万年历的设计[J].黑龙江科技信息,2004年
[11] Richard Blanchard, James Harden. Mosfets control more power in the same-sized
package .Electronic Design, 1982, 12 :107~114
[12] Daniel E. Geer, Jr. (Editor), Mary Ann Davidson, Marc Donner, Lynda McGhie, and
Adam Shostack.
[13] Menozzi s approved 19 projects for total amount of Euro 89
s.2000.5
13
XX学院20XX届本科毕业论文(设计)
附录A:系统原理图
14
XX学院20XX届本科毕业论文(设计)
附录B:系统PCB图
15
XX学院20XX届本科毕业论文(设计)
附录C:系统源程序
#include
变量范围0~65535 #define uint unsigned int //无符号整型 宏定义
6 7 8 9 #include "ds1302.h"//数码管段选定义 0 1 2 3 4 5
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
uchar code smg_du[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xBa,0x20,0x28,
0x30,0x25,0xe4,0x23,0x64,0x74,0xff}; //断码//数码管位选定义
uchar code smg_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管位选定义
uchar dis_smg[8] = {0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xBa};
uchar smg_i = 8; //显示数码管的个位数
bit flag_200ms ;
bit flag_100ms ;
bit flag_500ms; //500ms标志位
sbit beep = P3^7; //蜂鸣器定义
bit flag_beep_en;
uint clock_value; //用作闹钟用的
uchar flag_s = 0x03;//控制数码管闪烁的变量
sbit dq = P3^1; //18b20 IO口的定义
uint temperature ; //温度变量
uchar flag_nl; //农历 阳历显示标志位
uchar menu_1,menu_2,menu_i;
sbit dat0 = B^0;
sbit dat1 = B^1;
sbit dat2 = B^2;
sbit dat3 = B^3;
sbit dat4 = B^4;
sbit dat5 = B^5;
sbit dat6 = B^6;
sbit dat7 = B^7; //控制数码管闪烁的函数
void smg_s(uchar dat)
{
B = dat;
if(dat0 == 1)
dis_smg[0] = 0xff;
if(dat1 == 1)
16
XX学院20XX届本科毕业论文(设计)
dis_smg[1] = 0xff;
if(dat2 == 1)
dis_smg[2] = 0xff;
if(dat3 == 1)
dis_smg[3] = 0xff;
if(dat4 == 1)
dis_smg[4] = 0xff;
if(dat5 == 1)
dis_smg[5] = 0xff;
if(dat6 == 1)
dis_smg[6] = 0xff;
if(dat7 == 1)
dis_smg[7] = 0xff;
}
/***********************延时函数************************/
void delay_uint(uint q)
{
while(q--);
}
/***********************1ms延时函数*****************************/
XX学院20XX届本科毕业论文(设计)
// P0 = dis_smg[i]; //段选
// delay_1ms(1);
//}
// }
/********************独立按键程序*****************/
uchar key_can; //按键值
void key() //独立按键程序
{
static uchar key_new;
key_can = 20; //按键值还原
P3 |= 0x78; //对应的按键IO口输出为1
if((P3 & 0x78) != 0x78) //按键按下
{
delay_1ms(1); //按键消抖动
if(((P3 & 0x78) != 0x78) && (key_new == 1))
{ //确认是按键按下
key_new = 0;
switch(P3 & 0x78)
{
ca 0x70: key_can = 4; break; //得到按键值
ca 0x68: key_can = 3; break; //得到按键值
ca 0x58: key_can = 2; break; //得到按键值
ca 0x38: key_can = 1; break; //得到按键值
}
}
}
el
key_new = 1;
}
#include "menu.h"
/************菜单处理函数****************/
void menu_dis()
write_sfm2(1,0,key_can); //显示按键值 //
18
XX学院20XX届本科毕业论文(设计)
{
if((menu_1 > 0) && (menu_2 == 0)) //选择键面
{
{
dis_smg[0] = smg_du[1]; //1
dis_smg[1] = smg_du[10]; //A
dis_smg[2] = smg_du[2]; //2
dis_smg[3] = smg_du[10]; //A
dis_smg[4] = smg_du[3]; //3
dis_smg[5] = smg_du[10]; //A
dis_smg[6] = smg_du[4]; //4
dis_smg[7] = smg_du[10]; //A
smg_i = 8;
}
el
smg_s(flag_s);
}
if((menu_1 == 1) && (menu_2 > 0)) //选设置时 分 秒
{
smg_i = 8;
if(flag_500ms == 1)
XX学院20XX届本科毕业论文(设计)
if((menu_1 == 2) && (menu_2 > 0)) //选设置年 月 日
{
smg_i = 8;
if(flag_500ms == 1)
{
dis_smg[0] = smg_du[ri % 16]; //显示日
dis_smg[1] = smg_du[ri / 16]; //
dis_smg[2] = 0x7f;
dis_smg[3] = smg_du[yue % 16]; //显示月
dis_smg[4] = smg_du[yue / 16]; //
dis_smg[5] = 0x7f;
dis_smg[6] = smg_du[nian % 16]; //显示年
dis_smg[7] = smg_du[nian / 16]; //
}
el
smg_s(flag_s);
}
if((menu_1 == 3) && (menu_2 > 0)) //设置星期 和 闹钟的开和关
{
smg_i = 8;
if(flag_500ms == 1)
{
dis_smg[0] = smg_du[week % 16]; //显示星期
dis_smg[1] = smg_du[week / 16]; //
dis_smg[2] = 0x7f;
if(open1 == 1) //开闹钟
{
XX学院20XX届本科毕业论文(设计)
dis_smg[4] = 0x74;
dis_smg[5] = 0xa0;
dis_smg[6] = 0xFF;
}
dis_smg[7] = 0xff;
}
el
smg_s(flag_s);
}
if((menu_1 == 4) && (menu_2 > 0)) //选设置时 分 秒
{
smg_i = 8;
if(flag_500ms == 1)
{
dis_smg[0] = 0xff; //
dis_smg[1] = 0xff; //
dis_smg[2] = smg_du[fen1 % 16]; //显示分
dis_smg[3] = smg_du[fen1 / 16]; //
dis_smg[4] = 0x7f;
dis_smg[5] = smg_du[shi1 % 16]; //显示秒
dis_smg[6] = smg_du[shi1 / 16]; //
dis_smg[7] = 0xff;
}
XX学院20XX届本科毕业论文(设计)
if(open1 == 1) //如果闹钟打开
{
if((miao == 0) && (fen == fen1) && (shi == shi1))
flag_beep_en = 1; //有报警 打开蜂鸣器响的标志位
//闹钟以被打开 if(flag_beep_en == 1)
{
clock_value++;
if(clock_value <= 30)
beep = ~beep; //蜂鸣器叫3秒
el if(clock_value > 30)
{
beep = 1; //蜂鸣器停1秒
if(clock_value > 40)
{
clock_value = 0;
}
}
// 1 分钟后自动关闭闹钟
value ++;
if(value >= 10)
{
value = 0;
mm++;
if(mm >= 60)
{
mm = 0;
flag_beep_en = 0;
beep = 1;
}
{
}
XX学院20XX届本科毕业论文(设计)
}
}
/*************定时器0初始化程序***************/
void time_init()
{
EA = 1; //开总中断
TMOD = 0X01; //定时器0、工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
}
/***********************18b20初始化函数*****************************/
void init_18b20()
{
bit q;
dq = 1; //把总线拿高
delay_uint(1); //15us
dq = 0; //给复位脉冲
//750us delay_uint(80);
dq = 1; //把总线拿高 等待
//110us delay_uint(10);
q = dq; //读取18b20初始化信号
//200us delay_uint(20);
dq = 1; //把总线拿高 释放总线
}
/*************写18b20内的数据***************/
void write_18b20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
//把总线拿低写时间隙开始 dq = 0;
dq = dat & 0x01; //向18b20总线写数据了
// 60us delay_uint(5);
//释放总线 dq = 1;
dat >>= 1;
//写数据是低位开始 {
23
XX学院20XX届本科毕业论文(设计)
}
}
/*************读取18b20内的数据***************/
uchar read_18b20()
{
uchar i,value;
for(i=0;i<8;i++)
{
dq = 0; //把总线拿低读时间隙开始
value >>= 1; //读数据是低位开始
dq = 1; //释放总线
//开始读写数据 if(dq == 1)
value |= 0x80;
//60us 读一个时间隙最少要保持60us的时间 delay_uint(5);
}
return value; //返回数据
}
/*************读取温度的值 读出来的是小数***************/
uint read_temp()
{
uint value;
uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关
//初始化18b20 init_18b20();
//跳过64位ROM write_18b20(0xcc);
//启动一次温度转换命令 write_18b20(0x44);
//500us delay_uint(50);
了,否则会影响到18b20的时序
init_18b20(); //初始化18b20
//发出读取暂存器命令 write_18b20(0xbe);
EA = 0;
low = read_18b20(); //读温度低字节
value = read_18b20(); //读温度高字节
EA = 1;
value <<= 8; //把温度的高位左移8位
write_18b20(0xcc); //跳过64位ROM
24
XX学院20XX届本科毕业论文(设计)
value |= low; //把读出的温度低位放到value的低八位中
value *= 0.625; //转换到温度值 小数
return value; //返回读出的温度 带小数
}
/*************时钟显示***************/
void init_1602_ds1302()
{
static uchar value;
smg_i = 8;
value ++;
if(value <= 5*2) //2秒
{
dis_smg[0] = smg_du[miao % 16]; //显示秒
dis_smg[1] = smg_du[miao / 16]; //
dis_smg[2] = 0x7f;
dis_smg[3] = smg_du[fen % 16]; //显示分
dis_smg[4] = smg_du[fen / 16]; //
dis_smg[5] = 0x7f;
dis_smg[6] = smg_du[shi % 16]; //显示秒
dis_smg[7] = smg_du[shi / 16]; //
}
el if(value <= 5*4) //2秒
{
dis_smg[0] = smg_du[ri % 16]; //显示日
dis_smg[1] = smg_du[ri / 16]; //
dis_smg[2] = 0x7f;
XX学院20XX届本科毕业论文(设计)
dis_smg[1] = smg_du[week / 16]; //
dis_smg[2] = 0xff;
dis_smg[3] = smg_du[12];
dis_smg[4] = smg_du[temperature % 10] ; //
dis_smg[5] = smg_du[temperature / 10 % 10]& 0xdf;
dis_smg[6] = smg_du[temperature / 100 % 10];
dis_smg[7] = 0xff;
}
el
value = 0;
}
/*****************主函数********************/
void main()
{
beep = 0; //开机叫一声
delay_1ms(150);
//单片机IO口初始化为1 P0 = P1 = P2 = P3 = 0xff;
init_ds1302(); //ds1302初始化
time_init(); //定时器初始化
init_menu();
while(1)
{
key(); //按键程序
if(key_can < 10)
{
if(flag_beep_en == 0) //只有闹钟关了的时候才能进入设置
key_with();
el
{
flag_beep_en = 0; //按下任意键可关闭闹钟
XX学院20XX届本科毕业论文(设计)
if(flag_200ms == 1)
{
flag_200ms = 0;
if(menu_1 == 0)
{
read_time(); //读时间
temperature = read_temp(); //先读出温度的值
init_1602_ds1302(); //显示时钟
}
}
menu_dis(); //设置的对应的显示处理
clock_dis(); //闹钟报警函数
delay_1ms(1);
}
}
/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{
static uint value;
static uchar ii;
TH0 = 0xF8;
TL0 = 0x30; // 2ms 12M
if((value % 50) == 0) //100ms
flag_100ms = 1;
if(value % 100 == 0)
flag_200ms = 1;
XX学院20XX届本科毕业论文(设计)
P2 = smg_we[ii]; //位选
P0 = dis_smg[ii]; //段选
ii++;
if(ii >= smg_i)
ii = 0;
}

本文发布于:2023-10-29 12:18:31,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/zhishi/a/1698553111200148.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:电气工程自动化专业毕业论文火车站广场数字钟显示系统设计.doc
本文 PDF 下载地址:电气工程自动化专业毕业论文火车站广场数字钟显示系统设计.pdf
| 留言与评论(共有 0 条评论) |