您好,欢迎来到世旅网。
搜索
您的当前位置:首页单片机课程设计_万年历

单片机课程设计_万年历

来源:世旅网
 单片机系统课程设计

单片机系统 课 程 设 计

成绩评定表

设计课题 : 万年历 学院名称 : 电气工程学院 专业班级 : 学生姓名 : 学 号 : 指导教师 : 设计地点 : 设计时间 :

指导教师意见: 成绩: 签名: 年 月 日

单片机系统课程设计

单片机系统

课 程 设 计

课程设计名称: 万年历 专 业 班 级 : 学 生 姓 名 : 学 号 :

指 导 教 师 : 课程设计地点: 课程设计时间:

单片机系统课程设计 单片机系统 课程设计任务书

学生姓名 题 目 课题性质 指导教师 工程设计 专业班级 课题来源 选题 学号 主要内容 (参数) 1、 显示阳历年、月、日、时、分、秒、星期 2、 可用按键对时间、日期进行调整 第1-2天:熟悉课程设计任务及要求,查阅技术资料,确定设计方案。 第3-4天:按照确定的方案设计单元电路。要求画出单元电路图,元件及任务要求 (进度) 元件参数选择要有依据,各单元电路的设计要有详细论述。 第5-6天:软件设计,编写程序。 第7-8天:实验室调试。 第9-10天:撰写课程设计报告。要求内容完整、图表清晰、文理流畅、格式规范、方案合理、设计正确,篇幅合理。 [1] 张迎新.单片微型计算机原理、应用及接口技术(第2版)[M].北京:主要参考 资料 审查意见 系(教研室)主任签字: 年 月 日

国防工业出版社,2004 [2]伟福LAB6000系列单片机仿真实验系统使用说明书 [3] 阎石.数字电路技术基础(第五版).北京:高等教育出版社,2006 单片机系统课程设计 摘 要:随着当今世界经济的快速发展和信息化时代的来临,各种各样的小型智能家电产品陆续出现在我们的生活中。日历是人们不可或缺的日常用品。但一般日历都为纸制用品,使用不便,寿命不长。电子万年历采用智能电子控制和显示技术,改善了纸制日历的缺陷。本设计以AT89C52单片机为核心,构成单片机控制电路,结合DS1302时钟芯片,完成时间的调整和掉电保护,全部信息用LED数码管显示。时间、日期调整由按键来实现。日历能显示阳历和时、分、秒。 关键词:万年历;52系列单片机;时钟芯片

单片机课程设计

目 录

1 概述 ............................................................................................................................................. 1 2 总体方案设计 ........................................................................................................................... 1

2.1 方案1——基于AT89C52单片机的万年历设计 ..................... 1 2.2 方案2——基于AT89C52单片机和DS1302的万年历设计 ............ 2 2.3 总体方案 .................................................... 2 3 硬件电路设计 ........................................................................................................................... 3

3.1 主控器 AT89C52 .............................................. 3

3.1.1 AT89C52的主要性能 ..................................... 4 3.1.2 AT89C52的引脚及其功能 ................................. 4 3.2 时钟电路的设计 .............................................. 7

3.2.1 DS1302的性能特性 ...................................... 7 3.3.2 DS1302数据操作原理 .................................... 8 3.3 显示电路的设计 ............................................. 10 3.4 键盘接口的设计 ............................................. 12 4 系统软件设计 ......................................................................................................................... 12

4.1 主程序设计 ................................................. 13 4.2 中断服务程序设计 ........................................... 13 4.3 子程序设计 ................................................. 14

4.3.1 延时子程序 ............................................ 14 4.3.2 数码管动态扫描子程序 .................................. 14 4.3.3 定时器初始化子程序 .................................... 15 4.3.4 键盘扫描子程序 ........................................ 15 4.3.5 显示子程序 ............................................ 16

5 系统调试与总结 .................................................................................................................... 16 参考文献 ...................................................................................................................................... 19 附录A 源程序 ............................................................................................................................ 20 附录B 系统原理图 ................................................................................................................... 29

单片机课程设计

1 概述

