基于51单片机的数字时钟的设计-毕业论文 - 图文

更新时间:2024-03-28 18:01:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

青岛农业大学

毕 业 论 文(设计)

题 目:姓 名:学 院:专 业:班 级:学 号:指导教师: 基于51单片机的数字时钟的设计

2011年6月18日

毕业论文(设计)诚信声明

本人声明:所呈交的毕业论文(设计)是在导师指导下进行的研究工作及取得的研究成果,论文中引用他人的文献、数据、图表、资料均已作明确标注,论文中的结论和成果为本人独立完成,真实可靠,不包含他人成果及已获得青岛农业大学或其他教育机构的学位或证书使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说明并表示了谢意。

论文(设计)作者签名: 日期: 年 月 日

毕业论文(设计)版权使用授权书

本毕业论文(设计)作者同意学校保留并向国家有关部门或机构送交论文(设计)的复印件和电子版,允许论文(设计)被查阅和借阅。本人授权青岛农业大学可以将本毕业论文(设计)全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本毕业论文(设计)。本人离校后发表或使用该毕业论文(设计)或与该论文(设计)直接相关的学术论文或成果时,单位署名为青岛农业大学。

论文(设计)作者签名: 日期: 年 月 日 指 导 教 师 签 名: 日期: 年 月 日

目录

摘要: .............................................................. 1 ABSTRACT ........................................................... 1 1 绪论 ............................................................. 1 2 硬件总体设计方案 ................................................. 2 2.1 系统功能实现总体设计思路 ........................................ 2 2.2 各部分功能实现 .................................................. 2 2.3 系统工作原理 .................................................... 2 2.4 电路功能使用说明 ................................................ 3 2.5 系统的设计方案 .................................................. 4 2.5.1 系统的电路图和原理图.......................................... 4 2.5.2 单片机概述.................................................... 6 2.5.3 键盘电路...................................................... 9 2.5.4 显示电路..................................................... 10 2.6 硬件焊接准备 ................................................... 12 2.6.1电路板的布线 ................................................. 12 2.6.2 硬件电路元件明细表........................................... 13 3 软件总体设计方案 ................................................ 14 3.1 程序流程图 ..................................................... 14 3.1.1主程序流程图 ................................................. 14 3.1.2 按键处理流程图............................................... 14 3.1.3 定时器中断流程图............................................. 14 3.1.4 时间显示流程图............................................... 15 3.2 调试结果说明 ................................................... 16 4总结 ............................................................. 18 致 谢 ............................................................ 19 参考文献 ........................................................... 1 附录 ............................................................... 1

1

基于51单片机的数字时钟的设计

电子信息科学与技术专业 孙彬

指导教师 车晓岩

摘要: 自诞生以来,单片机的应用日趋广泛,应用领域日趋扩展,而MCS-51系列单片机是各单片机中最为典型的一种。这次毕业设计,以AT89C51芯片为核心,通过必要的电路,构成简单的电子时钟。数字时钟系统的主要任务是:采用单片机为核心器件产生24h(24小时)时间,并用LED显示器将他显示出来。另外本设计具有闹铃的功能,通过拉蜂鸣器来做提醒。这样简单的设计,直观反映单片机的应用。软件和硬件的开发是这次设计必不可少的。 关键词:AT89C51;数字时钟;LED数码显示管;C语言

1

Design of Digital Clock System Based on MSC-51 Singlechip

Electronic Information Science and Technology SunBin

Tutor CheXiaoYan

Abstract: The applications of single-chip have been spread widely,and the areas of its application have been expanding increasingly since its inception. and MCS-51 series single-chip microcontroller is the most typical one. In the graduation-design , AT89C51 chip is the core of the necessary circuitry to form a simple electronic clock. Here are the main tasks of the digital clock system : as the core device ,Single-chip creates 24h (24 hour) time which will he displayed by the LED .In addition ,this design has the function of alarm by making the buzzer to do as a reminder. This simple design can reflect the intuitive applications of the microcontroller. Software and hardware development is essential to this design .

Keywords: SCM; The LED display; A digital clock; Assembly language

1

1 绪论

数字时钟作为人们日常生活中的必需品,给人们的学习、工作、生活带来极大的便利。由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域[1]。尽管目前市场上已有现成的数字钟集成电路芯片出售,价格便宜、使用也方便,但鉴于单片机的定时器功能也可以完成数字钟电路的设计,因此进行数字钟的设计是必要的。在这里我们将已学过的专业知识有机的、系统的联系起来用于实际,来培养我们的综合分析和设计电路,写程序、调试电路的能力。

