您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页单片机制作万年历的研究

单片机制作万年历的研究

来源:华佗小知识
a

毕 业 设 计(论文)

题 目:单片机制作万年历的研究

a

a

摘 要

电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。该电路采用ATS51单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。

本设计是基于51系列的单片机进行的电子万年历设计,可以显示年月日时分秒及周信息,具有可调整日期和时间功能。在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面准备。在硬件与软件设计时,没有良好的基础知识和实践经验会受到很大,每项功能实现时需要那种硬件,程序该如何编写,算法如何实现等,没有一定的基础就不可能很好的实现。在编写程序过程中发现以现有的相关知识要独自完成编写任务困难重重,在老师和同学的帮助下才完成了程序部分的编写。

万年历的设计过程在硬件与软件方面进行同步设计。硬件部分主要由ATC51单片机,LED显示电路,以及调时按键电路等组成。在单片机的选择上本人使用了ATC51单片机,该单片机适合于许多较为复杂控制应用场合。显示器使用2片7SEG-MPX8-CA和一片7SEG-MPX4-CA。7SEG-MPX8-CA是一种八个共阳二极管显示器,7SEG-MPX4-CA是一种四个共阳二极管显示器。为了能更轻松的控制这三片显示器,本人使用了3片74HC1来驱动。74HC1 是 8 位边沿触发式移位寄存器,串行输入数据,

a

a

然后并行输出。软件方面主要包括日历程序、时间调整程序,公历转阴历程序,显示程序等。程序采用汇编语言编写,以便更简单地实现调整时间及阴历显示功能。所有程序编写完成后,在wave软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真。最后总在老师同学的帮助以及自己的努力下完成了此次电子万年历的设计。

a

a

关键词:时钟电钟;DS1302;DS18B20;动态扫描;单片机

ABSTRACT

E-calendar day time is a very wide range of tools, increasingly popular in modern society. It can be year, month, day, Sunday, hours, minutes, seconds for time, but also has a leap year compensation to a variety of functions, and the DS1302's long life, small error. For the digital electronic calendar using an intuitive digital display can simultaneously display year, month, day, Sunday, hours, minutes, seconds, and temperature and other information, but also a time-calibration and other functions. The circuit uses ATS51 microcontroller as the core, power consumption, low-voltage work in 3V, the voltage can choose 3 ~ 5V voltage supply.

The design is based on 51 series of microcontrollers to the design of electronic calendar, you can display date information on when the minutes and seconds, and weeks, with adjustable date and time functions. At the same time in the design of the theoretical basis of the MCU and peripheral expansion of knowledge of the more

a

a

comprehensive preparation. The hardware and software design, there is no good basic knowledge and practical experience will be greatly limited, each feature is required to achieve the kind of hardware, procedures, how to write, how to implement such algorithms, there is no certain foundation can not be good implementation. Found during the preparation process to the existing knowledge to complete preparation of the task alone difficult,

a

the a

In the help of teachers and students to complete the program part of the preparation.

Calendar of the design process in hardware and software to synchronize the design. Hardware mainly by the ATC51 microcontroller, LED display circuit, and the tune composed of the circuit when the button. In the SCM choice I used the ATC52 microcontroller, which is suitable for many of the more complex control applications. Monitor the use of two 7SEG-MPX8-CA and a 7SEG-MPX4-CA. 7SEG-MPX8-CA is a total of eight-yang diode display, 7SEG-MPX4-CA is a total of four-yang diode display. In order to more easily control the three monitors, I use three 74HC1 to drive.

74HC1 is an 8-bit edge-triggered shift register, serial input data, and parallel output. The software includes calendar program, time to adjust procedures, turn the lunar calendar programs, display programs. Programs written in assembly language used in order to more easily adjust the time and the realization of the lunar calendar display. All programming is complete, the wave software debugging, make sure that no problems, in the Proteus software within a microcontroller embedded in the simulation. The final overall the teacher to help students, as well as their own efforts to complete the design of the electronic calendar.

a

a

Keywords: Clock electric clock;DS1302;DS18B20;Dynamic scan;scm

a

a

目 录

第一章 引言 .............................................................. 1

1.1选题背景 .................................................................................................. 1 1.2单片机的简介 ............................................................................................ 1 1.3单片机的发展趋势 ...................................................................................... 1

第二章 设计要求与方案论证 ...................................... 4

2.1设计要求 ................................................................................................... 4 2.2系统基本方案选择和论证 ............................................................................. 4

2.3键盘的选择 ............................................................................................... 6 2.4实现定时 ................................................................................................... 6

2.2.1单片机芯片的选择方案和论证 ................................................................. 4 2.2.2显示模块选择方案 ................................................................................ 5

a

a

2.5电路设计最终方案决定 ................................................................................. 7

第三章 系统的硬件设计与实现 ................................... 8

3.1电路设计框图 ............................................................................................. 8 3.2系统硬件概述 ............................................................................................ 8 3.3 主要单元电路的设计 .................................................................................. 8

3.3.1单片机主控制模块的设计 ....................................................................... 8 3.3.2时钟电路模块的设计 .............................................................................. 9 3.3.3电路原理及说明 ................................................................................... 10 3.3.4显示模块的设计 ...................................................................................12

第四章 系统的软件设计 ............................................ 13

4.1程序流程框图 ............................................................................................13 4.2源代码 .....................................................................................................16

第五章 结论 ............................................................ 31 致谢 ........................................................................ 33 参考文献 .................................................................. 34

附录

a

a

第一章 引言

1.1选题背景

在社会迅速发展的今天,单片机的运用已经神偷到我们生活的每个角落,也似乎很难找到哪个领域没有单片机的足迹。智能仪表、医疗器械,导弹的导航装置、智能监控、通讯与数据传输、工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,汽车的安全保障系统,动控制领域的机器人,数码相机、电视机、全自动洗衣机的控制,电话机以及程控玩具,电子宠物等,这些都离不开单片机。

所以,单片机的学习、开发与应用将对于现代社会的发展、经济的繁荣,和提高满足人类日益增长的物质文化需求有着至关重要的作用。

随着经济的不断发展,人们对生活质量的要求也在不断地提高。厂家也不断的推出各种电子产品以满足人们的需要,而电子万年历则顺应了人们对时间方面的要求。传统的电子万年历功能较为单一,价格较高,较难走进千家万户,没能达到人们生活中所需要的最基本要求,本课题旨在设计一款,功能较全面,价格较低且实用性强的电子万年历,以满足不同使用者的需求。

1.2单片机的简介

单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统[1]。现在可以说单片机是百花齐放的时期,世界上各大芯片制造公司都推出了自己的单片机,从8位、16位到32位,数不胜数,应有尽有,它们

a

a

各具特色,互成互补,为单片机的应用提供广阔的天地。

(1)微型计算机(Single Chip Microcomputer)

微型计算机的主要特点:CPU集成于一个芯片中。单片机(Micro Controller Unit)是把组成微型计算机的各功能部件:CPU、RAM、ROM、定时/计数器、中断控制器、并行和串行接口均集成在一个芯片中。其一个芯片就构成了一个比较完整的计算机系统。

a

a

微型计算机与单片机是微电子领域的两个分支。微型计算机的特点是运算速度快、存储容量大,适合于信息管理、科学计算等领域;而单片机的特点为体积小、价格低,适合于仪器、设备的控制,常常嵌入到仪器、设备中。故单片机也称作微控制器(Microcontroller)。

(2)单片机的生产与发展

目前世界上单片机的生产公司有上百家,如Intel、Philips、Microchip、Motorola、Siemens、NEC、AMD、Zilog、TI、Atmel等。但在国内广泛应用的只有Intel 系列和Microchip PIC系列,

第1阶段(1976--1980):单片机发展初级阶段。集成了8位CPU、RAM、ROM、定时器、并行口(无串行口)等部件,但性能低,寻址范围小(≤4KB),中断系统、定时器也简单。典型机型:Intel MCS-48系列。

