数字电子时钟设计报告

课程设计报告

院 (系): 自动化系

专 业: 自动化 班 级: 自动化2班

学生姓名: 包良进

学 号: [1**********]07

指导教师: 黄书童

桂林航天工业学院

课程设计报告

系(部): 自动化系 专业班级: 自动化2班 学生姓名: 包良进 学 号: [1**********]07 设计题目: 数 字电子钟

完成日期 2015年7月3日

指导教师评语:_____________________________________ _______________________________________________________ _______________________________________________

________

成绩(五级记分制):

指导教师(签字):_____________________

桂林航天工业学院课程设计任务书

设计题目:

系(部)分管领导: 教研室主任: 指导教师:

年 月 日

2015年 7月3日

摘 要

电子万年历是一种应用非常广泛日常计时工具,对现代社会越来越重要。此电子万年历在硬件方面主要采用STC89C52单片机作为主控核心,由DS1302时钟芯片提供时钟、1602LCD液晶显示屏显示。STC89C52单片机是由Atmel公司推出的,功耗小,电压可选用4~6V电压供电;DS1302时钟芯片是美国DALLAS公司推出的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;对于数字电子万年历采用直观的数字显示,数字显示是采用的1602LED液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒等信息。此外,该电子万年历还具有时间校准等功能。在软件方面,主要包括日历程序、时间调整程序,显示程序等。所有程序编写完成后,在Keil软件中进行调试,确定没有问题后,烧写到单片机上进行测试。

此设计主要由时钟芯片DS1302和温度传感器DS18B20采集数据到单片机进行处理再通过LCD1602显示出来,本论文主要研究了液晶显示器LCD及时钟芯片DS1302,温度传感器DS18B20与单片机之间的硬件互联及通信,对数种硬件连接方案进行了详尽的比较,在软件方面对日历算法也进行了论述。

关键词:单片机;DS1302;LCD1602

Abstract

Electronic calendar is a widely used tool for the daily time, more and more important in modern society. The electronic calendar in terms of hardware as the main control mainly STC89C52 microcontroller core, provided by the DS1302 clock chip clock, 1602LCD LCD display. STC89C52 microcontroller by Atmel introduced, the power consumption, voltage can be selected 4 ~ 6V voltage power supply; DS1302 clock chip introduced in the United States DALLAS low-power real time clock chip, which can be year, month, day, week, hours, minutes and seconds time, but also has leap-year compensation, and other functions, and the DS1302's long life, small error; for digital electronic calendar using an intuitive digital display, digital display is used 1602LED LCD screen to display, you can also shows year, month, day, week, hours, minutes, seconds and other information. In addition, the electronic calendar is also a time calibration and other functions. In terms of software, including calendar, time to adjust procedures, display procedures. All programming is completed, the Keil software debugging, make sure that no problem, programmed into the microcontroller for testing.

This design mainly by the clock chip DS1302 temperature sensor to the microcontroller DS18B20 collect data for processing and then through the LCD1602 display, this thesis, the liquid crystal display LCD and clock chip DS1302, temperature sensor and microcontroller DS18B20 interconnection and communication between the hardware on Several hardware connection

scheme for a detailed comparison of algorithms in software on the calendar have also been discussed.

Key words: SCM; DS1302; DS18B20; LCD1602

目 录 摘 要 ..................................................................................................................................................................... I ................................................................................................................................................................ II

第 1 章 绪 论 ................................................................................................................................................... 1

1.1课题背景 ................................................................................................................................................ 1

1.2 课题意义 ............................................................................................................................................... 1

1.3国内外现状及水平 ................................................................................................................................ 1

第2章基于单片机万年历的方案研究 ............................................................................................................... 2

2.1 系统基本方案选择和论证 ................................................................................................................... 2

2.1.1 单片机芯片的选择 ................................................................................................................... 2

2.1.2 显示模块选择方案和论证 ....................................................................................................... 3

2.1.3 时钟芯片的选择方案和论证 ................................................................................................... 3

2.2 电路设计最终方案决定 ....................................................................................................................... 4

2.3 DS1302和LCD1602的原理及说明 ...................................................................................................... 4

2.3.1 LCD1602工作原理及说明 ........................................................................................................ 4

2.3.2 DS1302原理及说明 .................................................................................................................. 5

第3章 系统的硬件设计与实现 ......................................................................................................................... 7

3.1电路设计框图 ........................................................................................................................................ 7

3.2系统硬件概述 ........................................................................................................................................ 8

3.3 主要模块电路的设计 ........................................................................................................................... 8

3.3.1 STC89C52单片机主控制模块的设计 ...................................................................................... 8

3.3.2时钟电路模块的设计 .............................................................................................................. 10

3.3.4 显示模块的设计 ..................................................................................................................... 12

3.4各模块电路原理图 .............................................................................................................................. 12

3.4.1电源电路 .................................................................................................................................. 12

3.4.2复位电路 .................................................................................................................................. 12

3.4.3振荡电路 .................................................................................................................................. 13

3.4.4温度采集电路 .......................................................................................................................... 13

3.4.5通信电路 .................................................................................................................................. 14 3.4.6显示电路 .................................................................................................................................. 15 3.4.7键盘电路 .................................................................................................................................. 15

第4章 系统的软件设计 ................................................................................................................................... 16

4.1 程序流程框图: ................................................................................................................................. 16 第5章 系统测试 ............................................................................................................................................... 18

5.1 硬件测试 ............................................................................................................................................. 18

5.2 软件测试 ............................................................................................................................................. 18

结束语 ................................................................................................................................................................ 19

致谢 .................................................................................................................................................................... 19

参考文献............................................................................................................................................................. 20

附录1:程序 ...................................................................................................................................................... 22

第 1 章 绪 论

1.1课题背景

在当代繁忙的工作与生活中,时间与我们每一个人都有非常密切的关系,每

个人都受到时间的影响,随着社会、科技的发展,人类得知时间,从观太阳、摆

钟到现在电子钟,不断研究、创新。为了在观测时间的同时,能够了解其它与人

类密切相关的信息,比如温度、星期、日期等,电子万年历诞生了,它集时间、日期、星期功能于一身,具有读取方便、显示直观、功能多样、电路简洁等诸多

优点,符合电子仪器仪表的发展趋势。伴随着电子技术的迅速发展,特别是随大

规模集成电路出现,给人类生活带来了根本性的改变。由其是单片机技术的应用

产品已经走进了千家万户。电子万年历的出现给人们的生活带来的诸多方便,作

为一种附加功能,现在越来越广泛的被应用于各种电子产品中,具有广阔的市场

前景。

1.2 课题意义

电子万年历作为电子类小产品不仅是市场上的宠儿,也是是单片机设计培训

中一个很实用的题目。因为这个课题有很好的开放性和可发挥性,对制作者的要

求比较高,不仅考察了对单片机的掌握能力更加强调了对单片机扩展的应用。而

且要求设计的电子万年历在操作上力求简洁,功能上尽量齐全,显示界面也要出

色。所以,电子万年历制作无论从实用目的,还是从培养能力的角度来看都是很

有价值的毕业设计课题。本电子万年历的设计在硬件方面主要采用STC89C52单片机作为主控核心,由DS1302时钟芯片提供时钟、1602LCD液晶显示屏显示。STC89C52单片机是由Atmel公司推出的,功耗小,电压可选用4~6V电压供电;DS1302时钟芯片是美国DALLAS公司推出的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,而且DS1302的使用寿命长,误差小;数字显示是采用的LED液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒等信息。此外,该电子万年历还具有时间校准等功能。在软件方面,主要包括日历程序、时间调整程序,显示程序等。所有程序编写完成后,在Keil软件中进行调试,确定没有问题后,烧写到单片机上进行测试。最后在老师同学的帮助以及自己的努力下完成了此次电子万年历的设计。

1.3国内外现状及水平 诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,但是所有这些,都是以钟表数字化为基础的。因此,研究万年历及扩大其应用,有着非常现实的意义。它可以对年、月、日、周日、时、分、秒进行计时,对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒等信息,还具有时间校准等功能。 综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。近些年我国也开始重视对电子万年历的开发与设计,让更多的电子时钟能够走进人民生活,跟多人能够应用到功能强大,精度高的电子时钟。但是仍然存在很多问题。

中国电子万年历产业发展出现的问题中,许多情况不容乐观,如产业结构不合理、产业集中于劳动力密集型产品;技术密集型产品明显落后于发达工业国家;生产要素决定性作用正在削弱;产业能源消耗大、产出率低、环境污染严重、对自然资源破坏力大;企业总体规模偏小、技术创新能力薄弱、管理水平落后等。 从什么角度分析中国电子万年历产业的发展状况?以什么方式评价中国电子万年历产业的发展程度?中国电子万年历产业的发展定位和前景是什么?中国电子万年历产业发展与当前经济热点问题关联度如何„„诸如此类,都是电子万年历产业发展必须面对和解决的问题——中国电子万年历产业发展已到了岔

口;中国电子万年历产业生产企业急需选择发展方向。

中国电子万年历产业发展研究报告阐述了世界电子万年历产业的发展历程,分析了中国电子万年历产业发展现状与差距,开创性地提出了“新型电子万年历产业” 及替代品产业概念,在此基础上,从四个维度即“以人为本”、“科技创新”、“环境友好”和“面向未来”准确地界定了“新型电子万年历产业” 及替代产品的内涵。根据“新型电子万年历产业” 及替代品的评价体系和量化指标体系,从全新的角度对中国电子万年历产业发展进行了推演和精准预测,在此基础上,对中国的行政区划和四大都市圈的电子万年历产业发展进行了全面的研究。

第2章基于单片机万年历的方案研究

2.1 系统基本方案选择和论证

2.1.1 单片机芯片的选择

