当前位置: 首页 > article >正文

基于单片机的日程管理系统设计

基于单片机的日程管理系统设计

摘要:近些年来,在如今的社会发展中,人们对于时间和日程的控制逐渐成为生活中必不可少的一部分,无论是在一些地方包括办公室、教室等场所,都需要对时间和日程进行管理,一方面方便场所中人群对于时间和相关的信息把控,另一方面也能够使用该系统及时提醒使用者。本次设计中,采用单片机作为控制器,利用单片机设计日程管理系统,系统内部通过时钟芯片和温度传感器,实现实时时钟信息的显示和周围温度的显示,同时系统具备闹钟功能,用户能够根据自身情况设定闹钟和修改时间信息,设计中结合硬件电路设计和软件程序设计,从上述两方面实现其中的功能,经过仿真测试验证了设计的可靠性。

 

关键词:日程管理;单片机;温度

 

Design of schedule management system based on single chip microcomputer

Abstract:In recent years, in today's social development, people's control of time and schedule has gradually become an indispensable part of life. No matter in some places, including offices, classrooms and other places, people need to manage time and schedule. On the one hand, it is convenient for people in places to control time and relevant information, on the other hand, it can also use the system to remind users in time. In this design, the single chip microcomputer is used as the controller and the single chip microcomputer is used to design the schedule management system. The system realizes the display of real-time clock information and ambient temperature through the clock chip and temperature sensor. At the same time, the system has the alarm function. Users can set the alarm clock and modify the time information according to their own situation. In the design, the functions are realized from the above two aspects in combination with hardware circuit design and software program design, The reliability of the design is verified by simulation test.

 

Keywords: Schedule management; Singlechip; Temperature

 

 

目录

1 绪论 1

1.1设计概述 1

1.2国内外发展现状 1

1.3研究意义 2

1.4论文内容和结构 2

2 总体设计与硬件选型 3

2.1设计任务 3

2.2方案设计 3

2.3硬件选型 4

2.3.1单片机选型 4

2.3.2温度传感器选型 6

3 硬件设计 8

3.1 单片机模块设计 8

3.2 时钟模块设计 9

3.3 温度传感器模块设计 9

3.4 寄存器模块设计 10

3.5 按键模块设计 11

3.6 显示模块设计 12

3.7 蜂鸣器模块设计 13

4 软件设计 14

4.1 主程序部分 14

4.2 日期时间子程序 14

4.3 按键子程序 16

4.4 传感器子程序 16

4.5 显示子程序 17

5 系统调试与分析 18

5.1 开发环境 18

5.2 系统仿真与调试 18

5.3 分析与结论 20

结论 21

参考文献 22

致谢 23

附录一 系统仿真原理图 24

附录二 系统总原理图 24

附录二 程序代码 26

 

 

 

 

1 绪论

1.1设计概述

随着社会发展的不断加快,时钟日程信息对于不论是工业农业生产还是人们的日常生活中都是扮演着重要的角色,在工业控制领域,对于生产过程中时间控制依靠于传统的时钟,利用石英制成的时钟使用较为广泛,同时在人们日常的生活中,往往使用到钟表实现对时间的把握。同时对着如今的电子技术不断发展,单片机以其良好的特性广泛被使用在各个行业中,其体积小、功能性强大的特点成为设计的亮点之一,电子时钟使用单片机将传统的时钟数字化、电子化,能够使得改进后的时钟更加精准和可靠,其也是人们生活、工作和学习中必不可少的用品之一,在一些重要场所为人们提供精准的时间;其不仅在工业控制测量领域有着广泛的应用,还深入到人们的生活中,有力的推动者各行各业的发展。本次设计将电子时钟的功能进一步拓展,结合闹钟提醒等功能的实现,形成日程管理系统[1-4]。

1.2国内外发展现状

传统的电子时钟往往是采用机械结构实现时间显示,内部往往非常复杂,且极易损坏,修复较为困难。在上世纪早期使其为了能够进一步对传统时钟的改造升级,对于传统的机械式时钟的内部结构进一步的升级改造,但是在结构上依然较为复杂;传统的机械式结构进一步升级,利用升级式的改造结构实现,使用电子电池为其供电。随着单片机技术的深入研究发展,将机械式的时钟进一步改造,为了能够使其进一步轻便化和精准化,使用单片机实现对时钟的设计,利用内部的延时程序产生时钟中断,同时使用计数方式实现时间的进位控制。如今的高精度计时设备往往内部还是用到石英晶体振荡器,能够把控计时的精准性,也能够提高稳定性,电子式和数字式的时钟替代传统的机械式,将原本的指针显示转变为屏幕显示[5-7]。

对日程管理系统能够在制定的时间内提醒使用者,同时也能够实现电子时钟的掉电保存功能,如今的日程管理系统还结合多种传感器的使用,根据不同的应用场合设计不同的功能,如在停车场中,不仅能够显示当前的时间信息,还会通过传感器实现对当前车辆数和空位数的显示;在汽车站和高铁站中,还会结合车次信息显示等等。日程管理系统广泛应用在各行各业中,为各类场所和系统提供支持。

1.3研究意义

