数字钟课程设计

时间:2024.4.7

 

 

课程题目:          数字钟                  

专    业:     电子信息科学与技术                     

                      目录

封面..............................................1

目录..............................................2

数字钟的设计......................................3

一 设计目的.......................................3

二 设计要求.......................................3

三 设计所需的元器件...............................3

四 设计原理及构成.................................4

(一)设计原理....................................4

(二)设计555多谐振荡器秒信号....................6

(三)设计60进制、24进制计数器..................8

(四)设计译码显示电路...........................10

(五)设计校时电路...............................11

五 课程设计总结..................................12

六 本次设计心的体会..............................13

数字钟的设计

一、设计目的

1、熟悉集成电路的引脚安排.

2、掌握各芯片的逻辑功能及使用方法.

3、了解数字钟的组成及工作原理.

4、熟悉数字钟的设计与制作.

二、设计要求

1、画出电路原理图(或仿真电路图)

2、元器件及参数选择

3、电路仿真与调试

4、通过设计出精准的显示时、分、秒的数字钟,且可以校时。

三、设计所需的元器件

元器件清单

四、设计原理及构成

(一)设计原理

1、数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路.由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要在电路上加一个校时电路,同时标准的1HZ时间信号必须做到准确稳定.通常使用多谐振荡器电路构成数字钟信号.图 3所示为本次数字钟的构成框图

2、数字电子钟由信号发生器、“时、分、秒”计数器、译码器及显示器、校时电路、整点报时电路等组成。秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用555构成的振荡器加分频器来实现。将标准秒脉冲信号送入“秒计数器”,该计数器采用60

进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采用60进制计数器,每累计60分,发出一个“时脉冲”信号,该信号将被送到“时计数器”。“时计数器”采用24进制计数器,可以实现一天24h的累计。译码显示电路将“时、分、秒”计数器的输出状态经七段显示译码器译码,通过六位LED显示器显示出来。整点报时电路是根据计时系统的输出状态产生一个脉冲信号,然后去触发音频发生器实现报时。校时电路是来对“时、分、秒”显示数字进行校对调整。

3、数字钟的组成框图

(二)设计555多谐振荡器秒信号

秒脉冲信号发生器

秒脉冲信号发生器是数字电子钟的核心部分,它的精度和稳定度决定了数字钟的质量。由振荡器与分频器组合产生秒脉冲信号。

振荡器: 通常用555定时器与RC构成的多谐振荡器,经过调整输出1Hz脉冲。

1.多谐振荡器振荡器

  振荡器是收发设备的基础电路,它的作用是产生一定频率的交流信号,是一种能量转换装置——将直流电能转换为具有一定频率的交流电能。 [全文]的工作原理

  多谐振荡器多谐振荡器

  多谐振荡器电路是一种矩形波产生电路。这种电路不需要外加触发信号,便能连续地,周期性地自行产生矩形脉冲。该脉冲是由基波和多次谐波构成,因此称为多谐振荡器电路。又因为其没有稳定的工作状态,多谐振荡器也称为无稳态电路。具体地说,如果一开始多谐振荡器处于0状态,那么它在0状态停留一段时间后将自动转入1状态,在1状态停留一段时间后又将自动转入0状态,如此周而复始,输出矩形波。常用作脉冲信号源及时序电路中的时钟信号。 [全文]是能产生矩形波的一种自激振荡器电路,由于矩形波中除基波外还含有丰富的高次谐波,故称为多谐振荡器。多谐振荡器没有稳态,只有两个暂稳态,在自身因素的作用下,电路就在两个暂稳态之间来回转换,故又称它为无稳态电路。

  由555定时器定时器

定时器是装有时段或时刻控制机构的开关装置。它有一个频率稳定的振荡源,通过齿轮传动或集成电路分频计数,当将时间累加到预置数值时,或指示到预置的时刻处,定时器即发送信号控制执行机构。 [全文]构成的多谐振荡器如图所示,

R1,R2和C是外接定时元件,电路中将高电平触发端(6脚) 和低电平触发端(2脚)并接后接到R2和C的连接处,将放电端(7脚)接到R1,R2的连接处。 由于接通电源电源 电源是向电子设备提供功率的装置,也称电源供应器,它提供计算机中所有部件所需要的电能。[全文]瞬间,电容C来不及充电,电容器电容器   所谓电容器就是能够储存电荷的“容器”。只不过这种“容器”是一种特殊的物质——电荷,而且其所存储的正负电荷等量地分布于两块不直接导通的导体板上。至此,我们就可以描述电容器的基本结构:两块导体板(通常为金属板)中间隔以电介质,即构成电容器的基本模型。 [全文]两端电压Uc为低电平,小于(1/3)Vcc,故高电平触发 端与低电平触发端均为低电平,输出Our为高电平,放电管放电管   放电管是一种使用于设备输入端的高压保护元件。若其两端的电压高过其保护规格值时,其内部会出现短路现象,并吸收掉输入的过高压。 [全文]VT截止。这时,电源经R1,R2对电容C充电,使 电压Us按指数规律上升,当Us上升到(2/3)Vcc时,输出Uo为低电平,放电管VT导通,把Uc从(1/3)Vcc 上升到(2/3)Vcc这段时间内电路的状态称为第一暂稳态,其维持时间TPH的长短与电容的充电时间有关 。充电时间常数T充=(R1+R2)C。

  由于放电管VT导通,电容C通过电阻电阻

  电阻,物质对电流的阻碍作用就叫该物质的电阻。电阻小的物质称为电导体,简称导体。电阻大的物质称为电绝缘体,简称绝缘体。 [全文]R2和放电管放电,电路进人第二暂稳态.其维持时间TPL的长短与电 容的放电时间有关,放电时间常数T放=R2C0随着C的放电,Uc下降,当Uc下降到(1/3)Vcc时,输出Uo。 为高电平,放电管VT截止,Vcc再次对电容c充电,电路又翻转到第一暂稳态。不难理解,接通电源后,电 路就在两个暂稳态之间来回翻转,则输出可得矩形波。电路一旦起振后,Uc电压总是在(1/3~2/3)Vcc 之间变化。图1(b)所示为工作波形。

