分享

用LED实现的大屏幕时钟的制作

 共同成长888 2014-05-08

用LED实现的大屏幕时钟的制作

摘 要

基于在对单片机研究的基础上,本文提出了一种以AT89C51为核心的单片机构成数字电子钟的看法。AT89C51芯片是美国ATMEL公司生产的低电压、高性能8位单片机,片内含2KB的可反复擦写的只读程序存储器128 bytes的随机存储数据存储器(RAM),器件采用高密度,非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用中央处理器和flash存储单元。因此,在此基础上进行了数字电子钟设计的工作,给出数字电子钟的软件和硬件的设计。考虑到存在的各种干扰对系统的影响,从软件和硬件设计方面进行分析,采用相应的措施以增强系统的抗干扰能力。

该钟的显示电路采用LED数码管与AT89C51的外部I/O引脚,即采用P0口为输出口,P2口为位选,P1用来与外部输入按钮相连接,以用来控制数字钟的各个功能。P0口要直接驱动8位LED是不够的,我们通过两片74LS245对功率进行放大,如果没有,LED管将不能正常显示。(摘要只要写主要内容就可以了)

关键词:LED, 单片机, 数字钟, 抗干扰, 定时器


1 绪 论 1.1引言

在目前单片机已渗透到生活的各个领域,几乎很难找到哪个领域没有单片机的足迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说全自动控制领域的机器人、智能仪表、医疗器械了。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的工程师和科学家。科技越发达,智能化的东西就越多。看来学习单片机是社会发展的必然需求。

单片机即单片微型计算机,又称为微控制器,它的体积小,功能强,可靠性好,价格又便宜,成为传统工业技术改造和新产品更新换代的理想品种,具有广阔的发展前景,其中最具有代表性的就是Intel公司的8051系列单片机。

本文在对单片机研究的基础上,以AT89C51为核心控制芯片,对数字电子钟进行设计与应用,通过对其原理深入分析,探讨以AT89C51单片机构成数字电子钟的实现方法,介绍其设计原理及方法,给出数字钟软件设计。考虑到存在的各种干扰对系统的影响,从软、硬件设计两个方面进行分析,采取相应的措施以增强系统的抗干扰能力。

1.2选题背景

目前市场上所售的数字电子钟其主要功能都是依赖于数字电路的各功能模块的组合来实现的。这些数字钟的芯片组合和电路连接都比较难,而且焊接的过程也比较复杂,相对成本比较高,为了克服这些缺点,且能适合多种场合使用,所以这次毕业设计选择了使用以单片机编程为主的数字电子钟以满足更多人的需求。这次主要是通过软件编程来完成的,这样就降低了硬件电路的复杂性,而且其成本也有所降低,摆脱了数字电路设计所带来的电路复杂,焊接过程复杂,成本高等的劣势。所要设计的数字电子钟充分挖掘了单片机的资源和运算控制能力。具有功能多,显示全的优点。

1.3本设计的主要任务

本这次设计的主要任务:是使用采用AT89C51单片机编程的方法来实现LED数码管的时钟显示功能,还可以分别通过三个按键来改变时,分,秒。

2 单片机在工业控制中的应用

2.1 引言

1946年第一台电子计算机诞生至今,只有50年的时间,依靠微电子技术和半导体技术的进步,从电子管—晶体管—集成电路—大规模集成电路,现在一块芯片上完全可以集成几百万甚至上千万只晶体管,使得计算机体积更小,功能更强。特别是近20年时间里计算机技术获得飞速的发展,计算机在工农业,科研,教育,国防和航空航天领域获得了广泛的应用,计算机技术已经是一个国家现代科技水平的重要标志[1]。

单片机诞生于20世纪70年代,象Fairchild公司研制的F8单片微型计算机。所谓单片机是利用大规模集成电路技术把中央处理单元(Center Processing Unit,也即常称的CPU)和数据存储器(RAM)、程序存储器(ROM)及其他1/0通信口集成在一块芯片上,构成一个最小的计算机系统,而现代的单片机则加上了中断单元,定时单元及A/D转换等更复杂、更完善的电路,使得单片机的功能越来越强大,应用更广泛。

20世纪70年代,微电子技术正处于发展阶段,集成电路属于中规模发展时期,各种新材料新工艺尚未成熟,单片机仍处在初级的发展阶段,元件集成规模还比较小,功能比较简单,一般均把CPU, RAM有的还包括了一些简单的I/0口集成到芯片上,象Fairchild公司就属于这一类型,它还需配上外围的其他处理电路方才构成完整的计算系统。类似的单片机还有Zilog公司的Z80微处理器。

1976年INTEL公司推出了MCS-48单片机,这个时期的单片机才是真正的8位单片微型计算机,并推向市场。它以体积小,功能全,价格低赢得了广泛的应用,为单片机的发展奠定了基础,成为单片机发展史上重要的里程碑。

在CS-48的带领下,其后,各大半导体公司相继研制和发展了自己的单片机,象Zilog公司的Z8系列。到了80年代初,单片机已发展到了高性能阶段,象INTEL公司的MCS-51系列,Motorola公司的6801和6802系列,RokweII公司的6501及650系列等等,此外,日本的著名电气公司NEC和HITACHI都相继开发了具有自己特色的专用单片机。

80年代,世界各大公司均竞相研制出品种多功能强的单片机,约有几十个系列,300多个品种,此时的单片机均属于真正的单片化,大多集成了CPU, RAM, ROM、数目繁多的1/0接口、多种中断系统,甚至还有一些带A/D转换器的单片机,功能越来越强大,RAM和ROM的容量也越来越大,寻址空间甚至可达64kB,可以说,单片机发展到了一个全新阶段,应用领域更广泛,许多家用电器均走向利用单片机控制的智能化发展道路。

1982年以后,16位单片机问世,代表产品是INTEL公司的MCS-96系列,16位单片机比起8位机,数据宽度增加了一倍,实时处理能力更强,主频更高,集成度达到了12万只晶体管,RAM增加到了232字节,ROM则达到了8kB,并且有8个中断源,同时配置了多路的A/D转换通道,高速的1/O处理单元,适用于更复杂的控制系统。

九十年代以后,单片机获得了飞速的发展,世界各大半导体公司相继开发了功能更为强大的单片机。美国Microchip公司发布了一种完全不兼容MCS-51的新一代PIC系列单片机引起了业界的广泛关注,特别它的产品只有 33条精简指令集吸引了不少用户,使人们从INTEL的111条复杂指令集中走出来。PIC单片机获得了快速的发展,在业界中占有一席之地。

随后的事情,熟悉单片机的人士都比较清楚了,更多的单片机种蜂拥而至,MOTOROL公司相继发布了MC68HC系列单片机,日本的几个著名公司都研制出了性能更强的产品,但日本的单片机一般均用于专用系统控制,而不象INTEL等公司投放到市场形成通用单片机例如NEC公司生产的uCOM87系列片机,其代表作UPC7811是一种性能相当优异的单片机MOTOROLA公司MC68HCO5系列其高速低价等特点赢得了不少用户。

ZiIog公司的Z8系列产品代表作是Z8671,内含BASIC Debug解释程序,极大地方便用户。而美国国半的COP800系列单片机则采用先进的哈佛结构。ATMEL公司则把单片机技术与先进的Flash存储技术完美地结合起来,发布了性能相当优秀的AT89系列单片机。包括中国的台湾HOLTEK和WINBOND等公司也纷纷加入了单片机发展行列,凭着他们廉价的优势分享一杯美羹。

1990年美国INTEL公司推出了80960超级32位单片机引起了计算机界的轰动,产品相继投放市场,成为单片机发展史上又一个重要的里程碑。