在日程管理系统中,将单片机和传感器结合设计,实现对系统功能的实现,本设计不仅能够实现对实时时间的显示,还能够通过事先设定好时间,实现对使用者的提醒功能,同时该系统能够结合传感器信号输入,进一步将传感器采集到的信息显示在屏幕上[8]。本设计不仅具有时间显示功能,在考虑到应用在现代企业实践中,结合传感器功能的设计,单片机控制器的结合使得系统更加精简化,也使得系统成本更低、人机结合性良好等方面的提升。

1.4 论文内容和结构

本次设计的日程管理系统,该系统能够针对显示和修改时间日期、温度等信息,设定闹钟通过蜂鸣器提醒用户。

论文分为五个章节,每部分的研究内容如下:

第1章:对课题的背景进行介绍,同时围绕日程管理系统国内外的发展现状指出一些问题和改进的方法,同时明确研究的内容和研究方法;

第2章:分析了日程管理系统控制器系统的功能需求,根据功能需求设计基于单片机的日程管理系统总体设计方案,介绍需要用到的主要器件的选型和器件技术。

第3章:围绕日程管理系统硬件电路设计,从详细的器件原理的研究到具体的电路设计实现设计初期的功能,单片机主控电路作为控制核心衍生出多个控制电路实现对系统功能深入设计,完成该部分的详细功能设计。

第4章:系软件程序部分的设计,该章节主要是对系统的程序进行规划,不同的子程序之间的调用和详细的流程设计,在设计中主要围绕实现相关设定功能展开。

第5章:系统的整体调试,根据系统的硬件设计和软件设计,对其组成的系统进行仿真测试,将软件程序到单片机中,测试实际的功能,仿真测试均能够满足设计需求。

 

2 总体设计与硬件选型

2.1设计任务

本次设计主要是实现日程管理系统中时间显示功能、闹钟设定功能以及温度采集显示功能的实现,同时还能够通过按键对系统中的时间进行修改,也可以通过按键修改闹钟时间的设定,系统中的时间显示设计掉电保存功能,上电后系统还能够显示实时可靠的时间信息,同时系统时间达到设定闹钟时间,使用蜂鸣器对使用者提醒。

2.2方案设计

根据设计的实际需求,主要是能够实现时间显示修改以及闹钟温度等信息的设定与显示,所以根据设计的实际情况,结合稳定性和精确性等等要求,对系统进行总体的设计与规划[9]。

采用单片机作为核心的控制系统,系统的时钟显示功能和修改功能还需要依靠其他器件共同控制实现,通过内部的时钟芯片为单片机提供实时的时间信息,同时还能够通过可写存储器来存储闹钟信息的存储,通过按键实现对闹钟信息的设定和时间日期的修改,系统中还包括传感器电路,能够实时检测周围的温度情况,并通过显示器实时显示此时的温度、日期、时间信息,以上除了温度的信息,都可以通过按键进行修改设定。如下图2-1为系统的总体设计,系统中包括单片机部分、时钟部分、温度信号采集部分以及按键和显示部分等。

 

图2-1 系统总体设计框图

根据以上的总体设计框图,系统中对于时间、日期的设定和修改依靠于时钟芯片和按键调节,闹钟功能的实现依赖于存储芯片和按键调节以及蜂鸣器,温度传感器采集温度信号,在LCD显示屏上会将日期信息和温度信息显示,同时通过按键调节在LCD显示屏上也会有反馈[10]。

2.3硬件选型

根据设前文中总体设计的规划,对系统中涉及到的单片机模块和温度传感器模块进行选型,其他的模块根据设计经验选择,通过选型分析单片机和温度传感器内部的构成和相关的原理,后期设计系统中功能奠定基础。

2.3.1单片机选型

在本次设计中单片机作为设计的核心,首先需要接受相关传感器的参数值和相应的时钟信号,需要对这些信号进行处理,另外还需要根据这些信号对后续的系统进行处理,在单片机系统中,得到的信号需要交由单片机进行计算控制,这对单片机的计算处理功能具有一定的要求,在本次设计中针对以上的功能和需求,选用AT89C52作为系统的核心处理模块。

本次设计中的采用的单片机芯片是AT公司生产的AT89C52单片机,其作为整个控制系统的核心器件,自身还需要设计其外围电路以实现单片机的一些基础功能,包括复位电路、晶振电路等等外围电路,还包括输入输出接口和串行接口等主要单元,作为微型计算机,其能够实现相应的基本功能。STC89C52主要的特点有可靠性高且其内部结构简单,在各种器件中应用较为广泛,作为各种家电产品和智能化仪器的主要控制器件,在工业生产和生活中应用较为普及。单片机内部含有两种存储器,一种是只读存储器另外一种是普通的存储器,只读存储器中主要是存储芯片中固有的一些程序和进程,利用烧录的方式存入其中,其内部含有多种的管脚和指令集能够供用户使用,作为嵌入式器件中重要的组成部分发挥了核心控制功能。以单片机AT89C52为核心电路辅以其他模块构成电子时钟[11]。