在日新月异的21世纪里,家用电子产品得到了迅速发展。许多家电设备都趋于人性化、智能化,这些电器设备大部分都含有CPU控制器或者是单片机。单片机以其高可靠性、高性价比、低电压、低功耗等一系列优点,近几年得到迅猛发展和大范围推广,广泛应用于工业控制系统、通讯设备、日常消费类产品和玩具等。并且已经深入到工业生产的各个环节以及人民生活的各个方面,如车间流水线控制、自动化系统等、智能型家用电器(冰箱、空调、彩电)等。用单片机来控制的小型家电产品具有便携实用,操作简单的特点。

本文设计的电子万年历属于小型智能家用电子产品。利用单片机进行控制,实时时钟芯片进行记时,外加掉电存储电路和显示电路,可实现时间的调整和显示。电子万年历既可广泛应用于家庭,也可应用于银行、邮电、宾馆、医院、学校、企业、商店等相关行业的大厅,以及单位会议室、门卫等场所。因而,此设计具有相当重要的现实意义和实用价值。

2 总体方案设计

由于现在市面上的电子万年历的种类比较多,因此到底选择什么样的方案在设计中是至关重要的。正确地选择方案就可以使产品更加人性化,并且可以减小开发的难度,缩短开发的周期,降低产品的成本等等,因此就会被人们普遍接受,并且能够更快地将产品推向市场实现其自身的价值。下面我们就拟订了两种方案,希望能够选择一种性价比高的方案。

2.1 方案1——基于AT89C52单片机的万年历设计

不使用时钟芯片,而直接用AT89C52单片机来实现电子万年历设计。AT89C52是一种带8K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS 8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦写1000余次。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C52是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

若采用单片机计时,利用它的一个16位定时器/计数器每50ms产生一个中

1

单片机课程设计

断信号,中断20次后产生一个秒信号,然后根据时间进制关系依次向分、时、日、星期、月、年进位。这样就实现了直接用单片机来实现电子万年历设计。

用单片机来实现电子万年历设计,无须外接其他芯片,充分利用了单片机的资源。但是精度不够高,误差较大,掉电后丢失所有数据,软件编程较复杂。

2.2 方案2——基于AT89C52单片机和DS1302的万年历设计

在以单片机为核心构成的装置中,经常需要一个实时的时钟和日历,以便对一些实时发生事件记录时给予时标,实时时钟芯片便可起到这一作用。过去多用并行接口的时钟芯片,如MC146818,DS12887等。它们已能完全满足单片机系统对实时时钟的要求,但是这些芯片与单片机接口复杂、占用地址, 数据总线接线多、芯片体积大占用空间多、近年来串行接口的各种芯片在单片机系统中应用愈来愈多,串行接口的实时时钟芯片也出现了不少,DS1302是一个综合性能较好且价格便宜的串行接口实时时钟芯片。

利用单片机进行控制,采用DS1302作为实时时钟芯片,其三线接口 SCLK、I/O、 与单片机进行同步通信,外加掉电存储电路、显示电路、键盘电路,即构成一个基本的电子万年历系统,若还要添加其他功能,在这基础上外扩电路即可。

由于在系统设计时,需要考虑以下几点因素:功耗低、精确度高、软件编程较简单,芯片的体积小、芯片成本低等,而DS1302芯片有上面所述的诸多优点,所以本设计采用方案2——基于DS1302的电子万年历设计。

2.3 总体方案

本设计以AT89C52单片机为核心,构成单片机控制电路,结合DS1302时钟芯片,显示阳历的年、月、日、星期、时、分、秒同时完成对它们的手动调整和掉电保护,全部信息用8位八段数码管显示出来。输入接口由按键来实现,用按键可以对日期和时间进行调整。整机电路使用+5V稳压电源,可稳定工作。其软硬件设计简单,时间记录准确,可广泛应用于长时间连续显示的系统中。

按照系统设计功能的要求,确定硬件系统由主控制器、时钟模块、显示模块、键盘接口共4个模块组成,总体系统构成框图如图2-1所示。

2

单片机课程设计

键盘扫描模块AT89C52主控制器DS1302时钟模块数码管显示模块 图2-1 电子万年历系统构成框图

3 硬件电路设计

电子万年历电路原理图见附录B,系统由主控制器AT89C52、时钟芯片DS1302、显示电路及键盘扫描电路组成。