此期间,单片机园地里,单片机品种异彩纷呈,争奇斗艳。有8位、16位甚至32位机但8位单片机仍以它的价格低廉、品种齐全、应用软件丰富、支持环境充分、开发方便等特点而占着主导地位。而INTEL公司凭着他们雄厚的技术,性能优秀的机型和良好的基础,目前仍是单片机的主流产品。只不过是九十年代中期,INTEL公司忙着开发他们个人电脑微处理器,己没有足够的精力继续发展自己创导的单片机技术,而由PHILIPS等公司继续发展C51系列单片机。

2.2 单片机结构

8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在分别加以说明:

中央处理器:中央处理器(CPU)是整个单片机的核心部件,是8位数据宽指挥和调度整个单元度的处理器,能处理8位二进制数据或代码,CPU负责控制、系统协调工作,完成运算和控制输入输出功能等操作[2]。

数据存储器(RAM) : 8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。

程序存储器(ROM): 8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。

定时/计数器((ROM): 8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。

并行输入输出(I/0)口:8051共有4组8位I/0口(P0,P1,P2和P3),用于对外部数据的传输。

全双工串行口: 8051内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。

中断系统:8051具备较完善的中断功能,有两个外部中断、两个定时中断,可满足不同的控制要求,并具有2级的优先级别选择。

时钟电路:8051内置最高频率达12MHz的时钟电路,用于产生整个单片机运行的脉冲时序,但8051单片机需外置振荡电容。

单片机的结构有两种类型,一种是程序存储器和数据存储器分开的形式,即哈佛((Harvard)结构。INTEL的8051系列单片机采用的是哈佛结构的形式,而后续产品16位的8096系列单片机则采用普林斯顿结构。

单片机是一种集成电路芯片,采用超大规模技术把具有数据处理能力(如算术运算,逻辑运算、数据传送、中断处理)的微处理器(CPU) ,随机存取数据存储器(RAM),只读程序存储器(ROM),输入输出电路(I/0口),可能还包括定时计数器,串行通信口(SCI),显示驱动电路(LCD或LED驱动电路),脉宽调制电路((PWM),模拟多路转换器及A/D转换器等电路集成到一块单块芯片上,构成一个最小然而完善的计算机系统。这些电路能在软件的控制下准确、迅速、高效地完成程序设计者事先规定的任务。由此来看,单片机有着微处理器所不具备的功能,它可单独地完成现代工业控制所要求的智能化控制功能,这是单片机最大的特征。然而单片机又不同于单板机,芯片在没有开发前,它只是具备功能极强的超大规模集成电路,如果赋予它特定的程序,它便是一个最小的、完整的微型计算机控制系统,它与单板机或个人电脑(PC机)有着本质的区别,单片机的应用属于芯片级应用,需要用户了解单片机芯片的结构和指令系统以及其它集成电路应用技术和系统设计所需要的理论和技术,用这样特定的芯片设计应用程序,从而使该芯片具备特定的功能[3]。

不同的单片机有着不同的硬件特征和软件特征,即它们的技术特征均不尽相同,硬件特征取决于单片机芯片的内部结构,用户要使用某种单片机,必须了解该型产品是否满足需要的功能和应用系统所要求的特性指标。这里的技术特征包括功能特性、控制特性和电气特性等等,这些信息需要从生产厂商的技术手册中得到。软件特征是指指令系统特性和开发支持环境,指令特性即我们熟悉的单片机的寻址方式,数据处理和逻辑处理方式,输入输出特性及对电源的要求等等。开发支持的环境包括指令的兼容及可移植性,支持软件(包含可支持开发应用程序的软件资源)及硬件资源.要利用某型号单片机开发自己的应用系统,掌握其结构特征和技术特征是必须的。

单片机控制系统能够取代以前利用复杂电子线路或数字电路构成的控制系统,可以软件控制来实现,并能够实现智能化,现在单片机控制范畴无所不在,例如通信产品、家用电器、智能仪器仪表、过程控制和专用控制装置等等,单片机的应用领域越来越广泛。

诚然,单片机的应用意义远不限于它的应用范畴或由此带来的经济效益,更重要的是它己从根本上改变了传统的控制方法和设计思想。是控制技术的一次革命,是一座重要的里程碑。

2.2.1 程序存储器

8051具有64kB程序存储器寻址空间,它用于存放用户程序、数据和表格等信息。对于内部无ROM的8031单片机,它的程序存储器必须外接,空间地址为64kB,此时单片机的EA端必须接地,强制CPU从外部程序存储器读取程序。对于内部有ROM的8051等单片机正常运行时则需接高电平,使CPU先从内部的程序存储中读取程序,当PC值超过内部ROM的容量时,才会转向外部的程序存储器读取程序。

8051片内有4kB的程序存储单元,其地址为OOOOH-OFFFH,单片机启动复位后,程序计数器的内容为OOOOH,所以系统将从OOOOH单元开始执行程序[4]。但在程序存储中有些特殊的单元,这在使用中应加以注意:其中一组特殊单元是OOOOH-0002H单元,系统复位后,PC为OOOOH,单片机从OOOOH单元开始执行程序,如果程序不是从OOOOH单元开始,则应在这三个单元中存放一条无条件转移指令,让CPU直接去执行用户指定的程序。另一组特殊单元是0003H-002AH,这40个单元各有用途,它们被均匀地分为五段,它们的定义如下:

0003H-000AH外部中断0中断地址区 OOOBH-0012H定时/计数器0中断址区。

0013H-001AH外部中断1中断地址区 001BH-0022H定时/计数器1中断址区。

0023H-002AH串行中断地址区可见以上的40个单元是专门用于存放中断处理程序的地址单元,中断响应后,按中断的类型自动转到各自的中断区去执行程序。因此以上地址单元不能用于存放程序的其他内容,只能存放中断服务程序。但是通常情况下,每段只有8个地址单元是不能存下完整的中断服务程序的,因而一般也在中断响应的地址区安放一条无条件转移指令,指向程序存储器的其它真正存放中断服务程序的空间去执行,这样中断响应后,CPU读到这条转移指令,便转向其他地方去继续执行中断服务程序。

2.2.2 数据存储器

数据存储器也称为随机存取数据存储器[2]。8051单片机的数据存储器在物理上都分和逻辑上为两个地址空间,一个是内部数据存储区和一个外部数据存储区。8051内部RAM有128或256个字节的用户数据存储,它们是用于存放执行的中间结果和过程数据的。8051的数据存储器均可读写,部分单元还可以位寻址。

8051内部RAM共有256个单元,这256个单元共分为两部分。其一是地址从OOH-7FH单元 (共128个字节)为用户数据RAM。从80H-FFH地址单元(也是128个字节)为特殊寄存器 (SFR)单元。在OOH-1FH共32个单元中被均匀地分为四块,每块包含八个8位寄存器,均以RO-R7来命名,常称这些寄存器为通用寄存器。

内部RAM的20H-2FH单元为位寻址区,既可作为一般单元用字节寻址,也可对它们的位进行寻址。位寻址区共有16个字节,128个位,位地址OOH-7FH。

位地址分配如下表所示,CPU能直接寻址这些位,常称8051具有布尔处理功能,布尔处理的存储空间指的就是这些位寻址区[5]。

2.1 RAM 位寻址区地址

单元地址

MSB位地址LSB

2FH

2EH

2DH

2CH

2BH

2AH

29H

28H

27H

26H

25H

24H

23H

22H

21H

20H

7FH

77H

6FH

67H

5FH

57H

4FH

47H

3FH

37H

2FH

27H

1FH

17H

0FH

07H

7EH

76H

6EH

66H

5EH

56H

4EH

46H

3EH

36H

2EH

26H

1EH

16H

0EH

06H

7DH

75H

6DH

65H

5DH

55H

4DH

45H

3DH

35H

2DH

25H

1DH

15H

0DH

05H

7CH

74H

6CH

64H

5CH

54H

4CH

44H

3CH

34H

2CH

24H

1CH

14H

0CH

04H

7BH

73H

6BH

63H

5BH

53H

4BH

43H

3BH

33H

2BH

23H

1BH

13H

0BH

03H

7AH

72H

6AH

62H

5AH

52H

4AH

42H

3AH

32H

2AH

22H

1AH

12H

0AH

02H

79H

71H

69H

61H

59H

51H

49H

41H

39H

31H

29H

21H

19H

11H

09H

01H

78H

70H

68H

60H

58H

50H

48H

40H

38H

30H

28H

20H

18H

10H

08H

00H

2.2.3 特殊功能寄存器

特殊功能寄存器 (SFR):也称为专用寄存器,特殊功能寄存器反映8051单片机的运行状态。很多功能也通过特殊功能寄存器来定义和控制[7] [8]。

8051有20个特殊功能寄存器,它们被离散地分布在内部RAM的80H-FFH地址中,这些寄存的功能己作了专门的规定,用户不能修改其结构。程序计数器PC (program Counter):它不属于特殊内部数据存储器块PC是一个16位的计数器,用于存放一条要执行的指令地址,寻址范围为64kB的PC有自动加1功能,即完成了一条指令的执行后,其内容自动加1。PC本身并没有地址,因而不可寻址,用户无法对它进行读写,但是可以通过转移、调用、返回等指令改变其内容,以控制程序按要求去执行。

累加器ACC(Accumulator):是一个最常用的专用寄存器,大部分单操作指令的一个操作数取自累加器,很多双操作数指令中的一个操作数也取自累加器。加、减、乘、除法运算的指令、运算结果都存放于累加器A或AB累加器对中。大部分的数据操作都会通过累加器A进行。

表2.2 特殊功能寄存器

标识符号

地址

寄存器名称

ACC

B

PSW

SP

DPTR

IE

IP

P0

P1

P2

P3

PCON

SCON

SBUF

TCON

TMOD

TL0

TH0

TL1

TH1

0E0H

0F0H

0D0H

81H

82,83H

0A8H

0B8H

80H

90H

0A0H

0BH

87H

98H

99H

88H

89H

8AH

8CH

8BH

8DH

累加器

B寄存器

程序状态字

堆栈指针

数据指针(16位)含DPL和DPH

中断允许控制寄存器

中断优先控制寄存器

I/O口0寄存器

I/O口1寄存器

I/O口2寄存器

I/O口3寄存器

电源控制及波特率选择寄存器

串行口控制寄存器

串行数据缓冲寄存器

定时控制寄存器

定时器方式选择寄存器

定时器0低8位

定时器0高8位

定时器1低8位

定时器1高8位

寄存器B:在乘除法指令中,乘法指令中的两个操作数分别取自累加器A和寄存器B,其结果存放于AB寄存器对中。除法指令中,被除数取自累加器A,除数取自寄存器B,结果商存放于累加器A,余数存放于寄存器B中。

程序状态字:程序状态字是一个8位寄存器,用于存放程序运行的状态信息,这个寄存器的一些位可由软件设置,有些位则由硬件运行时自动设置。其中PSW.1是保留位,未使用。表2.3是它的功能说明,并对各个位的定义介绍如下

表2.3 程序状态字

位序

PSW.7

PSW.6

PSW.5

PSW.4

PSW.3

PSW.2

PSW.1

PSW.0

位标志

CY

AC

F0

RS1

RS0

OV

-

P

PSW.7 (CY):进位标志位,此位有两个功能:一是存放执行某写算数运时,存放进位标志,可被硬件或软件置位或清零。二是在位操作中作累加位使用

PSW.6 (AC):辅助进位标志位,进行加、减运算时当有低4位向高4位进或借位时,AC置位,否则被清零。AC辅助进位位也常用于十进制调整。

PSW.5 (FO):用户标志位,供用户设置的标志位。

PSW.4, PSW.3 (RS I和 RSO):寄存器组选择位。

PSW.2 (OV):溢出标志。带符号加减运算中,超出了累加器A所能表示的号数有效范围 (-128-+127)时,即产生溢出,OV=1。表明运算结果错误。如OV=O,表明运算结果正确。

执行加法指令ADD时,当位6向位7进位,而位7不向C进位时,OV=1或者位6不向位7进位,而位7向C进位时,同样OV=1;执行乘法指令时,当乘积超过25OV=1。乘积在AB寄存器对中。若OV=O,则说明乘积没有超过255,乘积只在累加器A中:执行除法指令时,当OV=1表示除数为0,运算不被执行。

PSW.0 (P):奇偶校验位。声明累加器A的奇偶性,每个指令周期都由硬件置位或清零,若值为1的位数奇数,则P置位,否则清零。

数据指针(DPTR):数据指针为16位寄存器,编程时,既可以按16位寄存器来使用,也可以按两个8位寄存器来使用,即高位字节寄存器DPH和低位字节DPL。

DPTR主要是用来保存16位地址,当对64kB外部数据存储器寻址时,可作为间址存储器使用,此时,使用如下两条指令:

MOVX A, @DPTR

MOVX @DPTR,A

在访问程序存储器时,DPTR可用作基址寄存器,采用基址+变址寻址方式问程序存储器,这条指令常用于读取程序存储器内的表格数据。

MOVC A,@A+DPTR

堆栈指针SP (Stack Pointer):堆栈是一种数据结构,它是一个8位寄存器它指示堆栈顶部在内部RAM中的位置。系统复位后,SP的初始值为07H。

实际上是从08H开始的。但从RAM的结构分布中可知,OSH-1 FH隶属1-3工作寄器区,若编程时需要用到这些数据单元,必须对堆栈指针SP进行初始化,原则设在任何一个区域均可,但一般设在30H-1FH之间较为适宜。

数据写入堆栈称为入栈 (PUSH,也称作插入运算或压入),从堆栈中取出据称为出栈 ( POP,也称为删除运算或弹出),堆栈的最主要特征是“后进先出”规则,即最先入栈的数据放在堆栈的最底部,而最后入栈的数据放在栈的顶部。因此,最后入栈的数据出栈时则是最先的。

堆栈的设立是为中断操作和子程序的调用而用于保存数据的,即常说的点保护和现场保护。微处理器无论是在转入子程序和中断服务程序的执行,执完后,还是要回到主程序中来,在转入子程序和中断服务程序前,必须先将现的数据进行保存,否则返回时,CPU并不知道原来的程序执行到哪一步,原来中间结果如何。所以在转入执行其它子程序前,先将需要保存的数据压入堆栈保存,以备返回时再复原当时的数据,供主程序继续执行。

堆栈的操作有两种方法:其一是自动方式,即在中断服务程序响应或子序调用时,返回地址自动进栈。当需要返回执行主程序时,返回的地址自动交PC,以保证程序从断点处继续执行,这种方式是不需要编程人员干预的。第二方式是人工指令方式,使用专有的堆栈操作指令进行进出栈操作,也只有两条指令:进栈为PUSH指令,在中断服务程序或子程序调用时作为现场保护;出栈POP指令,用于子程序完成时为主程序恢复现场。

I/O口专用寄存器(P0, P1, P2, P3):I/O口寄存器P0, Pl, P2和P3分别8051单片机的四组I/O口锁存器。8051单片机并没有专门的I/O口操作指令,而把I/O口也当作一般的寄存器来使用,数据传送都统一使用MOV指令来进行,这样的好处在于四组I/O口还可以当作寄存器直接寻址方式参与其他操作。

定时/计数: 8051单片机中有两个16位的定时/计数器TO和T1,它们由四个8位寄存器组成的,两个16位定时/计数器却是完全独立的。可以单独对这四个寄存器进行寻址,但不能把TO和T1当作16位寄存来使用。

定时/计数器方式选择寄存器(TMOD): TMOD寄存器是一个专用寄存器,用于控制两个定时计数器的工作方式,TMOD可以用字节传送指令设置其内容,但不能位寻址,各位的定义如表2.4所示。

表2.4 定时/计时器工作方式控制寄存器TMOD

位序

D7

D6

D5

D4

D3

D2

D1

D0

位标志

GATE

C/T

M1

MO

GATE

C/T

M1

M0

定时器

定时/计数器1

定时/计数器0

2.2.4 8051单片机的指令时序

时序是用定时单位来描述的,8051的时序单位有四个,它们分别是节拍、状态、机器周期和指令周期,接下来分别加以说明。

节拍与状态:把振荡脉冲的周期定义为节拍 (为方便描述,用P表示),振荡脉冲经过二分频后即得到整个单片机工作系统的时钟信号,把时钟信号的周期定义为状态(用S表示),这样一个状态就有两个节拍,前半周期相应的节拍定义为1(P) ,后半周期对应的节拍定义为2(P)。机器周期:

8051有固定的机器周期,规定一个机器周期有6个状态,分别表示S1-S6。

而一个状态包含两个节拍,那么一个机器周期就有12个节拍,可以记着SIP2,SIP2...... S6P1, S6P2,一个机器周期共包含12个振荡脉冲,即机器周期就是振荡脉冲的12分频,显然,如果使用6MHZ的时钟频率,一个机器周期就是2us,而如使用12MHz的时钟频率,一个机器周期就是lus。

指令周期:执行一条指令所需要的时间称为指令周期,8051的指令有单字节、双字节和三字节的,所以它们的指令周期不尽相同,也就是说它们所需的机器周期不相同,可能包括一到四个不等的机器周期。

8051的指令时序:8051指令系统中,按它们的长度可分为单字节指令、双字节指令和三字节指令。执行这些指令需要的时间是不同的,也就是它们所需的机器周期是不同的,有下面几种形式:单字节指令单机器周期;单字节指令双机器周期;双字节指令单机器周期;双字节指令双机器周期;三字节指令双机器周期;单字节指令四机器周期(如单字节的乘除法指令)。

单字节单周期指令:单字节单周期指令只进行一次读指令操作,当第二个ALE信号有效时,PC并不加1,读出的还是原指令,属于一次无效的读操作。

双字节单周期指令:这类指令两次的ALE信号都是有效的,只是第一个ALE信号有效时读的是操作码,第二个ALE信号有效时读的是操作数。

单字节双周期指令:两个机器周期需进行四次读指令操作,但只有一次读操作是有效的,后三次的读操作均为无效操作。

单字节双周期指令有一种特殊的情况,像MOVX这类指令,执行这类指令时,先在ROM中读取指令,然后对外部数据存储器进行读或写操作,头一个机器周期的第一次读指令的操作码为有效,而第二次读指令操作则为无效的。在第二个指令周期时,则访问外部数据存储器,这时,ALE信号对其操作无影响,即不会再有读指令操作动作。

外部程序存储器(ROM)读时序: 8051外部程序存储器读时序图时PO口提供低8位地址,P2口提供高8位地址,S2结束前,PO口上的低8位地址是有效的,之后出现在PO口上的就不再是低8位的地址信号,而是指令数据信号。当然地址信号与指令数据信号之间有一段缓冲的过度时间,这就要求在S2期间必须把低8位的地址信号锁存起来,这时是用ALE选通脉冲去控制锁存器把低8位地址予以锁存,P2口只输出地址信号,而没有指令数据信号。整个机器周期地址信号都是有效的,因而无需锁存地址信号。

从外部程序存储器读取指令,必须有两个信号进行控制,除了上述的ALE信号,还有一个PSEN(外部ROM读选通脉冲)。PSEN开始有效,直到将地址信号送出和外部程序存储器的数据读入CPU后方才失效,接着从S4P2开始执行第二个读指令操作。

外部数据存储器(RAM)读时序: 从ROM中读取需执行的指令,而CPU对外部数据存储的访问是对RAM进行数据的读或写操作,属于指令的执行周期,读或写是两个不同的机器周期,但他们的时序却是相似的,只对RAM的读时序进行分析。

上一个机器周期是取指阶段,是从ROM中读取指令数据,接着的下个周期才开始读取外部数据存储器RAM中的内容。在S4结束后,先把需读取RAM中的地址放到总线上,包括PO口上的低8位地址AO-A7和P2口上的高8位地址A8-A15。当RD选通脉冲有效时,将RAM的数据通过PO数据总线读进CPU。第二个机器周期的ALE信号仍然出现,进行一次外部ROM的读操作,但是这一次的读操作属于无效操作。

对外部RAM进行写操作时,CPU输出的则是WR(写选通信号),将数据通过P0数据总线写入外部存储中。

2.2.5 8051单片机输入输出口

8051有4组8位1/0口:P0, P1,P2和P3口,P1、P2和P3为准双向口,PO口则为双向三态输入输出口,下面分别介绍这几个口线:

PO口和P2口:PO口和P2口电路中包含一个数据输出锁存器和两个三态数据输入缓冲器,另外还有一个数据输出的驱动和控制电路。这两组口线用来作为CPU与外部数据存储器、外部程序存储器和I/0扩展口,而不能像Pl、P3直接用作输出口。它们一起可以作为外部地址总线,PO口身兼两职,既可作为地址总线,也可作为数据总线[5][7]。

P2口作为外部数据存储器或程序存储器的地址总线的高8位输出口AB8-AB15。 PO口由ALE选通作为地址总线的低8位输出ABO-AB7。外部的程序存储器由PSEA信号选通,数据存储器则由WR和RD读写信号选通, 8051最大可外接64kB的程序存储器和数据存储器。

P1口:P1口为8位准双向口,每一位均可单独定义为输入或输出口,当作为输入口时,1写入锁存器,Q(非)=0,内上拉电阻将电位拉至“1”,此时该口输出为1,当0写入锁存器,Q(非)=1,输出则为0。

作为输入口时,锁存器置l, Q(非)=0,此时该位既可以把外部电路拉成低电平,也可由内部上拉电阻拉成高电平,正因为这个原因,P1口常称为准双向口。需要说明的是,作为输入口使用时,有两种情况,其一是:首先是读锁存器的内容,进行处理后再写到锁存器中,这种操作即读一修改一写操作,像JBC(逻辑判断)、CPL(取反)、INC(递增)、DEC(递减)、ANL(与逻辑)和ORL(逻辑或)指令均属于这类操作。其二是:读P1口线状态时,打开三态门G2,将外部状态读入CPU。

P3口:P3口为准双向口,为适应引脚的第二功能的需要,增加了第二功能控制逻辑,在真正的应用电路中,第二功能显得更为重要。由于第二功能信号有输入输出两种情况,分别加以说明。P3口的输入输出及P3口锁存器、中断、定时/计数器、串行口和特殊功能寄存器有关,P3口的第一功能和P1口一样可作为输入输出端口,同样具有字节操作和位操作两种方式,在位操作模式下,每一位均可定义为输入或输出。着重讨论P3口的第二功能,P3口的第二功能各管脚定义如下:

P3.0 串行输入口(RXD)

P3.1 串行输出口((TXD)

P3.2 外中断0 (INTO)

P3.3 外中断1(INT1)

P3.4 定时/计数器0的外部输入口(TO)

P3.5 定时/计数器1的外部输入口(T1)

P3.6 外部数据存储器写选通(WR)

P3.7 外部数据存储器读选通(RD)

第二功能为输出引脚,当作I/0口使用时,第二功能信号线应保持高电平与非门开通,以维持从锁存器到输出口数据输出通路畅通。当作第二功能口线用时,该位的锁存器置高电平,使与非门对第二功能信号的输出是畅通,从而实现第二功能信号的输出。对于第二功能为输入的信号引脚,在口线上的输入通路增设了一个缓冲器,输入的第二功能信号即从这个缓冲器的输出端取得。而作为I/0口线输入端时,取自三态缓冲器的输出端。这样,不管是作为输入口使用还是第二功能信号输入,输出电路中的锁存器输出和第二功能输出信号线均应置“1”。

2.2.6 8051定时/计数器

8051的单片机内有两个16位可编程的定时/计数器[3],它们具有四种工作方式,其控制字和状态字均在相应的特殊功能寄存器中,通过对控制寄存器的编程可选择适当的工作方式。

8051单片机内部的定时器TO特殊功能寄存器由TLO(低8位)和THO(高8位)构成,定时器T1由特殊功能寄存器由TLl(低8位)和TH1(高8位)构成。

特殊功能寄存器TMOD控制定时寄存器的工作方式,TCON则用于控制定时器TO和T1的启动和停止计数,同时管理定时器TO和T1的溢出标志等。程序开始时需对TL0, THO, TL1和TH1进行初始化编程,以定义它们的工作方式和控制TO和T的计数。定时/计数器的方式控制字TMOD,字节地址为89H,其格式如表2.5:

表2.5 TMOD 寄存器结构

D7

D6

D5

D4

D3

D2

D1

D0

GATA

C/T

M1

M0

GATA

C/T

M1

M0

T1方式字段

T0方式字段

表2.6 TCON 结构

D7

D6

D5

D4

D3

D2

D1

D0

TF1

TR1

TF0

TR0

IE1

IT1

IE0

IT0

需要注意的是,TCON的DO-D3位与中断有关,在中断的内容中会加以说明,8051的定时/计数器共有四种工作方式,逐个进行讨论。

工作方式0

定时/计数器0的工作方式0是13位计数结构的工作方式,其计数器由TH的全部8位和TL的低5位构成,TL的高3位没有使用。当C/T=0时,多路开关接通振荡脉冲的12分频输出,13位计数器依次进行计数,这就是定时工作方式。当C/T=1时,多路开关接通计数引脚 (To),外部计数脉冲由引脚To输入。当计数脉冲发生负跳变时,计数器加1,这就是计数工作方式。不管是哪种工作方式,当TL的低5位溢出时,都会向TH进位,而全部13位计数器溢出时,则会向计数器溢出标志位TFO进位。

GATA位的状态决定定时器运行控制取决于TRO的一个条件还是TRO和INTO引脚这两个条件。当GATA=O时,与门的输出端由TRO和INTO电平的状态确定,此时如果TRO=1,INTO=1与门输出为1,允许定时/计数器计数,在这种情况下,运行控制由TRO和工NTO两个条件共同控制,TRO是确定定时/计数器的运行控制位,由软件置位或清“0”。如上所述,TFO是定时/计数器的溢出状态标志,溢出时由硬件置位,TFO溢出中断被CPU响应时,转入中断时硬件清“0”, TFO也可由程序查询和清“0”。

在方式0下,计数器的计数值范围是1-8192( )。为定时工作方式时,定时时间的计算公式为:( 一计数初值)X晶振周期X12或 ( 一计数初值)X机器周期,时间单位与晶振周期或机器周期相同。

工作方式1

当M1M0=01时,定时/计数器处于工作方式1。方式0和方式1的区别仅在于计数器的位数不同,方式0为13位,而方式1则为16位,由THO作为高8位,TLO为低8位,有关控制状态字和方式0相同。

在工作方式1下,计数器的计数值范围是1-65536( ),当为定时工作方式1时,定时时间的计算公式为:( 一计数初值)X晶振周期X12或 ( 一计数初值)X机器周期,其时间单位与晶振周期或机器周期相同。

工作方式2

M1M0=10时,定时/计数器处于工作方式2。工作方式0和工作方式1的最大特点就是计数溢出后,计数器为全0,因而循环定时或循环计数应用时就存在反复设置初值的问题,这给程序设计带来许多不便,同时也会影响计时精度。工作方式2就针对这个问题而设置,它具有自动重装载功能,即自动加载计数初值, 所以也称为自动重加载工作方式。在这种工作方式中,16位计数器分为两部分,即以TLO为计数器,以THO作为预置寄存器,初始化时把计数初值分别加载至TLO和THO中,当计数溢出时,由预置寄存器TH以硬件方法自动给计数器TLO重新加载。

程序初始化时,给TLO和THO同时赋以初值,当TLO计数溢出时,置位TFO的同时把预置寄存器THO中的初值加载给TLO, TLO重新计数。如此反复,这样省去了程序不断给计数器赋值的麻烦,而且计数准确度也提高了。但这种方式也有其不利的一面,就是这样一来的计数结构只有8位,计数值有限,最大只能到2550。所以这种工作方式很适合于那些重复计数的应用场合,例如可以当作串行数据通信的波特率发送器使用。

工作方式3

当M1M0=11时,定时/计数器处于工作方式3。在工作方式3模式下,定时/计数器0被拆成两个独立的8位计数器TL0和TH0。其中TL0既可以作计数器使用,也可以作为定时器使用,定时/计数器0的各控制位和引脚信号全归它使用。其功能和操作与方式0或方式1完全相同。TH0只能作为简单的定时器使用,而且由于定时/计数器0的控制位已被TL0占用,因此只能借用定时/计数器1的控制位TRl和TFI,也就是以计数溢出去置位TFI, TRI则负责控制TH0定时的启动和停止。由于TL0既能作定时器也能作计数器使用,而TH0只能作定时器使用而不能作计数器使用,因此在方式3模式下,定时/计数器0可以构成二个定时器或者一个定时器和一个计数器。如果定时/计数器0工作于工作方式3,那么定时/计数器1的工作方式就不可避免受到一定的限制,因为自己的一些控制位己被定时/计数器借用,只能工作在方式0、方式1或方式2下。在这种情况下,定时/计数器1通常作为串行口的波特率发生器使用,以确定串行通信的速率,因为已没有TFI被定时/计数器0借用了,只能把计数溢出直接送给串行口。当作波特率发生器使用时,只需设置好工作方式,即可自动运行。如要停止它的工作,只需送入一个把它设置为方式3的方式控制字即可,这是因为定时/计数器本身就不能工作在方式3,如硬把它设置为方式3,自然会停止工作。

2.3 单片机的编程软件的介绍

2. 3.1 Proteus的简介

Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件[9]。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:①实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。②支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。③提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2等软件。④具有强大的原理图绘制功能。总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。

Proteus主要用于绘制原理图并可进行电路仿真,Proteus ARES 主要用于PCB 设计。ISIS 的主界面主要包括:1 是电路图概览区、2 是元器件列表区、3 是绘图区。绘制电路图的过程如下:

单击2 区的P 命令即弹出元器件选择(Pick Devices)对话框,Proteus 提供了丰富的元器件资源,包括30 余种元器件库,有些元器件库还具有子库。利用该对话框提供的关键词(Keywords)搜索功能,输入所要添加的元器件名称,即可在结果(Results)中查找,找到后双击鼠标左键即可将该元器件添到2 区,待所有需要的元器件添加完成后点击对话框右下角的OK 按钮,返回主界面。接着在2 区中选中某一个元器件名称,直接在3 区中单击鼠标左键即可将该元器件添加到3 区。

由于是英国的软件,特别要注意的是绘图区中鼠标的操作和一般软件的操作习惯不同,这正像是司机座位和人行道走向和国内不同一样。单击左键是完成在2 区中被选中的元器件的粘贴功能;将鼠标置于某元器件上并单击右键则是选中该元器件(呈现红色),若再次单击右键的话则删除该元器件,而单击左键的话则会弹出该元器件的编辑对话框(Edit Component);若不需再选中任何元器件,则将鼠标置于3 区的空白处单击右键即可;另外如果想移动某元器件,则选中该元器件后再按住鼠标左键即可将之移动。

元器件之间的连线方法为:将鼠标移至元器件的某引脚,即会出现一个“×”符号,按住鼠标左键后移动鼠标,将线引至另一引脚处将再次出现符号“×”,此时单击鼠标左键便可完成连线。连线时在需拐弯的地方单击鼠标左键即可实现方向的改变。绘制好电路后,可利用1 区的绿色边框对3 区的电路进行定位。

2.4 单片机在工业控制中的应用领域

单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴[4]:

2.4.1在智能仪器仪表上的应用

单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。例如精密的测量设备(功率计,示波器,各种分析仪)。

2.4.2在工业控制中的应用

用单片机可以构成形式多样的控制系统、数据采集系统。例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等。

2.4.3在家用电器中的应用

可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭褒、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备,五花八门,无所不在。

2.4.4 在计算机网络和通信领域中的应用

现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。

2.4.5 单片机在医用设备领域中的应用

单片机在医用设备中的用途亦相当广泛,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等。此外,单片机在工商,金融,科研、教育,国防航空航天等领域都有着十分广泛的用途。

2.4.5 本章小节

本章从结构及用途方面系统地介绍了单片机,以便更好的对其使用。

3 控制系统硬件设计

3.1硬件电路图

3.2主控制部分

主控制部分采用AT89C51为控制芯片。其每个端口的功能分别如下:

本次实验输入都采用检测P1口的引脚电位的变化来实现的,其每个引脚的功能分别如下:

P1.0:调整按钮,用来调整时间的。每按下一次,可改变调整时间的位选,循环一周后回到显示时间界面。

P1.1:加按钮,在调整时间或在设置定时过程中向上调整。在秒表过程中,用来启动秒表。

P1.2:减按钮,在调整时间或在设置定时过程中向下调整。在秒表过程中,用来停止秒表。

P1.3:显示日期按钮,当按下后显示当前日期,弹起回到显示时间界面。

P1.4:定时按钮,按下后跳到调节定时时间界面,每按下一次,可改变定时时间的位选,循环一周后回到显示时间界面。

P1.5:显示秒表按钮。当按下后跳到显示秒表界面,当秒表停下后,再次按下此按钮回到显示时间界面。

本次实验采用P0口作为显示数据的输出口,P0口输出8位的显示数据送给74LS245进行功率放大后,再送给数码管显示。P2口位位选口,同一时间只能一位位低电平,对应的该位显示输出。每位轮流显示输出,在高速轮流反复显示下,根据视角暂留,就可以看到连续的显示。

P3.0和P3.1分别作为整点报时和定时时间到报警的闹铃驱动端。

3.3显示部分

显示部分采用两片4位七段数码管[10],共显示8位。在显示时间时,时、分、秒分别占两位,他们中间用“—”隔开。

3.4功率驱动部分

显示数据由P0口输出后不足以驱动数码管[10],故采用两片74LS245以增强其驱动能力。

3.5本章小节

本章主要介绍了数字钟的每部分的功能,并详细介绍了AT89C51每个端口在实验中的应用。

4 软件设计

4.1程序设计流程

软件系统的功能的主要任务是完成数字钟的显示调时功能。

数字钟的主要流程图见下:

图4.1 流程图

4.2 仿真结果

图4.2 程序运行效果图

图4.3 秒表运行效果图

图4.4 显示日期运行效果图

从proteus里可以看到程序的运行效果很令人满意,时间显示正常,尽管计时存在一定的误差,但在允许的误差范围内。秒表在改变过程中没有明显抖动,证明消抖比较成功[11]

在调节时间和调整定时时间时,要调整的那位闪烁,在向上或向下调节时均能正常满足要求。整点和定时时间到时,可以正常的驱动二级管(表示闹铃),效果令人满意。

4.3 本章小结

在本章主要叙述了软件的设计流程及实现效果。

5 结论

本文主要对数字电子钟进行了研究,在学习单片机理论知识的基础上,以AT89C51芯片为控制核心,设计了检测系统的硬件电路和软件。

本文主要完成下面工作:

1. 8051芯片性能参数的分析。

2.相关软件的学习和使用。

3. 数字电子钟的设计方案、显示电路及相应的软件的设计

4.8051构成的数字电子钟电路及相应的软件的设计

5.单片机系统抗干扰方法从软件和硬件方面进行分析。

所设计的数字电子钟有如下功能:

1.使用晶振与单片机相连接;

2.通过软件的方法实现以24小时为一个周期;

3.可选择显示年、月、日、或时、分、秒;

所存在的不足:

由于能力有限,不能够充分利用所学知识,对所设计的数字钟不能有进一步的简化,其电路及软件还有待更好的改善。

附录1:程序

T_SET BIT P1.0;调整

A_SET BIT P1.1;加1

S_SET BIT P1.2;减1

D_SET BIT P1.3;日期

TIMER_SET BIT P1.4;设置定时时间

MM_SET BIT P1.5;秒表

SECOND EQU 32H

MINUTE EQU 31H

HOUR EQU 30H

TCNT EQU 39H;t0中断次数

COUNT EQU 40H;判断哪位

FRIST EQU 36H

MIDDLE EQU 37H

LASTER EQU 38H

YEAR EQU 33H

MON EQU 34H

DAY EQU 35H

TIMER_HOUR EQU 41H

TIMER_MINUTE EQU 42H

TIMER_SECOND EQU 43H

TIMER_COUNT EQU 44H;定时判断哪位

TIMERSYMBOL EQU 45H;定时到达标志位

MMSEC EQU 47H;秒表,0。1秒

MSEC EQU 48H;1秒

MMIN EQU 49H;1分

ORG 0000H

SJMP START

ORG 0BH

LJMP INT_T0

ORG 001BH

LJMP INT_T1

START:

MOV DPTR, #TABLE

MOV HOUR, #12

MOV MINUTE, #35

MOV SECOND, #55

MOV YEAR, #07

MOV MON, #5

MOV DAY, #15

MOV TIMER_HOUR,#12

MOV TIMER_MINUTE,#30

MOV TIMER_SECOND,#30

MOV TCNT, #0

MOV COUNT,#0

MOV TIMER_COUNT,#0

MOV TIMERSYMBOL,#1;为0定时时间到

MOV TMOD, #11H

MOV TH0, #3CH

MOV TL0, #0B0H

MOV IE, #8AH

SETB PT0;设t0为最高优先级

SETB TR0

A1:

LCALL CLOCK

LCALL DISPLAY

JNB T_SET, S10;调整时间

JNB TIMER_SET,S20;设置定时时间

JNB D_SET, S4;显日期

JNB MM_SET,S3;显示秒表

MOV A,TIMERSYMBOL;定时时间到标志

JNZ A1;定时时间到

AJMP ALARM

AJMP A1

S10:

AJMP S1

S20:

AJMP S2

MOV R2,#0FFH;定时时间到,启动闹铃

ALARM:

CPL P3.1

DJNZ R2,A1

MOV TIMERSYMBOL,#1

SETB P3.1

AJMP A1

S3:

MOV MMSEC,#0;显示秒表

MOV MSEC,#0

MOV MMIN,#0

LCALL MSECOND

LCALL DISPLAY

JNB A_SET,M1

AJMP S3

M1:

MOV TH1, #0D8H

MOV TL1, #0F0H;启动秒表

SETB TR1

LCALL MSECOND

LCALL DISPLAY

JNB S_SET,M2

AJMP M1

M2:;停止秒表

CLR TR1

LCALL MSECOND

LCALL DISPLAY

JNB MM_SET,J3

JNB A_SET,M1

AJMP M2

J3:;判断停止秒表按键抬起

JB MM_SET,A1

LCALL MSECOND

LCALL DISPLAY

AJMP J3

S4:;显示日期

LCALL DATE

LCALL DISPLAY

LJMP J9

J9:;判断显示日期按键抬起

JB D_SET,A1

LCALL DATE

LCALL DISPLAY

SJMP J9

A12:

AJMP A1

S2:

;定时判断哪位

INC TIMER_COUNT

MOV A,TIMER_COUNT

CJNE A,#5,SSSS

MOV TIMER_COUNT,#1

SSSS:

MOV A,TIMER_COUNT

DEC A

JZ TIMER_HOUR0

DEC A

JZ TIMER_MINUTE0

DEC A

JZ TIMER_SECOND0

DEC A

JZ A12

TIMER_HOUR0:;不变,闪烁

MOV R3,TIMER_HOUR

MOV R4,#8H

T_HOUR0:

MOV TIMER_HOUR,#0

LCALL TIMER

LCALL DISPLAY

DJNZ R4,T_HOUR0

MOV R4,#8H

T_HOUR1:

MOV TIMER_HOUR,R3

JNB TIMER_SET,J01

LCALL TIMER

LCALL DISPLAY

DJNZ R4,T_HOUR1

JNB TIMER_SET,J01

JNB A_SET,TIMER_HOUR1

JNB S_SET,TIMER_HOUR2

AJMP TIMER_HOUR0

TIMER_MINUTE0:

MOV R3,TIMER_MINUTE

MOV R4,#8H

T_MINUTE0:

MOV TIMER_MINUTE,#0

LCALL TIMER

LCALL DISPLAY

DJNZ R4,T_MINUTE0

MOV R4,#8H

T_MINUTE1:

MOV TIMER_MINUTE,R3

JNB TIMER_SET,J01

LCALL TIMER

LCALL DISPLAY

DJNZ R4,T_MINUTE1

JNB TIMER_SET,J01

JNB A_SET,TIMER_MINUTE1

JNB S_SET,TIMER_MINUTE2

AJMP TIMER_MINUTE0

TIMER_SECOND0:

MOV R3,TIMER_SECOND

MOV R4,#8H

T_SECOND0:

MOV TIMER_SECOND,#0

LCALL TIMER

LCALL DISPLAY

DJNZ R4,T_SECOND0

MOV R4,#8H

T_SECOND1:

MOV TIMER_SECOND,R3

JNB TIMER_SET,J01

LCALL TIMER

LCALL DISPLAY

DJNZ R4,T_SECOND1

JNB TIMER_SET,J01

JNB A_SET,TIMER_SECOND1

JNB S_SET,TIMER_SECOND2

AJMP TIMER_SECOND0

;定时检测有按键抬起

J01:

JB TIMER_SET,S011

LCALL TIMER

LCALL DISPLAY

LJMP J01

S011:;远跳中转

LJMP S2

TIMER_HOUR2:;定时调时,减1

MOV A,TIMER_HOUR

JZ TIMER_HOUR00

DEC TIMER_HOUR

DEC TIMER_HOUR

TIMER_HOUR1:;加1

MOV A,#23

CLR C

SUBB A,TIMER_HOUR

JZ TIMER_HOUR00

INC TIMER_HOUR

TIMER_HOUR00:

AJMP TIMER_HOUR0

TIMER_MINUTE2:;定时调分

MOV A,TIMER_MINUTE

JZ TIMER_MINUTE00

DEC TIMER_MINUTE

DEC TIMER_MINUTE

TIMER_MINUTE1:

MOV A,#59

CLR C

SUBB A,TIMER_MINUTE

JZ TIMER_MINUTE00

INC TIMER_MINUTE

TIMER_MINUTE00:

AJMP TIMER_MINUTE0

TIMER_SECOND2:;定时调秒

MOV A,TIMER_SECOND

JZ TIMER_SECOND00

DEC TIMER_SECOND

DEC TIMER_SECOND

TIMER_SECOND1:

MOV A,#59

CLR C

SUBB A,TIMER_SECOND

JZ TIMER_SECOND00

INC TIMER_SECOND

TIMER_SECOND00:

AJMP TIMER_SECOND0

A11:

AJMP A1

S1:;调时判断哪位

INC COUNT

MOV A,COUNT

CJNE A,#5,SSS

MOV COUNT,#1

SSS:

MOV A,COUNT

DEC A

JZ THOUR0

DEC A

JZ TMINUTE0

DEC A

JZ TSECOND0

DEC A

JZ A11

THOUR0:

MOV R3,HOUR

MOV R4,#8H

HOUR0:

MOV HOUR,#0

LCALL CLOCK

LCALL DISPLAY

DJNZ R4,HOUR0

MOV R4,#8H

HOUR1:

MOV HOUR,R3

JNB T_SET,J1

LCALL CLOCK

LCALL DISPLAY

DJNZ R4,HOUR1

JNB T_SET,J1

JNB A_SET,THOUR1

JNB S_SET,THOUR2

AJMP THOUR0

TMINUTE0:

MOV R3,MINUTE

MOV R4,#8H

MINUTE0:

MOV MINUTE,#0

LCALL CLOCK

LCALL DISPLAY

DJNZ R4,MINUTE0

MOV R4,#8H

MINUTE1:

MOV MINUTE,R3

JNB T_SET,J1

LCALL CLOCK

LCALL DISPLAY

DJNZ R4,MINUTE1

JNB T_SET,J1

JNB A_SET,TMINUTE1

JNB S_SET,TMINUTE2

AJMP TMINUTE0

TSECOND0:

MOV R3,SECOND

MOV R4,#8H

SECOND0:

MOV SECOND,#0

LCALL CLOCK

LCALL DISPLAY

DJNZ R4,SECOND0

MOV R4,#8H

SECOND1:

MOV SECOND,R3

JNB T_SET,J1

LCALL CLOCK

LCALL DISPLAY

DJNZ R4,SECOND1

JNB T_SET,J1

JNB A_SET,TSECOND1

JNB S_SET,TSECOND2

AJMP TSECOND0

;检测有按键抬起

J1:

JB T_SET,S11

LCALL CLOCK

LCALL DISPLAY

LJMP J1

S11:;远跳中转

LJMP S1

THOUR2:;调时

MOV A,HOUR

JZ THOUR00

DEC HOUR

DEC HOUR

THOUR1:

MOV A,#23

CLR C

SUBB A,HOUR

JZ THOUR00

INC HOUR

THOUR00:

AJMP THOUR0

TMINUTE2:;调分

MOV A,MINUTE

JZ TMINUTE00

DEC MINUTE

DEC MINUTE

TMINUTE1:

MOV A,#59

CLR C

SUBB A,MINUTE

JZ TMINUTE00

INC MINUTE

TMINUTE00:

AJMP TMINUTE0

TSECOND2:;调秒

MOV A,SECOND

JZ TSECOND00

DEC SECOND

DEC SECOND

TSECOND1:

MOV A,#59

CLR C

SUBB A,SECOND

JZ TSECOND00

INC SECOND

TSECOND00:

AJMP TSECOND0

;定时中断

INT_T0:

MOV TH0, #3CH

MOV TL0, #0B0H

INC TCNT

MOV A,TCNT

CJNE A,#20,RETUNE

INC SECOND

MOV TCNT,#0

MOV A,HOUR

CJNE A,TIMER_HOUR,NEXT;判断定时时间是否到

MOV A,MINUTE

CJNE A,TIMER_MINUTE,NEXT

MOV A,SECOND

CJNE A,TIMER_SECOND,NEXT

MOV TIMERSYMBOL,#0

NEXT:

MOV A,SECOND

CJNE A,#60,RETUNE

INC MINUTE

SETB P3.0

MOV SECOND,#0

MOV A,MINUTE

CJNE A,#60,RETUNE

INC HOUR

CLR P3.0;整点报时

MOV MINUTE,#0

MOV A,HOUR

CJNE A,#24,RETUNE

MOV HOUR,#0

INC DAY

MOV R5, MON

CJNE R5, #1, MON22

MOV R5, DAY

CJNE R5, #32, RETUNE

INC MON

MOV DAY, #1

LJMP RETUNE

RETUNE:

RETI

MON22:

MOV R5, MON

CJNE R5, #2, MON33

MOV A, YEAR

MOV B, #4

DIV AB

MOV A, B

JNZ OUT1

MOV R5, DAY

CJNE R5, #30,RETUNE

INC MON

MOV DAY, #1

LJMP RETUNE

OUT1:

MOV R5, DAY

CJNE R5,#29, RETUNE

INC MON

MOV DAY, #1

LJMP RETUNE

MON33:

MOV R5, MON

CJNE R5, #3, MON44

MOV R5, DAY

CJNE R5,#32,RETUNE

INC MON

MOV DAY, #1

LJMP RETUNE

MON44:

MOV R5, MON

CJNE R5, #4, MON55

MOV R5, DAY

CJNE R5,#31,RETUNE

INC MON

MOV DAY, #1

LJMP RETUNE

MON55:

MOV R5, MON

CJNE R5, #5, MON66

MOV R5, DAY

CJNE R5,#32,RETUNE

INC MON

MOV DAY, #1

LJMP RETUNE

MON66:

MOV R5, MON

CJNE R5, #6, MON77

MOV R5, DAY

CJNE R5,#31,RETUNE

INC MON

MOV DAY, #1

LJMP RETUNE

MON77:

MOV R5, MON

CJNE R5, #7, MON88

MOV R5, DAY

CJNE R5,#32, L1

INC MON

MOV DAY, #1

L1: LJMP RETUNE

MON88:

MOV R5, MON

CJNE R5, #8, MON99

MOV R5, DAY

CJNE R5,#32, L2

INC MON

MOV DAY, #1

L2: LJMP RETUNE

MON99:

MOV R5, MON

CJNE R5, #9, MON00

MOV R5, DAY

CJNE R5,#31, L3

INC MON

MOV DAY, #1

L3: LJMP RETUNE

MON00:

MOV R5, MON

CJNE R5, #10, MONAA

MOV R5, DAY

CJNE R5,#32, L4

INC MON

MOV DAY, #1

L4: LJMP RETUNE

MONAA:

MOV R5, MON

CJNE R5, #11, MONBB

MOV R5, DAY

CJNE R5,#31, L5

INC MON

MOV DAY, #1

L5: LJMP RETUNE

MONBB:

MOV R5, DAY

CJNE R5, #32, L6

INC YEAR

MOV MON, #1

MOV DAY, #1

L6: LJMP RETUNE

;定时中断

INT_T1:

MOV TH1, #0D8H

MOV TL1, #0F0H

INC MMSEC

MOV A,MMSEC

CJNE A,#100,OUT

MOV MMSEC,#0

INC MSEC

MOV A,MSEC

CJNE A,#60,OUT

MOV MSEC,#0

INC MMIN

MOV A,MMIN

CJNE A,#60,OUT

MOV MMIN,#0

OUT:RETI

;显示秒表

MSECOND:

MOV LASTER,MMSEC

MOV MIDDLE,MSEC

MOV FRIST,MMIN

RET

;显示日期

DATE:

MOV LASTER,DAY

MOV MIDDLE,MON

MOV FRIST,YEAR

RET

;显示定时时间

TIMER:

MOV FRIST,TIMER_HOUR

MOV MIDDLE,TIMER_MINUTE

MOV LASTER,TIMER_SECOND

RET

;显示时间

CLOCK:

MOV LASTER,SECOND

MOV MIDDLE,MINUTE

MOV FRIST,HOUR

RET

;显示控制子程序

DISPLAY:

MOV A,LASTER

MOV B,#10

DIV AB

CLR P2.6

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

SETB P2.6

MOV A,B

CLR P2.7

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

SETB P2.7

CLR P2.5

MOV P0,#40H

LCALL DELAY

SETB P2.5

MOV A,MIDDLE

MOV B,#10

DIV AB

CLR P2.3

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

SETB P2.3

MOV A,B

CLR P2.4

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

SETB P2.4

CLR P2.2

MOV P0,#40H

LCALL DELAY

SETB P2.2

MOV A,FRIST

MOV B,#10

DIV AB

CLR P2.0

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

SETB P2.0

MOV A,B

CLR P2.1

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

SETB P2.1

RET

TABLE:

DB 3FH,06H,5BH,4FH,66H

DB 6DH,7DH,07H,7FH,6FH

DELAY:

MOV R6,#10

D1:

MOV R7,#250

DJNZ R7,$

DJNZ R6,D1

RET

END

参考 文 献

[1] 梅丽凤,王艳秋. 单片机原理及接口技术[M].北京:清华大学出版社,2004.P12~P16

[2] 朱定华,刘玉. 单片机原理及应用技术学习辅导[M].北京:电子工业出版社,2001.P19~P02

[3] 夏继强.单片机实验与实践教程[M]. 北京:北京航空航天大学出(二) 2001.P18~P26

[4] 何立明. MCS-51系列单片机应用系统设计[M].北京:北京航天航空大学出版社,2001.P30~P35

[5] 胡汉才.单片机原理及其接口技术[M].北京:清华大学出版社,1996.P58~P62 P80~P93

[6] 杨拴科.模拟电子技术[M].北京:高等教育出版社,2003.

[7] 范立南,谢子殿.单片机原理及应用教程[M]. 北京:清华大学出版社,2003.P30~P42 P103~P110

[8] 辛友顺. 单片机应用系统设计与实现[M]. 北京:电子工业出版社,1996.P26~P30

[9] 杨志忠,郭顺华. 数字电子技术基础[M]. 北京:高等教育出版社,2003.P100~P108

[10] 薛钧义. MCS-51/96系列单片机微型计算机及其应用[M].西安:西安交通大学出版社,1998. P90~P95

[11] 唐前辉.PROTEUS中文教程+实例. www.computerApp.com

[12] Yao Liang , Zhang Zhenren ,Zhang Bo. Communication realization Between PC and MCS-51 SCM Based on MODBUS Protocol

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多