第2阶段(1980--1983):高性能单片机阶段。此阶段的单片机普遍带有串行口,有多级中断处理系统,多个16位定时/计数器,片内ROM、RAM的容量加大,寻址范围达KB。典型机型:Intel MCS-51系列。

第3阶段(1983--80年代末):16位单片机和高性能8位机并行发展阶段。此阶段Intel推出16位单片机MCS-96系列,其他公司也推出了各种16位单片机。同时高性能8位单片机的性能更为完善。

第4阶段(90年代):单片机在集成度、功能、速度、可靠性等方面全面发展,如采用Flash ROM,加入了一些特殊功能部件(AD转换器,PWM输出,监视定时器WDT,DMA,调制解调器,通信控制器,浮点运算单元等)。

至今,单片机的性能已比较完善,且专业化的特点很强,为各种应用提供了很大的方便。

a

a

1.3单片机的发展趋势

纵观单片机的发展过程,可以预示单片机的发展趋势 。 1

a

a

.低功耗CMOS化

MCS-51系列的8031推出时的功耗达630mW,而现在的单片机普遍都在100mW左右,随着对单片机功耗要求越来越低,现在的各个单片机制造商基本都采用了CMOS(互补金属氧化物半导体工艺) [2]。80C51就采用了HMOS(即高密度金属氧化物半导体工艺)和CHMOS(互补高密度金属氧化物半导体工艺)。CMOS虽然功耗较低,但由于其物理特征决定其工作速度不够高 [2]。而CHMOS则具备了高速和低功耗的特点,这些特征,更适合于在要求低功耗,电池供电的应用场合。所以这种工艺将是今后一段时期单片机发展的主要途径。 2.微型单片化

现在常规的单片机普遍都是将处理器(CPU)、随机存取数据存储(RAM)、只读程序存储器(ROM)、并行和串行通信接口,中断系统、定时电路、时钟电路集成在一块单一的芯片上,增强型的单片机集成了如A/D转换器、PMW(脉宽调制电路)、WDT(看门狗)、有些单片机将LCD(液晶)驱动电路都集成在单一的芯片上,这样单片机包含的单元电路就更多,功能就越强大[3]。甚至单片机厂商还可以根据用户的要求量身定做,制造出具有自己特色的单片机芯片。 此外,现在的产品普遍要求体积小、重量轻,这就要求单片机除了功能强和功耗低外,还要求其体积要小[4]。现在的许多单片机都具有多种封装形式,其中SMD(表面封装)越来越受欢迎,使得由单片机构成的系统正朝微型化方向发展。 3.主流与多品种共存

现在虽然单片机的品种繁多,各具特色,但仍以80C51为核心的单片机占主流,兼容其结构和指令系统的有PHILIPS公司的产品,ATMEL公司的产品和中国的Winbond系列单片机[2]。所以C8051为核心的单片机占据了半

a

a

壁江山。而Microchip公司的PIC精简指令集(RISC)也有着强劲的发展势头

a

a

,中国的HOLTEK公司近年的单片机产量与日俱增,与其低价质优的优势,占据一定的市场分额。此外还有MOTOROLA公司的产品,日本几大公司的专用单片机。在一定的时期内,这种情形将得以延续,将不存在某个单片机一统天下的垄断局面,走的是依存互补,相辅相成、共同发展的道路。

4.大容量、高性能

以往单片机内的ROM为1KB~4KB,RAM 为~128B。但在需要复杂控制的场合,该存储容量是不够的,必须进行外接扩充。为了适应这种领域的要求,须运用新的工艺,使片内存储器大容量化。目前,单片机内ROM 最大可达KB,RAM 最大为2KB。另外单片机进一步改变CPU的性能,加快指令运算的速度和提高系统控制的可靠性。采用精简指令集(RISC)结构和流水线技术,可以大幅度提高运行速度[4]。现指令速度最高者已达100MIPS(Million Instruction Per Seconds,即兆指令每秒),并加强了位处理、中断和定时控制功能。这类单片机的运算速度比标准的单片机高出10 倍以上[5]。由于这类单片机有极高的指令速度,可以使用软件模拟其I/O 功能,由此引入了虚拟外设的新概念。

5.串行扩展技术

在很长一段时间里,通用型单片机通过三总线结构扩展外围器件成为单片机应用的主流结构。随着低价位OTP(One Time Programble)及各种特殊类型片内程序存储器的发展,加之处围接口不断进入片内,推动了单片机“单片”应用结构的发展。特别是I2C、SPI 等串行总线的引入,可以使单片机的引脚设计得更少,单片机系统结构更加简化及规范化[6]。

结论:单片机改变了我们生活,纵观我们现在生活的各个领域,从导弹的导

a

a

航装置

a

a

,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开单片机,单片机有着广阔的应用前景。

1.4设计的意义

单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次。

单片机模块中最常见的是电子万年历,电子万年历是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。

电子万年历是采用数字电路实现对时、分、秒数字显示的计时装置,广泛用于个人家庭、车站、 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得电子万年历的精度,远远超过老式的计时方法, 电子万年历的数字化给人们生产生活带来了极大的方便,而且大大地扩展了原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些都是以钟表数字化为基础的。因此,研究电子万年历及扩大其应用,有着非常现实的意义。

随着电子技术的迅速发展,特别是随着大规模集成电路的出现,给人类生活带来了根本性的变化。尤其是单片机技术的应用产品已经走进了千家万户。电子万年历的出现给人们的生活带来了诸多方便。但传统的电子万年历除显示时间以

a

a

外,功能较为单一,逐渐失去了市场。新型电子万年历的产生 更会带来更多方便,现在的发展方向以实用型,方便型,美观型,精巧型为主。电子万年历作为电子类小设计不仅是市场上的宠儿,也是单片机实验中一个很常用的题目。 我国生产的电子万年历有很多种,总体上来说以研究多功能电子万年历为主,使万年历除了原有的显示时间,日期等基本功能外,还具有闹铃,报警等功能。商家生产的电子万年历更从质量,价格,实用上考虑,不断的改进电子万年历的设计,使其更加的具有市场。

1.5对设计的认识

a

a

本设计为软件,硬件相结合的一组设计。在软件设计过程中,应对硬件部分有相关了解,这样有助于对设计题目的更深了解,有助于软件设计。基本的要了解一些主要器件的基本功能,作用。

除了采用集成化的时钟芯片外,还有采用MCU的方案,利用AT系列单片微机制成万年历电路,采用软件和硬件结合的方法,控制LED数码管输出,分别用来显示年、月、日、时、分、秒,其最大特点是:硬件电路简单,安装方便易于实现,软件设计独特,可靠[7]。ATC51是由ATMEL公司推出的一种小型单片机,95年出现在中国市场。其主要特点为采用Flash存贮器技术,降低了制造成本,其软件、硬件与MCS-51完全兼容,可以很快被中国广大用户接受。

本课题所研究的电子万年历是单片机控制技术的一个具体应用,主要研究内容包括以下几个方面:

(1)选用电子万年历芯片时,应重点考虑功能实在、使用方便、单片存储、低功耗、抗断电的器件。

(2)根据选用的电子万年历芯片设计外围电路和单片机的接口电路。 (3)在硬件设计时,结构要尽量简单实用、易于实现,使系统电路尽量简单。

(4)根据硬件电路图,在开发板上完成器件的焊接。

(5)根据设计的硬件电路,编写控制ATC51芯片的单片机程序。 (6)通过编程、编译、调试,把程序下载到单片机上运行,并实现本设计的功能。

(7)在硬件电路和软件程序设计时,主要考虑提高人机界面的友好性,方

a

a

便用户操作等因素。

(8)软件设计时必须要有完善的思路,要做到程序简单,调试方便。

a

a

第二章 设计要求与方案论证

2.1 设计要求:

能设计并制作出功能比较全面,价格较为适中的电子万年历。 (1)基本要求

① 具有年、月、日、星期、时、分、秒等功能; ② 万年历具有闰月识别显示功能;

③ 具备年、月、日、星期、时、分、秒校准功能; (2) 创新要求

① 万年历具有阴历显示功能;

a

a

② 具有测量室内温度功能;