该单片机主要由以下几个部分组成:中央处理器CPU以及8个不同的组件,8个不同的组件包括并行I/O接口,数据与程序存储器等等,都是运用总线连接,基本组成是CPU与各种芯片连接的方式,在功能上利用了集成控制特殊功能寄存器的方法,该型号的单片机在使用上和AT89C51单片机基本相同,其内部有可反复擦写的只读程序存储器,和具有128位字节的随机存储器,以及标准的指令系统相互兼容,内置8位CPU处理器,功能相对比完善。

该单片机主要由以下几个部分组成:中央处理器CPU以及8个不同的组件,8个不同的组件包括并行I/O接口,数据与程序存储器等等,它们直接通过总线连接,基本组成是CPU与各种芯片连接的方式,在功能方面应用了集成控制特殊功能寄存器的方法。接下来介绍该单片机主要的一些引脚的功能[12]。

VCC:电压接口

GND:接地接口

I/O口:当它作为输入端口时,有两种不同的工作方式,也就是我们常说的端口和引脚的读入和写出。

RST:实现对接口的复位,同时该引脚能够实现对单片机进行复位操作,恢复到设计的初始模式下。

其中的XTAL1和XTAL2是作为振荡器和放大器的信号接收和发射接口。

单片机内部还有一些核心的功能器件,CPU核心外围的芯片实现基本的微处理器的功能,包括RAM、ROM等芯片,其中CPU作为控制的核心,内部的闪存和内存都是含有多个存储单元,对于不同存储地址,对于处理控制过程中功能提供运行和存储数据的空间,单片机内部同时还需要实现系统的中断和定时功能,定时器依靠定时器芯片实现对微处理器计算时中断:单片机中有五个中断源,其中定时和计数各两个,外加一个串行[13]。

以下是51单片机一些主要引脚和接口功能介绍。

在核心为8051的单片机中,单片机通过外部的引脚与外界的电路和器件进行通信和控制,主要包括以下的引脚,首先是电源VCC和接地GND引脚,为单片机提供稳定的5V电源引脚和接地引脚,其次就是单片机的输入输出接口,其外部主要包括32个输入输出引脚,分为四个P口分别进行使用,每个P口有着不同的功能和使用方法,P0口通常用和外界显示器连接,P1和P2通常是作为外界设备和单片机通信的设备,P3口有着双向通信的功能。

当其作为输入口时,有两种工作方式,读入和写出;

RST:输入复位接口;

EA/Vpp:单片机信号输入和输出的接口,可连外部或内部储存器;

XTAL1与XTAL2:晶振的接口,在接外部晶振时,需要接地。

2.3.2温度传感器选型

在本在本次设计中对于传感器的选择,采用DS18B20实现对温度的检测,该传感器能够将采集来的模拟信号转化为数字信号,单片机能够对数字信号直接处理。如下图2-2所示为DS18B20的内部结构示意图。

 

图2-2 DS18B20内部结构图

温度采集电路主要是依靠温度传感器进行温度的测量,温度传感器的型号为DS18B20,该型号传感器集成化程度高,其内部将传感器主要元件和模数转换电路集成在一个狭小的空间,该传感器传输数据只需要单个数据传输线,即一线总线,可以灵活发挥该种特点。在量程方面,传感器可以测从零下55度到零上125度的范围,且精度误差相对在0.5度左右,利用一线总线的传输方式,提高系统传输的稳定性,能够应用在多种环境之中[14]。

由于该传感器是单线通信的,并且是分时完成,所以时间间隙和控制时序非常重要,对于DS18B20的各种操作设置都需要按照既定的规定进行设计。既定的设计规定主要顺序为:首先是初始化传感器DS18B20,也就是将其进行复位,之后发送ROM功能指令,紧接着发送存储器操作命令,来处理相关数据。因为传感器内部是采用总线协议方式,使用一根总线将数据进行双向的传输,但是对于本次设计所采用AT89C52单片机,其自身不支持传感器的总线协议方式,所以在本次设计中需要采用软件的方式模拟访问。

DS18B20传感器的通信协议主要是来保证传感器测得的数据传输的稳定性和可靠性。主要的时序是根据前文既定的设计规定来设置相应的时序,所有时序的设计主要以主机作为主要设备,其他的总线器件作为从设备,对于每次命令传送和数据传送都应该从主设备开始,若是要求从设备回传相关的数据,需要在写命令后,主设备读时序对数据进行接收,如下图2-2所示为DS18B20的读写时序。

 

图2-2 DS18B20的读写时序

 

3 硬件设计

硬件设计部分根据前文基本的设计方案进行设计,从相关的原理到具体的硬件电路结构设计,解决具体的引脚接线与电路问题。

3.1 单片机模块设计

通常单片机最小构成主要包括四大部分,首先是为整个系统供电的电源模块,其次是为系统提供时钟信号的晶振模块,最后是复位模块和存储模块,本次设计中为系统提供时钟信号由单独的芯片提供,所以无需设计晶振电路,同时由于设计中对于掉电存储的需要,设计中无需复位电路对系统复位,所以本次设计中单片机外围的电路主要为电源模块与其他功能性模块。