按照系统设计功能的要求,初步确定设计系统由主控模块、时钟模块、显示模块、键盘接口模块组成。主控芯片使用52系列AT89C52单片机,时钟芯片使用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片DS1302, DS1302作为主要计时芯片,可以做到计时准确。更重要的是,DS1302可以在很小电流的后备 (2.5~5.5V电源,在2.5V时耗电小于300nA)下继续计时,并可编程选择多种充电电流来对后备电源进行慢速充电,可以保证后备电源基本不耗电。显示模块使用8位八段数码管,八段数码管虽然操作略显繁琐,但可视范围十分宽,而且经济实惠,也不需要复杂的驱动程序。键盘模块使用若干个独立按键即可。

3.1 主控器 AT89C52

ATMEL公司生产的AT89C52单片机采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flsah程序存储器。它是一种高性能、低功耗的8位CMOS微处理芯片,市场应用最多。其引脚封装如图3-1所示。

3

单片机课程设计

图3-1 AT89C52引脚封装图

3.1.1 AT89C52的主要性能

8KB Flash ROM,可以檫写1000次以上,数据保存10年。 256字节内部RAM。 电源控制模式

——时钟可停止和恢复; ——空闲模式; ——掉电模式。 6个中断源。 4个中断优先级。 4个8位I/O口。 全双工增强型UART。

3个16位定时/计数器,T0、T1(标准80C51)和增加的T2(捕获和比较)。 全静态工作方式:0~24MHz。 3.1.2 AT89C52的引脚及其功能

AT89C52单片机的管脚说明如下: (1) 主要电源引脚

①VCC 电源端 ②GND 接地端

(2) 外接晶体引脚XTAL1和XTAL2

①XTAL1 接外部晶体的一个引脚。在单片机内部,它是构成片内振荡器的

4

单片机课程设计

反相放大器的输入端。当采用外部振荡器时,该引脚接收振荡器的信号,既把此信号直接接到内部时发生器的输入端。

②XTAL2 接外部晶体的另一个引脚。在单片机内部,它是上述振荡器的反相放大器的输出端。采用外部振荡器时,此引脚应悬浮不连接。 (3) EA控制或与其它电源复用引脚RST、ALE/PROG、PSEN和EA/VPP

①RST复位输入端。当振荡器运行时,在该引脚上出现两个机器周期的高电平将使单片机复位。

②ALE/PROG当访问外部存储器时,ALE(地址锁存允许)的输出用于锁存地址的低位字节。即使不访问外部存储器,ALE端仍以不变的频率(此频率为振荡器频率的1/6)周期性地出现正脉冲信号。因此,它可用作对外输出的时钟,或用于定时目的。然而要注意的是:每当访问外部数据存储器时,将跳过一个ALE脉冲。在对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。

③PSEN 程序存储允许(PSEN)输出是外部程序存储器的读选通信号。当AT89S52/LV52由外部程序存储器取指令(或常数)时,每个机器周期两次PSEN有效(既输出2个脉冲)。但在此期间内,每当访问外部数据存储器时,这两次有效的PSEN信号将不出现。

④EA/VPP 外部访问允许端。要使CPU只访问外部程序存储器(地址为0000H~FFFFH),则EA端必须保持低电平(接到GND端)。当EA端保持高电平(接VSS端)时,CPU则执行内部程序存储器中的程序。

(4) 输入/输出引脚 P0.0~ P0.7、P1.0~P1.7、P2.0~ P2.7 和P3.0~P3.7

①P0端口(P0.0~ P0.7) P0是一个8位漏极开路型双向I/O端口。作为输出口用时,每位能以吸收电流的方式驱动8个TTL输入,对端口写1时,又可作高阻抗输入端用。

②P1端口(P1.0~ P1.7) P1是一个带有内部上拉电阻的8位双向I/O端口。P1的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。对端口写1

5

单片机课程设计

时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。作输入口时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流。

③P2端口 (P2.0~P2.7) P2是一个带有内部上拉电阻的8位双向I/O端口。P2的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。对端口写1时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。P2作输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流。

④P3端口(P3.0~P3.7) P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流,这是由于上拉的缘故。P3口也可作为AT89S52的一些特殊功能,这些特殊功能见表3-1。

表3-1 P3端口的特殊功能