设计相应的软件并与硬件设计者共同完成系统的软件设计工作,基本完成系统的软、硬件统调工作。

a

a

PIC单片机:

是MICROCHIP公司的产品,其突出的特点是体积小,功耗低,精简指令集,抗干扰性好,可靠性高,有较强的模拟接口,代码保密性好,大部分芯片有其兼容的FLASH程序存储器的芯片。 EMC单片机:

是义隆公司的产品,有很大一部分与PIC 8位单片机兼容,且相兼容产品的资源相对比PIC的多,价格便宜,有很多系列可选,但抗干扰较差。 ATMEL单片机(51单片机):

ATMEl公司的8位单片机有AT、AT90两个系列,AT系列是8位Flash单片机,与8051系列单片机相兼容,静态时钟模式;AT90系列单片机是增强RISC结构、全静态工作方式、内载在线可编程Flash的单片机,也叫AVR单片机。

PHLIPIS 51PLC系列单片机(51单片机):

PHILIPS公司的单片机是基于80C51内核的单片机,嵌入了掉电检测、模拟以及片内RC振荡器等功能,这使51LPC在高集成度、低成本、低功耗的应用设计中可以满足多方面的性能要求。 HOLTEK单片机:

盛扬半导体的单片机,价格便宜,种类较多,但抗干扰较差,适用于消费类产品。

TI公司单片机(51单片机):

德州仪器提供了TMS370和MSP430两大系列通用单片机.TMS370系列单片机是8位CMOS单片机,具有多种存储模式、多种外围接口模式,适用于复

a

a

杂的实时控制场合;MSP430系列单片机是一种超低功耗、功能集成度较高的16位低功耗单片机,特别适用于要求功耗低的场合

a

a

2.2.1单片机芯片的选择方案和论证

采用C51芯片作为硬件核心,数码管显示,为使用户更清楚更明白,万年历的日期和时间是分开显示,同时分别对应两个74LS138芯片用于控制数码管显示,还有74LS373译码器芯片,74LS21芯片是用于控制键盘的功能[8]。74LS138引脚图如图2-1所示:

图2-1 74LS138引脚图

74LS138的八个输出引脚,任何时刻要么全为高电平1也就是芯片处于不工作状态,要么只有一个为低电平0,其余7个输出引脚全为高电平1[16]。如果出现两个输出引脚同时为0的情况,说明该芯片已经损坏。74LS373原理图如图2-2所示:

a

a

图2-2 74LS373原理图

当74LS373用作地址锁存器时,应使OE为低电平,此时锁存使能端G为高电平时,输出Q1~Q8 状态与输入端D1~D8状态相同;当G发生负的跳变时,输入端D1~D8 数据锁入Q1~Q8。51单片机的ALE信号可以直接与74LS373的G连接。在MCS-51单片机系统中,常采用74LS373作为地址锁存器使用,其连接方法如上图所示。其中输入端1D~8D接至单片机的P0口,输出端提供的是低8位地址,G端接至单片机的地址锁存允许信号ALE[7]。输出允许端OE接地,表示输出三态门一直打开。

2.2.2显示模块选择方案

采用LED数码管动态扫描,LED数码管价格适中,对于显示数字最合适,而且采用动态扫描法与单片机连接时,占用的单片机口线少[9]。使用多个数码管显示LED数码管是利用二极管发光显示数字和字母,具有亮度大、接口设计比较容

a

a

易,价格相对较便宜等优点,所以采用了LED数码管作为显示。数码管电路如图2-3所示:

a

a

图2-3数码管电路

2.3键盘的选择

采用式按键电路。每个键单独占有一根I/O接口线,每个I/O口的工作状态互不影响,此类键盘采用端口直接扫描方式[15]。而且在本次实验课设用的键盘很少,所以采用式按键比较实用。键盘简图如图2-4所示:

图2-4 键盘简图

a

a

2.4实现定时

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

2.5电路设计最终方案决定

综上各方案所述,对此次作品的方案选定: 采用ATC51作为主控制系统; LED数码管动态扫描作为显示。两个74LS138和一个74LS21芯片。 器件的选用: 单片机ATC51 电容RESPACK-8 三个74LS1串行接口 传感器DS1302 主要单片机类型如下: (1)MCS-51系列单片机

MCS-51系列单片机主要是指Intel公司生产的以51位内核的单片机芯片,具有8位CPU、4K字节ROM、128字节RAM、可扩展外部K字节RAM和ROM、2个16位的定时器/计数器、4个8位并行I/O口、1个全双工串行I/O口、21字节的专用寄存器、5个中断源、片内自带振荡器、片内单总线等功能部件。 (2)ATC51单片机

ATC51单片机的主要特性如下:  与MCS-51产品指令系统完全兼容

 4K字节的在线编程Flash存储器,1000次擦写周期  4.0~5.5V的工作电压范围

a

a

 全静态工作模式:0~33MHz  三级程序存储器锁  128×8字节内部RAM

a

a

 32个可编程I/O口线  2个16位定时/计数器  6个中断源

 全双工串行UART通道  低功耗空闲和掉电模式  中断可从空闲模式唤醒系统  看门狗(WDT)及双数据指针  掉电标识和快速编程特性  具有掉电状态下的中断恢复功能

 灵活的在系统编程(ISP字节或页写模式)

由于ATC51单片机片内有4K字节的在线编程Flash存储器,可以擦写1000次,具有掉电模式,而且具有掉电状态下的中断恢复功能,对设计开发非常实用。所以选用ATC51单片机作为电子万年历芯片的控制单片机。

a

a

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

3.1电路设计框图

LED数码管动态扫描显示模块 ATS51 主控制模 块 图3-1 电路设计框图

键盘模块 DS1302时钟模块 3.2 系统硬件概述

本电路是由ATS51单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V[10]。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31*8的用于临时性存放数据的RAM寄存器[16]。可产生年、月、日、

a

a

周日、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能;温度的采集由DS18B20

a

a

构成;显示部份由21个数码管,74LS138、74LS47译码器构成。使用动态扫描显示方式对数字的显示。 系统硬件框图如图3-2:

时钟芯片DS1302 串口 ATC51 P2口 LED显示器 驱动电路 图3-2 系统硬件框图

3.3 主要单元电路的设计 3.3.1单片机主控制模块的设计

本系统采用的是美国ATMEL公司生产的ATC51单片机,首先我们来熟悉一下ATC51单片机的外部引脚和内部结构。 1.单片机的引脚功能

ATC51单片机有40个引脚。  Vcc:电源电压+5V  GND:接地

 P0口:P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写

a

a

“1”可作为高阻抗输入端用。

在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线服用,在访问期间激活内部上拉电阻。

在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时要求外接上拉电阻。

 P1口:P1口是一个带内部上拉电阻的8位双向I/O,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。

Flash 编程和程序校验期间,P1接收低8位地址。

 P2口:P2口是一个带内部上拉电阻的8位双向I/O,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。

在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器(MOVX @Ri指令)时,P2口线上的内容(也即特殊功能寄存器(SFR)区中P2寄存器的内容),在整个访问期间不改变。

Flash 编程和程序校验期间,P2亦接收低高位地址和其他控制信号。  P3口:P3口是一组带内部上拉电阻的8位双向I/O,P3的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部的上拉电阻拉高并可作为输入端口。作输入端时,被外部拉低的P3口将

a

a

用上拉电阻输出电流。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,见表3-1所示:

a

a

P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。

表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(外部数据存储器读选通)  RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。WDT溢出将使引脚输出高电平,设置SFR AUXR的DISRT0(地址8EH)可打开或关闭该功能。DISRT0位缺省为RESET输出高电平打开状态。

 ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存器允许)输出脉冲用于锁存地址的低8位字节。即使不访问外部存储器,ALE仍以时钟振荡频率的1/6输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。

对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。 如有必要,可通过多特殊功能寄存器(SFR)区中的8EH单元的D0位置,可禁止ALE操作。该位置后,只有一条MOVX和MOVC指令ALE才会被激

a

a

活。另外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE无效。

a