单片机上面的电源与接地接口和电源模块相连接,在设计的过程中,需要设计相应的滤波电路目的是保护单片机系统正常工作不受外部电流波动的影响,减少对系统正常运行的影响。

 

图3-1 单片机最小系统

单片机的存储部分,位于单片机芯片的内部,用于程序运行中数据临时处理和存储,其中主要的存储部分分为两部分,一部分是作为处理运行中相关文件的存储位置,称为闪存部分,另一部分是作为固定的存储部分,在其中存储预先设置好的相关文件,在运行过程中按照既定的顺序运行,称为硬件存储部分。

3.2 时钟模块设计

系统中的时钟信号由时钟模块提供,为系统中提供秒、分、小时和日期信息,设计中采用DS1302芯片作为实现芯片,其内部包含时钟和日期信息的静态RAM,通过串行的接口与单片机微处理器连接,且能够提供闰年、闰月日期信息的更正。如下图3-2所示为时钟芯片的引脚图,其中该芯片支持双电源供电或者是系统控制器供电的方式,X1、X2作为晶振引脚,CE、I\O以及SCLK作为芯片中的输入输出引脚,其中第一个引脚在读写过程中电平信号为高电平,第二个引脚是作为双向数据的引脚,第三个引脚是用于同步串行接口上的数据移动[15]。

 

图3-2 DS1302芯片引脚图

在本次设计中,该芯片主要为系统提供时钟和日期信息,其中这二者的信息通过读取适当的寄存器字节获得,采用二进制编码的BCD形式进行读取和写入,如下图3-3所示为DS1302芯片与单片机的连接情况,其中DS1302的电源由单片机提供,同时芯片的WP引脚接地,RST、SDA、I\O引脚分别于单片机中的P2.4、P2.3、P2.2引脚连接,用于数据的传输和读写信号的控制。

 

图3-3 DS1302芯片电路连接图

3.3 温度传感器模块设计

DS18B20的测温原理主要是在低温下晶振产生脉冲信号,其信号给到计数器一,同时DS18B20受到温度的影响较小;在高温的情况下,晶振的振荡频率受到温度的影响较大,同样产生的脉冲信号给到计数器二,通过温度寄存器进行置位与清除操作,比较计数器一和斜率累加器,所测的温度就是温度寄存器内所存的数值,如下图3-4所示为测温原理的框图。

 

图3-4 DS18B20测温原理的框图

DS18B20有两种连接的方式可以选择,一种是通过电源直接供电的方式供电,其中DS18B20的三个引脚分别接地、电源和信号,另外一种是利用单片机的电源进行供电,这种寄生方式下,VCC引脚必须要接地,如下图3-5所示为DS18B20与单片机连接的电路,VCC引脚与5V的电源相连接,同时DQ引脚与单片机相连接,接着STM32单片机的P2.1引脚,与之进行数据的传递和通讯,GND引脚接地。

 

图3-5 DS18B20传感器连接电路

3.4 寄存器模块设计

寄存器模块的设计初衷是为了能够存储闹钟的设定信息,同样单片机中也有存储器能够存储闹钟信息,但是为了能够提高闹钟设定存储的稳定性和可靠性,采用独立的可擦写的存储器24C02C,为EEPROM,电压范围为4V-5V,同时内部的内存大小为256*8字节内存,内部含有2线串行接口,如下图3-6为24C02C的引脚图,其中SDA作为双向引脚,将地址和数据传输到单片机中,同时将从单片机中的数据传输到该芯片中,SCK引脚用于同步二者之间的数据传输,WP引脚为写保护引脚。

 

图3-6 24C02C引脚图

设计中对于该芯片的电路设计主要针对SCK、SDA以及WP引脚的连接,其中SCK与单片机的P3.3引脚连接,SDA与单片机的P3.4引脚连接,同时WP引脚接地,WP接地意味着禁用写保护,能够实现对芯片内部的写操作,即能够通过上述两个引脚实现对闹钟信息的存储,若WP引脚接VCC引脚,则会开启写保护,无法向芯片内写入新的数据信息,如下图3-7所示为24C02C的电路连接图。

 

图3-7 24C02C芯片电路图

3.5 按键模块设计

系统中设置四个按键对日期和时间信息进行设定,同时能够通过按键设定闹钟信息,四个按键的主要功能有增加、减小、清除以及功能确认按键,通过功能按键调用菜单对时间和闹钟进行设定,通过上述的另外三个按键实现对日期时间信息和闹钟进行调整设置。通过按键与单片机的连接实现上述功能,其中该四个按键与单片机的P0.0、P0.1、P0.2、P0.3连接,其中每个回路中还与470Ω的电阻连接,如下图3-8所示为系统的按键电路设计。

 

图3-8按键设置电路图

3.6 显示模块设计

在本次设计中对于信息的显示需要依靠显示器件来完成,需要显示的信息包括时间、日期、农历信息以及温度情况,所以需要显示的内容比较多,需要采用较大的显示屏将上述的内容一并的显示。