(三)设计60进制、24进制计数器

本次设计利用74160来实现60进制和24进制74160是十进制同步计数器,有置数功能,清除功能,可使计数或停止计数,有动态进位输出功能,它具有异步清除端与同步清除端,不同的是,它不受时钟脉冲控制,只要来有效电平,就立即清零,无需再等下一个计数脉冲的有效沿到来。74160是直接清零,异步清零端MR非为低电平时,不管时钟端CP信号状态如何,都可以完成清零功能。74160的预置是同步的,当置入控制器PE非为低电平时,在CP上升沿作用下,输出端Q0-Q3数据端P0-P3一致

1、时间计数单元

时间计数单元有时计数,分计数和秒计数等几个部分.

时计数单元采用24进制计数器计数,其输出为两位8421BCD码形式;分计数和秒计数单元为60进制计数器,其输出也为8421BCD码.

本次设计采用10进制计数器74160来实现时间计数单元的计数功能.

(1)秒个位计数单元为10进制计数器,无需进制转换,RCO可作为向上的进位信号与十位计数单元的ENT、ENP相连即可.秒位计数单元应输出59作为向上的进位信号与分个位计数单元的ENT、ENP相连。秒十位计数单元为6进制计数器需要进制转换.将10进制计数器转换为6进制计数器的电路。

10进制——6进制计数器转换电路如图所示

(2)分个位和分十位计数单元电路结构分别与秒个位和秒十位计数单元完全相同,只不过分个位计数单元的RCO作为向上的进位信号应与分十位计数单元的ENP、ENT相连,分位计数单元的应与秒位计数单元同时输出59的信号作为向上的进位信号应与时个位计数单元的ENT、ENP相连.

(3)时个位计数单元电路结构仍与秒或分个位计数单元相同,但是要求,整个时计数单元应为24进制计数器,不是10的整数倍,因此需将个位和十位计数单元合并为一个整体才能进行24进制转换.利用2片74160实现24进制计数功能的电路如图所示.

(四)设计译码显示电路

计数器实现了对时间的累计以8421BCD码形式输出,选用显示译码电路将计数器的输出数码转换为数码显示器件所需要的输出逻辑和一定的电流,选用7448作为显示译码电路,选用LED数码管作为显示单元电路. 7448除了有实现7段显示译码器基本功能的输入(DCBA)和输出(Ya~Yg)端外,7448还引入了灯测试输入端(LT)和动态灭零输入端(RBI),以及既有输入功能又有输出功能的消隐输入/动态灭零输出(BI/RBO)端。
由7448真值表可获知7448所具有的逻辑功能:
(1)7段译码功能(LT=1,RBI=1)
在灯测试输入端(LT)和动态灭零输入端(RBI)都接无效电平时,输入DCBA经7448译码,输出高电平有效的7段字符显示器的驱动信号,显示相应字符。除DCBA = 0000外,RBI也可以接低电平,见表1中1~16行。
(2)消隐功能(BI=0)
此时BI/RBO端作为输入端,该端输入低电平信号时,表1倒数第3行,无论LT 和RBI输入什么电平信号,不管输入DCBA为什么状态,输出全为“0”,7段显示器熄灭。该功能主要用于多显示器的动态显示。
(3)灯测试功能(LT = 0)
此时BI/RBO端作为输出端, 端输入低电平信号时,表1最后一行,与 及DCBA输入无关,输出全为“1”,显示器7个字段都点亮。该功能用于7段显示器测试,判别是否有损坏的字段。
(4)动态灭零功能(LT=1,RBI=1)
此时BI/RBO端也作为输出端,LT 端输入高电平信号,RBI 端输入低电平信号,若此时DCBA = 0000,表1倒数第2行,输出全为“0”,显示器熄灭,不显示这个零。DCBA≠0,则对显示无影响。该功能主要用于多个7段显示器同时显示时熄灭高位的零

(五)设计校时电路

当重新接通电源或走时出现误差时都需要对时间进行校正.通常,校正时间的方法是:首先截断正常的计数通路,然后再进行人工出触发计数或将频率较高的方波信号加到需要校正的计数单元的输入端,校正好后,再转入正常计时状态即可.