a

 PSEN:程序存储允许(PSEN)输出是外部程序存储器的读选通信号,当ATC51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。当访问外部数据存储器,没有两次有效的PSEN信号。

 EA/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H—FFFFH),EA端必须保持低电平(接地)。需要注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。

如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。 Flash存储器编程时,该引脚加上+12V的变成电压Vpp.  XTAL1:振荡器反相放大器及内部时钟发生器的输入端。  XTAL2:振荡器反相放大器的输出端。 ATC51单片机内部结构

2.ATC51单片机与MCS-51完全兼容

 看门狗(WDT):WDT是一种需要软件控制的复位方式。WDT 由13位计数器和特殊功能寄存器中的看门狗定时器复位存储器(WDTRST)构成。WDT 在默认情况下无法工作;为了激活WDT,用户必须往WDTRST 寄存器(地址:0A6H)中依次写入01EH 和0E1H。当WDT激活后,晶振工作,WDT在每个机器周期都会增加。WDT计时周期依赖于外部时钟频率。除了复位(硬件复位或WDT溢出复位),没有办法停止WDT工作。当WDT溢出,它将驱动RSR引脚输出一个高电平。

 可编程串口(UART)在ATC51中,UART 的操作与ATC51 和AT

a

a

C52 一样。ATC51系列单片机的串行通信口可以工作于同步和异步通信方式。当工作于异步方式时,它具有全双工的操作功能,也就是说,它可以同时进行数据的发送和接收。串行口内的接收器采用的是双缓冲结构,能够在接收到的第一个字节从接收寄存器读走之前就开始接收第二个字节(当然,如果第二个字节接收完毕,而第一个字节仍然没有被读走,那将会丢掉一个字节)。串行口的发送和接收操作都是通过特殊功能寄存器中的数据缓冲寄存器SBUF进行的,但在SBUF的内部,接收寄存器和发送寄存器在物理结构上是完全的。如果将数据写入SBUF,数据会被送入发送寄存器准备发送。如果执行SBUF指令,则读出的数据一定来自接收缓存器。因此,CPU对SBUF的读写,实际上是分别访问2个不同的寄存器。这2个寄存器的功能决不能混淆。

 振荡电路:ATC51系列单片机的内部振荡器,由一个单极反相器组成。XTAL1反相器的输入,XTAL2为反相器的输出。可以利用它内部的振荡器产生时钟,只要XTAL1和XTAL2引脚上一个晶体及电容组成的并联谐振电路,便构成一个完整的振荡信号发生器,此方式称为内部方式。另一种方式由外部时钟源提供一个时钟信号到XTAL1端输入,而XTAL2端浮空。在组成一个单片机应用系统时,多数采用这种方式,这种方式结构紧凑,成本低廉,可靠性高。在电路中,对电容C1和C2的值要求不是很严格,如果使用高质的晶振,则不管频率为多少,C1、C2通常都选择30pF。

 定时/计数器:ATC51单片机内含有2个16位的定时器/计数器。当用于定时器方式时,定时器的输入来自内部时钟发生电路,每过一个机器周期,定时器加1,而一个机器周期包含有12个振荡周期,所以,定时器的技术频率为

a

a

晶振频率的1/12,而计数频率最高为晶振频率的1/24。为了实现定时和计数功能,定时器中含有3种基本的寄存器:控制寄存器、方式寄存器和定时器/计数器。控制寄存器是一个8位的寄存器,用于控制定时器的工作状态,方式寄存器是一个8位的寄存器,用于确定定时器的工作方式,定时器/计数器是16位的计数器,分为高字节和低字节两部分。

a

a

 RAM:高于7FH内部数据存储器的地址是8位的,也就是说其地址空间只有256字节,但内部RAM的寻址方式实际上可提供384字节。的直接地址访问同一个存储空间,高于7FH的间接地址访问另一个存储空间。这样,虽然高128字节区分与专用寄器 ,即特殊功能寄存器区的地址是重合的,但实际上它们是分开的。究竟访问哪一区,存是通过不同的寻址方式加以区分的。

 SFR:SFR是具有特殊功能的所有寄存器的集合,共含有22个不同寄存器,它们的地址分配在80H~FFH中。虽然如此,不是所有的单元都被特殊功能寄存器占用,未被占用的单元,其内容是不确定的。如对这些单元进行读操作,得到的是一些随机数,而写入则无效,所以在编程时不应该将数据写入这些未确定的地址单元中,特殊功能寄存器主要有累加器ACC、B寄存器、程序状态字寄存器PSW、堆栈指针SP、数据指针DPTR、I/O端口、串行口数据缓冲器SBUF、定时器寄存器、捕捉寄存器、控制寄存器。

 中断系统:ATC51单片机有6个中断源,中断系统主要由中断允许寄存器IE、中断优先级寄存器IP、优先级结构和一些逻辑门组成。IE寄存器用于允许或禁止中断;IP寄存器用于确定中断源的优先级别;优先级结构用于执行中断源的优先排序;有关逻辑门用于输入中断请求信号。在整个中断响应过程中CPU所执行的操作步骤如下:

(1)完成当前指令的操作 (2)将PC内容压入堆栈 (3)保存当前的中断状态 (4)阻止同级的中断请求

(5)将中断程序入口地址送PC寄存器

a

a

(6)执行中断服务程序

a

a

(7)返回

3.3.2时钟电路模块的设计

现在流行的串行时钟电路很多,如DS1302、 DS1307、PCF8485等。这些电路的接口简单、价格低廉、使用方便,被广泛地采用。本文介绍的实时时钟电路DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。

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进行操作。如果在传

a

a

送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),后面有详细说明。SCLK始终是输入端。

a

a

DS1302 的控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1902,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。

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

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

DS1302与CPU的连接需要三条线,即SCLK(7)、I/O(6)、RST(5)。DS1902与C2051的连接图,其中,时钟的显示用LED。

DS1302与CPU的连接,实际上,在调试程序时可以不加电容器,只加一个32.768kHz 的晶振即可。只是选择晶振时,不同的晶振,误差也较大。另外,还可以在上面的电路中加入DS18B20,同时显示实时温度。只要占用CPU一

a

a

个口线即可。 L

a

a

ED还可以换成LCD,还可以使用北京卫信杰科技发展有限公司生产的10位多功能8段液晶显示模块LCM101,内含看门狗(WDT)/时钟发生器及两种频率的蜂鸣器驱动电路,并有内置显示RAM,可显示任意字段笔划,具有3-4线串行接口,可与任何单片机、IC接口。功耗低,显示状态时电流为2μA (典型值),省电模式时小于1μA,工作电压为2.4V~3.3V,显示清晰。

DS1302的实时时间流程。根据流程框图,不难采集实时时间。下面对DS1302的基本操作进行编程:

根据本人在调试中遇到的问题,特作如下说明:

DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM数据;D5~D1指定输入或输出的特定寄存器;最低位LSB(D0)为逻辑0,指定写操作(输入), D0=1,指定读操作(输出)。

在DS1302的时钟日历或RAM进行数据传送时,DS1302必须首先发送命令字节。若进行单字节传送,8位命令字节传送结束之后,在下2个SCLK周期的上升沿输入数据字节,或在下8个SCLK周期的下降沿输出数据字节。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM寄存器,在此方式下可一次性读、写所有的RAM的31个字节。

a

a

要特别说明的是备用电源B1,可以用电池或者超级电容器(0.1F以上)。虽然DS1302在主电源掉电后的耗电很小,但是,如果要长时间保证时钟正常,最好选用小型充电电池。可以用老式电脑主板上的3.6V充电电池。如果断电时间较短(几小时或几天)时,就可以用漏电较小的普通电解电容器代替。100 μF就可以保证1小时的正常走时。DS1302在第一次加电后,必须进行初始化操作。初始化后就可以按正常方法调整时间。