单片机具有体积小、功能强可靠性高、价格低廉、走时准确、性能稳定、携带方便等一系列优点,不仅已成为工业测控领域普遍采用的智能化控制工具,而且已渗入到人们工作和和生活的各个角落,有力地推动了各行业的技术改造和产品的更新换代,应用前景广阔。

培养针对课题需要,选择和查阅有关手册、图表及文献资料的自学能力,提高组成系统、编程、调试的动手能力;巩固、加深和扩大单片机应用的知识面,提高综合及灵活运用所学知识解决工业控制的能力;过对课题设计方案的分析、选择、比较、熟悉单片机用系统开发、研制的过程,软硬件设计的方法、内容及步骤。

1

2 硬件总体设计方案

本次设计时钟电路,使用了AT89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的时、分、秒,用一扬声器来进行定时提醒,同时使用C语言程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:键盘、芯片、扬声器、显示屏即可满足设计要求。 2.1 系统功能实现总体设计思路

此设计原理框图如图2-1所示,此电路包括以下四个部分:单片机,键盘,闹铃电路及显示电路。

数码管显示 独立键盘

51单片机 闹铃电路

图2-1 设计原理框图

2.2 各部分功能实现

(1) 单片机发送的信号通过程序控制最终在数码管上显示出来。 (2) 单片机通过输出各种电脉冲信号来驱动控制各部分正常工作。

(3) 为使时钟走时与标准时间一致,校时电路是必不可少的,键盘用来校正数

码管上显示的时间。

(4) 单片机通过控制闹铃电路来完成 定时闹钟的功能。 2.3 系统工作原理

设计的电路主要由四模块构成:单片机控制电路,显示电路、闹铃电路以及校正电路。

详细电路功能图下图所示:

2

图2-2 详细电路功能图

本设计采用C语言程序设计,使单片机控制数码管显示时、分、秒,当秒计数计满60时就向分进位,分计数器计满60后向时计数器进位,小时计数器按“23翻0”规律计数。时、分、秒的计数结果经过数据处理可直接送显示器显示。当计时发生误差的时候可以用校时电路进行校正。设计采用的是时、分、秒显示,单片机对数据进行处理同时在数码管上显示。 2.4 电路功能使用说明

(1) 各个控制键的功能:可对时间进行校准调节(只能加1);按下设置键数字时钟进入闹钟设置状态,设置闹钟的时间;时加1、分加1键是在校准时间时或设置闹钟时间对小时数或分钟数调节而设置的;按下秒切换键就可以进入秒表模式,同时秒表也开始计时,按下秒表暂停、复位键就暂停、归零,如果要重新对秒计时则可以按秒表开始、复位;清零键可以对闹钟清零。 (2)AT89C51单片机,通过编写程序对数码显示进行控制。 (3)八个7段数码管显示时钟和秒表信号。

3

2.5 系统的设计方案 2.5.1 系统的电路图和原理图

图2-3 数字时钟电路图

4

图2-4 数字时钟电路原理图

5

2.5.2 单片机概述

(1)单片机型号的选择:AT89C51

图2-5 AT89C51引脚图

(2)单片机的主要特点

AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机[2]。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 主要特性:

·与MCS-51 兼容

·4K字节可编程FLASH存储器 ·寿命:1000写/擦循环 ·数据保留时间:10年 ·全静态工作:0Hz-24MHz ·三级程序存储器锁定 ·128×8位内部RAM

6

·32可编程I/O线

·两个16位定时器/计数器 ·5个中断源 ·可编程串行通道

·低功耗的闲置和掉电模式

·片内振荡器和时钟电路 (3)管脚说明: VCC:供电电压。 GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由

7

于上拉的缘故。

也可作为AT89C51的一些特殊口,如下表所示:

表2-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(外部数据存储器读选通)

RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。

/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:来自反向振荡器的输出

8

2.5.3 键盘电路 (1)键盘电路的描述:

作为整个系统中最简单的部分,可以根据功能要求,进行时间设置键、闹钟设置键、时间加键、时间减键等操作,并采用独立式按键。 (2)键盘电路图:

图2-6 键盘电路

(3)键盘的工作原理:

键盘是人与微机打交道的主要设备,按键的读取容易引起误动作。可采用软件去抖动的方法处理,软件的触点在闭合和断开的时候会产生抖动,这时触点的逻辑电平是不稳定的,如不采取妥善处理的话,将引起按键命令错误或重复执行,在这里采用软件延时的方法来避开抖动,延时时间20ms[3]。

独立式按键的软件常采用查询式结构。诸位查询每根I/O口线的输入状态,如某一根I/O线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。

连击功能的实现 :按下某键时,对应的功能键解释程序得到执行,如操作者没有释放按键,则对应的功能会反复执行,好象连续执行,在这里我们采用软件延时250ms,当按键没释放则执行下一条对应程序。利用连击功能,能实现快速调时操作。

(4)键盘电路应注意的问题:

1) 开关状态的可靠输入,必须消除键抖动,可以采用硬件和软件两种方法,硬件方法就是在按键输入通道上贴加去抖动电路,软件方法采用延迟

9

10-20MS。

2) 键盘状态的检测方法——中断方式还是查询方式。 3) 键盘编码方法。 4) 键盘控制程序的编制。 2.5.4 显示电路

(1) LED数码显示管简介

数码管由7个发光二极管组成,行成一个日字形,它门可以共阴极,也可以共阳极。通过解码电路得到的数码接通相应的发光二极而形成相应的字,这就是它的工作原理。基本的半导体数码管是由7个条状的发光二极管(LED)排列而成的,可实现数字\~9\及少量字符的显示。另外为了显示小数点,增加了1个点状的发光二极管,因此数码管就由8个LED组成[5]。 (2) 数码管的分类:

数码管按各发光二极管电极的连接方式分为共阳数码管和共阴数码管两种。 7段共阳极LED数码管是由7个条形发光二极管和一个小数点位构成,其引脚配置,如图所示,其内部结构,如图所示。从图中可以看出,其中7个发光二极管构成字形“8”,可以用来显示数字,另一个发光二极管构成小数点。

图2-7 共阳极7段LED引脚设置和内部结构

共阴极7段LED数码管和共阳极LED数码管结构类似,其引脚配置,如图所示。从图中可以看出7段LED数码管同样由8个发光二极管组成,其中7个发光二极管构成字形“8”,另一个发光二极管构成小数点。共阴极7段LED数码管的内部结构,如图所示。其中所有发光二极管的阴极为公共端,接GND[6]。如果发光二极管的阳极极为高电平的时候,发光二极管导通,该字段发光;反之,如果

10

发光二极管的阳极为低电平的时候,发光二极管截止,该字段不发光。

图2-8共阴极7段LED引脚设置和内部结构

(3) 数码管的显示方式:

数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类[7]。

1)动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划\的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。

2)静态显示驱动:静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O

11

端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个。),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性[8]。 (4)LED数码管的选择:四位一体共阴数码管。 2.6 硬件焊接准备 2.6.1 电路板的布线

图2-9电路板的布线

通过电路板的布线设计,初步掌握焊接硬件的必要准备,也能够在实际的数字时钟焊接中,做好元器件的布局,使更美观。

12

2.6.2 硬件电路元件明细表

表3-1 硬件电路原件

编号 1 2 3 4 5 6 7 8 9 10 11 12 13 元件 单片机 40PIC座 万用板 LED数码管 排阻 晶振 电容 蜂鸣器 三极管 电阻 按键 DC座 USB电源线 参数

AT89C51 1只

1只

7cm*9cm 1片

四位一体共阴0.36寸 2只

1K 1只 12M 1只 22P 2只 1个 S8550 1只 4.7K 2只

5个 1个 1条1

13

3 软件总体设计方案

单片机软件的设计也是工具系统功能的设计,对于数字时钟的实现和正常运

行也是非常重要的[9]。为提高软件的可行性,可以根据各部分的功能件软件划分为若干相对独立的部分,使软件开发结构更合理,流程更清晰。建立正确的数学模型,绘制流程图对软件工程的实施会有很大帮助。 3.1 程序流程图 3.1.1 主程序流程图

主程序是先开始,然后启动定时器,再进行检测,完成之后,就能显示时间。

开始 定时器及中断定时器初始化 是否设定参数 执行显示程序 N 执行时钟闹铃设定Y 图3-1主程序流程图

3.1.2 按键处理流程图

按键处理时先检测秒按键是否按下,如果按下,秒就加1;如果没有按下,就检测分按键是否按下,分按键如果按下,分加1;如果没有就检测时按键,如果按下就加1,如果没有,时间显示。流程图如图3-1所示。 3.1.3 定时器中断流程图