液晶显示屏的选择有很多种,与其他的液晶显示屏相比较,KS0108功耗占据优势,同时对于控制器件的兼容性较好,通过内部的电极控制液晶分子来显示,且本着设计环保的原则,功耗的高低也是选择器件的标准之一,所以采用128*64的点阵液晶显示屏LGM12641BS1R,其作为KS0108显示屏中的一款,如图3-8为该型号液晶显示屏的引脚结构,其中DB0-DB7为八位的数据输入,其中CS1与CS2为片选引脚,前者高电平时选择屏幕中的左半边屏幕,E为使能端,R/W为芯片与单片机进行读写的引脚。

 

图3-9 LGM12641BS1R引脚结构

如下图3-10所示为液晶显示电路的连接方式,在硬件连线中,LGM12641BS1R的RST引脚与电源相连接,同时CS1引脚和CS2引脚与单片机的P3.6和P3.7引脚连接,DB0-DB7这八个数据引脚分别和单片机的P1.0到P1.7引脚相连接,作为数据引脚,接收传递的数据,DI、RW分别与P3.0、P3.1相连接,作为对显示屏的读写引脚操作,E使能引脚与P3.2引脚连接,控制显示屏的工作状态。

 

图3-10 LGM12641BS1R显示屏连接电路

3.7 蜂鸣器模块设计

系统中设定闹钟需要设置蜂鸣器对用户进行提醒,在本次设计中使用普通的蜂鸣器组成的电路,如下图3-11所示为蜂鸣器模块的电路设计,其中蜂鸣器一端来接三极管的漏极,一端接地,三极管另外两极分别接电源和1KΩ的电阻,与单片机的P2.0引脚连接。

 

图3-11 蜂鸣器电路

 

4 软件设计

软件设计部分在硬件设计的基础上进行,通过前文所规划好的功能进一步完善,对程序的响应顺序进行设计,实现选择时间日期温度等信息的显示以及闹钟等基本功能。

4.1 主程序部分

主程序部分主要是调用各个子程序实现相应的功能,如下图4-1所示为主程序的流程图,主程序使用while循环显示,首先需要定义好时间变量,包括秒、分、时、日、月、年等,定义温度变量包括高八位和低八位,同时初始化LCD显示屏和时钟芯片,通过while循环对时间、温度、进行刷新,后对系统中存储过的闹钟信息使用if结构对其进行判定,若吻合则启动蜂鸣器报警,且若是时间恰为整点同样通过if结构判断启用蜂鸣器报警,如下图4-1所示为主程序的设计框图。 

 

图4-1 主程序框图

4.2 日期时间子程序

日期时间子程序的设计是能够实现日期和时间的显示,分为两个部分进行设计,首先设计详细的日期信息,设计中的日期部分包括具体的星期、农历信息和阳历信息,阳历信息通过DS1302中存储使用BCD二进制码存储,通过阳历信息计算得到星期信息和农历信息,农历信息局限于1901年-2099年,通过将BCD的转换,定位日历地址,对春节所在的阳历月份和日期进行提取,同时如果阳历的月大于2 且该年的2月为闰月,天数加1 ,闰年指的就是阳历有闰日或阴历有闰月的一年;阳历四年一闰,在二月加一天,这一天叫做闰日:农历三年一闰,五年两闰,十九年七闰,每逢闰年所加的一个月叫做闰月,运算结束后将信息转换为BCD码。同时星期信息的计算方式采用(日期 + 年份 + 所过闰年 + 月校正 ) / 7 的余数就是星期,如果是闰年又不到 3 月份上述之和要减一天,这样就能够得到星期,如下图4-2为设计的日期信息的计算程序实现框图。

 

图4-2 日期星期获取框图

时间信息依靠于时钟芯片,DS1302初始化后,写入数据,通过计算判断是否需要调整校时,最后读出数据,如下图4-3所示为时间信息的输出流程框图。

 

图4-3 时间信息获取框图

4.3 按键子程序

在本次的设计中利用到按键对时间和闹钟进行设定,按键程序的设计围绕初始化和扫描展开,初始化按键的输入输出端口,利用扫描函数对按键扫描,执行相应的动作,结束按键子程序。

按键扫描部分设计按键检测函数,检测输入的相关信息,需要检测的主要内容,根据不同按键触发不同的功能,同样设计多重的if结构,按键触发电平,判断按键端口的电平高低引导后续进程,在程序设计中定义按键的接口 ,顺序对应四个按键功能。

如下图4-4所示为按键子程序的流程图,按键扫描部分需要在初始化部分对其进行去抖动操作,执行延时程序后,确认是否电平仍处于闭合状态的电平,若保持闭合状态的电平,则按键被按下。

 

图4-4 按键子程序框图

4.4 传感器子程序

温度传感器的程序设计主要从读取温度数据,然后将温度数据传送到控制器中去,根据传感器的约定代码实现相关的功能,如表4-1所示为传感器的指令操作表。

表4-1 指令操作表

  

 对这个温度传感器进行初始化操作,之后进行读写操作,通过总线控制器读取和写入数据,在编程的时候,按照相关时间数据,把握好总线电平的变化,完成控制和采集温度数据。

以上是温度传感器DS18B20的初始化操作,其中初始化复位成功的标志是flag,初始化成功与否决定后面的具体读写操作,在后面的读写操作中也要按照相关时间顺序进行,在这里就不详细的进行介绍了,相关程序置在附录之中。