根据要求,数字钟应具有分校正和时校正功能,因此,应截断分个位和时个位的直接计数通路,并采用正常计时信号与校正信号可以随时切换的电路接入其中.图所示即为的校时电路

由于ENP、ENT端需高电平才能置数,故将a、b端经过按键与高电平相连,若按一次m按钮,则增加1小时,若按一次n按钮,则增加1分钟。

五 课程设计总结

设计过程中遇到的问题及其解决方法.

在这次课程设计的整个过程中,我做了一次全面、较规范的设计练习,全面地温习了以前所学过的知识,用理论联系实际并结合数字电子技术解决实际问题,巩固、加深和扩展了有关组合逻辑电路和时序逻辑电路方面的知识。利用此次课程设计还让自己对protuse的使用方法更加熟练,也使我们对分立元件的应用有了进一步的认识,以前学习的时候觉得自己会应用了,可是到了设计电路时才发现知识的匮乏。通过这次设计,使我增强了自身的动手能力也是一方面,把以前书本上讲的或是没有讲的,通过一次课程设计具体的实施,使自己真正得到锻炼,对于以后我们的发展与学习来说,都可以看做是一个巨大的进步,前面还有很多需要我们去尝试和探索。

调试过程中,出现显示但却未正确显示的状况,后经检验发现是由于7SEG-MPX1-CC接成了共阳,所以未能正常显示,改为共阴。在设计控制时、分按钮时只能是时间加而不能减,至今未找到解决的办法;在59分进向时位进位的时候显示12,在一次进位的时候又变成了0,后来经过思考及改进,原来必须满足59分59秒才能正常的向时位进位            。本次设计采用74160十进制计数器芯片和与和与非门作为基础,利用函数信号发生器作为秒脉冲源,LED数码显示器进行时间的读取。电路结构相对简单,原理易懂,经过调试和仿真能够达到预期的效果。

六 本次设计心的体会

设计过程中,最初遇到的问题是对protuse软件的运用不是很熟练,只能通过自己慢慢的摸索自学,终于能够运用它们了。设计电路时,由于平时对数电知识的掌握不够,对需要的功能不知道用什么器件去实现,只能查书和在网上搜索,不过这也帮助我们掌握了不少知识。至于在protuse中仿真,还比较容易完成,花费的时间不多就得到了正确的仿真结果。

  由于我的设计自己设计,没有及时参考一些好的方案,因此存在很多不足,需要改进和能够改进的地方还有很多。例如没有采用递减计数功能,使得视觉上不适应;电路结构相对简单但是连线较为复杂等等。

   整个设计过程,虽然很累,要做的事情很多,很繁琐,但是从设计制作过程中我也总结了一些经验,积累了知识,锻炼了动手能力,确实是学到了很多东西。在设计中我还学会了如何培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以是在原有的基础上进行改进,使之功能不断的完善,成为自己的东西。

总体来说,这次学习使我受益匪浅。在摸索如何设计该程序使之实现所需功能的过程中,培养了我的设计思想,增加了实际操作能力。在让我体会到设计艰辛的同时,更让我体会到成功的喜悦和快乐。这次课程设计,虽然仅有短短5天,但是我多方面得到了提高:

1、查阅参考书的独立思考的能力以及培养非常重要,我在设计过程中,遇到了很多不理解的东西,有的我通过查阅参考书,有的通过网络查到,但大多数是通过我独立思考完成的。

2、相互讨论共同研究也很重要。开始并不理解各个元件的原理,通过和同学们讨论,理解了各个元件的基本原理,设计了电路图。

在设计的过程中,难免会遇到各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解不够深刻,掌握得不够牢固。在这次课程设计过程中,遇到了很多专业的知识问题,此次课程设计,学到了很多课本内学不到了东西,比如独立思考解决问题的能力,和与人探讨,听取别人的想法及意见,都受益匪浅。


第二篇:数字钟课程设计


科信学院

课程设计说明书