定时器中断时是先检测1秒是否到,1秒如果到,秒单位就加1;如果没有到,就检测1分钟是否到,1分钟如果到,分单元就加1.如果没到,就检测1小时是否到,1小时如果到,时单元就加1,如果没到,就显示时间。流程图如3-2示。

14

开始 开始 N N 秒按键按下? 1秒时间到? Y 秒单元加1 Y 秒加1 N N 分按键按下? 60秒时间到? Y 秒单元清零,分单元加1 Y 分加1 N N 时按键按下? 60分钟到? Y 分单位清零,时单元加1 Y 时加1 24小时到? 显示时间 时单元清零 结束 显示时间 中断返回 图3-2按键处理流程图 图3-3 定时器中断流程图

3.1.4 时间显示流程图

时间显示是先秒个位计算显示,然后是秒十位计算、依次分个位计算、分十位计算、时个位计算、时十位计算。

15

秒 开 始 个位计算显示秒十位计算显示 分个位计算显示 结 束 时十位计算显示 时个位计算显示 图3-4 时间显示流程图

分十位计算显示

3.2 调试结果说明

在调试的过程中出现拉很多的问题,真对这些问题我进行拉系统的分析。 (1)数据与代码转换。

由前述可知,从P2 口输出位选码,从P0 口输出段选码,LED 就会显示出数字来。但P0 口的输出的数据是要BCD 码,各存储单元存储的是二进制数,也就是和要显示出的字符表达的含义是不一致的。可见,将要显示的存储单元的数据直接送到P0 口去驱动LED 数码管显示是不能正确表达的,必须在系统内部将要显示的数据经过BCD 码行转换后,将各个单元数据的段选代码送入P0 口,给CD4511 译码后去驱动数码管显示[10]。

具体转换过程如下:

先将要显示的数据装入累加器A 中,再将A 中的数据转换成高低两位的BCD 码, 再放回A 中,然后将A 中的值输出。如:有一个单元存储了45 这样一位数,则需转换成四位的BCD 码:(0100)(0101)然后放入A 中。 A 中BCD 码,高位四位代表4低四位代表5同时送给两个译码器中,译码后45字就在两个LED 中显示出来。

(2)计时功能的实现与中断服务程序

时间的运行依靠定时中断子程序对时钟单元数值进位调整来实现的。计数器

16

T0 打开后, 进入计时,满100 毫秒后,重装定时。中断一次,满一秒后秒进位,满60 秒后即为1 分钟, 分钟单元进位,60 分到了后,时单元进位,24 小时满后,天单元进位。这样然后根据进率, 得到时、分、秒存储单元的值,并经译码后,通过扫描程序送LED 中显示出来, 实现时钟计时功能。累加是用指令INC 来实现的。 进入中断服务程序以后,执行PUSH PSW 和PUSH A 将程序状态寄存器PSW 的内容和累加器A 中的数据保存起来,这便是所谓的保护现场, 以保护现场和恢复现场时存取关键数据的存储区叫做堆栈。在软件的控制之下,堆栈可在片内RAM 中的任一区间设定,而堆栈的数据存取与一般的RAM 存取又有区别,对它的操作要遵循后进先出的原则。

(3)时钟误差分析

开启定时器/计数器0,使之开始计时,中断后进入中断程序。自停止计数到、计数又开始,中间执行了7 条指令,也就是延迟了13 个单周期共用时间26us,这样,每个中断的总时间应为为100.026sm,而原来定时是100ms,所以,也就是说每次中断定时多了26um。 这样,可改变计数重装值,使每次中断定时时间为99.974sm,加上原来的7 条指令所用的时间,正好100sm.计数10 次得1s.这样就可得到较精确的计时秒数,然后根据进率,得到时、分的值。

(4)时间控制功能与比较指令

系统的另一功能就是实现对执行设备的定时开关控制,其主要控制思想是这样的:先将执行设备开启的时间和关闭时间置入RAM 某一单元,在计时主程序当中执行几条比较指令,如果当前计时时间与执行设备的设定开启时间相等,就执行一条 CLR 指令,将对应的那路P3 置为高电位,开启;如果当前计时时间与执行设备设定的关闭时间相等,就执行SETB 对应的P3 置低电位,二极管截止,。实现此控制功能用到的比较指令为CJNE A,#direct, rel,其转移条件是累加器A 中的值与立即数不等则转移。