端口引脚 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 兼 用 功 能 RXD (串行输入口) TXD (串行输出口) INT0 (外部中断0) INT1 (外部中断1) T0 ( 定时器0的外部输入) T1 (定时器1的外部输入) WR (外部数据存储器写选通) RD (外部数据存储器读选通)

本系统即采用AT89C52作为主控芯片,本系统中其管脚分配如图3-2所示。其中VCC接5V稳压电源,GND接地,RST接复位电路,P3端口作为独立按键的接口,XTAL1,XTAL2接外部可换晶振,P0端口作为数据总线接到两片74LS573上作为其输入信号,P2.7口向DS1302提供CLK时钟信号,P2.6向DS1302提供I/O信号,P2.5口向DS1302提供RST复位/片选线信号,P2.4和P2.3口分别向两片74LS573提供段选和片选信号。

6

单片机课程设计

图3-2 主控芯片及其管脚分配

3.2 时钟电路的设计

3.2.1 DS1302的性能特性

实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行计数; 用于高速数据暂存的31×8位RAM; 最少引脚的串行I/O; 2.5~5.5V电压工作范围; 2.5V时耗电小于300nA;

用于时钟或RAM数据读/写的单字节或多字节(脉冲方式)数据传送方式; 简单的3线接口;

可选的慢速充电(至Vcc1)的能力。

DS1302时钟芯片包括实时时钟/日历和31字节的静态RAM。它经过一个简单的串行接口与微处理器通信。实时时钟/日历提供秒、分、时、日、周、月和年等信息。对于小于31天的月和月末的日期自动调整,还包括闰年校正的功能。时钟的运行可以采用24h或带AM(上午)/PM(下午)的12h格式。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302有主电源/后备电源双电源引脚:Vcc1在单电源与电池供电的系统中提供低电源,并提供低功率的电池备份;Vcc2在双电源系统中提供主电源,在这种运用方式中,Vcc1连接到备份电,以便在没有主电源的情况下能保存时间信息以及数据。DS1302由Vcc1或Vcc2中较大者供电。当Vcc2大于

7

单片机课程设计

Vcc1+0.2V时,Vcc2给DS1302供电;当Vcc2小于Vcc时, DS13026由Vcc1供电。

3.3.2 DS1302数据操作原理

DS1302在任何数据传送时必须先初始化,把RST脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在SCLK的上升沿被输入。无论是读周期还是写周期,开始8位指定40个寄存器中哪个将被访问到。在开始8个时钟周期,把命令字节装入移位寄存器之后,另外的时钟周期在读操作时输出数据,在写操作是写入时写入数据。时钟脉冲的个数在单字节方式下为8加8,在多字节方式下为8加字节数,最大可达248字节数。

如果在传送过程中置RST脚为低电平,则会终止本次数据传送,并且I/O引脚变为高阻态。上电运行时,在Vcc大于等于2.5V之前,RST脚必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。DS1302内部结构图如图3-3所示,表3-2为各引脚的功能。

Vcc1Vcc2GNDI/O电源控制实时时钟输入移位寄存器32.768KHzX1振荡器与分频器X2SCLKRST命令与控制逻辑31×8RAM

图3-3 DS1302内部结构 表 3-2 DS1302引脚功能

引脚号 1 2,3 4 引脚名称 Vcc2 X1,X2 GND 8

功 能 主电源 振荡源,外界32.768kHz晶振 地线

单片机课程设计

5 6 7 8 RST I/O SCLK Vcc1 复位/片选线 串行数据输入/输出端(双向) 串行数据输入端 后备电池

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

图3-4 DS1302的控制字

为了提高对32个地址的寻址能力(地址/命令位1~5=逻辑1),可以把时钟/日历或RAM寄存器规定为多字节(burst)方式。位6规定时钟或RAM,而位0规定读或写。在时钟/日历寄存器中的地址9~31或RAM寄存器中的地址31不能寄存数据。在多字节方式中,读或写从地址0的位0开始。必须按数据传送的次序写最先的8个寄存器。但是,当以多字节方式写RAM时,为了传送数据不必写所有31字节。不管是否写了全部31字节,所写的每一字节都将传送至RAM。

DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。其日历、时间寄存器及其控制字见表3-3,其中奇数为读操作,偶数为写操作。