本设计采用STC89C52芯片作为硬件核心,该芯片采用Flash ROM,内部具有8KB ROM存储空间,相对于本设计而言程序空间完全够用。能于5V电压工作,而且与MCS-51系列单片机完全兼容,而且运用于电路设计中时具备ISP在线编程技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,避免芯片的多次拔插对芯片造成的损坏。

2.1.2 显示模块选择方案和论证

方案一:

采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示。

方案二:

采用LED数码管动态扫描,LED数码管价格虽适中,对于显示数字也最合适,而且采用动态扫描法与单片机连接时,占用的单片机口线少。但是由于数码管动态扫描需要借助74LS164移位寄存器进行移位,该芯片在电路调试时往往会有很多障碍,所以不采用LED数码管作为显示。

方案三:

采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见,对于电子万年历而言,一个1602的液晶屏即可,价格也还能接受,需要的接口线较多,但会给调试带来诸多方便,所以此设计中采用LCD1602液晶显示屏作为显示模块。

2.1.3 时钟芯片的选择方案和论证

方案一:

直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然可以减少时钟芯片的使用,节约成本,但是,实现的时间误差较大。所以不采用此方案。

方案二:

采用DS1302时钟芯片实现时钟,DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。因此,本设计中采用DS1302提供时钟。

2.2 电路设计最终方案决定

综上各模块的选择方案与论证,确定最后的主要硬件资源如下:采用STC89C52作为主控制系统;DS1302提供时钟;LCD1602液晶屏作为显示。

2.3 DS1302,DS18B20和LCD1602的原理及说明

2.3.1 LCD1602工作原理及说明

(1)寄存器选择控制

1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符,图形寄存器选择控制表如表2.1所示:

表2.1 LCD1602寄存器选择控制表

(2)指令集

1602通过D0~D7的8位数据端传输数据和指令。显示模式设置(初始化)00111000[0x38]设置16×2显示,5×7点阵,8位数据接口;显示开关及光标设置:(初始化) 00001DCBD显示(1有效)、C光标显示(1有效)、B光标闪烁(1有效)。000001NS N=1(读或写一个字符后地址指针加1并且光标加1),N=0(读或写一个字符后地址指针减1并且光标减1),S=1且N=1(当写一个字符后,整屏显示左移),S=0当写一个字符后,整屏显示不移动。数据指针设置:数据首地址为80H,所以数据地址为80H+地址码(0-27H,40-67H)。其他设置:01H(显示清屏,数据指针=0,所有显示=0);02H(显示回车,数据指针=0)。

2.3.2 DS1302原理及说明

(1) 时钟芯片DS1302的工作原理

DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置 “0”,接着把RST端置“1”,最后才给予SCLK脉冲;读/写时序如下图2.2所示。图

2.1为DS1302的控制字,此控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时,CK=0。位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。表2.2为DS1302的日历、时间寄存器内容:“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP”是写保护位,在任何的对时钟和RAM的写操作之前,WP必须为0。当“WP”为1时,写保护位防止对任一寄存器的写操作。

(2) DS1302的控制字

DS1302的控制字如图2.1所示。控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。

图2.1 DS1302的控制字

(3) 数据输入输出

在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。如下图2.2所示:

图2.2 DS1302读与写的时序图

1. DS1302的寄存器

DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表2.2。

表2.2 DS1302的日历、时间寄存器

此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下

第3章 系统的硬件设计与实现

3.1电路设计框图

本系统的电路系统框图如图3.1所示。STC89C52单片机对DS1302和DS18B20写入控制字并读取相应的数据,继而控制LCD1602作出对应的显示。 LCD1602液晶显示模块

STC89C52主控模块

按键控制模块

DS1302时钟模块

图3.1 系统硬件框图

3.2系统硬件概述

本电路是由STC89C52单片机作为控制核心,能在5V电压工作,STC89C52是一个低功耗,高性能CMOS 8位单片机,片内含8kBytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C52引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的STC89C52可为许多嵌入式控制应用系统提供高性价比的解决方案;时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31*8的用于临时性存放数据的RAM寄存器。可产生年、月、日、周、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能;显示部份由LCD1602液晶显示器完成,该显示器为工业字符型液晶,能够同时显示16x02即32个字符(16列2行)。

3.3 主要模块电路的设计

3.3.1 STC89C52单片机主控制模块的设计

STC系列单片机是由STMicroelectronics 公司生产,并有宏晶公司做大陆代理的。本设计使用STC89C52作为控制核心,其管脚兼容其他51系列的单片机,以下对STC89C52进行简单讲解。

STC89C52单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线。采用40Pin封装的双列直接DIP结构,图3.2是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。现在对各引脚功能说明如下(图

3.2):

图3.2 STC89C52单片机管脚图

(1)主电源引脚

Vcc :接+5V电源正端。

Vss :接+5V电源地端。

(2)输入/输出引脚

P.0~P0.7:P0口的8个引脚。在不接片外存储器与不扩展I/O接口时,可作为准双向输入/输出接口。在接有片外存储器或扩展I/O接口时,P0口分时复用为低8位地址总线和双向数据总线。

P1.0~P1.7:P1口的8个引脚。可作为准双向I/O接口使用。对于52子系列,P1.0 与 P1.1还有第二种功能:P1.0 可用作定时器/计数器2的计数脉冲输入端T2。P1.1可用作定时器/计数器2的外部控制端T2EX。

P2.0~P2.7:P2口的8个引脚。可作为准双向I/O接口;有接有片外存储器或扩展I/O接口且寻址范围超过256个字节时,P2口用作高8位地址总线。 P3.0~P3.7:P3口的8个引脚。除作为准双向I/O接口使用外,还具有第二种功能 ,详见表3.1。

表3.1 P3口第二功能表

(3)控制总线

ALE/PROG:地址锁存有效信号输出端。在访问片外程序存储器期间,每机器周期该信号出现两次,其下降沿用于控制锁存P0口输出的低8位地址。对于片内含EPROM的机型,在编程期间,此引脚用作编程脉冲PROG的输入端。

PSEN:片外程序存储器读选通信号输出端,或称片外取指信号输出端。在向片外程序存储器读取指令或常数期间,每个机器周期该信号两次有效(低电平),以通过数据总线P0口读回指令或常数。在访问片外数据存储器期间,PSEN信号将不出现。 RST/V:(RST 是 RETET 简略写法。)是复位端。单片机的振荡器工作时,该引脚上出现持续两个机器周期的高电平就可实现复位操作,使单片机回复到初始状态。上电时,考虑到振荡器有一定的起振时间,该引脚上高电平必须持续10ms以上才能保证有效复位。

Vcc掉电期间,该引脚如接备用电源VPD(电压范围+4.5V至+5.5V),可用于保存片内RAM中的数据。当Vcc下降到某规定值以下VPD,便向片内RAM供电。

EA/VDD:片外程序存储器选用端。该引脚有效(低电平)时只选用片外程序存储器,否则计算机上电或6复位后先选用片内程序存储器。

(4)外接晶振引脚

XTAL1:片内反相放大器输入端。

XTAL2:片内反相放大器输出端。外接晶体时,XTAL1和 XTAL2各接晶体的一端,借外接晶体与片内反相放大器构成振荡器。

图3.3单片机最小系统

3.3.2时钟电路模块的设计

DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、周、时、分、秒进行计时,工作电压为2.5V~

5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。

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提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc>2.0V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),SCLK为时钟输入端。DS1302的控制字节的

最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。DS1302与CPU的连接需要三条线,即SCLK(7)、I/O(6)、RST(5)。实际上,在调试程序时可以不加电容器,只加一个32.768kHz 的晶振即可。只是选择晶振时,不同的晶振,误差也较大。另外,还可以在上面的电路中加入DS18B20,同时显示实时温度。只要占用CPU一个口线即可。

3.3.3 显示模块的设计