17

4 总结

这次对数字钟的设计与制作,让我了解了设计电路的程序,也让我了解了关于数字钟的原理与设计理念。在此次的数字钟设计过程中,更进一步地熟悉了芯片的结构及掌握了各芯片的工作原理和其具体的使用方法。

在连接单片机与其他外部电路的实验中,要求熟悉逻辑电路及其芯片各引脚的功能,那么在电路出错时便能准确地找出错误所在并及时纠正了。在设计电路中,对单片机的编程的进一步的熟悉与学习让我明白拉许多自己没有掌握的功能,对单片机有拉更深刻的理解。再就是电路的连接中的一些小的的注意的问题像极性电容器其 “ + ” 与 “ - ” 极不能接错,例如电容器上的标记方向要易看可见。

在设计电路的连接图中出错的主要原因都是接线和芯片的接触不良以及接线的错误所引起的。接线的时候一定要细心,不要接错,同时也要学会如何判别芯片的好坏,要是芯片坏了即使接线再正确也出不来结果。对自己的设计图要仔细考虑,反复调试只有这样我们才能找到自己的不足从不足中学习。

通过这次数字钟的设计,让我对各种电路都有了大概的了解,也学会了常用绘图软件的使用。所以说,坐而言不如立而行,对于这些电路还是应该自己动手实际操作才会有深刻理解,才会有收获。当然我做出这样的文章也是离不开老师对我的细心指导的,所以在这里我感谢老师感谢帮助过我的所有的人。

18

致谢

毕业设计是培养我们工作能力的最后一个实践性的学习环节。它不但是我们三年大学学习中所学知识的一次综合复习与考查,同时也是理论联系实际的一个过程,为以后从事专业技术工作的一次准备。

通过此次毕业设计,培养了我综合运用所学的基础理论课、技术基础课、专业课的知识和实践技能去分析和解决实际工作中的一般工程技术问题的能力,使我建立了正确的设计思想,学会了如何把三年所学的理论知识运用到实践当中去。掌握了单片机的数字时钟设计的一般程序、规范和方法,并进一步巩固、扩大和深化了我所学的基本理论,基本知识和基本技能,提高了我设计计算、计算机制图、设计说明书、正确使用技术资料,标准手册等工具书的能力。

在毕业设计的过程中,虽然本人在指导老师的帮助下对所设计的问题有初步的实习调研。但由于本人缺少实际工作经验,遇到了一些设计和实际加工中的问题,受到师傅和指导老师的指导与帮助,从而得到了全面的解决同时也受到各位老师优良工作作风的影响,培养了我严肃认真、一丝不苟和实事求是的工作作风,并树立了正确的生产观、经济观和全局观。

在设计中,由于个人能力有限,设计中漏洞和错误在所难免,敬请各位老师指正批评,以使我对自己的不足得到及时发现并修正。

通过此次毕业设计,希望能把所学的知识有机的联系起来,培养自己分析问题,解决问题的能力,为充实自己,并在未来工作岗位上好好工作打下坚实的基础。

在这里,向在这次毕业设计中给予过帮助我的老师表示衷心的谢意。

19

参考文献

[1]彭为,黄科.单片机典型系统设计实例精讲.电子工业出版社,2006

[2]梅丽凤,王艳秋.单片机原理及接口技术(修订本).清华大学出版社,2007 [3]毛敏.MCS-51系列单片机系统及应用实践教程.高等教育出版社,2009

[4]胡杰,吴磊,赵鸣.51单片机C语言应用与开发. 北京航空航天大学出版社,2008 [5]谭浩强. C程序设计(第二版)[M]. 清华大学出版社,2003 [6]马轲瀛.八路数字抢答器系统[J].北京,2007

[7]蔡朝阳.单片机控制实习与专题制作[M].北京:北京航空航天大学出版社,2006 [8]李增生.对抢答器的改进[J].电子制作,2000

[9] 高伟.AT89单片机原理及应用[M].北京:国防工业出版社,2008 [10] Gordon McComb. Constructing Robot Bases.北京:机械工业出版社,2006.

20

附录

控制电路的源程序 #include

#define tl 0xba; #define th 0x3c;

sbit time=P1^0; //时间设置 sbit timer=P1^1; //闹钟设置 sbit add=P1^2; //加 sbit dec=P1^3; //减

sbit speaker=P3^5; //闹钟输出