表3-3 内部寄存器地址和内容

积存器名 秒积存器 命令字节 写 80H 读 81H 取值范围 00~59 9

积存器内容 7 CH 6 10S 5 4 3 2 1 0 SEC

单片机课程设计

分积存器 [小]时积存器 日积存器 月积存器 周积存器 年积存器 82H 84H 85H 88H 8AH 8CH 83H 85H 87H 89H 8BH D3H 00~59 00~23或01~12 01~28,29,30,31 01~12 01~07 00~99 0 12/24 0 0 0 10 min 0 0 0 0 10A/P 10DATE 0 0 0 HR MIN HR DATE 10M MONTH 0 DAY YEAR 10YEAR

时钟暂停:秒寄存器的位7定义位时钟暂停位。当它为1时,DS1302停止震荡,进入低功耗的备份方式。通常在对DS1302进行写操作时(如进入时钟调整程序),停止震荡。当它为0时,时钟将开始启动。

AM-PM/12-24[小]时方式:[小]时寄存器的位7定义为12或24[小]时方式选择位。它为高电平时,选择12[小]时方式。在此方式下,位5是AM/PM位,此位是高电平时表示PM低电平表示AM。在24[小]时方式下,位5为第二个10[小]时位(20~23h)。

DS1302的晶震选用32.768kHz,电容推荐值为33pF,因为震荡频率较低,也可以不接电容,对计时精度影响不大。

本系统即采用了DS1302时钟芯片,其外部电路如图3-5所示。其中VCC2接5V系统稳压电源,VCC1接备用干电池,SCLK、I/O、RST端口与主控制器相对应的端口相连接,X1、X2外界晶振。

图3-5 时钟电路

3.3 显示电路的设计

显示部分采用普通的共阴极数码管显示,采用动态扫描,以减少硬件电路。

10

单片机课程设计

为了减少I/O接口,在使用两个LG3641共阴极数码管的情况下,采用2片74HC573分别作为数码管的驱动,输出位选和段选信号驱动数码管显示相应内容。

数码管的一种是半导体发光器件,数码管可分为七段数码管和八段数码管,区别在于八段数码管比七段数码管多一个用于显示小数点的发光二极管单元DP(decimal point),其基本单元是发光二极管。

本系统采用动态显示驱动。动态显示驱动是将所有数码管通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示。将所有数码管的8个显示笔划\"a,b,c,d,e,f,g,dp\"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。

图3-6 74HC573引脚图

74HC573包含八进制3态非反转透明锁存器,是一种高性能硅门CMOS器件。SL74HC573跟LS/AL573的管脚一样,其引脚图见图3-6。器件的输入是和标准CMOS输出兼容的,加上拉电阻他们能和LS/ALSTTL输出兼容。当锁存使能端为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)。当锁存使能变低时,符合建立时间和保持时间的数据会被锁存。

本系统所采用的显示电路接线图如图3-7所示。其中,第一片74LS573作为数码管的段码驱动,输入端与单片机的P0口相连接,输出端接八位共阴数码管相应的段码输入端(a--dp),端口C与单片机相应的段码输出端相连接,VCC接主电源,GND、OC接地。相应的,第二片74LS573作为数码管的位码驱动,输

11

单片机课程设计

入端与单片机的P0口相连接,输出端接八位共阴数码管相应的位码端口相连接,CC接主电源,GND、OC接地。

图3-7 数码管显示电路

3.4 键盘接口的设计

由于按键有8个,用普通按钮接10K上拉电阻,用查询法完成读键功能。其线路连接图下图所示。

图3-8 按键电路

4 系统软件设计

本系统软件分为主程序、中断服务程序、子程序三个模块进行编写。由于本

12

单片机课程设计

系统程序相对来讲比较简单,用轮询法对键盘进行反复扫描,用中断法进行数码管显示,每隔一段时间,定时器向CPU申请中断,调用中断服务子程序,根据当前的键值,显示日期、时间或者周秒。而子程序为一些常用的延时函数、显示函数等。

4.1 主程序设计

由于本系统程序相对来讲比较简单,主程序流程图如图4-1所示。系统上电启动后,定义后续过程中要使用到的全局变量,对定时器和DS1302进行初始化之后,进入主循环对键盘进行扫描,若检测到有按键按下,进入相应的键处理程序;若没有检测到按键按下,继续扫描键盘。