DS1302 存在时钟精度不高,易受环境影响,出现时钟混乱等缺点。DS1302可以用于数据记录,特别是对某些具有特殊意义的数据点的记录,能实现数据与出现该数据的时间同时记录。这种记录对长时间的连续测控系统结果的分析及对异常数据出现的原因的查找具有重要意义。传统的数据记录方式是隔时采样或定时采样,没有具体的时间记录,因此,只能记录数据而无法准确记录其出现的时间;若采用单片机计时,一方面需要采用计数器,占用硬件资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而且,某些测控系统可能不允许。但是,如果在系统中采用时钟芯片DS1302,则能很好地解决这个问题。

3.3.4显示模块的设计

简述:

LED单元模块,由集成有多行、多列的发光二极管四边形模块构成,所述的四边形模块至少一边为带有一组以上凹凸槽块的边缘。所述的四边形模块至少可有一组对边两壁均带有一组以上凹凸槽块,其中,两对边凹凸槽块可呈对应状,亦可呈对称状。所述的四边形模块的主视面上可带有用于模糊模块拼接界限的装饰结构。

a

a

如 LCD1602液晶芯片 主要技术参数:

表3-3 1602液晶技术参数

显示容量 芯片工作电压 16×2字符 4.5~5.5V~ a

a

工作电流 模块最佳工作电压 字符尺寸

2.0mA(5.0V) 5.0V 2.95×4.35(W×H)mm 接口信号说明:

表3-4 1602引脚说明 编号 1 SS 2 DD 3 L 4 S 5 /W 6 7 0 E D使能信号 DateI/0 14 15 D7 BLA DateI/0 背光源正极 R数据/命令选择端12 D5 DateI/0 V液晶显示偏压信号 11 D4 DateI/0 V电源正极 10 D3 DateI/0 号 V电源地 符引脚说明 号 9 D2 DateI/0 编符号 引脚说明 (H/L) R读/写选择端(H/L) 13 D6 DateI/0 a

a

8 1

DDateI/0 16 BLK 背光源负极 控制器接口说明

a

a

1.基本操作时序:

1.1 读状态: 输入: RS=L,RW=H,E=H 输出: D0~D7=状态字 1.2 写指令: 输入: RS=L,RW=L, D0~D7指令码,E= 高脉冲 输出:无 1.3 读数据: 输入: RS=H,RW=H,E=H 输出: D0~D7=数据 1.4 写数据: 输入: RS=H,RW=L,D0~D7=数据,E= 高脉冲 输出: 无 2.状态字说明

表3-5 各状态字说明 STA7 D7 STA6 D6 STA5 D5 STA4 D4 STA3 D3 STA2 D2 STA1 D1 STA0 D0 表3-6 STA 0-7状态字说明 STA0-6 STA7

值 当前数据地址指针的数 读写操作使能 1: 禁止 0: 允许 注:对控制器每次进行读写操作之前,都必须进行读写检测,确保STA为0 3.指令说明 3.1 初始化设置 3.1.1 显示模式设置

表3-7 显示模式 指令码 0 0 1 1 1 0 0 0 功能 设置16×2显示,5×7点阵,8位数据接口

3.1.2 显示开/关及光标出设置

表3-8 显示开/关及光标 指令码 功能 a

a

00 0 0 1 DC BD=1开显示;D=0 关显示 a

a

C=1 显示光标; C=0 不显示光标 B=1 光标闪烁; B=0 光标不显示 00 0 0 0 1 N SN=1 当读或写一个字符后地址指针加一,且光标加一 N=0 当读或写一个字符后地址指针减一,且光标减一 S=1 当写一个字符,整屏显示左移(N=1)或右移(N=0),以得到光标不移动而屏幕移动的效果 S=0 当写一个字符,整屏显示不移动

3.2 数据指针设置

表3-9数据指针 指令码 80H+地址码(0-27H,40H-67H) 功能 设置数据地址指针 a

a

(2)如图3-4所示,采用动态扫描显示,由21个数码管,3-8译码器74LS138接1K限流电阻,再接8550三极管接到共阳数码管的CoM端作为选通位码,每位选择相应的列。74LS47接240Ω限流电阻,再接共行的LED数码管的断码。

图3-4 LED动态扫描显示

第四章 系统的软件设计

4.1程序流程框图

开始 初始化 读、写日期、时间和温度 分离日期\\时间\\温度显示值 显示子程序

定时闹铃子程序 日期、时间修改子程序 a 农历自动更新子程序 a

图4-1 主程序流程图

开始 Y 置阳历总天数 N 当前月加1 当前号数是总天数 月加 总天数中加入号 Y 与当前月同? N 计算阳历天数结束,总天数中的数据为当前日期在阳历中的第几天

图4-2计算阳历程序流程图

a

a

开始 控制键有效,进入年调整程序 控制键有效,进入月调整程序 等待按键程序 等待按键程序 加键有效 减键有效 加键有效 减键有效 年加1 减加1 月加1 月减1 控制键有效,进入日调整程序 控制键有效,进入星期调整程序 等待按键程序 等待按键程序 加键有效 减键有效 加键有效 日加1 日减1 星期加1 星期减1 减键有效 控制键有效,进入小时调整程序 控制键有效,进入分钟调整程序 等待按键程序 等待按键程序 加键有效 减键有效 加键有效 小时加1 小时减1 分钟加1 分钟减1 减键有效 按键有效,跳出时间调整程序,进入主循环程序

图4-3 时间调整程序流程图

a

a

图4-4 LED动态扫描显示

4.2程序

万年历: 84 bytes 的 51 ASM

;==SUB_WNL=== 万年历 ==* Deng Miao * 2004-06-01 *****

GuangZhou ******

SJ DATA 30H ; 世纪 BCD 00 TO 99

NH DATA 31H ; 年号 BCD 00 TO 99 0000 TO 9999 年 YF DATA 32H ; 月份 BCD 01 TO 12 org 000h MOV SP, #40H

MOV SJ, #21H ;2004-05 MOV NH, #01H

a

a

MOV YF, #4H ACALL SUB_WNL SJMP $

;===============SUB_WNL=================== ;

a

a

入口:

; SJ DATA 30H ; 世纪 BCD 00 TO 99

; NH DATA 31H ; 年号 BCD 00 TO 99 0000 TO 9999 年 ; YF DATA 32H ; 月份 BCD 01 TO 12 ; 出口

; ACC -- 本月天数 BCD 28 to 31

; B -- 本月1日的星期数 1 to 6 == 星期1 to 星期6 ; 0 -- 星期日 ; 使用: ACC, B, R5, R6

; STACK: 3 bytes (不包括调用) ORG 50H SUB_WNL: PUSH PSW MOV A, SJ

ACALL BCD2BIN_MOD4 ; x 400年: (大周期)

; =146097天 = 7 * 20871 + 0 天 ; x 100年: ; 000

a

a

年 = 7 * 0 + 0 + 1 - 1 1 = 0 * 2 + 1 **** ; 100年 = 7 * 5217 + 7 + 1 - 2 2 = 1 * 2 ; 200年 = 7 * 10435 + 7 + 1 - 4 4 = 2 * 2 ; 300年 = 7 * 15653 + 7 + 1 - 6 6 = 3 * 2 ; {1,2,4,6} MOV A, R6 ; A=R6= SJ_BIN MOD 4

RLC A ; A=A*2+C A = {1,2,4,6} **** XRL A, #10000111B ; A = 87H - A ; 边界调整

MOV R5, A ; A = {86H, 85H, 83H, 81H} ; R5: 星期 MOV A, NH JZ WNL_1

ACALL BCD2BIN_MOD4 XCH A, R5

SUBB A, R5 ; 0 年 ; 0 = 0 + 0 + 1 + (-1) *** MOV R5, A WNL_1: MOV A, YF

ADD A, #(WNL_TAB-$-4) MOVC A, @A+PC MOV R6, A SWAP A

ACALL WNL_F0; 大年对>=3月调整准备

a

a

ADDC A, R5 ;

a

a

月调整 MOV B, #7

DIV AB ; B = A MOD 7 MOV A, R6

ACALL WNL_F0; 大年调整准备 ADDC A, #28 POP PSW RET WNL_TAB:

DB 3*2 + 5 * 32+0 ;1 BIT 0 : \"2月\" 标志 DB 0*2+1+1 * 32+0 ;2 ** BIT 12: 月大小 DB 3*2 + 1 * 32+16 ;3 00:28 天 DB 2*2 + 4 * 32+16 ;4 01:---- DB 3*2 + 6 * 32+16 ;5 10: 30 天 DB 2*2 + 2 * 32+16 ;6 11: 31 天 DB 3*2 + 4 * 32+16 ;7 BIT 3: 0 ----- DB 3*2 + 7 * 32+16 ;8 BIT 4: 0: 1/2月 DB 2*2 + 3 * 32+16 ;9 1: >=3月 WNL_F0: ; 6 BYTES ; 大年调整准备 RRC A ;0AH ANL A, #07H ;0BH ;0CH

a

a

ANL C, F0 ;0DH ;0EH

RET ;0FH

DB 3*2 + 5 * 32+16 ;10H BIT 57:

a

a

星期调整数

DB 2*2 + 1 * 32+16 ;11H 0:--- DB 3*2 + 3 * 32+16 ;12H 1-7: 调整数 BCD2BIN_MOD4:

; 功能:A. 1 BYTES BCD TO BIN ; B. MOD 4 ; C. MUL 2 ; 入口:

; A : SJ OR NH ; F0 : 大世纪 ; 出口

; ACC -- (BIN(A) 4) * 2 - (BIN(A) MOD 4) ; R6 -- BIN(A) MOD 4

; C -- IIF( (BIN(A) MOD 4)=0, 1, 0 ) ; 使用: ACC, B, R6, PSW ; STACK: 0 bytes (不包括调用) MOV R6, A ; BCD ==> BIN ANL A, #0F0H ; 16X+Y ==> 10X+Y SWAP A

MOV B, #(256-6) ; (256-6)*X + (16X+Y) MUL AB ;

ADD A, R6 ; = 256X + (10X+Y)

a

- F0 a

MOV R6, A ; MOD4 ANL A, #3

XCH A, R6 ; R6 = BIN MOD 4 = {0,1,2,3} ; X 4

a

a

年:3 * 365 + 366 = 7*209 + (-2) ** XRL A, R6 ; A = (BIN 4)

RR A ; A = (BIN 4 ) * 2 ** MOV C, F0 ; 大世纪调整 SUBB A, R6 ;X 1 年:

;0 年 0 = 0 + 0 + 1 + (-1) *** ;1 年 366 = 7*52 + 1 + 1 ;2 年 366 + 365 = 7*104 + 2 + 1 ;3 年 366 + 365 + 365 = 7*156+3 + 1 ; {-1,1,2,3}

CJNE R6, #1, $ + 3 ; C = IIF(R6>=1, 0, 1) MOV F0, C ; C=1 为大年/大世纪 RET

;----------------------------- END ;======== END OF FILE

a

a

第五章 PROTEUS使用

5.1编程环境PROTEUS

PROTEUS软件是由英国LabCenter Electronics 公司开发的EDA工具软件,由ISIS和ARES两个软件构成,其中ISIS是一款便捷的电子系统仿真平台软件,ARES是一款高级的布线编辑软件,它集成了高级原理布线图、混合模式SPICE电路仿真、PCB设计以及自动布线来实现一个完整的电子设计。

5.2用PROTEUS ISIS对电子万年历的硬件电路设计

通过PROTEUS ISIS软件的VSM(虚拟仿真技术),用户可以对模拟电路、数字电路、模数混合电路,以及基于微控制器的系统连同所有外围接口电子元器件一起仿真。

用PROTEUS ISIS设计硬件电路的过程 ① 选择设计图纸的到小

根据设计所使用到元器件的多少,选择合适大小的设计图纸,操作是单击菜单栏上的System→Set Sheet Size ,然后弹出如图5-1所示的对话框,从中选择合适大小的图纸,也可以选择User进行图纸的自定义设置。在设计过程中也可以通过此方法调整图纸的大小。

a

a

图 5-1 选择设计图纸对话框

a

a

② 选取仿真所需的元器件

选取元器件的方式是,单击如图5-2所示的按钮“P”。会弹出如图5-3所示的窗口。

图 5-2 选取元器件对话框(1)

图 5-3 选取元器件对话框(2)

a

a

从此窗口的左上角的“Keywords”中输入电子万年历设计用到的器件,如输入“ATC51”,在中间会列出带有输入关键字的元器件,选择合适的元器件并双击它,则已经选择好了该元器件。然后再在“Keywords”中输入其他所需的元器件,用同样的方法进行操作。最后选择好所有的元器件如图5-4所示。

图 5-4 所用器件

其中74LS174表示三个串行接口,ATC51代表单片机会,DS1302代表时钟芯片,RESPACK-8代表八排电阻。

③ 把元器件放到图纸的合适位置,进行布线

单击如图5-4所示的元器件ATC51,再在右边图纸上单击,就把元器件放入到了图纸上。再用同样的方法把ds1302放入到图纸的合适位置。如果元器件放置错误,这可通过两次右击删除所放置的元器件,如果位置放得不理想,可以先右击该器件,然后按住左键进行移动。在布线之前,如果觉得元器件的引脚的方向不好布线,则可以通过单击

这四个按钮进行调整,这

四按钮的意思分别是:顺时针旋转90°,逆时针旋转90°,沿Y轴对称,沿X轴对称。通过这样的调整,可以使整个布局合理一些。接着进行布线,由于

a

a

PROTEUS ISIS有自动布线的功能,比如要把ATC51的P2口连到

a

a

74LS1的OUT8口,只要先在P2引脚上单击一下,再在OUT8引脚上单击,则ISIS自动将两个引脚连上线。

图 5-5 ATC51与DS1302的连接

ISIS还提供了网络布线,即不使用线连接也可以把两个引脚虚拟的连接了起来。具体操作是:单击要连线的一个引脚,连出适当的距离后双击,另一个引脚也同样操作,在单击如图6-5所示的“LBL”按钮,再在图中P0.1引脚的A处单击,在弹出的窗口中的“String”中填入名称,如“A” ,对OUT7引脚进行同样的操作,在“String”中也填入名称“A”,这样就完成了P3.4引脚与RES引脚的网络连接,这个好处避免两个距离比较远的器件进行真实线的连接,使布线美观。

a

a

④ 编辑窗口连接端子

要让最后的设计成功仿真时,必须放置并连接端子。选择择电路原理中的两个通用的端子,一个是接地,一个是电源。

,从中可以选

a

a

如图5-6所示。

图 5-6连接端子

在PROTEUS ISIS中的最终设计图如图5-7所示

图 5-7仿真图

最后分别对各元器件的属性值进行设置,单击接线是否合理,说明硬件电路已经顺利的完成。

按钮,进行电气检测,查看

5.3用PROTEUS ISIS进行电子万年历的仿真测试

① 添加Keil中编写的代码文件

单击工具栏中的Source→Add/Remove Source files...,弹出一个对话框,分别单击“New” ,然后选择在Keil中编写的数字电压表.ASM汇编语言程序,单击“OK” ,完成添加代码文件。

a

a

② 编译源程序,生成.HEX目标代码文件

a

a

单击Source→Build All。如果编译结果没有错误,会出现如图5-8所示的结果。

图5-8 编译结果框图

③ 加载.HEX目标代码文件

通过如图5-9所示的对话框,选择刚才编译生成的.HEX文件。设置使单片机的运行频率为6MHz 。

a

a

图5-9 设置频率

④ 单击示。

按钮,进行对电子万年历的仿真测试,运行结果如图5-10所

a

a

图5-10仿真测试

a

a

PROTEUS的调试功能

由于使用的是汇编语言编写的程序,如果在测量的时候测量值显示错误,说明程序中存在问题,这个问题只用在仿真测量的时候才能被发现,这时可以使用PROTEUS对程序进行调试。单击

按钮,再单击菜单栏中的Debug,可以

在最下面选择打开内存观察窗口,寄存器值观察窗口,汇编语言源代码窗口等等。在汇编语言源代码窗口中,也可以在所需要设置断点的语句前双击设置断点,当设置断点的时候,程序运行到所设断点处停止,从而可以在内存、寄存器等的值的变化,从而找出程序出错的地方。