bit disp_sd; //数码管闪动显示标志位

bit disp_ms; //数码管显示时间/闹钟标志位 bit disp_sdt; //数码管闪动间隔反转标志位 bit zhengdian=0; //整点报时标志位

//unsigned char code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数字0-9的编码 unsigned char code led[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x45,0xDF,0xD7,}; //数字0-9的编码

unsigned char time_cc,timer_cc; //调时计数器 unsigned char count0,count1,second,minit,hour; //时间时分秒 unsigned char second1,minit1,hour1; //闹钟时分秒 unsigned char hour_zd; //整点小时记录

void delay(void) {

unsigned int i; for(i=0;i<100;i++); }

void display(void) {

if(disp_ms==0) {

if(disp_sd==0) {

P0=led[hour/10];

P2=0xFE; delay(); P2=0xFF; P0=led[hour]; P2=0xFD; delay(); P2=0xFF; P0=0x80; P2=0xFB; delay(); P2=0xFF;

P0=led[minit/10]; P2=0xF7; delay(); P2=0xFF;

P0=led[minit]; P2=0xEF; delay(); P2=0xFF;

P0=0x80; P2=0xDF; delay(); P2=0xFF;

P0=led[second/10]; P2=0xBF; delay();

P2=0xFF;

P0=led[second]; P2=0x7F; delay(); P2=0xFF; } else {

if(time_cc==0x01) {

if(disp_sdt==1)

2

P0=led[hour/10]; else

P0=0x00; P2=0xFE; delay(); P2=0xFF;

if(disp_sdt==1)

P0=led[hour]; else

P0=0x00; P2=0xFD; delay(); P2=0xFF; } else {

P0=led[hour/10]; P2=0xFE; delay(); P2=0xFF; }

P0=led[hour]; P2=0xFD; delay(); P2=0xFF;

P0=0x80; P2=0xFB; delay(); P2=0xFF;

if(time_cc==0x02) {

if(disp_sdt==1)

P0=led[minit/10]; else

P0=0x00; P2=0xF7; delay(); P2=0xFF;

if(disp_sdt==1)

3

P0=led[minit]; else

P0=0x00; P2=0xEF; delay(); P2=0xFF; } else {

P0=led[minit/10]; P2=0xF7; delay(); P2=0xFF; }

P0=led[minit]; P2=0xEF; delay(); P2=0xFF;

P0=0x80; P2=0xDF; delay(); P2=0xFF;

if(time_cc==0x03) {

if(disp_sdt==1)

P0=led[second/10]; else

P0=0x00; P2=0xBF; delay(); P2=0xFF; }

if(disp_sdt==1)

P0=led[second]; else

P0=0x00; P2=0x7F; delay(); P2=0xFF;

4

else {

P0=led[second/10]; P2=0xBF; delay(); P2=0xFF;

P0=led[second]; P2=0x7F; delay(); P2=0xFF; } } } else {

if(disp_sd==0) {

P0=led[hour1/10]; P2=0xFE; delay(); P2=0xFF; P0=led[hour1]; P2=0xFD; delay(); P2=0xFF; P0=0x80; P2=0xFB; delay(); P2=0xFF;

P0=led[minit1/10]; P2=0xF7; delay(); P2=0xFF;

P0=led[minit1]; P2=0xEF; delay(); P2=0xFF;

P0=0x80;

5

P2=0xDF; delay(); P2=0xFF;

P0=led[second1/10]; P2=0xBF; delay(); P2=0xFF;

P0=led[second1]; P2=0x7F; delay(); P2=0xFF; } else {

if(timer_cc==0x01) {

if(disp_sdt==1)

P0=led[hour1/10]; else

P0=0x00; P2=0xFE; delay(); P2=0xFF;

if(disp_sdt==1)

P0=led[hour1]; else

P0=0x00; P2=0xFD; delay(); P2=0xFF; } else {

P0=led[hour1/10]; P2=0xFE; delay(); P2=0xFF;

P0=led[hour1]; P2=0xFD; delay();

6

P2=0xFF; }

P0=0x80; P2=0xFB; delay(); P2=0xFF;

if(timer_cc==0x02) {

if(disp_sdt==1)

P0=led[minit1/10]; else

P0=0x00; P2=0xF7; delay(); P2=0xFF;

if(disp_sdt==1)

P0=led[minit1]; else

P0=0x00; P2=0xEF; delay(); P2=0xFF; } else {

P0=led[minit1/10]; P2=0xF7; delay(); P2=0xFF; }

P0=led[minit1]; P2=0xEF; delay(); P2=0xFF;

P0=0x80; P2=0xDF; delay(); P2=0xFF;

7

if(timer_cc==0x03) {

if(disp_sdt==1)

P0=led[second1/10]; else

P0=0x00; P2=0xBF; delay(); P2=0xFF;

if(disp_sdt==1)

P0=led[second1]; else

P0=0x00; P2=0x7F; delay(); P2=0xFF; } else {

P0=led[second1/10]; P2=0xBF; delay(); P2=0xFF;

P0=led[second1]; P2=0x7F; delay(); P2=0xFF; } } } }