4.5 显示子程序

本系统中的LCD显示模块也需要先进行初始化,初始化该模块时,首先应该对屏幕的坐标进行设定,并且通过系统自动进行审查是否完成,如果未完成此步骤,则重新进行设定。接下来AT89C52单片机将时间信息处理完成后发送至LCD模块上进行显示。如图4-5所示为LCD模块工作流程图。

 

图4-5 显示子程序框图

 

5 系统调试与分析

5.1 开发环境

通过前文的硬件设计与软件设计,最后需要对设计的系统进行仿真验证,验证硬件设计的正确性以及软件设计功能的配套性,首先需要明确系统的开发和仿真环境。 

STC89C51单片机软件开发平台为Keil uvision4 C52,在Proteus软件中仿真设计,利用STC_ISP软件下载程序代码到单片机中。其中,Keil是可以用C语言编写的软件,系统程序可以用汇编语言编码,但C语言具有良好的沟通性和可维护性,在这方面具有很好的特点。 Keil软件可以通过编写程序代码,提供完整的开发方案,通过集成开发环境对系统进行编程,生成HEX文件,导入仿真软件Proteus中进行测试,与各个设备接口配合使用。

Proteus软件能够实现对模拟电路、数字电路以及单片机等外围电路的仿真,支持许多类型的单片机型号,其支持大多数的硬件存储器和芯片,功能十分强大,与其他单片机仿真软件不同的是,其能够真实仿真单片机外围电路或者是无单片机存在的情况下,因此能够从工程的角度直接运行仿真文件,得到相应的仿真过程和结果,弥补了实验和工程之间的脱节的矛盾和现象。

5.2 系统仿真与调试

通过前文的硬件设计与软件设计,最后需要对设计的系统进行仿真验证,验证功能上的可靠性,在仿真软件中Proteus中绘制相关的硬件电路,导入设计生成好的HEX文件的,导入到单片机中,如附录中硬件电路图所示,对系统进行仿真测试,能够观察到系统能够正常显示时间和日期信息,同时能够正确显示以上的信息,如下图5-1所示,为设计的系统时间日期显示,同时能够正确显示温度传感器的信息。

 

图5-1 LCD显示日期、时间、温度信息

接着对系统对于时间和日期信息的修改,通过按键功能键进入到菜单,如下图5-2所示。

 

图5-2 菜单选择界面

界面上显示时间设置和闹钟设置,选择时间设置,进入到时间修改的界面,使用按键增加和减小对相关的日期信息和时间信息进行增加减少修改,如下图5-3所示,显示界面中左侧的信息通过按键的增加和减少实现修改,每修改好一个值后使用功能确定键对修改好的信号进行确定,同时还是利用该按键跳转到下一个需要修改的值,通过清除按键回到主显示界面。

 

 

图5-3 时间、日期修改界面 

最后对系统的闹钟功能检测,通过菜单界面进入到闹钟的设置界面,设定闹钟时间为22:30分,验证系统仿真中蜂鸣器是否会响起,如下图5-4界面为闹钟的设置界面,先设置好分钟的值,再确认后设置好小时的信息,确认后返回到主界面,经过验证蜂鸣器能够正常工作。

 

图5-3 闹钟界面的设定 

5.3 分析与结论

通过仿真验证了集时间、日期、温度于一体的日程管理系统,对以上的设计功能进行验证,验证得到系统能够正常显示时间温度等信息,同时能够实现设定闹钟,修改日期等功能,基本符合设计要求和规划。

 

 

 

结论

本设计从具体方案的制作确定、完成并测试硬件电路、完成软件代码的编写和调试,到最终的功能测试,完成了智能车辆灯光控制系统的设计的基本功能要求,从硬件电路设计到后期对于具体程序的编写围绕整体功能的设计展开,在对硬件电路设计上遵循相应的电路引脚功能,一方面需要模块化的对部分电路设计,另一方面需要对整体系统的结构控制与把握,在软件部分的设计上,需要根据相应的功能从整体和部分去设计,主程序和子程序的设计,完成整体理论的设计,后期对电路仿真设计与测试,达到最初的设计要求。

在系统设计的过程中,不论是在硬件设计部分还是软件程序设计的部分都需要考虑器件引脚和自身的功能关系和使用原理,通过其中的原理和使用细节实现一些细小的功能,对其中的自动控制下的闹钟情况,就是需要考虑到多个闹钟的设定,在这个过程中不断思考与进步,能够进一步提高设计的能力,同时通过整个系统的设计,也完善的设计思维和体系。

在本次设计中针对日程管理系统的控制原理进行详细的设计,搭配相关的外部器件,在设计过程中选用单片机作为主要的控制器件,设计从硬件和软件两方面的进行。硬件方面从具体的芯片选型到功能的实现进行分析,进一步确定设计的可能性和可行性;软件方面根据硬件设计的各个模块所规定的的具体功能进行完善,同时从主要功能设计,到功能的拆分,对不同的子程序模块进行设计,完善系统的功能。从信号发生器的整体结构设计到局部功能的实现,包括对基础功能的进一步拓展,结合相应的芯片引脚和编程实践,从硬件部分在软件部分完成此次设计。

 