(2010/20##学年第二学期)

课程名称 :  单片机原理与应用课程设计      

题    目 :        数字钟                        

专业班级 :       通信08-1                         

学生姓名 :        赵红霞                       

学    号:        080312118                    

指导教师 :李晓东,马小进,贾少锐         

设计周数 :          2                        

设计成绩 :                              

          20##年 6 月 22日

  

 

课题概述…………………………………………………2

设计目的…………………………………………………2

设计正文

31 基本元器件介绍…………………………………………………...…2

32 数字钟的设计…………………….....………………………………...6

     33 硬件模块设计..................……………………………………………….……8               

     34软件设计……………………………………………...................………………10

课程设计总结………………………………………………..............……………23

附录………………………………...…………………………24

一、课题概述

20世纪末,电子技术获得了飞速发展,在其推动下现代电子产品几乎渗透到了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使电子产品性能进一步提高,产品更新换代速度越来越快。

目前,单片机正朝着高性能和多品种方向发展。单片机的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。

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

二、设计目的

本课程设计是通信工程专业的一门软硬件相结合实践的专业基础课,旨在提高学生的单片机应用、软件编程及小型工程项目开发能力。本设计将进一步加强学生对单片机硬件的理解,增强对汇编或C语言的灵活运用。要求学生能结合单片机、模拟电路、数字电路、汇编或C语言,实现基本的应用系统,为以后从事相关行业打下实践基础。

理论学习固然重要,但仅仅止于纸上谈兵是没有意义的,只有实践才是检验真理的唯一标准。因此为了进一步深入地学习单片机技术,将实践动手能力与课堂上学习的理论知识有机的结合起来,从而开展了此次单片机的课程设计。

我们小组设计的课题为基于单片机的数字钟。这从硬件和软件两个方面锻炼了我们的实际动手能力和编程能力,目的是为了考查:

1.能够读懂并分析技术资料

2.巩固、加深和扩大单片机应用的知识面,提高综合及灵活运用所学知识解决实际应用的能力

3.了解数字钟的组成及其工作原理

    4.延时程序、显示程序、循环程序的编写

    5.学会课题设计方案的分析、选择、比较、熟悉单片机用系统开发、研制的过程,软硬件设计的方法、内容及步骤。

三、设计正文

3.1基本元器件介绍

3.1.1  AT89C51介绍

微型计算机的基本组成有三部分,即中央处理器CPU(通常包括运算器和控制器)+存储器+输入/输出(I/O)接口。若将组成计算机的基本部件集成在一块芯片上,则俗称单片微机。

80C51内部结构主要包括中央处理器CPU(算术逻辑部件ALU、控制器等)、只读存储器ROM、随机存取存储器RAM、定时器/计数器、并行I/O口P0~P3、串行口、中断系统以及定时控制逻辑电路等。

(1)中央处理器

单片机中的中央处理器是单片机的核心,主要完成运算和控制功能,又增设了“面向控制”的处理功能,增强了实时性。

(2)程序存储器

根据内部是否带有程序存储器而形成三种型号:内部没有程序存储器的称80C31,内部带ROM的称80C51,内部以EPROM代替ROM的称87C51。

目前单片机的程序存储器有以下几种结构形式:

片内只读存储器

片内掩膜ROM的特点是程序必须在制作单片机时写入。

片内可编程的ROM

可直接由用户进行编程,紫外线可擦出型ROM-EPROM型单片机(如87C51)。EPROM需用紫外线擦除,必须脱机固化,不能在线改写。电可擦除型ROM-EEPROM,称为Flash单片机(如89C51)。EPROM和EEPROM都是可以多次擦除和编程的,或称MTP的ROM。OTP的ROM,仅允许用户一次编程。

 片外只读存储器

利用单片机的并行扩展技术可以外扩片外只读存储器。

(3) 数据存储器(RAM)

在单片机中,用随机存取存储器来存储程序在运行期间的工作变量和数据,所以称为数据存储器。

在单片机中,常把寄存器(如工作寄存器、特殊功能寄存器、堆栈等)在逻辑上划分在片内RAM空间中,所以可将单片机内部RAM看成是寄存器堆,有利于提高运行速度。当内部RAM容量不够时,还可通过串行总线或者并行总线外扩数据存储器。

(4)并行I/O口

 单片机往往提供了许多功能强、使用灵活的并行输入/输出引脚,用于检测与控制。有些I/O引脚还具有很多功能,比如还可以作为数据总线的数据线、地址总线的地址线、控制总线的控制线等。单片机I/O口引脚的驱动能力也逐渐增大,甚至可以直接驱动外扩的LED显示器。

(5)串行I/O口

 目前高档8位单片微机均设置了全双工串行I/O口,用以实现与某些终端设备进行串行通信,或者和一些特殊功能的器件相连的能力,甚至用多个单片机相连构成多机系统。随着应用的拓展,有些型号的单片机内部还包括含有两个串行I/O口。

(6)定时器/计数器

 在单片机的实际应用中,往往需要精确的定时,或者需对外部事件进行计数。为了减少软件开销和提高单片机的实时控制能力,因而均在单片机内部设置定时器/计数器电路。80C51共有两个16位的定时器/计数器,80C52则有三个16位的定时器/计数器。

(7)中断系统

  80C51单片机的中断能力较强,具有内、外五个中断源,二个中断优先级。

(8)定时电路及元件

  计算机的整个工作是在时钟信号的驱动下,按照严格的时序有规律的一个节拍一个节拍的执行各种操作。单片机微机内部设有定时电路,只需外接震荡元件即可工作。外接震荡元件一般选用晶体振荡器,或用廉价的RS振荡器,也可用外部时钟源,作为震荡元件。近来有的单片机将震荡元件也集成在芯片内部。

按引脚的功能可分为三部分:

1.电源和晶振:

   Vcc—运行和程序校验时接电源。

   Vss—接地。

   XTAL1—输入到单片微机内部振荡器的方相放大器。当采用外部振荡器时,对单片机,此引脚应接地;对CHMOS单片机,此引脚作驱动端。

   XTAL2—反相放大器的输出,输入到内部时钟发生器。当采用外部振动器时,XTAL2接收振荡器信号。

2. I/O: 共4个口,32根I/O线。

    P0---8位、漏极开路的双向I/O口。 当使用片外存储器(ROM及RAM)时,作低八位地址和数据总线分时复用。P0口(作为总线时)能驱动8个LSTTL负载。

P1---8位、准双向I/O口。在编程/校验期间,用做输入低位字节地址。P1口可以驱动4个LSTTL负载。

P2--8位、准双向I/O口。当使用片外存储器(ROM及RAM)时,输出高8位地址。在编程/校验期间,接收高位字节地址。P2口可以驱动4个LSTTL负载。

P3口---8位、准双向I/O口,具有内部上拉电路。P3提供各种替代功能,在提供这些功能时,其输出锁存器应由程序置1。P3口可以输入/输出4 个LSTTL负载。

串行口:

    P3.0------RXD    串行输入口。

    P3.1------TXD    串行输出口。

中断口:

    P3.2------- 外部中断0输入。

    P3.3------- 外部中断1输入。

定时器/计数器:

    P3.4--------定时器/计数器T0的外部输入。

    P3.5--------定时器/计数器T1的外部输入。

数据存储器选通:

    P3.6--------WR低电平有效,输出,片外存储器写选通。

     P3.7--------RD低电平有效,输出,片外存储器读选通。

3. 控制线:共4根。

   RST-----复位输入信号,高电平有效。在振荡器工作时,在RST上作用两个机器周期以上的高点平,将器件复位。

   EA/Vpp------片外程序存储器访问允许信号,低电平有效。EA=1,选择片外程序存储器(80C51为4KB);EA=0,则程序存储器全部在片外而不管片内是否有程序存储器。

   ALE/PROG------地址锁存器允许信号,输出。在访问片外存储器或I/O时,用于锁存器低八位地址,以实现低八位地址与数据的隔离。由于ALE以1/6的振荡频率固定速率输出,可作为对外输出的时钟或用作外部定时脉冲。在EPROM编程期间,作输入。输入编程脉冲(PROG)。ALE可以驱动8个LSTTL负载。

 PSEN-----片外程序存储器读选通信号。低电平有效。在从片外程序存储器取值期间,在每个机器周期中,当有效时,程序存储器的内容被送上P0口(数据总线)。可以驱动8个LSTTL负载。

3.1.2  液晶的管脚说明

  表3液晶管脚说明

 1602基本操作时序

1.读状态:    输入:RS=0,RW=1,EN=1;   输出:D0~D7=状态字。

2.写指令:   输入:RS=0,RW=0,D0~D7=指令码EN=高脉冲;输出无。

3.读数据:   输入:RS=1,RW=1,EN=1;     输出:D0~D7=数据。

4.写数据:   输入:RS=1,RW=0,D0~D7=数据,EN=高脉冲;输出无。

1602指令说明

表4 1602液晶指令

3.2数字钟的设计

 3.2.1基本原理

 定时控制电子钟的设计主要有硬件设计和软件设计两大部分:硬件设计包括了AT89C51的最小系统,电源部分,显示部分,键盘部分。软件部分设计其实是在结合硬件的基础上,事先规定的技术指标。是通过内部的定时器完成时间的计数及显示的。其精度主要取决于单片机本身的晶振频率的精度。定时控制则通过时钟不间断的和设定的时间进行比较,当两者相同时,则控制输出,使得对应的继电器动作。

 3.2.2 系统分析

本系统是由液晶模块、驱动模块、消抖电路、控制模块、按键五部分组成。系统框图如

图1:

上箭头:  位选 


              图1  系统框图

3.2.3 设计方案

本方案完全采用软件实现数字时钟。原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息,并通过程序控制扫描输出显示数据。利用定时器0与软件结合实现1秒定时中断,S1控制调整时间光标的移动,S2控制时间的增加,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则天数加1,将时字节清零;当天数达到30,月数加1,字节清零;当月数达到12.年数加1,字节清零。同理S3控制时间的减少。S4控制闹铃光标的位移,S2、S3分别控制时间的增加和减少。该方案具有硬件电路简单的特点,但当单片机不接电源时,程序将不执行。且由于每次执行程序时,定时器都要重新赋值,固该时钟精度不够高。

3.3硬件设计

3.3.1电源模块

    采用普通的USB线连接微型计算机作为数据下载线,五伏电源作为单片机电源,可以随时调试使用。

3.3.2按键模块

    采用矩阵键盘,因为单片机的I/O口有限,显然,在按键数量较多时,矩阵式键盘较之独立式键盘省很多I/O口线。但必须将行线、列线信号配合起来作适当处理,才能确定闭合键的位置。

3.3.3显示模块

显示模块是本次单片机课程设计最核心的部分。

采用LCD1602.LCD1602为工业字符型液晶,能够同时显示16*02即32个字符。其采用标准的16脚接口,该液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,所以可很容易的实现数字钟数码显示。

3.3 .4  软件消抖

消抖可以采用硬件(施密特触发器)的方式,也可以采用软件的方式。在此只讨论软件方式。软件消抖有定时器定时,和利用延时子程序两种方式。一,定时器定时消抖可以不影响显示模块扫描速度,其实现方法是:设置标志位,在定时器中断中将其置位,然后在程序中查询。将其中断优先级设置为低于时钟定时中断,那么它就可以完全不影响时钟定时。二,在采用延时子程序时,如果显示模块的扫描速度本来就不是很快,此时可能会影响到显示的效果,一般情况下,每秒的扫描次数不应小于50次,否则,数码的显示会出现闪烁的情况。因此,延时子程序的延时时间应该小于20毫秒,如果采用定时器定时的方式,延时时间不影响时钟。

如果,设计时采用的是中断的方式来完成有关操作,同样可以采用软件的方式来消抖,其处理思想是:中断不能连续执行,两次之间有一定的时间间隔。

3.3.4控制模块

3.4 软件设计

主程序框图

 

3.5 主要程序

#include<reg52.h>

#include<math.h>

#include"1602.h"

#define uchar unsigned char

#define uint unsigned int

sbit s1=P3^0;

sbit s2=P3^1;

sbit s3=P3^2;

sbit s4=P3^3;

sbit rd=P3^7;

sbit buzzer=P2^3;

uchar count,s1num,s4num;

uchar miao,shi,fen,date,month,year;

uchar miao_set,shi_set,fen_set;

uchar flag;

uchar  table[]="YMD 20##-06-22  ";

uchar  table1[]="TME 00:00:00    ";

void delay_ms(uint z)

{

    uint x,y;

    for(x=z;x>0;x--)

        for(y=110;y>0;y--);

}

/************************蜂鸣器报警函数*****************************/

void buzzer_alarm(uchar m)

{

        uchar a;

        for(a=m;a>0;a--)

        {

                buzzer=0;    

                delay_ms(1000);    

                buzzer=1;    

                delay_ms(500);    

                buzzer=0;    

                delay_ms(1000);

        }

}

/**************************定时计数器初始化函数**************************/

void InitTimer()

{  

    TMOD=0x01;

    TH0=(65536-50000)/256;

    TL0=(65536-50000)%256;

    EA=1;

    ET0=1;

    TR0=1;

}

/******************************键盘扫描函数********************************/

void KeyScan(viod)                                                     

{

    rd=0;

    if(s1==0)      //扫描S1

    {

        delay_ms(10);

        if(s1==0)

        {

            TR0=0;

            s1num++;

            while(!s1);

            switch(s1num)

            {

                case 1:

                       Write_LCD_Command(0xc0|10);

                       Write_LCD_Command(0x0f);

                       break;

                case 2:

                       Write_LCD_Command(0xc0|7);

                       break;

                case 3:

                       Write_LCD_Command(0xc0|4);

                       break;

                case 4:

                       Write_LCD_Command(0x80|12);

                       break;

                case 5:

                       Write_LCD_Command(0x80|9);

                       break;

                case 6:

                       Write_LCD_Command(0x80|6);

                       break;

                case 7:

                       s1num=0;

                       Write_LCD_Command(0x0c);

                       TR0=1;

                       break;

            }

        }

    }

    if(s4==0)

    {

        delay_ms(10);

        if(s4==0)

        {

            s4num++;

            flag=1;

            Write_1602(10,1,miao_set);

            Write_1602(7,1,fen_set);

            Write_1602(4,1,shi_set);

            while(!s4);

            switch(s4num)

            {

                case 1:

                       Write_LCD_Command(0xc0|10);       //按键一次,调整光标位置和形状

                       Write_LCD_Command(0x0f);

                       break;

                case 2:

                       Write_LCD_Command(0xc0|7);

                       break;

                case 3:

                       Write_LCD_Command(0xc0|4);

                       break;

                case 4:

                       s4num=0;

                       flag=0;

                       Write_LCD_Command(0x0c);

                       Write_1602(10,1,miao);

                       Write_1602(7,1,fen);

                       Write_1602(4,1,shi);

                       break;

             }

        }

    }

        if(s1num)           //在S1被按下的情况作相应处理

        {

            if(s2==0)

            {

                delay_ms(10);

                if(s2==0)

                {

                    while(!s2);

                    switch(s1num)

                    {

                        case 1:

                               miao++;

                               if(miao==60)miao=0;

                               Write_1602(10,1,miao);

                               Write_LCD_Command(0xc0|10);

                               break;

                        case 2:

                               fen++;

                               if(fen==60)fen=0;

                               Write_1602(7,1,fen);

                               Write_LCD_Command(0xc0|7);

                               break;

                        case 3:

                               shi++;

                               if(shi==24)shi=0;

                               Write_1602(4,1,shi);

                               Write_LCD_Command(0xc0|4);

                               break;

                        case 4:

                               date++;

                               if(date==31) date=1;

                               Write_1602(12,0,date);

                               Write_LCD_Command(0x80|12);

                               break;

                        case 5:

                               month++;

                               if(month==13) month=1;

                               Write_1602(9,0,month);

                               Write_LCD_Command(0x80|9);

                               break;

                        case 6:

                               year++;

                               Write_1602(6,0,year);

                               Write_LCD_Command(0x80|6);

                               break;

                        case 7:

                               break;      

                    }

                }

            }

            if(s3==0)

            {

                delay_ms(10);

                if(s3==0)

                {

                    while(!s3);

                    switch(s1num)

                    {

                        case 1:

                               miao--;

                               if(miao==-1)miao=59;

                               Write_1602(10,1,miao);

                               Write_LCD_Command(0xc0|10);

                               break;

                        case 2:

                               fen--;

                               if(fen==-1)fen=59;

                               Write_1602(7,1,fen);

                               Write_LCD_Command(0xc0|7);

                               break;

                        case 3:

                               shi--;

                               if(shi==-1)shi=23;

                               Write_1602(4,1,shi);

                               Write_LCD_Command(0xc0|4);

                               break;

                        case 4:

                               date--;

                               if(date==0) date=30;

                               Write_1602(12,0,date);

                               Write_LCD_Command(0x80|12);

                               break;

                        case 5:

                               month--;

                               if(month==0) month=12;

                               Write_1602(9,0,month);

                               Write_LCD_Command(0x80|9);

                               break;

                        case 6:

                               year--;

                               Write_1602(6,0,year);

                               Write_LCD_Command(0x80|6);

                               break;

                        case 7:

                               break;      

                    }

                }

            }

        }

        if(s4num)               //在S4 被按下作相应处理

        {

            if(s2==0)

            {

                delay_ms(10);

                if(s2==0)

                {

                    while(!s2);

                    switch(s4num)

                    {

                        case 1:

                               miao_set++;

                               if(miao_set==60)miao_set=0;

                               Write_1602(10,1,miao_set);

                               Write_LCD_Command(0xc0|10);

                               break;

                        case 2:

                               fen_set++;

                               if(fen_set==60)fen_set=0;

                               Write_1602(7,1,fen_set);

                               Write_LCD_Command(0xc0|7);

                               break;

                        case 3:

                               shi_set++;

                               if(shi_set==24)shi_set=0;

                               Write_1602(4,1,shi_set);

                               Write_LCD_Command(0xc0|4);

                               break;

                        case 4:

                               break;                                               

                    }

                }

            }

            if(s3==0)

            {

                delay_ms(10);

                if(s3==0)

                {

                    while(!s3);

                    switch(s4num)

                    {

                        case 1:

                               miao_set--;

                               if(miao_set==-1)miao_set=59;

                               Write_1602(10,1,miao_set);

                               Write_LCD_Command(0xc0|10);

                               break;

                        case 2:

                               fen_set--;

                               if(fen_set==-1)fen_set=59;

                               Write_1602(7,1,fen_set);

                               Write_LCD_Command(0xc0|7);

                               break;

                        case 3:

                               shi_set--;

                               if(shi_set==-1)shi_set=23;

                               Write_1602(4,1,shi_set);

                               Write_LCD_Command(0xc0|4);

                               break;

                        case 4:

                               break;                                               

                    }

                }

            }

      }

      rd=1;

}

/***************************主函数*****************************/

void main()

{

    InitTimer();

    Initialize_LCD();

    ShowString(0,0,table);

    ShowString(0,1,table1);

    while(1)

    {

        KeyScan();

        if((shi==shi_set)&&(fen==fen_set)&&(miao==miao_set))//闹钟时间到

        {

            buzzer_alarm(5);

        }      

    }

}

void timer0() interrupt 1

{

    TH0=(65536-50000)/256;

    TL0=(65536-50000)%256;

    count++;

if(count==18)

        {

            count=0;

            miao++;

            if(miao==60)

            {

                miao=0;

                fen++;

                if(fen==60)

                {

                    fen=0;

                    shi++;

                    if(shi==24)

                    {

                        shi=0;

                        date++;

                        if(date==31)

                        {

                           date=1;

                           month++;

                           if(month==13)

                           {

                                month=1;

                                year++;

                                Write_1602(6,0,year);

                           }

                           Write_1602(9,0,month);

                        }

                        Write_1602(12,0,date);

                    }

                    if(flag==0)

                    Write_1602(4,1,shi);

                }

                if(flag==0)

                Write_1602(7,1,fen);

            }

            if(flag==0)

            Write_1602(10,1,miao);     

        }  

}

四、课程设计总结

在这次课程设计的整个过程中,我不仅学会了proteus的使用方法,还学会了80C51的连接方法,又巩固了一下课本上学的单片机的基本知识,更加深入的了解了各引脚的功能。   

也使我对分立元件的应用有了进一步的认识,以前学习的时候觉得自己会应用了,可是到了实践中才发现知识的匮乏。本次试验软件我用C语言编写,通过实践才发现自己对知识掌握的不熟练。增强了自身的动手能力也是一方面,把以前书本上讲的或是没有讲的,通过一次课程设计具体的实施,使自己真正得到锻炼,对于以后我们的发展与学习来说,都可以看做是一个巨大的进步,前面还有很多需要我们去尝试和探索。

设计过程中我遇到了很多的问题,比如只会做时钟部分,闹铃部分毫无头绪,在几位老师和同学的帮助下得到了解决,同时,在老师身上学到了很多实用的知识。同学们互帮互助的精神实在让人感动,也增强了我们的团队精神。总体来说,这次学习使我受益匪浅。在摸索如何设计该程序使之实现所需功能的过程中,培养了我的设计思想,增加了实际操作能力。在让我体会到设计艰辛的同时,更让我体会到成功的喜悦和快乐。这次课程设计,虽然仅有短短两周,但是我多方面得到了提高:

1、提高了我们的程序编写能力,使我们在编写程序能力上有了很大成度得提高,加深了我们对程序编程的印象。另外,我们还更加充分的认识到,编程能力对我们今后的影响。

2、查阅参考书的独立思考的能力以及培养非常重要,我们在设计过程中,遇到了很多不理解的东西,有的我们通过查阅参考书,有的通过网络查到,但大多数是通过我们独立思考完成的。

3、相互讨论共同研究也很重要。开始并不理解各个元件的原理,通过和同学们讨论,理解了各个元件的基本原理,设计了电路图。编程过程中,遇到了很多麻烦,程序总是运行错误,在老师的帮助下,终于完成了程序的编写过程。

回顾此次课程设计,至今我感慨颇多,的确,从选稿到定稿,从理论到实践,可以说是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固以前学过的知识,而且可以学到很多课本上没有学到过的知识。通过这次单片机课程设计,我不仅加深了对单片机的理解,将理论很好的应用到实际当中去,而且我还学会了如何培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以是在原有的基础上进行改进,使之功能不断的完善,成为自己的东西。在这个设计过程中,我们通过在原有的计数器系统进行了改进,使之增添了闹铃控制功能,使之成为一个更加完备的属于自己的一个系统。设计结果能够符合题意,成功完成了此次实习要求,我们不只是在乎这一结果,更加在乎的是这个过程。在这个过程中,我们花费了大量的时间和精力,更重要的是,我们在学会创新的基础上,同时还懂得了合作精神的重要性,学会了与他人合作。

附录

参考文献

 [1]  吴炳胜等编著.80C51单片机原理与应用技术.冶金工业出版社,2003.9

 [2]  王为清  程国刚编著.单片机Keil Cx51应用开发技术,2007.2  

 [3] 陈永甫.《基于单片机的数字钟设计》.人民邮电出版社.2004

更多相关推荐:
多功能数字钟课程设计报告

电子时钟课程设计电子时钟课程设计报告班级文通0741姓名学号20xx905121共页第页电子时钟课程设计多功能数字钟课程设计报告一课程设计题目多功能数字钟二实验目的了解多功能数字电子钟的工作原理学习数字系统设计...

课程设计报告数字钟

湖北民族学院信息工程学院课程设计报告书题目多功能数字钟课程电子线路课程设计专业电子信息科学与技术班级0310411学号031041132学生姓名杭晓慧指导教师杨庆20xx年12月8日1信息工程学院课程设计任务书...

单片机课程设计数字钟报告

单片机课程设计报告基于单片机的数字钟班级姓名学号设计时间单片机课程设计正文一引言现代社会科技飞速发展人们生活节奏加快时间就是金钱时间就是生命时间对人们来说总是那么宝贵工作的忙碌性和繁杂性容易使人忘记当前的时间忘...

数字钟课程设计报告

数电课程设计报告1前言22设计任务23方案论证34系统结构441系统结构框图442系统各方框图的作用55整机电路设计651总电路图652芯片管脚图653整机电路元器件表76整机电路调试861调试步骤862调试中...

数字钟课程设计报告(模板)

号学线名姓业专化封动自其及气电级7002院密学院学工课程设计专用封面设计题目所修课程名称电子课程技术课程设计修课程时间20xx年12月07日至20xx年12月18日完成设计日期20xx年12月18日评阅成绩评阅...

EDA课程设计报告_数字钟

目录摘要21设计目的22设计内容221设计任务222扩展23系统方案及设计原理331方案选择332数字钟的基本工作原理333底层元件接口434数字钟设计的RTL电路54设计步骤55心得体会106程序代码10摘要...

多功能数字钟—数电课程设计报告

多功能数字钟电路设计与制作课程设计报告班级建筑设施智能技术二班姓名学号指导教师20xx年11月19日1目录一内容摘要3二设计内容及要求3三总设计原理3四单元电路的设计61基于NE555的秒方波发生器的设计52基...

数字时钟课程设计报告

课程设计报告学生姓名学院班级题目学号数字时钟职称1目录一设计任务和要求111设计要求1二设计原理及框图121设计原理122设计原理框图1三器件说明231器件名称2四设计过程841程序分部解析842总设计图13五...

数字时钟课程设计报告

电子线路课程设计报告设计课题数字时钟专业班级12信工2班小组成员李家豪指导教师朱其祥设计时间20xx12数字时钟一设计任务与要求任务设计一个数字电子钟要求1用LED显示屏显示24进制时60进制分和秒2具有校正时...

数字钟设计报告

目录1设计的任务与要求111数字钟的设计目的112数字钟的设计要求213数字电子钟的基本原理22实验器材和主要器件221主要器材222所需芯片与芯片管脚图33电路仿真与设计531系统设计框图532单元模块设计6...

数电数字时钟课程设计报告1

数字电子技术课程设计报告姓名张保军班级电科102学号1005B223数字电子钟逻辑电路设计一简述数字电子钟是一种用数字显示秒分时日的计时装置与传统的机械钟相比它具有走时准确显示直观无机械传动装置等优点因而得到了...

数字时钟课程设计报告

河南理工大学电子技术基础课程课程设计报告基于DS1302与DS18B20的数字温度时钟姓名IvanMeng摘要随着电子技术的发展人类的计时已由早期的机械装置计时发展到现今发达的电子装置计时随着人类对计时精度的日...

数字钟课程设计报告(29篇)