void key_scan(void) {

unsigned int i; if(time==0) {

speaker=1;

for(i=0;i<10;i++) display(); if(time==0) {

TR0=0;

8

do

display(); while(time==0); disp_sd=1; disp_ms=0; time_cc++; if(time_cc==4) {

TR0=1; time_cc=0; disp_sd=0; } } }

if(timer==0) {

speaker=1;

for(i=0;i<10;i++) {

display(); }

if(timer==0) {

do

display(); while(timer==0); disp_sd=1; disp_ms=1; timer_cc++; if(timer_cc==4) {

timer_cc=0; disp_sd=0; disp_ms=0; }

} }

if(add==0) {

for(i=0;i<10;i++) {

display(); }

//数码管闪动显示 //显示模式为闹钟时间//闪动关闭

//切换到时间模式

9

if(add==0) {

do

display(); while(add==0); if(disp_ms==0) {

switch(time_cc) {

case (0x01): { hour++; if(hour>23) hour=23; break;} case (0x02): { minit++; if(minit>59) minit=59; break;}

case (0x03): { second++;if(second>59) second=59; break;}

default: break; } } else {

switch(timer_cc) {

case (0x01): {if(hour1==23) hour1=23; else hour1++; break;}

case (0x02): {if(minit1==59) minit1=59; else minit1++; break;}

case (0x03): {if(second1==59) second1=59; else second1++; break;}

default:break; } } } }

if(dec==0) {

for(i=0;i<10;i++) {

display(); } if(dec==0) {

do

display(); while(dec==0);

10

if(disp_ms==0) {

switch(time_cc) {

case (0x01): {if(hour==0) hour=0; else hour--; break;} case (0x02): {if(minit==0) minit=0; else minit--; break;}

case (0x03): {if(second==0) second=0; else second--; break;}

default: break; }

} else {

switch(timer_cc) {

case (0x01): {if(hour1==0) hour1=0; else hour1--; break;}

case (0x02): {if(minit1==0) minit1=0; else minit1--; break;}

case (0x03): {if(second1==0) second1=0; else second1--; break;}

default: break; } } } } }

void timer_alam(void) {

if((disp_ms==0)&&(disp_sd==0)) //正常运行时间的状态下 {

if((hour1==hour)&&(minit1==minit)) {

speaker=disp_sdt; } else {

11

if(zhengdian==1) {

speaker=disp_sdt; } else

speaker=1; } } }

//******************************主

*************************************************

void main(void) {

second=0x00; //时间初始化为12:00:00 minit=0x00; hour=12; count0=0x00; count1=0x00; P1=0xFF; TMOD=0x11; TL0=tl; TH0=th; TL1=tl; TH1=th; EA=1; ET0=1; ET1=1; TR0=1; TR1=1; while(1) {

key_scan(); display(); timer_alam(); } }

//*********************************中断服************************************** void time0_int(void) interrupt 1 {

12

务函数

TL0=tl; TH0=th; TR0=1; count0++;

if(count0==20) {

count0=0; second++;

if(hour_zd==second) //报时到小时数后关闭报时标志。 zhengdian=0; if(second==60) {

second=0; minit++;

if(minit==60) {

zhengdian=1; //开启整点报时 minit=0; hour++;

hour_zd=hour; if(hour_zd>12)

hour_zd=hour_zd-12; //12小时制报时方式 if(hour==24) {

hour=0; } } } } }

//*********************************中断服务函************************************** void time1_int(void) interrupt 3 {

TL1=tl; TH1=th; TR1=1; count1++;

if(count1==10) {

count1=0;

disp_sdt=~disp_sdt; }

}

13

本文来源:https://www.bwwdw.com/article/jkkr.html

Top