第六章 结论

6.1硬件测试

一个基于ATC51单片机的日历显示系统,本设计能显示公历年、月、日,以及时、分、秒、温度、星期等信息,而且还提供了农历信息。系统所用的时钟日历芯片DS1302具有高性能、低功耗、接口简单的特点,使本系统电路简化,编程方便,同时功能也很强。采用ATC51单片机的万年历系统可以很好的改善传统采用模拟电路引起的计时不准确,不可靠,一致性差等问题。此系统计时

a

a

精确,价格低廉,可以广泛应用在生活,学习和工作等任何领域,并且起到重要作用。

电子万年历的电路系统较大,对于焊接方面更是不可轻视,庞大的电路系统中只要出于一处的错误,则会对检测造成很大的不便,而且电路的交线较多,对于各种锋利的引脚要注意处理,否则会刺被带有包皮的导线,则会对电路造成短路现象。

a

a

在本电子万年历的设计调试中遇到了很多的问题。回想这些问题只要认真多思考都是可以避免的,以下为主要的问题:

(1)LED数码管的断码错乱,原因出于没有认真看清 a、b 、c等引脚信息。

解决:重新排列74LS47的输出端,相应接入LED数码管,即可解决出现在的断码或乱码。

( 2)对万年历修改时间或日期时,有时LED数码管被屏蔽掉,造成不亮现象。

解决:根据仪器的测试,发现电路的驱动能力不足,最后在DS1302时钟芯片的/CS、SCLK、RET端接入5.1K的上拉电阻后,电路的驱动能力才能满足,即可解决不亮现象。

6.2软件测试

电子成年历是多功能的数字型,可以看当前日期(阴、阳历),时间,还有温度的仪器。电子成年历功能很多,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多的问题。最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。在软件的调试过程中主要遇到的问题如下:

1.烧入程序后,LED数码管显示闪动,而且亮度不均匀。

解决:首先对调用的延时进行逐渐修改,可以解决显示闪动问题。其次,由于本作品使作动态扫描方式显示的数字,动态扫描很快,人的肉眼是无法看出,但是调用的显示程序时,如果不在反回时屏蔽掉最后的附值,则会出现很亮的现象,所以在显示的后面加了屏蔽子令,最后解决了此问题。

2.修改时间、日期时没有农历没有自动对应上。

a

a

解决:把不相关的程序暂时屏蔽,地农历的子程序调试,发现在调用农历自动更新时,对十进制和十六进制处理不好,所以会造成错乱。最后把相应的十进制进行修改,使得可以与十六进制对应,最后解决了此问题.

6.3测试结果分析与结论

a

a

6.3.1 测试结果分析

(1)在测试中遇到发光二极管、LED数码管为不显示时,首先使用试测仪对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏.

(2)LED 数码管显示不正常,还有亮度不够,首先使用试测仪对电路进行测试,观察电路是否存在短路现象。查看烧写的程序是否正确无误,对程序进行认真修改。

6.3.2 测试结论

如电路原理总图可知,本电路具有年、月、日、周日、时、分、秒、温度和农历功能,总共由21个LED数码管显示,如下图5-1所示 。

图5-1 电路模拟图

日期和时间的修改由3个按键构成。如图5-2所示。键1为向右移;键2为加1;键3为减1。

a

a

图5-2 日期和时间模拟图

测试结果分析

(1)在测试中遇到发光二极管、LED数码管为不显示时,首先使用试测仪对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏.

(2)LED 数码管显示不正常,还有亮度不够,首先使用试测仪对电路进行测试,观察电路是否存在短路现象。查看烧写的程序是否正确无误,对程序进行认真修改。

本文所介绍的万年历的设计方案已经调试成功,其功能全部实现,本产品成本低、寿命长、误差小、功能齐全,达到设计要求。

经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,提高了设计能力与及对电路的分析能力。在软件的编程方面得到更到的提高,对编程能力得到加强,同时对所学的知识得到很大的提高与巩固.

a

a

a

a

致谢

经过学习和实验,我终于完成了单片机制作万年历课程设计。从开始接到课设要求到万年历的实现,再到报告的完成,每走一步对我来说都是新的尝试与挑战,这也是我在大学期间完成的最大的项目。在这段时间里,我学到了很多知识也有很多感受,我开始了的学习和试验,查看相关的资料和书籍,让自己头脑中模糊的概念逐渐清晰,使自己非常稚嫩作品一步步完善起来,每一次改进都是我学习的收获。

这次报告的书写也会使我终身受益,我感受到做报告是要用心去做的一件事情,是真正的自己学习的过程和研究的过程,没有学习就不可能有研究的能力,没有自己的研究,就不会有所突破。通过本次单片机课设,获得了丰富的理论知识,极大地提高了实践能力,单片机领域这对我今后进一步学习计算机方面的知识有极大的帮助。

在做设计的日子里得到了董玉婷老师的悉心指导,在此向我的指导老师董老师致以诚挚的谢意。感谢提供相关技术帮助的老师和同学,你们的支持和鼓励使我对这次的作品完成有了信心和动力,也给了我很多无私的帮助和支持,我在此深表谢意。

a

a

a

a

参考文献

[1] 李建忠.单片机原理及应用.西安电子科技大学出版,2006 [2] 张俊谟.单片机中级教程.北京航空航天大学出版,2006 [3] 余发山.单片机原理及及应用技术.中国矿业大学出版社,2003 [4] 杨凌霄.微型计算机原理及应用.中国矿业大学出版社,2004 [5] 何立民.单片机应用技术选编.北京航空航天大学出版社,2000 [6] 万光毅.单片机实验与实践教程.北京航空航天大学出版社,2005 [7] 周航慈.单片机程序设计基础.北京航空航天大学出版社,1991 [8] 黄遵熹.单片机原理接口与应用.西北工业大学出版社,1997

[9] 杨振江,杜铁军,李群.流行单片机实用子程序及应用实例[M].西安:西安电子科技

大学出版社,2002

[10] 杨子文.单片机原理及应用 西安电子科技大学出版社,2006 [11] 王法能.单片机原理及应用科学出版社,2004

[12] 陈正振.电子电路设计与制作 广西交通职业技术学院信息工程系 2007 [13] 康华光. 电子技术基础. 北京:高等教育出版社,1999年; [14] 彭华林等. 数字电子技术. 长沙:湖南大学出版社,2004年; [15] 侯建军. 数字电路实验一体化教程. 北京:清华大学出版社,2005年; [16] 阎石军.电子技术基础仿真实验. 北京:机械工业出版社出版社,2007年;

a

a

附录 源代码

#include sbit p1_0=P1^0; sbit p1_1=P1^1; sbit p1_2=P1^2; sbit p1_3=P1^3; sbit p1_4=P1^4; sbit p3_2=P3^2; unsigned

char

code

zimal[13]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,

0x40,0x80,0x00,};

/*共阴极字形代码,显示0-9字形码,最后三个代码分别表示‘-’,‘.’‘熄灭’*/

unsigned int year,month,day,hour,minute,second;//定义变量年,月,日,时,分,秒;

void delay(); //延时函数;

void xianshi(unsigned int h,min,s); //显示时间函数;

void ymdxianshi(unsigned int year,month,day); //显示年月日;

a

a

void fengming(); //蜂鸣器函数; int leap(unsigned int year); //判断闰年函数;

a

a

unsigned int h,m,s=5; //记录定时时间; unsigned int mode=1,td=0,yw=0; //状态; void main() {

year=2010;month=5;day=20;hour=23;minute=59; second=0;

/*初始化年,月,日,时,分,秒*/

TMOD=0x10; //定时器1;模式1; TL1=0xb0;TH1=0x3c;定时时间为50ms TR1=1;//打开定时器1

ET1=1;//定时器1溢出中断允许位 EX0=1;//外部中断0允许

IT0=1;//外部中断0触发方式为边沿触发 EA=1;

while(1) //主循环; {