参考文献

[1]严敏. 基于单片机的DS1302日历时钟的设计和实现[J]. 石家庄职业技术学院学报,2019,31(06):32-36.

[2]王凯. 基于STC型的单片机控制的体育场多功能电子日历设计[J]. 电子设计工程,2016,24(23):26-28.

[3]雷宁,朱凡元. 基于单片机控制的多功能电子日历设计[J]. 电子世界,2014,(13):25-26.

[4]闫坤. 一款基于单片机的多功能电子日历的设计[J]. 科技创新导报,2013,(29):245.

[5]李永平,李杰,徐一峰,周晓玲. 基于单片机的语音电子日历[J]. 电子世界,2012,(12):34-35.

[6]杨会保. 基于51单片机的温度日期显示系统[J]. 信息化研究,2009,35(04):58-60.

[7]马健,刘亲社,王晟达. 一种基于MSP430单片机的日程管理系统[J]. 山西电子技术,2009,(02):14-16.

[8]徐治义,尹玉富. 用单片机控制实现日历时间的LED点阵小屏幕显示[J]. 电子世界,2001,(09):35-36.

[9]王文涛,夏厚德,宋铭利. 一种在单片机系统中实现日历功能的方法[J]. 中南民族学院学报(自然科学版),2000,(03):42-45.

[10]刘红,韩太林. 实时日历时钟芯片DS12887与MCS-51单片机的接口技术[J]. 长春光学精密机械学院学报,1997,(02):75-77.

[11]Yong Hong. Design of Electronic Calendar Based on MCU[J]. IOP Conference Series: Earth and Environmental Science,2019,234(1).

[12]黄仕凰,林炜滨. 基于单片机的遥控电子钟系统的设计[J]. 实验科学与技术,2014,12(04):62-64.

[13]丰焕亭. 基于AT89S52单片机的数字万年历设计[J]. 科技信息,2011,(30):128+130.

[14]Anonymous. Microchip Rolls Out Stand-Alone Real-Time Clock/Calendar Family[J]. Manufacturing Close - Up,2010.

[15]朱奇,高言. 单片机组成的多功能计时器[J]. 微处理机,1995,(03):41-44.

 

致谢

行文至此,稿已将成,幸学途之圆满:倏忽二载,历历在目,感获益之良多。

回顾这许多年的学习生涯,曾不懈追求过许多,亦曾遗憾失去过许多,感念来时路,一句时光太匆匆似乎十分单薄,尚不足以描绘我此时波澜复杂的心情,饮水思其源,学成念吾师。感谢我的恩师XX教授,何其有幸,得师如您。您的慈祥温暖,幽默风趣感染着我们每一位学生,一提到您,我们学生无不赞美不绝。您身上体现出的师德风范、对学术的严谨态度、开阔视野和创新思维不断渗透我的内心,融入我的思想,让我明白了学习的真谛与意义,希望日后在自己的工作岗位上也能秉承这份精神,兢兢业业。祝愿老师身体健康,工作顺利,万事胜意。

感谢我的父母家人。下笔之时太多的感念之词涌上心头,这二十多载求学路,不论学习之多坎坷艰难,情绪之多崩溃无助,都是你们的支持与鼓励支撑着我,予我暖衣饱食,无尽关怀。你们尊重我的选择,理解我的决定,让我没有后顾之忧的去做自己想做的事情,是我求学之路最大的底气和铠甲!在此,愿我的父母家人身体健康,让我有足够的时间与你们相伴,以报这春晖之恩感谢学途路上相伴的诸多同窗、挚友,学途漫漫,坎坷难行,但关关难过关关过,前路漫漫亦灿烂。感恩诸友相伴,感谢你们在我学业、生活中所给予的照顾与帮助,因为有你们,让我的大学生活变得快乐又有趣。天下无不散之筵席,惟愿此去繁华相伴,再遇之时友谊依旧。 

感谢我自己,我本不是一个十分聪慧的人,从小学、初高中,到大学乃至如今的科研,从未一蹴而就、潇洒从容。感谢自己这么多年从未放弃,虽路途多有不顺,仍坚守至今,才得如今这细微成就,虽如萤火烛光,我亦幸甚。祝自己日后仍能坚守这份初心,永远赤诚,保持热爱,奔赴山海。感谢我的祖国和母校给我提供了如此安稳又保障的学习环境。再次感谢你们,并祝愿我的祖国、母校繁荣昌盛,疫情早日彻底褪去!

文末搁笔,仅以寥寥拙笔,简述心头之感,言辞有尽,情谊依旧。此番拜别,前路漫漫,万望珍重,惟愿“舒吾陵霄羽,奋此千里足”,共勉之。

 

 

附录一 系统仿真原理图

 

 

附录二 系统总原理图

 

 

附录三 程序代码

#include < reg52.h >

#include < character.h >

#include < lcd.h >

#include < clock.h >

#include < sensor.h>

#include < calendar.h >

#include < key.h >

 

/*****************************预定义**************************************/

#define uchar unsigned char

#define uint unsigned int