开始定义全局变量定时器初始化DS1302初始化调用键盘扫描程序N取得相应的键值?Y执行相应的键处理程序

图4-1 主程序流程图

4.2 中断服务程序设计

定时器0定时时间到,向CPU申请中断而进入中断服务程序。进入中断服务程序后,先清中断标志位,再对定时器0赋初始值,接着调用数码管扫描子程序达到数码管动态显示的目的,延时100ms后,读标志位置1,这里的“读”是指从时钟芯片DS1302中读取相关数据。

13

单片机课程设计

开始清中断标志位定时器赋初值调用数码管扫描子程序延时100ms读标志位置1结束 图4-2 中断服务程序流程图

4.3 子程序设计

4.3.1 延时子程序

此延时子程序可用于对延时时间不是特别精确的场合,其程序流程图如图4-3所示,主体是一个循环结构,先对t赋初始值255,通过循环执行“t--”指令而达到延时的目的。

开始定义变量t=255t--t=0?Y结束N

图4-3 延时子程序流程图

4.3.2 数码管动态扫描子程序

本系统使用8位八段共阴极数码管用于显示时间和日期,而74LS73作为数码管的驱动芯片,如要控制数码管的显示只需要用程序控制74LS73即可。子程序中定义i为需要显示的位数,通过对段码和位码的锁存达来到数码管动态显示的目的。

14

单片机课程设计

开始定义i=0清空数据段锁存、取位码位锁存、取段码i++i=8Yi=0结束

图4-4 数码管动态扫描子程序流程图

4.3.3 定时器初始化子程序

首选选择定时器/计数器的工作方式为定时器0工作方式1,再对其赋初始值,然后打开总中断,打开定时器0中断,打开定时器0开关,定时器初始化工作完成。

开始TMOD=01HEA=1ET0=1TR0=1结束 图4-5 定时器初始化子程序流程图

4.3.4 键盘扫描子程序

键盘扫描用于向系统输入数据,其工作流程如图4-6所示。简单描述为: (1) 判断有无闭合键,若无则退出;

15

单片机课程设计

(2) 延时10ms去抖动;

(3) 再次判断有无闭合键,若无则退出; (4) 识别闭合键并取得键值; (5) 退出键盘扫描子程序。

开始N判断有无键按下Y延时10msN判断有无键按下Y取得键值结束

图4-6 键盘扫描子程序流程图

4.3.5 显示子程序

为了使主程序结构上更加紧凑和清晰,故将显示部分的程序代码单独拿出来定义为一个子函数来调用。其功能相对比较简单,将数据从时钟芯片取出来经过简单运算放入输出缓冲区。

开始从DS1302中读出时钟数据对数据进行相应计算将计算过的数据输出结束 图4-7 显示子程序流程图

5 系统调试与总结

系统研制完成后,在自己的单片机开发板上进行了系统功能测试。系统上电后显示正常。按下按键K1,LED数码管能够在日期、时间之间切换显示;按下按键K3调节小时数值,其能够在0-23之间循环递增调节;按下按键K5调节分

16

单片机课程设计

钟数值,其能够在0-59之间循环递增调节;按下按键K2,K4调节年份数值,按K2年份数值递增,按K4年份数值递减,年份可设定为0-99;按下按键K6可进行分钟数值的调节,调节范围为0-59;按下按键K8可进行日数值的调节,实际上调节范围可以是0-31,但是调节是要根据不同的月份适当调节。实际调试结果如下图所示。

图5-1 调试结果1

图5-2 调试结果2

此次设计立足于电子技术的实际运用,不断实践,开拓了思维,设计以考查、调研、搜集资料、拟订方案、进行系统规划、编程、仿真、调试的流程,使我深刻的体会到了在学习我们专业的过程中理论与实践相结合的重要性,同时也解决了以前学习比较模糊的专业知识点,使自己掌握的专业知识更加结构化、系统化。

17

单片机课程设计

总之,本次设计在任课老师的辅导与大力支持下;在指导老师的耐心指导下;在各位同学和朋友的贴心帮助下解决了许多设计中的实际困难,我以最低的成本和最简单的方案设计出了功能强大的电子万年历。