if(hour==h&&minute==m&&second==s) fengming(); //定时时间到,蜂鸣器响;

if(mode%2==0) ymdxianshi(year,month,day);

else {

if(td%3==2) xianshi(h,m,s); // 定时状态;

//显示年月日

else xianshi(hour,minute,second); //正常显示时间状态;

a

a

} } }

void delay() //延时函数; {

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

void ymdxianshi(unsigned int year,month,day) //年月日的显示与调整 {int i,j; i++;

if(td%2==1&&yw%8==0&&i%2==0) //点亮年的第一个

{

P2=0x7f; P0=zimal[12]; for(j=0;j<2000;j++); }

else {

P2=0x7f;

P0=zimal[year/1000];

a

a

}

delay();

if(td%2==1&&yw%8==1&&i%2==0) //点亮年的第二个 {

P2=0xbf; P0=zimal[12]; for(j=0;j<1800;j++); }

else {

P2=0xbf; }

if(td%2==1&&yw%8==2&&i%2==0)//点亮年的第三个 {

P2=0xdf; P0=zimal[12]; for(j=0;j<1800;j++); }

P0=zimal[year%1000/100]; delay();

else {

a

a

P2=0xdf;

P0=zimal[year%100/10]; delay();

}

if(td%2==1&&yw%8==3&&i%2==0) //点亮年的第四个 { }

else //显示年

{ P2=0xef;

P0=zimal[year%10]; delay(); } P2=0xef; P0=zimal[12]; for(j=0;j<1800;j++);

if(td%2==1&&yw%8==4&&i%2==0)//显示月点亮 {

P2=0xf7; P0=zimal[12]; P2=0xfb; P0=zimal[12];

a

a

for(j=0;j<1800;j++); }

else {

P2=0xf7;

P0=zimal[month/10]; delay(); P2=0xfb;

P0=zimal[month%10]; delay(); }

P2=0xef;//显示点 P0=zimal[11];

for(j=0;j<100;j++);

P2=0xfb; P0=zimal[11]; for(j=0;j<100;j++);

if(td%2==1&&yw%8==5&&i%2==0)//显示日的第一个

{

P2=0xfd;

P0=zimal[12]; for(j=0;j<1800;j++); }

a

a

else { P2=0xfd;

P0=zimal[day/10]; delay(); }

if(td%2==1&&yw%8==6&&i%2==0)//显示日的第二个

{ P2=0xfe; P0=zimal[12]; for(j=0;j<1800;j++); }

else }

void xianshi(unsigned int h,min,s) //显示时间函数; { unsigned int i,j; i++;

{ }

P2=0xfe;

P0=zimal[day%10]; delay();

a

a

if(td%3!=0&&yw%6==0&&i%2==0)

{ P2=0x7f; //显示时的第一个; } else {

P2=0x7f; }

if(td%3!=0&&yw%6==1&&i%2==0)//显示时的第二个 {

P2=0xbf; P0=zimal[12]; P0=zimal[h/10]; delay();

P0=zimal[12]; for(j=0;j<2000;j++);

for(j=0;j<2000;j++); }

else

{

P2=0xbf; P0=zimal[h%10]; delay(); }

a

a

//显示-

P2=0xdf;

P0=zimal[10];

delay();

if(td%3!=0&&yw%6==2&&i%2==0) //显示分的第一个;

{

P2=0xef;

P0=zimal[12]; for(j=0;j<2000;j++);

} else {

P2=0xef; //显示分的第二个;

P0=zimal[min/10]; delay();

}

if(td%3!=0&&yw%6==3&&i%2==0) {

P2=0xf7; P0=zimal[12]; for(j=0;j<2000;j++);

} else

a

a

{

P2=0xf7;

P0=zimal[min%10]; delay();

}

//显示-

P2=0xfb;

P0=zimal[10]; delay();

if(td%3!=0&&yw%6==4&&i%2==0) //显示秒的第一个;

{

P2=0xfd; }

else {

P2=0xfd; ; P0=zimal[s/10]; delay(); }

P0=zimal[12];

for(j=0;j<2000;j++);

if(td%3!=0&&yw%6==5&&i%2==0) //显示秒的第二个

{ P2=0xfe;

a

a

}

P0=zimal[12]; for(j=0;j<2000;j++);

else }

void ex0()interrupt 0 //外部中断零; {

unsigned int i; if(p1_3==0)delay();

if(p1_3==0) {mode++;td=0;} if(p1_1==0)delay();

if(p1_1==0)yw++; //移位; if(p1_0==0)delay();

if(p1_0==0)td++; //修改调整时间状态;

if(mode%2==0) //调整日期;

a

{ }

P2=0xfe; P0=zimal[s%10]; delay();

a

{ if(td%2==1)

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

if(p1_2==0)delay(); if(p1_2==0) //移位;

{ if(yw%8==0)year+=1000; //调整对应位的数值;

if(yw%8==1){year+=100;if(year%100/10==0)year-=1000;}

if(yw%8==2){year+=10;if(year/10%10==0)year-=100;} if(yw%8==3) {year++;if(year%10==0)year-=10;} }

// if(year>=2500)year=0; //年份小于2500; if(month>12)month=1; //月份小于12; switch(month) //日期 { case 4: case 6: case 9:

case 11:if(day>30)day=1;break;//4,6,9,11月30天;

if(yw%8==4)month++;

if(yw%8==6){day++;if(day%10==0)day-=10;} if(yw%8==5) day+=10;

a

a

}

}

case 2 :

{if (leap(year)) //闰年2月29天; while(day>29)day=1; else

while(day>28)day=1;//非闰年28天;

}break;

default:if(day>31)day=1; //1,3,5,7,8,10,12月31天;

}

//else if(td%3==1) //调整时间; else if(td%3==1) {

ET1=0;//时钟中断

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

if(p1_2==0)delay();

if(p1_2==0)

{

if(yw%6==1){hour++;if(hour%10==0) hour-=10;} if(yw%6==0)hour+=10;

if(yw%6==3){minute++;if(minute%10==0)minute-=10;}

a

a

}

if(yw%6==2)minute+=10;

if(yw%6==5){second++; if(second%10==0)second-=10;} if(yw%6==4)second+=10;

if(hour>23)hour=0; if(minute>59)minute=0; if(second>59)second=0; }

else //定时状态;

{ ET1=1; if(td%3==2) {

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

if(p1_2==0) //定时; {

if(yw%6==1){h++;if(h%10==0) h-=10; } if(yw%6==0)h+=10;

if(yw%6==3){m++;if(m%10==0)m-=10;} if(yw%6==2)m+=10;

if(yw%6==5){s++; if(s%10==0)s-=10;} if(yw%6==4)s+=10;

a

a

}

}

}

if(h>23)h=0; if(m>59)m=0; if(s>59)s=0;

}

void time1()interrupt 3 //定时器1中断; {

unsigned char i;

TF0=0; TL0=0xb0; TH0=0x3c; i++;

if(i==20) //1秒钟到;

{

second++; i=0; }

if(second==60)//1分钟;

{

second=0;

a

a

minute++; }

if(minute==60)//1小时; {

minute=0; hour++; }

if(hour==24) //1天;

{ hour=0; day++;

}

switch(month) //1月; 天;

case 2:{if(leap(year))

if(day>29){month++;day=1;} //闰年29天;

{

case 4: case 6: case 9:

case 11:if(day>30){month++;day=1;}break;//4,6,9,11月30

else

a

a

天; }

if(day>28){month++;day=1;}//非半闰年28天;

}break;

default:if(day>31){month++;day=1;}//1,3,5,7,8,10,12月30

}

if(month>12) //1年; {year++; month=1; }

void fengming() //蜂鸣器; { int m,n;

for(m=0;m<=100;m++) {p1_4=!p1_4; for(n=0;n<380;n++); } }

int leap(unsigned int year) //判断闰年函数; { int leap;

a

a

if(year%4==0&&year%100!=0||(year%400==0)) leap=1; else leap=0; return(leap); }

电路原理图

a

a

文本仅供参考,感谢下载!

a

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

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

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

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