/****************************************************************************/

sbit bell = P2 ^ 0; //定义蜂鸣器端口

/*****************************************************************************

* 名称: Timer0_Service() inturrupt 1

* 功能: 中断服务程序 整点报时 3声嘟嘟的声音

* 入口参数:

* 出口参数:

*****************************************************************************/

void Timer0_Service() interrupt 1

{

   static uchar count = 0;

   static uchar flag = 0; //记录鸣叫的次数

   count = 0;

   TR0 = 0; //关闭Timer0

   TH0 = 0x3c;

   TL0 = 0XB0; //延时 50 ms

   TR0 = 1 ; //启动Timer0

   count ++;

   if( count == 20 ) //鸣叫 1 秒 

   {

      bell = ~ bell;

      count = 0;

      flag ++;

   } 

   if( flag == 6 )

   {

      flag = 0;

      TR0 = 0; //关闭Timer0

   }

 

}

/*****************************************************************************

* 名称: Timer2_Servie() interrupt 5

* 功能: 中断服务程序 整点报时 一分钟

* 入口参数: 

* 出口参数:

*****************************************************************************/

uchar HexNum_Convert(uchar HexNum)/*时间存储个位和十位的方式与我们用的十进制不一样,你懂的,呵呵--BB车*/

{

uchar Numtemp;

Numtemp=(HexNum>>4)*10+(HexNum&0X0F);

return Numtemp;

}

/******************************************************************************

* 函数名称:main()

* 功 能:

* 入口参数:

* 出口参数:

********************************************************************************/

void main( void )

{          

    uchar clock_time[6] = {0X00,0X59,0X23,0X09,0X04,0X11}; //定义时间变量 秒 分 时 日 月 年

 uchar alarm_time[2] = { 10, 06}; //闹钟设置 alarm_time[0]: 分钟 alarm_time[1] :小时

 uchar temperature[2]; //定义温度变量 temperature[0] 低8位 temperature[1] 高8位

    Lcd_Initial(); //LCD初始化

 Clock_Fresh( clock_time ); //我把时间刷新放在这里,proteus会调用当前系统时间,别问为什么,经验,呵呵

 Clock_Initial( clock_time ); //时钟初试化

    

 /***********************中断初始化***************************/

    EA = 1; //开总中断

    ET0 = 1; //Timer0 开中断

 ET2 = 1; //Timer2 开中断

    TMOD = 0x01 ; //Timer0 工作方式 1

 RCAP2H = 0x3c; 

    RCAP2L = 0xb0; //Timer2 延时 50 ms

 

    while( 1 )

 {

    switch( Key_Scan() )

       {

          case up_array:  

                 {

                          Key_Idle();

                       }

                 break;     

          case down_array:   

                   {

          Key_Idle();

       }

                   break;                  

    case clear_array:   

                    {    

           Key_Idle();

           } 

        break;

    case function_array:{

                                 Key_Function( clock_time, alarm_time );

                        }

    case null:      

             {

          Clock_Fresh( clock_time ); //时间刷新

                Lcd_Clock( clock_time ); //时间显示

                     

                      Sensor_Fresh( temperature ); //温度更新

       Lcd_Temperture( temperature ); //温度显示

 

                      Calendar_Convert( 0 , clock_time );

       Week_Convert( 0, clock_time );

 

       //整点报时

       if( ( * clock_time == 0x59 ) && ( * ( clock_time + 1 ) == 0x59 ) )

       {

          bell = 0;

       TR2 = 1; //启动Timer2

       }

                      //闹钟报警

                      if( * alarm_time == HexNum_Convert(* ( clock_time + 1 ) )) //分钟相吻合

          if( * ( alarm_time + 1 ) == HexNum_Convert(*( clock_time + 2 )) ) //小时相吻合

       {

          bell = 0;

       TR2 = 1; //启动Timer2

       }

                   } 

        break;

         }

 }

}

 

 

 


http://www.kler.cn/a/548770.html

相关文章:

  • 报错 - 你不能打开应用程序“Docker.app”,因为它没有响应
  • 用Python构建Mad Libs经典文字游戏
  • Android 13 媒体权限适配指南
  • CMake无法生成可执行文件,一直生成库文件
  • Qt QDateTimeEdit总结
  • Android:播放Rtsp视频流的两种方式
  • 在 Go 项目中实现 JWT 用户认证与续期机制
  • 总结前端常用数据结构 之 数组篇【JavaScript -包含常用数组方法】
  • easyCode代码模板配置
  • Mybatisplus自定义sql
  • 双指针-三数之和
  • 机器视觉--switch语句
  • 海尔小红书年度规划方案拆解
  • 使用 Ansys Fluent 进行电池热滥用失控传播仿真
  • 使用 Ansys MotorCAD 进行轴向磁通电机设计
  • Python的imutils库详细介绍
  • 详解tensorflow的tensor和Python list及Numpy矩阵的区别
  • Day7 微服务 Elasticsearch搜索引擎、DSL查询(叶子查询、复合查询、排序、分页、高亮)、RestClient查询、数据聚合
  • 网络安全学习笔记
  • 二十九、vite项目集成webpack+vue2项目