18

单片机课程设计

参考文献

[1] 张迎新.单片微型计算机原理、应用及接口技术(第2版)[M].北京:国

防工业出版社,2004

[2] 何立民.单片机应用文集,北京:北京航空航天大学出版社,1991,53-72. [3] 公茂法.单片机人机接口实例集,北京:北京航空航天大学出版社,1998.2,

32-59.

[4] 何立明.单片机高级教程——应用与设计,北京:北京航天航空大学出版社,

2000.4,149-173.

[5] 李广弟,朱月秀.单片机基础,北京:北京航空航天大学出版社,2001.8,

36-85.

[6] 楼然苗,李光飞.MCS-51系列单片机设计实例,北京:北京航天航空大学

出版社,2001.3,75-83.

[7] 李华.单片机原理与接口技术,北京:清华大学出版社,33-80. [8] 王伟.高性能、低功耗带RAM实时时钟芯片DS1302(上),电子世界:第一

期,1995,26-35.

[9] 王伟.高性能、低功耗带RAM实时时钟芯片DS1302(下),电子世界:第

四期,1995,32-41.

单片机课程设计

附录A 源程序

/*----------------------------------------------- 名称:万年历 编写:王晓辉 日期:2015.1.X 修改:无

内容:DS1302实时时钟数码管显示,时间和日期切换显示 按下按键,循环切换

时间格式xx-xx-xx

日期格式xx-xx-xx 周秒格式-x- xx

------------------------------------------------*/

#include //包含头文件,头文件包含特殊功能寄存器的定义 #include \"ds1302.h\"

#define KeyPort P3 //定义按键端口

#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换

sbit LATCH1=P2^3;//定义锁存使能端口 段锁存 sbit LATCH2=P2^4;// 位锁存

bit ReadTimeFlag;//定义读时间标志 unsigned

char

code

dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9

unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分

20

单片机课程设计

别对应相应的数码管点亮,即位码

unsigned char TempData[8]; //存储显示值的全局变量

void DelayUs2x(unsigned char t);//us级延时函数声明 void DelayMs(unsigned char t); //ms级延时

void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数 unsigned char KeyScan(void);//键盘扫描 void Init_Timer0(void);//定时器初始化 void displaytime(void);//时间显示函数声明 void displaydate(void);//日期显示函数声明 void displatzhoumiao(void);//周秒显示函数声明 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) {

unsigned char num,displaynum; Init_Timer0(); Ds1302_Init(); //Ds1302_Write_Time(); while (1) //主循环 {

num=KeyScan(); //按键扫描 switch(num) {

case 1: displaynum++;

if(displaynum==3) displaynum=0;

21

单片机课程设计

break;

case 2: time_buf1[1]++;if(time_buf1[1]==100)time_buf1[1]=0;

Ds1302_Write_Time();break; //正常日期 年 加1

case 3: time_buf1[4]++;if(time_buf1[4]==24)time_buf1[4]=0;

Ds1302_Write_Time();break; //正常时间 小时 加1

case 4: time_buf1[1]--;if(time_buf1[1]==0)time_buf1[1]=99;

Ds1302_Write_Time();break; //正常日期 年 减1

case 5: time_buf1[5]++;if(time_buf1[5]==60)time_buf1[5]=0;

Ds1302_Write_Time();break;//分加1

case 6: time_buf1[2]++;if(time_buf1[2]==13)time_buf1[2]=1;

Ds1302_Write_Time();break; //正常日期 月 加1

case 7: break;

case 8: time_buf1[3]++;if(time_buf1[3]==32)time_buf1[3]=1;

Ds1302_Write_Time();break; //正常日期 日 加1

}

default: break;

if(ReadTimeFlag==1) {

ReadTimeFlag=0; Ds1302_Read_Time(); if(displaynum==0) //显示时间

displaytime();

else if(displaynum==1)//显示日期

displaydate();

else if(displaynum==2)//显示周秒

displatzhoumiao();

} }

22

单片机课程设计

}

/*------------------------------------------------

uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS

------------------------------------------------*/ void DelayUs2x(unsigned char t) { while(--t); }