采用LCD1602液晶显示器,单片机P0口作为数据输出口,通过10R的上拉电阻连接到VCC,VCC接5V电源,GND接地。GND为液晶显示器对比度调整端,可以通过滑动变阻器RH1调显示器的对比度(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。E(或EN)端为使能(enable)端,下降沿使能。DB0-DB7为双向数据总线,同时最高位DB7也是忙信号检测位。BLA、BLK分别为显示器背光灯的正、负极。

3.4各模块电路原理图

3.4.1电源电路 由USB接口供5V电压,此电源电路能够给单片机提供稳定的电压,使系统能够稳定工作如图3.7所示

图3.7电源电路

3.4.2复位电路 无论用户使用哪种类型的单片机 ,总要涉及到单片机复位电路的设计。而单片机复位电路设计的好坏,直接影响到整个系统工作的可靠性。许多用户在设计完单片机系统,并在实验室调试成功后,在现场却出现了“死机”、“程序走飞”等现象,这主要是单片机的复位电路设计不可靠引起的,本电路设计采用可靠的手动复位方式,单片机复位电路如图

3.8所示

图3.8复位电路 3.4.3振荡电路

对于一个高可靠性的系统设计,晶体的选择非常重要。在振荡回路中,晶体既不能过激励(容易产生高次谐波)也不能欠激励(不容易起振)。晶体的选择至少必须考虑:谐振频点,负载电容,激励功率,温度特性,长期稳定性。

在本设计中采用了11.0592MHZ的晶振。这样有利于得到没有误差的波特率。特别是用于串口通信时,选用这种晶振比较好。单片机振荡电路如图图3.9所示。

图3.9震荡电路

图3.10温度采集电路

图3.11串口通信电路

3.4.4显示电路

显示电路由1602液晶接口插槽组成,如下图3.12所示。液晶显示器R/W端直接接地,表示只允许写入,而不可以从中读取。使能端E由单片机P0.7引脚控制,数据/命令选择端由单片机的P2.6引脚控制。偏压信号VL端与滑动变阻器RH1相连,通过RH1可以调节显示器的显示对比度。RD1主要用于限流作用,起到一定的保护作用。显示器数据端口与单片机的P0对应相连,单片机通过P0口可以向显示器中输入控制命令或要显示的字符。

图3.12显示电路

3.4.5键盘电路

按键电路由3个按键组

成,主要是用于调节时间,日期和星期如图3.13所示。

图3.13按键电路

第4章 系统的软件设计

4.1 程序流程框图:

是否有按键按下

初始化DS1302,LCD1602

键盘扫描

时钟停止

Y

时间调节

N

Y

Y

N

图4.1主程序流程图

主程序流程图如上图4.1所示。由于LCD1602,DS18B20,DS1302的数据读取及指令写入函数均已在各自的头文件中完成,在主程序中只须引用即可。

由于在硬件电路方面上设计了时间调整按键和开关,因此应有对应的时间调整程序。时间调整程序的流程图如图4.2所示。

图4.2 时间调整程序流程图

第5章 系统测试

5.1 硬件测试

在调试硬件时遇到过很多问题,但只要细心、认真检查这些问题都是可以避免的,主要问题及解决办法现列如下: 1. 2.

认真检查电路是否有短路的地方,线与线之间,管脚刺破邻近的漆包线检查完毕后接通电源后LCD1602没有正确的显示。在不通电状态下用万

之间是否连接在一起,有的话要用刀划开,或者重新焊接。

用表检测电路是否正常连接,在检查回路时发现有的点之间看似连接,但由于虚焊导致其并无电气连接,只能对焊脚进行在加工直到解决问题。

5.2 软件测试

由于本系统涉及到多个子程序,多个芯片的编程。首先必须对可编程芯片的控制字即其控制指令要熟记于心。其次,芯片很多都有时钟输入端,需要晶振支持。对芯片的读写都需要在相应的触发沿到来时才能进行。。

结束语

以上所述即是基于单片机电子万年历的设计全过程,经过多次的反复测试与分析,对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力.经过此设计,基本完成了设计任务的要求。硬件层面而言操作相对简单,界面比较友好。

在硬件电路方面,详尽解析了各个独立元件的选择依据,对数种方案进行了全面的比较。在时钟芯片的选择上,若直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然可以减少时钟芯片的使用,节约成本,但是,实现的时间误差较大。因此采用专业的时钟芯片DS1302,它可以对年、月、日、周日、时、分、秒进行计时,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能;在显示模块的选择上,若采用LED数码管动态扫描,LED数码管价格虽适中,对于显示数字也最合适,

而且采用动态扫描法与单片机连接时,占用的单片机口线少。但是由于数码管动态扫描需要借助74LS164移位寄存器进行移位,该芯片在电路调试时往往会有很多障碍,因此本次设计选择了LCD1602,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见;从元件性能和组装电路后的测试结果来看,硬件电路的设计是比较成功的,各个功能都能实现了。

参考文献

[1]胡乾斌,李光斌,李玲,喻红.单片微型计算机原理与应用.华中科技大学出版社,1996.

[2]刘勇.数字电路.电子工业出版社,2004.

[3]陈正振.电子电路设计与制作.广西交通职业技术学院信息工程系,2007. [4]杨子文.单片机原理及应用.西安电子科技大学出版社,2006. [5]郭天祥新概念51单片机教程

附录1:程序

#include #include

#define uchar unsigned char #define uint unsigned int

sbit ACC0 = ACC^0; sbit ACC7 = ACC^7;

sbit t=P3^2;//进入调时按键 sbit jia=P3^3;//加一按键

sbit jian=P3^4;//减一按键 sbit m=P3^5;//退出调时按键 sbit BEEP=P2^0;//蜂鸣器

sbit jtod=P1^5;//矩阵按键转独立按键,该脚置0 sbit T_CLK = P1^0; /*实时时钟时钟线引脚 */ sbit T_IO = P1^1; /*实时时钟数据线引脚 */ sbit T_RST = P1^2; /*实时时钟复位线引脚 */ sbit E=P2^7; sbit RW=P2^6; sbit RS=P2^5; uchar

//1602使能引脚 //1602读写引脚

code

//1602数据/命令选择引脚

hanzi[][8]={{0x04,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02},{0x0f,0x09,0x0f,0x09,0x0f,0x09,0x13,0x11},{0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00}};

uchar sec, min, hour, day, month, year; uint Time=0 ,flag=0,flag2=0;

void v_W1302(uchar ucAddr, uchar ucDa); uchar uc_R1302(uchar); uchar dectobcd(uchar bcd); uchar bcdtodec(uchar); void beep(); void delay(uchar x) {

uchar i; while(x--)

for(i=0;i

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

* 名称 : enable(uchar del) * 功能 : 1602命令函数 * 输入 : 输入的命令值 * 输出 : 无

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

void enable(uchar del) { }

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

* 名称 : write(uchar del) * 功能 : 1602写数据函数 * 输入 : 需要写入1602的数据 * 输出 : 无

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

void write(uchar del) { }

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

* 名称 : L1602_init()

RS = 1; RW = 0; P0 = del; E = 1; delay(3); E=0; RS = 0; RW = 0; P0 = del; E = 1; delay(3); E=0;

* 功能 : 1602初始化,请参考1602的资料 * 输入 : 无 * 输出 : 无

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

void L1602_init(void) { }

//装入自定义字符(汉字) void writch() {

uchar i,j; enable(0x40); for(i=0;i

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

* 名称 : L1602_char(uchar hang,uchar lie,char sign)

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下

L1602_char(1,5,'b')

* 输入 : 行,列,需要输入1602的数据 * 输出 : 无

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

void L1602_char(uchar hang,uchar lie,char sign) {

write(hanzi[i][j]); enable(0x01); enable(0x38); enable(0x06); enable(0x0c); E=0;

}

uchar a;

if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; enable(a); write(sign);

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

* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下

L1602_string(1,5,"ab cd ef;") * 输入 : 行,列,需要输入1602的数据 * 输出 : 无

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

void L1602_string(uchar hang,uchar lie,uchar *p) { }

//时钟调节// void timechange() {

uchar a;

if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; enable(a); while(1) { }

if(*p == '\0') break; write(*p); p++;

uchar a,num=1; uchar year,mon,day,hour,min,sec;

//进入调时循环 while(num) { if(t==0) delay(5); if(t==0) { num++; // beep();

while(!t); }

//退出调时按键m if(m==0) delay(5); if(m==0) num=0; enable(0x0f); a=uc_R1302(0x81)|0x80;

v_W1302(0x8e,0); v_W1302(0x80,a); if(num==7) num=0; if(num==1) { enable(0xc0+12); if(jia==0) delay(5); if(jia==0) { while(!jia); //秒加一 //调时到年以后退出调时 //num=1调秒

sec=bcdtodec(uc_R1302(0x81)&0x7f);

if(sec>59) sec=0; L1602_char(2, 12, sec/10%10+48); L1602_char(2, 13, sec%10 + 48); v_W1302(0x80,dectobcd(sec)|0x80); } if(jian==0) delay(5); if(jian==0) { while(!jian); sec--; if(sec==-1) sec=59; L1602_char(2, 12, sec/10%10+48); L1602_char(2, 13, sec%10 + 48); v_W1302(0x80,dectobcd(sec)|0x80); } } if(num==2) { enable(0xc0+9); if(jia==0) delay(5); if(jia==0) { min++; while(!jia); if(min>59) min=0; L1602_char(2, 9, min / 10 % 10 + 48); //调分钟 //秒减一 sec=bcdtodec(uc_R1302(0x81)); min = bcdtodec(uc_R1302(0x83));

v_W1302(0x82,dectobcd(min)); } if(jian==0) delay(5); if(jian==0) { min--; while(!jian); if(min==-1) min=59; L1602_char(2, 9, min / 10 % 10 + 48); L1602_char(2, 10, min % 10 + 48); v_W1302(0x82,dectobcd(min)); } } if(num==3) { enable(0xc0+6); if(jia==0) delay(5); if(jia==0) { hour++; while(!jia); if(hour>23) hour=0; L1602_char(2, 6, hour / 10 % 10 + 48); L1602_char(2, 7, hour % 10 + 48); v_W1302(0x84,dectobcd(hour)); } if(jian==0) delay(5); //调小时 min = bcdtodec(uc_R1302(0x83)); hour = bcdtodec(uc_R1302(0x85));

{ while(!jian); hour--; if(hour==-1) hour=23; L1602_char(2, 6, hour / 10 % 10 + 48); L1602_char(2, 7, hour % 10 + 48); v_W1302(0x84,dectobcd(hour)); } } if(num==4) { enable(0x80+13); if(jia==0) delay(5); if(jia==0) { day++; while(!jia); if(day>31) day=0; L1602_char(1, 13, day / 10 % 10 + 48); L1602_char(1, 14, day % 10 + 48); v_W1302(0x86,dectobcd(day)); } if(jian==0) delay(5); if(jian==0) { while(!jian); day--; //调日期 hour = bcdtodec(uc_R1302(0x85)); hour = bcdtodec(uc_R1302(0x87)); day=bcdtodec(uc_R1302(0x87));

day=31; L1602_char(1,13,day/10%10+48); L1602_char(1,14,day%10+48); v_W1302(0x86,dectobcd(day)); } } if(num==5) { enable(0x80+10); if(jia==0) delay(5); if(jia==0) { mon++; while(!jia); if(mon>12) mon=0; //调月份 mon = bcdtodec(uc_R1302(0x89)); L1602_char(1, 10, mon / 10 % 10 + 48); L1602_char(1, 11, mon % 10 + 48); v_W1302(0x88,dectobcd(mon)); } if(jian==0) delay(5); if(jian==0) { while(!jian); mon--; if(mon==-1) mon=12; mon = bcdtodec(uc_R1302(0x89)); L1602_char(1, 10, mon / 10 % 10 + 48); L1602_char(1, 11, mon % 10 + 48); v_W1302(0x88,dectobcd(mon));

} if(num==6) { enable(0x80+7); if(jia==0) delay(5); if(jia==0) { year++; while(!jia); if(year>20) year=0; L1602_char(1, 7, year / 10 % 10 + 48); L1602_char(1, 8, year % 10 + 48); v_W1302(0x8c,dectobcd(year)); } if(jian==0) delay(5); if(jian==0) { while(!jian); year--; if(year==-1) year=20; L1602_char(1, 7, year / 10 % 10 + 48); L1602_char(1, 8, year % 10 + 48); v_W1302(0x8c,dectobcd(year)); } } } if(num==0) { //关闭光标闪烁 //调年份 year = bcdtodec(uc_R1302(0x8d)); year = bcdtodec(uc_R1302(0x8d));

} } //开启1302记时 v_W1302(0x80,uc_R1302(0x81)&0x7f);

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

* 名称 : v_RTInputByte()

* 功能 : 往DS1302写入1Byte数据

* 输入 : ucDa 写入的数据

* 输出 : 无 ***********************************************************************/ void v_RTInputByte(uchar ucDa) {

} /********************************************************************

* 名称 : uc_RTOutputByte()

* 功能 : 从DS1302读取1Byte数据

* 输入 : 无

* 返回值: ACC ***********************************************************************/

uchar uc_RTOutputByte(void) uchar i; ACC = ucDa; T_RST = 1; for(i=8; i>0; i--) { } T_IO = ACC0; T_CLK = 1; T_CLK = 0; ACC = ACC >> 1;

{

} /********************************************************************

* 名称 : v_W1302(uchar ucAddr, uchar ucDa)

* 功能 : 往DS1302写入数据

* 输入 : ucAddr: DS1302地址, ucDa: 要写的数据

* 返回值 : 无 ***********************************************************************/ void v_W1302(uchar ucAddr, uchar ucDa) {

} /******************************************************************** T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(ucAddr); // 写地址 _nop_(); _nop_(); v_RTInputByte(ucDa); // 写1Byte数据 T_CLK = 1; T_RST = 0; uchar i; T_RST = 1; for(i=8; i>0; i--) { } return(ACC); ACC = ACC >>1; ACC7 = T_IO; T_CLK = 1; T_CLK = 0;

* 名称 : uc_R1302(uchar ucAddr)

* 功能 : 读取DS1302某地址的数据

* 输入 : ucAddr: DS1302地址

* 返回值 : ucDa :读取的数据 ***********************************************************************/ uchar uc_R1302(uchar ucAddr) {

} /********************************************************************

* 名称 : bcdtodec(uchar bcd)

* 功能 : BCD码转换为DEC码(DEC码为十进制数据:BCD:0x11->DEC为数值11(HEX:0x0b))

* 输入 : bcd码

* 输出 : dec码 ***********************************************************************/ uchar bcdtodec(uchar bcd) {

} uchar data1; return data1; data1=((bcd&0x70)>>4)*10+(bcd&0x0f); uchar ucDa; T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(ucAddr); //写地址,命令 _nop_(); _nop_(); ucDa = uc_RTOutputByte(); //读1Byte数据 T_CLK = 1; T_RST = 0; return(ucDa);

uchar dectobcd(uchar dec) { uchar dat;

} /********************************************************************

* 名称 : Write_DS1302Init()

* 功能 : 往DS1302中写入数据。最开始显示的数据就是在这里设置的。 * 输入 : 无

* 输出 : 无 ***********************************************************************/ void Write_DS1302Init(void) {

}

v_W1302(0x8e,0); v_W1302(0x80,0x00); //写入秒 v_W1302(0x8e,0); v_W1302(0x82,0x00); //写入分 v_W1302(0x8e,0); v_W1302(0x84,0x00); //写入小时 v_W1302(0x8e,0); v_W1302(0x86,0x00); //写入日 v_W1302(0x8e,0); v_W1302(0x88,0x00); //写入月 v_W1302(0x8e,0); v_W1302(0x8a,0x00); //写入星期 v_W1302(0x8e,0); v_W1302(0x8c,0x00); //写入年 dat=((dec/10)

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

* 名称 : Run_DS1302(void)

* 功能 : 读出DS1302中的数据,并在液晶1602上进行显示 * 输入 : 无 * 输出 : 无

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

void Run_DS1302(void) {

L1602_char(2, 6, hour / 10 % 10 + 48); //字符ASIIC码显示,L1602_char(2, 7, hour % 10 + 48); L1602_char(2, 8, ':');

L1602_char(2, 9, min / 10 % 10 + 48); L1602_char(2, 10, min % 10 + 48); L1602_char(2, 11, ':');

L1602_char(2, 12, sec / 10 % 10 + 48); L1602_char(2, 13, sec % 10 + 48); L1602_char(1, 7, year / 10 % 10 + 48); L1602_char(1, 8, year % 10 + 48);

0的ASIIC=48

v_W1302(0x8f, 0);

sec = bcdtodec(uc_R1302(0x81)); //读出DS1302中的秒 v_W1302(0x8f, 0);

min = bcdtodec(uc_R1302(0x83)); //读出DS1302中的分 v_W1302(0x8f, 0);

hour = bcdtodec(uc_R1302(0x85)); //读出DS1302中的小时 v_W1302(0x8f, 0);

day = bcdtodec(uc_R1302(0x87)); //读出DS1302中的日 v_W1302(0x8f, 0);

month = bcdtodec(uc_R1302(0x89)); //读出DS1302中的月 v_W1302(0x8f, 0);

year = bcdtodec(uc_R1302(0x8d)); //读出DS1302中的年

}

L1602_char(1, 9, 0);

L1602_char(1, 10, month / 10 % 10 + 48); L1602_char(1, 11, month % 10 + 48); L1602_char(1, 12, 1);

L1602_char(1, 13, day / 10 % 10 + 48); L1602_char(1, 14, day % 10 + 48); L1602_char(1, 15, 2);

void int0() interrupt 0 { }

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

* 函数名 : TimerConfiguration() * 函数功能

: 配置定时器值

* 输入 : 无 * 输出 : 无

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

void TimerConfiguration() {

TMOD = 0x01; //选择工作方式1 TH0 = 0x0FC; TL0 = 0x18; EA = 1; ET0 = 1; }

void InitTimer1(void) {

TMOD = 0x10;

//打开总中断 //打开定时器0中断

timechange();

TH1 = 0x0FE; TL1 = 0x0C; EA = 1; ET1 = 1; }

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

* 名称 : Main(void) * 功能 : 主函数 * 输入 : 无 * 输出 : 无

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

void Main(void) {

L1602_init(); writch(); jtod=0;

L1602_string(1,1,"DAY 20"); L1602_string(2,1,"TIME"); EA=1; EX0=1; IT0=1; InitTimer1(); TimerConfiguration(); while(1) { {

Write_DS1302Init(); }

if((t==0)&&(m==0))

Run_DS1302(); if(min==59) {

switch(sec) {

case 49:TR0=1; break; case 58:TR0=0; break; case 59:TR1=1; break; }

} else { TR0=0; TR1=0; }

} }

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

* 函数名 : Timer0() * 函数功能

: 定时器0中断函数

* 输入 : 无 * 输出 : 无

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

void Timer0() interrupt 1 {

TH0 = 0x0FC;

TL0 = 0x18;

}

void Timer1() interrupt 3 {

TH1 = 0x0FE; TL1 = 0x0C; }

Time++; if(Time==2000) {

Time=0;

flag2=!flag2; }

if(flag2==1) {

BEEP=!BEEP; }

Time++; if( Time==1000) {

Time=0; flag=!flag; }

if(flag==1) {

BEEP=!BEEP; }

本次设计的原理图,PCB图和实物图

本次设计的原理图

PCB图

实物图

6.1心得体会

此次课程设计虽然圆满完成了,但仍然有很多东西需要去做出总结,在设计课题的过程中我遇到了许多意想不到的困难与困惑,这充分说明了我自己的专业基础知识还不够扎实,面对所发生的困难准备不足,这也提醒我专业知识是多么的至关重要,要想做好一个好的作品,对个人的能力以及面对困难时的毅力起到了决定性的作用。因此,在今后的学习中一定夯实基础,努力提高自己,为成为一个优秀的电子设计人才积蓄力量。

6.2电子元器件清单

课程设计报告

院 (系): 自动化系

专 业: 自动化 班 级: 自动化2班

学生姓名: 包良进

学 号: [1**********]07

指导教师: 黄书童

桂林航天工业学院

课程设计报告

系(部): 自动化系 专业班级: 自动化2班 学生姓名: 包良进 学 号: [1**********]07 设计题目: 数 字电子钟

完成日期 2015年7月3日

指导教师评语:_____________________________________ _______________________________________________________ _______________________________________________

________

成绩(五级记分制):

指导教师(签字):_____________________

桂林航天工业学院课程设计任务书

设计题目:

系(部)分管领导: 教研室主任: 指导教师:

年 月 日

2015年 7月3日

摘 要

电子万年历是一种应用非常广泛日常计时工具,对现代社会越来越重要。此电子万年历在硬件方面主要采用STC89C52单片机作为主控核心,由DS1302时钟芯片提供时钟、1602LCD液晶显示屏显示。STC89C52单片机是由Atmel公司推出的,功耗小,电压可选用4~6V电压供电;DS1302时钟芯片是美国DALLAS公司推出的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;对于数字电子万年历采用直观的数字显示,数字显示是采用的1602LED液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒等信息。此外,该电子万年历还具有时间校准等功能。在软件方面,主要包括日历程序、时间调整程序,显示程序等。所有程序编写完成后,在Keil软件中进行调试,确定没有问题后,烧写到单片机上进行测试。

此设计主要由时钟芯片DS1302和温度传感器DS18B20采集数据到单片机进行处理再通过LCD1602显示出来,本论文主要研究了液晶显示器LCD及时钟芯片DS1302,温度传感器DS18B20与单片机之间的硬件互联及通信,对数种硬件连接方案进行了详尽的比较,在软件方面对日历算法也进行了论述。

关键词:单片机;DS1302;LCD1602

Abstract

Electronic calendar is a widely used tool for the daily time, more and more important in modern society. The electronic calendar in terms of hardware as the main control mainly STC89C52 microcontroller core, provided by the DS1302 clock chip clock, 1602LCD LCD display. STC89C52 microcontroller by Atmel introduced, the power consumption, voltage can be selected 4 ~ 6V voltage power supply; DS1302 clock chip introduced in the United States DALLAS low-power real time clock chip, which can be year, month, day, week, hours, minutes and seconds time, but also has leap-year compensation, and other functions, and the DS1302's long life, small error; for digital electronic calendar using an intuitive digital display, digital display is used 1602LED LCD screen to display, you can also shows year, month, day, week, hours, minutes, seconds and other information. In addition, the electronic calendar is also a time calibration and other functions. In terms of software, including calendar, time to adjust procedures, display procedures. All programming is completed, the Keil software debugging, make sure that no problem, programmed into the microcontroller for testing.

This design mainly by the clock chip DS1302 temperature sensor to the microcontroller DS18B20 collect data for processing and then through the LCD1602 display, this thesis, the liquid crystal display LCD and clock chip DS1302, temperature sensor and microcontroller DS18B20 interconnection and communication between the hardware on Several hardware connection

scheme for a detailed comparison of algorithms in software on the calendar have also been discussed.

Key words: SCM; DS1302; DS18B20; LCD1602

目 录 摘 要 ..................................................................................................................................................................... I ................................................................................................................................................................ II

第 1 章 绪 论 ................................................................................................................................................... 1

1.1课题背景 ................................................................................................................................................ 1

1.2 课题意义 ............................................................................................................................................... 1

1.3国内外现状及水平 ................................................................................................................................ 1

第2章基于单片机万年历的方案研究 ............................................................................................................... 2

2.1 系统基本方案选择和论证 ................................................................................................................... 2

2.1.1 单片机芯片的选择 ................................................................................................................... 2

2.1.2 显示模块选择方案和论证 ....................................................................................................... 3

2.1.3 时钟芯片的选择方案和论证 ................................................................................................... 3

2.2 电路设计最终方案决定 ....................................................................................................................... 4

2.3 DS1302和LCD1602的原理及说明 ...................................................................................................... 4

2.3.1 LCD1602工作原理及说明 ........................................................................................................ 4

2.3.2 DS1302原理及说明 .................................................................................................................. 5

第3章 系统的硬件设计与实现 ......................................................................................................................... 7

3.1电路设计框图 ........................................................................................................................................ 7

3.2系统硬件概述 ........................................................................................................................................ 8

3.3 主要模块电路的设计 ........................................................................................................................... 8

3.3.1 STC89C52单片机主控制模块的设计 ...................................................................................... 8

3.3.2时钟电路模块的设计 .............................................................................................................. 10

3.3.4 显示模块的设计 ..................................................................................................................... 12

3.4各模块电路原理图 .............................................................................................................................. 12

3.4.1电源电路 .................................................................................................................................. 12

3.4.2复位电路 .................................................................................................................................. 12

3.4.3振荡电路 .................................................................................................................................. 13

3.4.4温度采集电路 .......................................................................................................................... 13

3.4.5通信电路 .................................................................................................................................. 14 3.4.6显示电路 .................................................................................................................................. 15 3.4.7键盘电路 .................................................................................................................................. 15

第4章 系统的软件设计 ................................................................................................................................... 16

4.1 程序流程框图: ................................................................................................................................. 16 第5章 系统测试 ............................................................................................................................................... 18

5.1 硬件测试 ............................................................................................................................................. 18

5.2 软件测试 ............................................................................................................................................. 18

结束语 ................................................................................................................................................................ 19

致谢 .................................................................................................................................................................... 19

参考文献............................................................................................................................................................. 20

附录1:程序 ...................................................................................................................................................... 22

第 1 章 绪 论

1.1课题背景

在当代繁忙的工作与生活中,时间与我们每一个人都有非常密切的关系,每

个人都受到时间的影响,随着社会、科技的发展,人类得知时间,从观太阳、摆

钟到现在电子钟,不断研究、创新。为了在观测时间的同时,能够了解其它与人

类密切相关的信息,比如温度、星期、日期等,电子万年历诞生了,它集时间、日期、星期功能于一身,具有读取方便、显示直观、功能多样、电路简洁等诸多

优点,符合电子仪器仪表的发展趋势。伴随着电子技术的迅速发展,特别是随大

规模集成电路出现,给人类生活带来了根本性的改变。由其是单片机技术的应用

产品已经走进了千家万户。电子万年历的出现给人们的生活带来的诸多方便,作

为一种附加功能,现在越来越广泛的被应用于各种电子产品中,具有广阔的市场

前景。

1.2 课题意义

电子万年历作为电子类小产品不仅是市场上的宠儿,也是是单片机设计培训

中一个很实用的题目。因为这个课题有很好的开放性和可发挥性,对制作者的要

求比较高,不仅考察了对单片机的掌握能力更加强调了对单片机扩展的应用。而

且要求设计的电子万年历在操作上力求简洁,功能上尽量齐全,显示界面也要出

色。所以,电子万年历制作无论从实用目的,还是从培养能力的角度来看都是很

有价值的毕业设计课题。本电子万年历的设计在硬件方面主要采用STC89C52单片机作为主控核心,由DS1302时钟芯片提供时钟、1602LCD液晶显示屏显示。STC89C52单片机是由Atmel公司推出的,功耗小,电压可选用4~6V电压供电;DS1302时钟芯片是美国DALLAS公司推出的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,而且DS1302的使用寿命长,误差小;数字显示是采用的LED液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒等信息。此外,该电子万年历还具有时间校准等功能。在软件方面,主要包括日历程序、时间调整程序,显示程序等。所有程序编写完成后,在Keil软件中进行调试,确定没有问题后,烧写到单片机上进行测试。最后在老师同学的帮助以及自己的努力下完成了此次电子万年历的设计。

1.3国内外现状及水平 诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,但是所有这些,都是以钟表数字化为基础的。因此,研究万年历及扩大其应用,有着非常现实的意义。它可以对年、月、日、周日、时、分、秒进行计时,对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒等信息,还具有时间校准等功能。 综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。近些年我国也开始重视对电子万年历的开发与设计,让更多的电子时钟能够走进人民生活,跟多人能够应用到功能强大,精度高的电子时钟。但是仍然存在很多问题。

中国电子万年历产业发展出现的问题中,许多情况不容乐观,如产业结构不合理、产业集中于劳动力密集型产品;技术密集型产品明显落后于发达工业国家;生产要素决定性作用正在削弱;产业能源消耗大、产出率低、环境污染严重、对自然资源破坏力大;企业总体规模偏小、技术创新能力薄弱、管理水平落后等。 从什么角度分析中国电子万年历产业的发展状况?以什么方式评价中国电子万年历产业的发展程度?中国电子万年历产业的发展定位和前景是什么?中国电子万年历产业发展与当前经济热点问题关联度如何„„诸如此类,都是电子万年历产业发展必须面对和解决的问题——中国电子万年历产业发展已到了岔

口;中国电子万年历产业生产企业急需选择发展方向。

中国电子万年历产业发展研究报告阐述了世界电子万年历产业的发展历程,分析了中国电子万年历产业发展现状与差距,开创性地提出了“新型电子万年历产业” 及替代品产业概念,在此基础上,从四个维度即“以人为本”、“科技创新”、“环境友好”和“面向未来”准确地界定了“新型电子万年历产业” 及替代产品的内涵。根据“新型电子万年历产业” 及替代品的评价体系和量化指标体系,从全新的角度对中国电子万年历产业发展进行了推演和精准预测,在此基础上,对中国的行政区划和四大都市圈的电子万年历产业发展进行了全面的研究。

第2章基于单片机万年历的方案研究

2.1 系统基本方案选择和论证

2.1.1 单片机芯片的选择

本设计采用STC89C52芯片作为硬件核心,该芯片采用Flash ROM,内部具有8KB ROM存储空间,相对于本设计而言程序空间完全够用。能于5V电压工作,而且与MCS-51系列单片机完全兼容,而且运用于电路设计中时具备ISP在线编程技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,避免芯片的多次拔插对芯片造成的损坏。

2.1.2 显示模块选择方案和论证

方案一:

采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示。

方案二:

采用LED数码管动态扫描,LED数码管价格虽适中,对于显示数字也最合适,而且采用动态扫描法与单片机连接时,占用的单片机口线少。但是由于数码管动态扫描需要借助74LS164移位寄存器进行移位,该芯片在电路调试时往往会有很多障碍,所以不采用LED数码管作为显示。

方案三:

采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见,对于电子万年历而言,一个1602的液晶屏即可,价格也还能接受,需要的接口线较多,但会给调试带来诸多方便,所以此设计中采用LCD1602液晶显示屏作为显示模块。

2.1.3 时钟芯片的选择方案和论证

方案一:

直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然可以减少时钟芯片的使用,节约成本,但是,实现的时间误差较大。所以不采用此方案。

方案二:

采用DS1302时钟芯片实现时钟,DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。因此,本设计中采用DS1302提供时钟。

2.2 电路设计最终方案决定

综上各模块的选择方案与论证,确定最后的主要硬件资源如下:采用STC89C52作为主控制系统;DS1302提供时钟;LCD1602液晶屏作为显示。

2.3 DS1302,DS18B20和LCD1602的原理及说明

2.3.1 LCD1602工作原理及说明

(1)寄存器选择控制

1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符,图形寄存器选择控制表如表2.1所示:

表2.1 LCD1602寄存器选择控制表

(2)指令集

1602通过D0~D7的8位数据端传输数据和指令。显示模式设置(初始化)00111000[0x38]设置16×2显示,5×7点阵,8位数据接口;显示开关及光标设置:(初始化) 00001DCBD显示(1有效)、C光标显示(1有效)、B光标闪烁(1有效)。000001NS N=1(读或写一个字符后地址指针加1并且光标加1),N=0(读或写一个字符后地址指针减1并且光标减1),S=1且N=1(当写一个字符后,整屏显示左移),S=0当写一个字符后,整屏显示不移动。数据指针设置:数据首地址为80H,所以数据地址为80H+地址码(0-27H,40-67H)。其他设置:01H(显示清屏,数据指针=0,所有显示=0);02H(显示回车,数据指针=0)。

2.3.2 DS1302原理及说明

(1) 时钟芯片DS1302的工作原理

DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置 “0”,接着把RST端置“1”,最后才给予SCLK脉冲;读/写时序如下图2.2所示。图

2.1为DS1302的控制字,此控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时,CK=0。位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。表2.2为DS1302的日历、时间寄存器内容:“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP”是写保护位,在任何的对时钟和RAM的写操作之前,WP必须为0。当“WP”为1时,写保护位防止对任一寄存器的写操作。

(2) DS1302的控制字

DS1302的控制字如图2.1所示。控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。

图2.1 DS1302的控制字

(3) 数据输入输出

在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。如下图2.2所示:

图2.2 DS1302读与写的时序图

1. DS1302的寄存器

DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表2.2。

表2.2 DS1302的日历、时间寄存器

此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下

第3章 系统的硬件设计与实现

3.1电路设计框图

本系统的电路系统框图如图3.1所示。STC89C52单片机对DS1302和DS18B20写入控制字并读取相应的数据,继而控制LCD1602作出对应的显示。 LCD1602液晶显示模块

STC89C52主控模块

按键控制模块

DS1302时钟模块

图3.1 系统硬件框图

3.2系统硬件概述

本电路是由STC89C52单片机作为控制核心,能在5V电压工作,STC89C52是一个低功耗,高性能CMOS 8位单片机,片内含8kBytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C52引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的STC89C52可为许多嵌入式控制应用系统提供高性价比的解决方案;时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31*8的用于临时性存放数据的RAM寄存器。可产生年、月、日、周、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能;显示部份由LCD1602液晶显示器完成,该显示器为工业字符型液晶,能够同时显示16x02即32个字符(16列2行)。

3.3 主要模块电路的设计

3.3.1 STC89C52单片机主控制模块的设计

STC系列单片机是由STMicroelectronics 公司生产,并有宏晶公司做大陆代理的。本设计使用STC89C52作为控制核心,其管脚兼容其他51系列的单片机,以下对STC89C52进行简单讲解。

STC89C52单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线。采用40Pin封装的双列直接DIP结构,图3.2是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。现在对各引脚功能说明如下(图

3.2):

图3.2 STC89C52单片机管脚图

(1)主电源引脚

Vcc :接+5V电源正端。

Vss :接+5V电源地端。

(2)输入/输出引脚

P.0~P0.7:P0口的8个引脚。在不接片外存储器与不扩展I/O接口时,可作为准双向输入/输出接口。在接有片外存储器或扩展I/O接口时,P0口分时复用为低8位地址总线和双向数据总线。

P1.0~P1.7:P1口的8个引脚。可作为准双向I/O接口使用。对于52子系列,P1.0 与 P1.1还有第二种功能:P1.0 可用作定时器/计数器2的计数脉冲输入端T2。P1.1可用作定时器/计数器2的外部控制端T2EX。

P2.0~P2.7:P2口的8个引脚。可作为准双向I/O接口;有接有片外存储器或扩展I/O接口且寻址范围超过256个字节时,P2口用作高8位地址总线。 P3.0~P3.7:P3口的8个引脚。除作为准双向I/O接口使用外,还具有第二种功能 ,详见表3.1。

表3.1 P3口第二功能表

(3)控制总线

ALE/PROG:地址锁存有效信号输出端。在访问片外程序存储器期间,每机器周期该信号出现两次,其下降沿用于控制锁存P0口输出的低8位地址。对于片内含EPROM的机型,在编程期间,此引脚用作编程脉冲PROG的输入端。

PSEN:片外程序存储器读选通信号输出端,或称片外取指信号输出端。在向片外程序存储器读取指令或常数期间,每个机器周期该信号两次有效(低电平),以通过数据总线P0口读回指令或常数。在访问片外数据存储器期间,PSEN信号将不出现。 RST/V:(RST 是 RETET 简略写法。)是复位端。单片机的振荡器工作时,该引脚上出现持续两个机器周期的高电平就可实现复位操作,使单片机回复到初始状态。上电时,考虑到振荡器有一定的起振时间,该引脚上高电平必须持续10ms以上才能保证有效复位。

Vcc掉电期间,该引脚如接备用电源VPD(电压范围+4.5V至+5.5V),可用于保存片内RAM中的数据。当Vcc下降到某规定值以下VPD,便向片内RAM供电。

EA/VDD:片外程序存储器选用端。该引脚有效(低电平)时只选用片外程序存储器,否则计算机上电或6复位后先选用片内程序存储器。

(4)外接晶振引脚

XTAL1:片内反相放大器输入端。

XTAL2:片内反相放大器输出端。外接晶体时,XTAL1和 XTAL2各接晶体的一端,借外接晶体与片内反相放大器构成振荡器。

图3.3单片机最小系统

3.3.2时钟电路模块的设计

DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、周、时、分、秒进行计时,工作电压为2.5V~

5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。

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提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc>2.0V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),SCLK为时钟输入端。DS1302的控制字节的

最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。DS1302与CPU的连接需要三条线,即SCLK(7)、I/O(6)、RST(5)。实际上,在调试程序时可以不加电容器,只加一个32.768kHz 的晶振即可。只是选择晶振时,不同的晶振,误差也较大。另外,还可以在上面的电路中加入DS18B20,同时显示实时温度。只要占用CPU一个口线即可。

3.3.3 显示模块的设计

采用LCD1602液晶显示器,单片机P0口作为数据输出口,通过10R的上拉电阻连接到VCC,VCC接5V电源,GND接地。GND为液晶显示器对比度调整端,可以通过滑动变阻器RH1调显示器的对比度(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。E(或EN)端为使能(enable)端,下降沿使能。DB0-DB7为双向数据总线,同时最高位DB7也是忙信号检测位。BLA、BLK分别为显示器背光灯的正、负极。

3.4各模块电路原理图

3.4.1电源电路 由USB接口供5V电压,此电源电路能够给单片机提供稳定的电压,使系统能够稳定工作如图3.7所示

图3.7电源电路

3.4.2复位电路 无论用户使用哪种类型的单片机 ,总要涉及到单片机复位电路的设计。而单片机复位电路设计的好坏,直接影响到整个系统工作的可靠性。许多用户在设计完单片机系统,并在实验室调试成功后,在现场却出现了“死机”、“程序走飞”等现象,这主要是单片机的复位电路设计不可靠引起的,本电路设计采用可靠的手动复位方式,单片机复位电路如图

3.8所示

图3.8复位电路 3.4.3振荡电路

对于一个高可靠性的系统设计,晶体的选择非常重要。在振荡回路中,晶体既不能过激励(容易产生高次谐波)也不能欠激励(不容易起振)。晶体的选择至少必须考虑:谐振频点,负载电容,激励功率,温度特性,长期稳定性。

在本设计中采用了11.0592MHZ的晶振。这样有利于得到没有误差的波特率。特别是用于串口通信时,选用这种晶振比较好。单片机振荡电路如图图3.9所示。

图3.9震荡电路

图3.10温度采集电路

图3.11串口通信电路

3.4.4显示电路

显示电路由1602液晶接口插槽组成,如下图3.12所示。液晶显示器R/W端直接接地,表示只允许写入,而不可以从中读取。使能端E由单片机P0.7引脚控制,数据/命令选择端由单片机的P2.6引脚控制。偏压信号VL端与滑动变阻器RH1相连,通过RH1可以调节显示器的显示对比度。RD1主要用于限流作用,起到一定的保护作用。显示器数据端口与单片机的P0对应相连,单片机通过P0口可以向显示器中输入控制命令或要显示的字符。

图3.12显示电路

3.4.5键盘电路

按键电路由3个按键组

成,主要是用于调节时间,日期和星期如图3.13所示。

图3.13按键电路

第4章 系统的软件设计

4.1 程序流程框图:

是否有按键按下

初始化DS1302,LCD1602

键盘扫描

时钟停止

Y

时间调节

N

Y

Y

N

图4.1主程序流程图

主程序流程图如上图4.1所示。由于LCD1602,DS18B20,DS1302的数据读取及指令写入函数均已在各自的头文件中完成,在主程序中只须引用即可。

由于在硬件电路方面上设计了时间调整按键和开关,因此应有对应的时间调整程序。时间调整程序的流程图如图4.2所示。

图4.2 时间调整程序流程图

第5章 系统测试

5.1 硬件测试

在调试硬件时遇到过很多问题,但只要细心、认真检查这些问题都是可以避免的,主要问题及解决办法现列如下: 1. 2.

认真检查电路是否有短路的地方,线与线之间,管脚刺破邻近的漆包线检查完毕后接通电源后LCD1602没有正确的显示。在不通电状态下用万

之间是否连接在一起,有的话要用刀划开,或者重新焊接。

用表检测电路是否正常连接,在检查回路时发现有的点之间看似连接,但由于虚焊导致其并无电气连接,只能对焊脚进行在加工直到解决问题。

5.2 软件测试

由于本系统涉及到多个子程序,多个芯片的编程。首先必须对可编程芯片的控制字即其控制指令要熟记于心。其次,芯片很多都有时钟输入端,需要晶振支持。对芯片的读写都需要在相应的触发沿到来时才能进行。。

结束语

以上所述即是基于单片机电子万年历的设计全过程,经过多次的反复测试与分析,对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力.经过此设计,基本完成了设计任务的要求。硬件层面而言操作相对简单,界面比较友好。

在硬件电路方面,详尽解析了各个独立元件的选择依据,对数种方案进行了全面的比较。在时钟芯片的选择上,若直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然可以减少时钟芯片的使用,节约成本,但是,实现的时间误差较大。因此采用专业的时钟芯片DS1302,它可以对年、月、日、周日、时、分、秒进行计时,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能;在显示模块的选择上,若采用LED数码管动态扫描,LED数码管价格虽适中,对于显示数字也最合适,

而且采用动态扫描法与单片机连接时,占用的单片机口线少。但是由于数码管动态扫描需要借助74LS164移位寄存器进行移位,该芯片在电路调试时往往会有很多障碍,因此本次设计选择了LCD1602,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见;从元件性能和组装电路后的测试结果来看,硬件电路的设计是比较成功的,各个功能都能实现了。

参考文献

[1]胡乾斌,李光斌,李玲,喻红.单片微型计算机原理与应用.华中科技大学出版社,1996.

[2]刘勇.数字电路.电子工业出版社,2004.

[3]陈正振.电子电路设计与制作.广西交通职业技术学院信息工程系,2007. [4]杨子文.单片机原理及应用.西安电子科技大学出版社,2006. [5]郭天祥新概念51单片机教程

附录1:程序

#include #include

#define uchar unsigned char #define uint unsigned int

sbit ACC0 = ACC^0; sbit ACC7 = ACC^7;

sbit t=P3^2;//进入调时按键 sbit jia=P3^3;//加一按键

sbit jian=P3^4;//减一按键 sbit m=P3^5;//退出调时按键 sbit BEEP=P2^0;//蜂鸣器

sbit jtod=P1^5;//矩阵按键转独立按键,该脚置0 sbit T_CLK = P1^0; /*实时时钟时钟线引脚 */ sbit T_IO = P1^1; /*实时时钟数据线引脚 */ sbit T_RST = P1^2; /*实时时钟复位线引脚 */ sbit E=P2^7; sbit RW=P2^6; sbit RS=P2^5; uchar

//1602使能引脚 //1602读写引脚

code

//1602数据/命令选择引脚

hanzi[][8]={{0x04,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02},{0x0f,0x09,0x0f,0x09,0x0f,0x09,0x13,0x11},{0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00}};

uchar sec, min, hour, day, month, year; uint Time=0 ,flag=0,flag2=0;

void v_W1302(uchar ucAddr, uchar ucDa); uchar uc_R1302(uchar); uchar dectobcd(uchar bcd); uchar bcdtodec(uchar); void beep(); void delay(uchar x) {

uchar i; while(x--)

for(i=0;i

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

* 名称 : enable(uchar del) * 功能 : 1602命令函数 * 输入 : 输入的命令值 * 输出 : 无

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

void enable(uchar del) { }

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

* 名称 : write(uchar del) * 功能 : 1602写数据函数 * 输入 : 需要写入1602的数据 * 输出 : 无

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

void write(uchar del) { }

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

* 名称 : L1602_init()

RS = 1; RW = 0; P0 = del; E = 1; delay(3); E=0; RS = 0; RW = 0; P0 = del; E = 1; delay(3); E=0;

* 功能 : 1602初始化,请参考1602的资料 * 输入 : 无 * 输出 : 无

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

void L1602_init(void) { }

//装入自定义字符(汉字) void writch() {

uchar i,j; enable(0x40); for(i=0;i

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

* 名称 : L1602_char(uchar hang,uchar lie,char sign)

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下

L1602_char(1,5,'b')

* 输入 : 行,列,需要输入1602的数据 * 输出 : 无

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

void L1602_char(uchar hang,uchar lie,char sign) {

write(hanzi[i][j]); enable(0x01); enable(0x38); enable(0x06); enable(0x0c); E=0;

}

uchar a;

if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; enable(a); write(sign);

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

* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下

L1602_string(1,5,"ab cd ef;") * 输入 : 行,列,需要输入1602的数据 * 输出 : 无

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

void L1602_string(uchar hang,uchar lie,uchar *p) { }

//时钟调节// void timechange() {

uchar a;

if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; enable(a); while(1) { }

if(*p == '\0') break; write(*p); p++;

uchar a,num=1; uchar year,mon,day,hour,min,sec;

//进入调时循环 while(num) { if(t==0) delay(5); if(t==0) { num++; // beep();

while(!t); }

//退出调时按键m if(m==0) delay(5); if(m==0) num=0; enable(0x0f); a=uc_R1302(0x81)|0x80;

v_W1302(0x8e,0); v_W1302(0x80,a); if(num==7) num=0; if(num==1) { enable(0xc0+12); if(jia==0) delay(5); if(jia==0) { while(!jia); //秒加一 //调时到年以后退出调时 //num=1调秒

sec=bcdtodec(uc_R1302(0x81)&0x7f);

if(sec>59) sec=0; L1602_char(2, 12, sec/10%10+48); L1602_char(2, 13, sec%10 + 48); v_W1302(0x80,dectobcd(sec)|0x80); } if(jian==0) delay(5); if(jian==0) { while(!jian); sec--; if(sec==-1) sec=59; L1602_char(2, 12, sec/10%10+48); L1602_char(2, 13, sec%10 + 48); v_W1302(0x80,dectobcd(sec)|0x80); } } if(num==2) { enable(0xc0+9); if(jia==0) delay(5); if(jia==0) { min++; while(!jia); if(min>59) min=0; L1602_char(2, 9, min / 10 % 10 + 48); //调分钟 //秒减一 sec=bcdtodec(uc_R1302(0x81)); min = bcdtodec(uc_R1302(0x83));

v_W1302(0x82,dectobcd(min)); } if(jian==0) delay(5); if(jian==0) { min--; while(!jian); if(min==-1) min=59; L1602_char(2, 9, min / 10 % 10 + 48); L1602_char(2, 10, min % 10 + 48); v_W1302(0x82,dectobcd(min)); } } if(num==3) { enable(0xc0+6); if(jia==0) delay(5); if(jia==0) { hour++; while(!jia); if(hour>23) hour=0; L1602_char(2, 6, hour / 10 % 10 + 48); L1602_char(2, 7, hour % 10 + 48); v_W1302(0x84,dectobcd(hour)); } if(jian==0) delay(5); //调小时 min = bcdtodec(uc_R1302(0x83)); hour = bcdtodec(uc_R1302(0x85));

{ while(!jian); hour--; if(hour==-1) hour=23; L1602_char(2, 6, hour / 10 % 10 + 48); L1602_char(2, 7, hour % 10 + 48); v_W1302(0x84,dectobcd(hour)); } } if(num==4) { enable(0x80+13); if(jia==0) delay(5); if(jia==0) { day++; while(!jia); if(day>31) day=0; L1602_char(1, 13, day / 10 % 10 + 48); L1602_char(1, 14, day % 10 + 48); v_W1302(0x86,dectobcd(day)); } if(jian==0) delay(5); if(jian==0) { while(!jian); day--; //调日期 hour = bcdtodec(uc_R1302(0x85)); hour = bcdtodec(uc_R1302(0x87)); day=bcdtodec(uc_R1302(0x87));

day=31; L1602_char(1,13,day/10%10+48); L1602_char(1,14,day%10+48); v_W1302(0x86,dectobcd(day)); } } if(num==5) { enable(0x80+10); if(jia==0) delay(5); if(jia==0) { mon++; while(!jia); if(mon>12) mon=0; //调月份 mon = bcdtodec(uc_R1302(0x89)); L1602_char(1, 10, mon / 10 % 10 + 48); L1602_char(1, 11, mon % 10 + 48); v_W1302(0x88,dectobcd(mon)); } if(jian==0) delay(5); if(jian==0) { while(!jian); mon--; if(mon==-1) mon=12; mon = bcdtodec(uc_R1302(0x89)); L1602_char(1, 10, mon / 10 % 10 + 48); L1602_char(1, 11, mon % 10 + 48); v_W1302(0x88,dectobcd(mon));

} if(num==6) { enable(0x80+7); if(jia==0) delay(5); if(jia==0) { year++; while(!jia); if(year>20) year=0; L1602_char(1, 7, year / 10 % 10 + 48); L1602_char(1, 8, year % 10 + 48); v_W1302(0x8c,dectobcd(year)); } if(jian==0) delay(5); if(jian==0) { while(!jian); year--; if(year==-1) year=20; L1602_char(1, 7, year / 10 % 10 + 48); L1602_char(1, 8, year % 10 + 48); v_W1302(0x8c,dectobcd(year)); } } } if(num==0) { //关闭光标闪烁 //调年份 year = bcdtodec(uc_R1302(0x8d)); year = bcdtodec(uc_R1302(0x8d));

} } //开启1302记时 v_W1302(0x80,uc_R1302(0x81)&0x7f);

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

* 名称 : v_RTInputByte()

* 功能 : 往DS1302写入1Byte数据

* 输入 : ucDa 写入的数据

* 输出 : 无 ***********************************************************************/ void v_RTInputByte(uchar ucDa) {

} /********************************************************************

* 名称 : uc_RTOutputByte()

* 功能 : 从DS1302读取1Byte数据

* 输入 : 无

* 返回值: ACC ***********************************************************************/

uchar uc_RTOutputByte(void) uchar i; ACC = ucDa; T_RST = 1; for(i=8; i>0; i--) { } T_IO = ACC0; T_CLK = 1; T_CLK = 0; ACC = ACC >> 1;

{

} /********************************************************************

* 名称 : v_W1302(uchar ucAddr, uchar ucDa)

* 功能 : 往DS1302写入数据

* 输入 : ucAddr: DS1302地址, ucDa: 要写的数据

* 返回值 : 无 ***********************************************************************/ void v_W1302(uchar ucAddr, uchar ucDa) {

} /******************************************************************** T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(ucAddr); // 写地址 _nop_(); _nop_(); v_RTInputByte(ucDa); // 写1Byte数据 T_CLK = 1; T_RST = 0; uchar i; T_RST = 1; for(i=8; i>0; i--) { } return(ACC); ACC = ACC >>1; ACC7 = T_IO; T_CLK = 1; T_CLK = 0;

* 名称 : uc_R1302(uchar ucAddr)

* 功能 : 读取DS1302某地址的数据

* 输入 : ucAddr: DS1302地址

* 返回值 : ucDa :读取的数据 ***********************************************************************/ uchar uc_R1302(uchar ucAddr) {

} /********************************************************************

* 名称 : bcdtodec(uchar bcd)

* 功能 : BCD码转换为DEC码(DEC码为十进制数据:BCD:0x11->DEC为数值11(HEX:0x0b))

* 输入 : bcd码

* 输出 : dec码 ***********************************************************************/ uchar bcdtodec(uchar bcd) {

} uchar data1; return data1; data1=((bcd&0x70)>>4)*10+(bcd&0x0f); uchar ucDa; T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(ucAddr); //写地址,命令 _nop_(); _nop_(); ucDa = uc_RTOutputByte(); //读1Byte数据 T_CLK = 1; T_RST = 0; return(ucDa);

uchar dectobcd(uchar dec) { uchar dat;

} /********************************************************************

* 名称 : Write_DS1302Init()

* 功能 : 往DS1302中写入数据。最开始显示的数据就是在这里设置的。 * 输入 : 无

* 输出 : 无 ***********************************************************************/ void Write_DS1302Init(void) {

}

v_W1302(0x8e,0); v_W1302(0x80,0x00); //写入秒 v_W1302(0x8e,0); v_W1302(0x82,0x00); //写入分 v_W1302(0x8e,0); v_W1302(0x84,0x00); //写入小时 v_W1302(0x8e,0); v_W1302(0x86,0x00); //写入日 v_W1302(0x8e,0); v_W1302(0x88,0x00); //写入月 v_W1302(0x8e,0); v_W1302(0x8a,0x00); //写入星期 v_W1302(0x8e,0); v_W1302(0x8c,0x00); //写入年 dat=((dec/10)

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

* 名称 : Run_DS1302(void)

* 功能 : 读出DS1302中的数据,并在液晶1602上进行显示 * 输入 : 无 * 输出 : 无

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

void Run_DS1302(void) {

L1602_char(2, 6, hour / 10 % 10 + 48); //字符ASIIC码显示,L1602_char(2, 7, hour % 10 + 48); L1602_char(2, 8, ':');

L1602_char(2, 9, min / 10 % 10 + 48); L1602_char(2, 10, min % 10 + 48); L1602_char(2, 11, ':');

L1602_char(2, 12, sec / 10 % 10 + 48); L1602_char(2, 13, sec % 10 + 48); L1602_char(1, 7, year / 10 % 10 + 48); L1602_char(1, 8, year % 10 + 48);

0的ASIIC=48

v_W1302(0x8f, 0);

sec = bcdtodec(uc_R1302(0x81)); //读出DS1302中的秒 v_W1302(0x8f, 0);

min = bcdtodec(uc_R1302(0x83)); //读出DS1302中的分 v_W1302(0x8f, 0);

hour = bcdtodec(uc_R1302(0x85)); //读出DS1302中的小时 v_W1302(0x8f, 0);

day = bcdtodec(uc_R1302(0x87)); //读出DS1302中的日 v_W1302(0x8f, 0);

month = bcdtodec(uc_R1302(0x89)); //读出DS1302中的月 v_W1302(0x8f, 0);

year = bcdtodec(uc_R1302(0x8d)); //读出DS1302中的年

}

L1602_char(1, 9, 0);

L1602_char(1, 10, month / 10 % 10 + 48); L1602_char(1, 11, month % 10 + 48); L1602_char(1, 12, 1);

L1602_char(1, 13, day / 10 % 10 + 48); L1602_char(1, 14, day % 10 + 48); L1602_char(1, 15, 2);

void int0() interrupt 0 { }

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

* 函数名 : TimerConfiguration() * 函数功能

: 配置定时器值

* 输入 : 无 * 输出 : 无

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

void TimerConfiguration() {

TMOD = 0x01; //选择工作方式1 TH0 = 0x0FC; TL0 = 0x18; EA = 1; ET0 = 1; }

void InitTimer1(void) {

TMOD = 0x10;

//打开总中断 //打开定时器0中断

timechange();

TH1 = 0x0FE; TL1 = 0x0C; EA = 1; ET1 = 1; }

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

* 名称 : Main(void) * 功能 : 主函数 * 输入 : 无 * 输出 : 无

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

void Main(void) {

L1602_init(); writch(); jtod=0;

L1602_string(1,1,"DAY 20"); L1602_string(2,1,"TIME"); EA=1; EX0=1; IT0=1; InitTimer1(); TimerConfiguration(); while(1) { {

Write_DS1302Init(); }

if((t==0)&&(m==0))

Run_DS1302(); if(min==59) {

switch(sec) {

case 49:TR0=1; break; case 58:TR0=0; break; case 59:TR1=1; break; }

} else { TR0=0; TR1=0; }

} }

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

* 函数名 : Timer0() * 函数功能

: 定时器0中断函数

* 输入 : 无 * 输出 : 无

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

void Timer0() interrupt 1 {

TH0 = 0x0FC;

TL0 = 0x18;

}

void Timer1() interrupt 3 {

TH1 = 0x0FE; TL1 = 0x0C; }

Time++; if(Time==2000) {

Time=0;

flag2=!flag2; }

if(flag2==1) {

BEEP=!BEEP; }

Time++; if( Time==1000) {

Time=0; flag=!flag; }

if(flag==1) {

BEEP=!BEEP; }

本次设计的原理图,PCB图和实物图

本次设计的原理图

PCB图

实物图

6.1心得体会

此次课程设计虽然圆满完成了,但仍然有很多东西需要去做出总结,在设计课题的过程中我遇到了许多意想不到的困难与困惑,这充分说明了我自己的专业基础知识还不够扎实,面对所发生的困难准备不足,这也提醒我专业知识是多么的至关重要,要想做好一个好的作品,对个人的能力以及面对困难时的毅力起到了决定性的作用。因此,在今后的学习中一定夯实基础,努力提高自己,为成为一个优秀的电子设计人才积蓄力量。

6.2电子元器件清单


相关文章

  • 数电课程设计数字电子时钟的实现
  • 课 程 设 计 报 告 设计题目:数字电子时钟的设计与实现 班 级: 学 号: 姓 名: 指导教师: 设计时间: 摘 要 钟表的数字化给人们生产生活带来了极大的方便,大大的扩展了原先钟表的报时.诸如,定时报警.按时自动打铃.时间程序自动控制 ...查看


  • 电子秒表的设计报告
  • 电子秒表电路设计实验报告 学生姓名: 如孜江·库万 学 号:2011130215 专 业:通信工程 年级.班级:2011年级3班 实验项目:电子秒表电路设计 实验类型:设计 实验时间: 实验指导老师: 实验评分: 一. 实验目的 1.进一步 ...查看


  • 新数字时钟实验报告
  • 数 字 电 路 课 程 设 计 2014 年 10月 23 日 目录 1. 实验目的 .............................................. 3 2. 设计要求 .................... ...查看


  • 数字电子时钟实验报告
  • 一.设计题目与要求 设计题目:多功能数字钟 设计要求: 1. 准确计时,以数字形式显示机器人行走的时.分.秒的时间. 二.设计原理 1数字钟的组成部分 ⑴555定时器组成的方波发生电路 多谐振荡器电路给数字钟提供一个频率1Hz 的信号,可保 ...查看


  • 数字钟设计报告
  • 数字电子钟设计报告 目录 一. 设计任务和要求··································(1) 二.设计方案的选择与论证···························(2) 三.电路设计计算与分析····· ...查看


  • 数字电子钟制作调试总结报告--计算机学院
  • 计算机学院 数字电子钟制作.调试报告 专业名称: 课程名称: 指导教师: 班 级: 姓 名: 学 号: 成 绩: (2011/2012 学年 第2学期) 计算机应用 数字电路应用 瞿 新 南 计应112 常程 1108143201 常州信息 ...查看


  • 电子秒表实验报告
  • 电子技术设计性 实训报告 学 号: 211002146 姓 名: 邱富烨 同 组 人: 夏文彬 班 级: 指导老师: 林雪健 日 期: 2012.09.07 目 录 一.实训目的------------------------------- ...查看


  • 数电课程设计 1
  • 数字电子技术课程设计报告 专业名称:电气工程及其自动化 班 级:11电气本二班 姓 名:廖闽志 学 号:110812039 日 期:2013年12月19日 目 录 一.设计要求................................ ...查看


  • 彩灯控制系统说明书
  • 电子技术课程设计 设计报告 题目: 彩灯控制电路 姓名: 学号: 班级: 计算机科学与技术1班 指导教师: 日期: 2013.1.10 摘要 随着人们生活环境的不断改善和美化,在许多场合可以看到彩色霓虹灯.用彩灯来装饰街道和城市建筑物已经成 ...查看


热门内容