/*------------------------------------------------

mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编 ------------------------------------------------*/ void DelayMs(unsigned char t) { while(t--) {

//大致延时1mS DelayUs2x(245); } }

/*------------------------------------------------

23

DelayUs2x(245);

单片机课程设计

显示函数,用于动态扫描数码管

输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示

如输入0表示从第一个显示。

Num表示需要显示的位数,如需要显示99两位数值则该值输入2 ------------------------------------------------*/

void Display(unsigned char FirstBit,unsigned char Num) {

static unsigned char i=0;

DataPort=0; //清空数据,防止有交替重影

LATCH1=1; //段锁存 LATCH1=0;

DataPort=dofly_WeiMa[i+FirstBit]; //取位码 LATCH2=1; //位锁存 LATCH2=0;

DataPort=TempData[i]; //取显示数据,段码 LATCH1=1; //段锁存 LATCH1=0;

i++;

if(i==Num)

24

i=0;

单片机课程设计

}

/*------------------------------------------------ 定时器初始化子程序 ------------------------------------------------*/ void Init_Timer0(void) {

TMOD |= 0x01; //使用模式1,16位定时器,使用\"|\"符号可以在使用多个定时器时不受影响 //TH0=0x00; //TL0=0x00;

EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 }

/*------------------------------------------------ 定时器中断子程序 ------------------------------------------------*/ void Timer0_isr(void) interrupt 1 {

static unsigned int num; TH0=(65536-2000)/256; TL0=(65536-2000)%256;

Display(0,8); // 调用数码管扫描 num++;

if(num==50) //大致100ms { num=0;

25

//给定初值

//重新赋值 2ms

单片机课程设计

ReadTimeFlag=1; //读标志位置1 }

/*------------------------------------------------ 按键扫描函数,返回扫描键值 ------------------------------------------------*/ unsigned char KeyScan(void) {

unsigned char keyvalue; if(KeyPort!=0xff) {

DelayMs(10); if(KeyPort!=0xff)

}

{

keyvalue=KeyPort; while(KeyPort!=0xff);

switch(keyvalue) {

case 0xfe:return 1;break; case 0xfd:return 2;break; case 0xfb:return 3;break; case 0xf7:return 4;break; case 0xef:return 5;break; case 0xdf:return 6;break; case 0xbf:return 7;break; case 0x7f:return 8;break; default:return 0;break;

26

单片机课程设计

}

}

} return 0; }

/*------------------------------------------------ 时间显示子程序 ------------------------------------------------*/ void displaytime(void) {

TempData[0]=dofly_DuanMa[time_buf1[4]/10];//时 //数据的转换,

TempData[1]=dofly_DuanMa[time_buf1[4]%10];//因我们采用数码管0~9的显示,将数据分开 TempData[2]=0x40;

//加入\"-\"

TempData[3]=dofly_DuanMa[time_buf1[5]/10];//分 TempData[4]=dofly_DuanMa[time_buf1[5]%10]; TempData[5]=0x40;

TempData[6]=dofly_DuanMa[time_buf1[6]/10];//秒 TempData[7]=dofly_DuanMa[time_buf1[6]%10]; }

/*------------------------------------------------ 日期显示子程序 ------------------------------------------------*/ void displaydate(void) {

27

单片机课程设计

TempData[0]=dofly_DuanMa[time_buf1[1]/10];//年 TempData[1]=dofly_DuanMa[time_buf1[1]%10]; TempData[2]=0x40;

//加入\"-\"

TempData[3]=dofly_DuanMa[time_buf1[2]/10];//月 TempData[4]=dofly_DuanMa[time_buf1[2]%10]; TempData[5]=0x40;

TempData[6]=dofly_DuanMa[time_buf1[3]/10];//日 TempData[7]=dofly_DuanMa[time_buf1[3]%10]; }

/*------------------------------------------------ 周秒显示子程序 ------------------------------------------------*/ void displatzhoumiao(void) {

TempData[0]=0x40;

TempData[1]=dofly_DuanMa[time_buf1[7]%10];//周 TempData[2]=0x40; //加入\"-\" TempData[3]=0; TempData[4]=0; TempData[5]=0;

TempData[6]=dofly_DuanMa[time_buf1[6]/10];//秒 TempData[7]=dofly_DuanMa[time_buf1[6]%10]; }

28

单片机课程设计

附录B 系统原理图

29

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- esig.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务