课程设计 多功能秒表报告

武夷学院

课程设计(论文)

基于单片机的多功能秒表设计

武夷学院教务处制

 

                          

近年来随着科技的飞速发展,单片机的应用正在不断的走向深入。本文阐述了基于单片机的多功能电子秒表设计。本设计主要特点是具有倒计时功能,还可以按圈计时,而且误差在0.01,,是各种体育竞赛的必备设备之一,另外硬件部分设置了查看按键。

本设计的数字电子秒表系统采用AT89C52单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合显示电路、数码管以及外部中断电路来设计计时器。将软、硬件有机地结合起来,使得系统能够实现8位LED显示,显示时间24小时内,计时精度为0.01秒,能正确地进行计时,同时能记录一次时间,并在下一次计时后对上一次计时时间进行查询。其中软件系统采用C语言编写程序,包括显示程序,定时中断服务延时程序等,并在KEIL中调试运行,硬件系统利用PROTEUS强大的功能来实现,简单切易于观察,在仿真中就可以观察到实际的工作状态。

关键字:单片机;数字电子秒表;仿真

Abstract

With the rapid development of science and technology in recent years, SCM applications are constant-depth manner. In this paper, based on single chip design of digital electronic stopwatch. The main characteristics of this design timing accuracy of 0.01s, to solve the traditional result of a lack accuracy due to timing errors and unfair, and is a variety of sports competitions, one of the essential equipment. In addition the hardware part of the set View button on the stopwatch can be the last time to save time for user queries.

The design of the multi-function stopwatch system uses STC89C52 microcontroller as the central device, and use its timer / counter timing and the count principles, combined with display circuit, LED digital tube, as well as the external interrupt circuit to design a timer. The software and hardware together organically, allowing the system to achieve two LED display shows the time within 24 hours, Timing accuracy of 0.01 seconds, Be able to correctly time at the same time to record a time, and the next time after the last time the time to search.automatically added a second in which software systems using assembly language programming, including the display program, timing, interrupt service, external interrupt service routine, delay procedures, key consumer shaking procedures, and WAVE in the commissioning, operation, hardware system uses to achieve PROTEUS powerful, simple and easy to observe the cut in the simulation can be observed on the actual working condition.

KeywordLED display;High-precision stopwatch;STC89C52

目  录

1  硬件设计... 7

1.1  总体方案的设计... 7

1.2  单片机的选择... 8

1.3  显示电路的选择与设计... 10

1.4  按键电路的选择与设计... 10

1.5  时钟电路的选择与设计... 11

1.6  系统总电路的设计... 12

软件设计... 12

2.1  程序设计思想... 13

2.2  主程序设计... 13

2.3  中断程序设计... 14

电子秒表的安装与调试... 15

3.1  软件的仿真与调试... 15

3.2  硬件的安装与调试... 15

致  谢... 16

附录A  c语言程序... 17

附录B  电路原理图... 33

基于单片机的多功能秒表设计

一.     

秒表计时器是电器制造,工业自动化控制、国防、实验室及科研单位理想的计时仪器,它广泛应用于各种继电器、电磁开关,控制器、延时器、定时器等的时间测试。

奥运男子百米飞人大战中,牙买加飞人博尔特以9秒69的成绩夺得冠军。而博尔特冲过终点的瞬间,荧屏显示其成绩为9秒68。相差的这个0.01秒,系由电子计时系统确认。

奥运会男子100米蝶泳决赛上,美国选手菲尔普斯以50秒58的成绩惊险夺冠,距离“八金梦想”仅一步之遥。塞尔维亚选手查维奇以50.59秒获得银牌,只比菲尔普斯慢0.01秒。这种细微的差距,即使是现场大屏幕用经典超慢镜头回放,也无法分辨。

20##年8月28日15点15分,中国选手孟关良/杨文军在雅典奥运会男子500米划艇决赛中,以1分40秒278的成绩获得中国在雅典奥运会的第28金。这是中国皮划艇项目的第一枚奥运金牌,也是中国水上项目在历届奥运会上所获得的第一枚金牌。孟关良/杨文军的成绩比获得银牌的古巴选手只快了 0.072秒,以至于两人在夺冠之后还不敢相信。

自首届现代奥运会在希腊雅典举办以来,奥运计时技术一直在不断地向前发展。一百多年过去了,首届现代奥运会上计时所用的跑表如今换成了一系列高科技计时装 置,如高速数码摄像机、电子触摸垫、红外光束、无线应答器等等。鉴于当今计时技术的快速发展,即便千分之一秒(为眨眼的40倍)的毫微差距,也决定着冠军的归属。

在现在的体育竞技比赛中,随着运动员的水平不断提高,差距也在不断缩小。有些运动对时间精度的要求也越来越高,有时比赛冠亚军之间的差距只有几毫秒,因此就需要高精度的秒表来记录成绩。

有关计时钟表的发展历史,大致可以分为三个演变阶段。

一、从大型钟向小型钟演变。二、从小型钟向袋表过渡。三、从袋表向腕表发展。

每一阶段的发展都是和当时的技术发明分不开的。

1088年,当时我国宋朝的科学家苏颂和韩工廉等人制造了水运仪象台,它是把浑仪、浑象和机械计时器组合起来的装置。它以水力作为动力来源,具有科学的擒纵机构,虽然几十年后毁于战乱,但它在世界钟表史上具有极其重要的意义。

1656年,荷兰的科学家惠更斯应用伽利略的理论设计了钟摆,第二年,在他的指导下年轻钟匠S.Coster制造成功了第一个摆钟。1675年,他又用游丝取代了原始的钟摆,这样就形成了以发条为动力、以游丝为调速机构的小型钟,同时也为制造便于携带的袋表提供了条件。

18世纪期间发明了各种各样的擒纵机构,为袋表的进一步产生与发展奠定了基础。英国人George Graham在1726年完善了工字轮擒纵机构,它和之前发明的垂直放置的机轴擒纵机构不同,所以使得袋表机芯相对变薄。

20世纪初,尤其是第一次世界大战的爆发,袋表已经不能适应作战军人的需要,腕表的生产成为大势所趋。许多新的设计和技术也被应用在腕表上,成为真正意义上的带在手腕上的计时工具。紧接着的二战使腕表的生产量大幅度增加,价格也随之下降,使普通大众也可以拥有它。腕表的年代到来了!

1998年:建立超冷铯原子钟,比微微秒又要精确10万倍。

从我国水运仪像台的发明到现在各国都在研制的原子钟这几百年的钟表演变过程中,我们可以看到,各个不同时期的科学家和钟表工匠用他们的聪明的智慧和不断的实践融合成了一座时间的隧道,同时也为我们勾勒了一条钟表文化和科技发展的轨迹。

此次设计的秒表主要实现的功能是倒计时、计时和时钟显示。因此设置了六个按键和八位数码管显示时间,六个按键中,按键4是模式调节:模式1为倒计时模式,按圈计时模式和时钟模式;按键2为:要调节的位段的选择,可以选择小时,分钟,秒;按键1和按键3分别为调节加和减;按键5为倒计时启动,调节规定的时间,按下按键五启动倒计时;按键6为模式2下按圈计时模式的启动键,当按第一下时是开始计时,第二下记录第一组数据,继续按依次记录6组,当记录完6组后,继续点击则依次显示六组的时间,,在继续按按键6则复位到0,然后依次循环。利用这六个建来实现秒表的全部功能,而八个位数码管则能显示最多24小时的计时。

本文主要内容包括三部分:第一部分介绍硬件部分设计思路及方案;第二部分介绍了软件部分的设计思路和设计;最后一部分则是整个系统的安装与调试过程。

1  硬件设计

1.1  总体方案的设计

数字电子秒表具有显示直观、读取方便、精度高等优点,在计时中广泛使用。本设计用单片机组成数字电子秒表,力求结构简单、精度高为目标。

设计中包括硬件电路的设计和系统程序的设计。其硬件电路主要有主控制器,时钟功能,倒计时,计时与显示电路和回零、启动和停表电路等。主控制器采用单片机AT89C52,显示电路采用共阴极LED数码管显示计时时间。

本设计利用AT89C52单片机的定时器/计数器定时和记数的原理,使其能精确计时。利用中断系统使其能实现开始暂停的功能。P0口输出段码数据,P2口作列扫描输出,P1^7,P1^6,P1^5,P1^4,P1^3口接5个按钮开关,分别实现调节加、位选择、调节减,倒计时启动和记圈时间启动。电路原理图设计最基本的要求是正确性,其次是布局合理,最后在正确性和布局合理的前提下力求美观。硬件电路图按照图1.1进行设计。

图1.1 数字秒表显示硬件电路基本原理图

根据要求知道秒表设计主要实现的功能是倒计时、计时和时钟显示。因此设置了六个按键和八位数码管显示时间,六个按键中,按键4是模式调节:模式1为倒计时模式,按圈计时模式和时钟模式;按键2为:要调节的位段的选择,可以选择小时,分钟,秒;按键1和按键3分别为调节加和减;按键5为倒计时启动;按键6为模式2下按圈计时模式的启动键,当按第一下时是开始计时,第二下记录第一组数据,继续按依次记录6组,当记录完6组后,继续点击则依次显示六组的时间,在继续按按键6则复位到0。利用这六个建来实现秒表的全部功能,而八个位数码管则能显示最多的计时。

计时采用定时器T0中断完成,定时溢出中断周期为50ms,当一处中断后向CPU发出溢出中断请求,每发出一次中断请求就对毫秒计数单元进行加一,达到2次就对十毫秒位进行加一,就是进位0.01,然后按时钟的取值范围进行进位。

再看按键的处理。这六个键可以采用中断的方法,也可以采用扫描的方法来识别。

设计中包括硬件电路的设计和系统程序的设计。其硬件电路主要有主控制器,显示电路和回零、启动、查看、停表电路等。主控制器采用单片机AT89C52,显示电路采用共阴极LED数码管显示计时时间,六个按键均采用触点式按键。

1.2  单片机的选择

本课题在选取单片机时,充分借鉴了许多成形产品使用单片机的经验,并根据自己的实际情况,选择了ATMEL公司的AT89S51。

ATMEL公司的89系列单片机以其卓越的性能、完善的兼容性、快捷便利的电擦写操作,低廉的价格、超强的加密功能,完全替代87C51/62和8751/52,低电压、低电源、低功耗,有DIP、PLCC、QFP封装,有民用型、工业级、汽车级、军品级等多种温度等级,是当今世界上性能最好、价格最低、最受欢迎的八位单片机[3]

AT89C52P为40 脚双列直插封装的8 位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC 内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。

单片机的外部结构

AT89S52单片机采用40引脚的双列直插封装方式。图1.2为引脚排列图, 40条引脚说明如下:

主电源引脚Vss和Vcc

①  Vss接地

②  Vcc正常操作时为+5伏电源

外接晶振引脚XTAL1和XTAL2

①  XTAL1内部振荡电路反相放大器的输入端,是外接晶体的一个引脚。当采用外部振荡器时,此引脚接地。   

②  XTAL2内部振荡电路反相放大器的输出端。是外接晶体的另一端。当采用外部振荡器时,此引脚接外部振荡源。

图1.2 单片机引脚图

控制或与其它电源复用引脚RST/VPD,ALE//Vpp

①  RST/VPD  当振荡器运行时,在此引脚上出现两个机器周期的高电平(由低到高跳变),将使单片机复位在Vcc掉电期间,此引脚可接上备用电源,由VPD向内部提供备用电源,以保持内部RAM中的数据。

②  ALE/正常操作时为ALE功能(允许地址锁存)提供把地址的低字节锁存到外部锁存器,ALE 引脚以不变的频率(振荡器频率的1/6)周期性地发出正脉冲信号。因此,它可用作对外输出的时钟,或用于定时目的。但要注意,每当访问外部数据存储器时,将跳过一个ALE脉冲,ALE 端可以驱动(吸收或输出电流)八个LSTTL电路。对于EPROM型单片机,在EPROM编程期间,此引脚接收编程脉冲(功能)

③  外部程序存储器读选通信号输出端,在从外部程序存储取指令(或数据)期间,在每个机器周期内两次有效。同样可以驱动八LSTTL输入。

④  /Vpp、/Vpp为内部程序存储器和外部程序存储器选择端。当/Vpp为高电平时,访问内部程序存储器,当/Vpp为低电平时,则访问外部程序存储器。对于EPROM型单片机,在EPROM编程期间,此引脚上加21伏EPROM编程电源(Vpp)。

输入/输出引脚P0.0 - P0.7,P1.0 - P1.7,P2.0 - P2.7,P3.0 - P3.7。

①  P0口(P0.0 - P0.7)是一个8位漏极开路型双向I/O口,在访问外部存储器时,它是分时传送的低字节地址和数据总线,P0口能以吸收电流的方式驱动八个LSTTL负载。

②  P1口(P1.0 - P1.7)是一个带有内部提升电阻的8位准双向I/O口。能驱动(吸收或输出电流)四个LSTTL负载。

③  P2口(P2.0 - P2.7)是一个带有内部提升电阻的8位准双向I/O口,在访问外部存储器时,它输出高8位地址。P2口可以驱动(吸收或输出电流)四个LSTTL负载。

④  P3口(P3.0 - P3.7)是一个带有内部提升电阻的8位准双向I/O口。能驱动(吸收或输出电流)四个LSTTL负载[6]

AT89C52具有以下标准功能:8k字节Flash,256字节RAM,32 位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89C52可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。CPU是单片机的核心部件。它由运算器和控制器等部件组成[2]

本设计采用ATMEL的AT89C52微处理器,主要基于以下几个因素:

①  AT89C52为51内核,仿真调试的软硬件资源丰富。

②  性价比高,货源充足。

③  功耗低,功能强,灵活性高。

④  DIP40封装,体积小,便于产品小型化。

⑤  为EEPROM程序存储介质,1000次以上擦写周期,便于编程调试。

⑥         工作电压范围宽:2.7V-6V,便于交直流供电。

1.3  显示电路的选择与设计

对于数字显示电路,通常采用液晶显示或数码管显示。对于一般的段式液晶屏,需要专门的驱动电路,而且液晶显示作为一种被动显示,可视性差,不适合远距离观看;对于具有驱动电路和单片机接口的液晶显示模块(字符或点阵),一般多采用并行接口,对单片机的接口要求较高,占用资源多;另外,AT89S52单片机本身无专门的液晶驱动接口。而数码管作为一种主动显示器件,具有亮度高、响应速度快、防潮防湿性能好、温度特性极性、价格便宜、易于购买等优点,而且有远距离视觉效果,很适合夜间或是远距离操作。因此,本设计的显示电路采用7段数码管作为显示介质。

数码管显示可以分为静态显示和动态显示两种。由于本设计需要采用八位数码管显示时间,如果静态显示则占用的口线多,硬件电路复杂。所以采用动态显示。

文本框: 段控制 图1.3 显示电路基本原理图

动态显示是一位一位地轮流点亮各位数码管,这种逐位点亮显示器的方式称为位扫描。通常各位数码管的段选线相应并联在一起,由一个8位的I/O口控制;各位的公共阴极位选线由另外的I/O口线控制。动态方式显示时,各数码管分时轮流选通,要使其稳定显示必须采用扫描方式,即在某一时刻只选通一位数码管,并送出相应的段码,在另一时刻选通另一位数码管,并送出相应的段码,依此规律循环,即可使各位数码管显示将要显示的字符,虽然这些字符是在不同的时刻分别显示,但由于人眼存在视觉暂留效应,只要每位显示间隔足够短就可以给人同时显示的感觉。

1.4  按键电路的选择与设计

本设计中有四个按键,分别实现开始、暂停、复位和查看功能。这三个键可以采用中断的方法,也可以采用查询的方法来识别。对于复位键和查看键,主要功能在于数值复位和对上次计时时间的查看,对于时间的要求不是很严格,而开始和暂停键主要用于时间的锁定,需要比较准确的控制。因此可以考虑,对复位键和查看键采用查询的方式,而对于开始和暂停键采用外部中断。四个按键均采用低电平有效,具体电路连接图如图1.5所示。

当按键没有按下时,单片机的I/O口直接连接电源,因此需要接上拉电阻来进行限流,本设计中选取阻值为2kΩ 的电阻作为上拉电阻,根据计算可知此时的灌电流为2.5mA,查看AT89C52的资料得知次电流在安全范围内,符合安全设计要求。

图1.5 按键电路

键电路中由于采用了外部中断。使用程序先给P1^2至P1^7 送数据1,然后检测按键是否按下。

1.5  时钟电路的选择与设计

单片机的时钟信号用来提供单片机内各种微操作的时间基准,89S52片内设有一个由反向放大器所构成的振荡电路,XTAL1和 XTAL2分别为振荡电路的输入和输出端,89S52单片机的时钟信号通常用两种电路形式得到:内部振荡方式与外部振荡方式。外部方式的时钟很少用,若要用时,只要将XTAL1接地,XTAL2接外部振荡器就行。对外部振荡信号无特殊要求,只要保证脉冲宽度,一般采用频率低于12MHz的方波信号。

时钟发生器把振荡频率两分频,产生一个两相时钟信号P1和P2供单片机使用。P1在每一个状态S的前半部分有效,P2在每个状态的后半部分有效。本设计采用的内部振荡方式,内部振荡方式所得的时钟信号比较稳定,实用电路中使用较多。本设计系统的时钟电路如图1.4所示。只要按照图1.6所示电路进行设计连接就能使系统可靠起振并能稳定运行。图中,电容器C1 、C2起稳定振荡频率、快速起振的作用,电容值一般为5~33pF。但在时钟电路的实际应用中一定要注意正确选择其大小,并保证电路的对称性,尽可能匹配,选用正牌的瓷片或云母电容,如果可能的话,温度系数尽可能低。本设计中采用大小为30pF的电容和12MHz的晶振[8]

图1.6 内部振荡电路

1.6  系统总电路的设计

系统总电路由以上设计的显示电路,时钟电路,按键电路和复位电路组成,只要将单片机与以上各部分电路合理的连接就组成了系统总电路。系统总电路图如图1.11所示。

AT89C52单片机为主电路的核心部分,各个电路均和单片机相连接,由单片机统筹和协调各个电路的运行工作。

AT89C52单片机提供了XTAL1和XTAL2两个专用引脚接晶振电路,因此只要将晶振电路接到两个专用引脚即可为单片机提供时钟脉冲,但在焊接晶振电路时要尽量使晶振电路靠近单片机,这样可以为单片机提供稳定的始终脉冲。

图1.11 系统总电路图

复位电路同晶振电路,单片机设有一个专用的硬件复位接口,并设置为高电平有效。

按键电路与单片机的端口连接可以由用户自己设定,本设计中软件复位键和查看键为P1^2,均设为低电平有效。

显示电路由八位数码管组成,采用动态显示方式,因此有8位段控制端和8位位控制端,八位段控制接P0口,P0.0~P0.7分别控制数码显示管的a、b、c、d、e、f、g、dp显示,AT89C52的P0口没有集成上拉电阻,高电平的驱动能力很弱,所以需要接上拉电阻来提高P0的高电平驱动能力,然后接至74ls164,段锁存和位锁存分别由P1^2和P1^3,对应的数码管导通显示。

通过以上设计已经将各部分电路与单片机有机的结合到一起,硬件部分的设计以大功告成,剩下的部分就是对单片机的编程,使单片机按程序运行,实现数字电子秒表的全部功能。

软件设计

2.1  程序设计思想

本设计采用了C语言编写,汇编语言由于采用了助记符号来编写程序,比用机器语言的二进制代码编程要方便些,在一定程度上简化了编程过程。汇编语言的特点是用符号代替了机器指令代码,而且助记符与指令代码一一对应,基本保留了机器语言的灵活性。使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程序。

C语言具有下列特点:

1. C是中级语言

它把高级语言的基本结构和语句与低级语言的实用性结合起来。C语言可以象汇

编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。

2. C是结构式语言

结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信

息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调

试。C 语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循

环、条件语句控制程序流向,从而使程序完全结构化。

3. C语言功能齐全

C语言具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。另外C

语言也具有强大的图形功能,支持多种显示器和驱动器。而且计算功能、逻辑判

断功能也比较强大,可以实现决策目的。

4. C语言适用范围大

C语言还有一个突出的优点就是适合于多种操作系统,如DOS、UNIX,也适用于多

种机型。

2.2  主程序设计

本系统程序主要模块由主程序、定时中断服务程序、外部中断0服务程序和外部中断1服务程序组成。其中主程序是整个程序的主体。可以对各个中断程序进行调用。协调各个子程序之间的联系。

系统(上电)复位后,进入主程序,主程序流程图如图2.1

图2.1 主程序流程图

2.3  中断程序设计

现在方案中采用了定时中断T0。CPU在响应中断时,先处理高级中断,在处理低级中断,若有多个同级中断时,则按自然优先顺序处理。例如当CPU正在处理一个中断申请时,有出现了另一个优先级比它高的中断请求,这是,CPU就暂停终止对当前优先级较低的中断源的服务,转去响应优先级比它高的中断请求,并为其服务。待服务结束,再继续执行原来较低级的中断服务程序。而当CPU为级别高的终端服务程序服务时,如果级别低的中断发出中断请求,此时CPU是不会响应的,所以为了避免开始和暂停两个按键中的一个出现没有响应的情况,在进行程序编辑时要注意对中断的使用,避免出现中断的嵌套。,合理分配中断对本设计的实现是至关重要的。

另外由于数字式电子秒表的最小精度位100ms。定时器T0的定时周期也为50ms,为了使电子秒表暂停键按下后CPU能马上进行数据调整

3  电子秒表的安装与调试

3.1  软件的仿真与调试

Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件,它可以仿真、分析(SPICE)各种模拟器件和集成电路。该软件的主要特点总结后有以下四点:①实现了单片机仿真和SPICE电路仿真相结合的功能。②支持目前主流单片机系统的仿真。③提供了软件调试功能,并可以与WAVE联合仿真调试。④具有强大的原理图绘制功能。总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。在电子领域中也起到了很大的作用,它的出现仿真不需要先焊接电路,可以先仿真调试通过后在焊电路,节省了不少在硬件调试上所花的时间。

Proteus ISIS的工作界面是一种标准的Windows界面,如图1.19所示。它包括标题栏、主菜单、状态栏、标准工具栏、绘图工具栏、对象选择按钮、预览对象方位控制按钮、仿真进程控制按钮、预览窗口、对象选择器窗口、图形编辑窗口等十几个工具,方便了使用者的使用。

Proteus ISIS绘制原理图的操作与Protel 99se绘制原理图的操作基本相同,在这里就不再作赘述。下面拿本设计中的一个仿真例子作简述说明。运行Proteus ISIS后,绘制病床呼叫系统的原理图。

首先打开已经画好的proteus DSN文件,双击图中的AT89S52芯片,就弹出一个窗口,在Program File项中通过路径选择在WAVE中生成的HEX文件,双击选中后确定,这样仿真图中的AT89S52芯片就已经读取了本设计中的HEX文件。单击“三角形按钮”进行仿真。通过对仿真结果的观察来对程序进行修改,最终使程序到达设计要求。

3.2  硬件的安装与调试

按照之前设计好的数字电子秒表原理图,详细计算系统中各个元件的参数,选择相应器件,制作实际电路板。由于考虑到万能板大小的问题及元件之间连线的方便,在焊接元器件前必须考虑元件的布局然后进行实际操作。

制作好的电路板可以用万用表(200欧姆档)的红、黑表笔测试电路板的每条走线,当其电阻非常小时,证明走线没有断开,当其电阻很大时,证明该条走线断了,应该重新走线,使电路板在电气上得到正确地连接。选用万用表的20K欧姆档,检测电路中是否存在短路。因为系统采用的是共阴极数码管作为显示电路,必须确保数码管的公共端接的是低电平。
结  论

本设计的数字电子秒表是由AT89S52单片机、共阴数码显示管、控制按键、三极管等器件构成的,设有五位计时显示,开始、暂停、复位、查看按键以及一个系统整机复位按钮。计时精度能到达1ms,能调看上一次计时时间,设计精简,使用简单易懂。系统设计合理,线路简单、功能先进,性能稳定,程序精简。并给出了详细的电路设计方法。本系统是以单片机为核心,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。所以采用汇编语言来进行软件设计,利用汇编语言面向机器并能较好的发挥机器的特性,得到较高的程序,同时汇编语言目标代码简短,占用内存少,执行速度快,能提高秒表的精度。

本系统主要由3章组成,第一章中,主要是硬件组成部分和其实现的功能,在本此实验中各部分都实现了其功能。在第二章中,主要介绍的是软件实现过程的框图。在第三章中,主要是对硬件和软件的调试,最终保证了系统的正常运行。

通过毕业设计,复习巩固我们以前所学习的数字、模拟电子技术、单片机原理及接口等课程知识,加深对各门课程及相互关系的理解,并成功使用了Wave、Protel 99se和Proteus ISIS三款电子软件,使理论知识系统化、实用化,系统地掌握微机应用系统的一般设计方法,培养较强的编程能力、开发能力。

同时,在毕业设计的过程中,我也发现了本系统的许多不足和可以改进的地方。但因时间紧迫等原因没能改进。本设计的数字电子秒表缺少对多次计时时间进行记录的功能。应给在单片机的内部存储区多设置一些存储空间,用来存储多次计时时间。并在程序中编入对多次计时时间的调用显示。虽然存在不足,但本设计开发的数字电子秒表仍具有它的实用性。

致  谢

我这次毕业设计是在唐朝仁老师的精心指导下完成的,唐朝仁老师为我对本文的完成提供了良好的设施和环境,从论文的选定到实验研究,从资料收集到方案确定,唐朝仁老师都给了我大量的中肯的建议和意见,我的每步工作都凝聚了吕老师的辛勤汗水。同时,唐朝仁老师的严谨的治学态度和忘我的工作精神以及高尚的师德给我留下了深深的影响,这将激励我更好地完成今后的学习和工作。借此机会对唐朝仁老师的精心教育和指导表示忠心的感谢;也借此机会,感谢大学四年来辛勤教育指导我的各科任老师。我也很感谢论文答辩的各位评委老师,感谢他们在百忙之中抽出时间帮我们答辩。还要感谢班里的同学对我不懈的支持与帮助。

通过这次设计,我学到了很多知识,同时也认识到在团队工作中需要有合作精神,我想这会为今后自己踏上工作岗位、更好地融入新的团队打下良好的基础。


附录A  c语言程序


#include<reg52.h>

#include<intrins.h>

#define uchar unsigned char

#define uint unsigned int

uchar hour,min,sec,msec,hour1,min1,sec1,msec1;

uchar shi,ge,option,aa,bb,shunxu,flag,direction,flag1;

uchar a,b,c,d,a1,b1,c1,d1,a2,b2,c2,d2,a3,b3,c3,d3,a4,b4,c4,d4,a5,b5,c5,d5;

sbit wela=P2^3;

sbit dula=P2^2;

sbit key1=P1^7;

sbit key2=P1^6;

sbit key3=P1^5;

sbit key4=P1^4;

sbit key5=P1^3;

sbit key6=P1^2;//启动按圈计时功能

sbit leden=P2^6;

sbit zhishi=P1^0;

uchar code du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

uchar code we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

void delay(uint);

void display(uchar,uint);

void tiaojia();

void tiaojian();

void dstart();

void quanstart();

void fenpei();

void model();

void init();

void main()

{

       init();

       while(1)

              {    

                     model(); 

                     if(shunxu==0)

                            {

                                   direction++;

                                   if(direction==3)

                                          direction=0;

                            }

                     fenpei();

                     dstart();

                     quanstart();

                           

                     if(direction==0)zhishi=0;

                            else zhishi=1;        

              }

}

void quanstart()//按圈计时启动与分段(在模式0下应用)

{

       if(key6==0&&shunxu==1)

              {    

                     delay(8);//消抖

                     if(key6==0)

                            {

                                   flag1++;

                                   if(flag1==2)

                                          {

                                                 a=msec1;

                                                 b=sec1;

                                                 c=min1;

                                                 d=hour1;

                                          }

                                   if(flag1==3)

                                          {

                                                 a1=msec1;

                                                 b1=sec1;

                                                 c1=min1;

                                                 d1=hour1;

                                          }

                                   if(flag1==4)

                                          {

                                                 a2=msec1;

                                                 b2=sec1;

                                                 c2=min1;

                                                 d2=hour1;

                                          }

                                   if(flag1==5)

                                          {

                                                 a3=msec1;

                                                 b3=sec1;

                                                 c3=min1;

                                                 d3=hour1;

                                          }

                                   if(flag1==6)

                                          {

                                                 a4=msec1;

                                                 b4=sec1;

                                                 c4=min1;

                                                 d4=hour1;

                                          }

                                   if(flag1==7)

                                          {

                                                 a5=msec1;

                                                 b5=sec1;

                                                 c5=min1;

                                                 d5=hour1;

                                          }

                                   if(flag1==1)

                                          {

                                                 msec1=0;sec1=0;min1=0;hour1=0;

                                          }

                            }

                     if(flag1==14)

                            flag1=0;

                     if(flag1==0)

                            {

                                   msec1=0;sec1=0;min1=0;hour1=0;

                            }

                    

                     while(!key6);

                     delay(5);//消抖

                     if(key6==1)

                            while(!key6); 

              }

}void dstart()//倒计时启动与暂停(在模式0下应用)

{

       if(key5==0&&shunxu==0)

              {    

                     delay(8);//消抖

                     if(key5==0)

                            flag++;

                     if(flag==2)

                            flag=0;

                     while(!key5);

                     delay(5);//消抖

                     if(key5==1)

                            while(!key5); 

              }

}

void timer0() interrupt 1

{    

       TH0=(65536-5000)/256;

       TL0=(65536-5000)%256;

       bb++;

       if(bb==2)      

              {    

                     msec++; 

                     bb=0;

                     if(shunxu==0&&msec1==0&&min1==0&&sec1==0&&hour1==0&&flag==0)msec1=msec1;

                     if(shunxu==0&&(msec1!=0|min1!=0|sec1!=0|hour1!=0)&&flag==0)msec1--;

                     if(shunxu==1&&flag1!=0)msec1++;

              }

       if(msec==100)//限制顺序数值范围

              {

                     msec=0;

                     sec++;

                     if(sec==60)

                            {

                                   sec=0;

                                   min++;

                                          if(min==60)

                                                 {

                                                        min=0;

                                                        hour++;

                                                               if(hour==24)

                                                                      hour=0;

                                                       

                                                 }

                            }

              }

if(msec1==100)//限制顺序数值范围

              {

                     msec1=0;

                     sec1++;

                     if(sec1==60)

                            {

                                   sec1=0;

                                   min1++;

                                          if(min1==60)

                                                 {

                                                        min1=0;

                                                        hour1++;

                                                               if(hour1==24)

                                                                      hour1=0;

                                                       

                                                 }

                            }

              }

              if(msec1==-1)//限定倒序数值范围

                     {

                            msec1=99;

                            sec1--;

                            if(sec1==-1)

                                   {

                                          sec1=59;

                                          min1--;

                                                 if(min1==-1)

                                                        {

                                                               min1=59;

                                                               hour1--;

                                                                      if(hour1==-1)

                                                                             hour1=23;

                                                        }

                                   }

                     }

}

void model()

{

       if(key4==0)/*模式:*/

              {

                     delay(10);//消抖

                     if(key4==0)

                            {    

                                   shunxu++;

                                   if(shunxu==1)option=0;

                                   if(shunxu==3)

                                          {

                                                 shunxu=0;

                                          }

                            }

                     while(!key4);

                     delay(5);//消抖

                     if(key4==1)

                            while(!key4);

              }

}

void delay(uint x)

{

       uint y,z;

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

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

}

void display(uchar x,uint z)//(显示位段的第一位,数值)

{

       shi=z/10;

    ge=z%10;

       P0=we[x];

       wela=1;

       wela=0;

       P0=du[shi];

       dula=1;

       dula=0;

       delay(7);

      

       P0=we[x+1];

       wela=1;

       wela=0;

       P0=du[ge];

       dula=1;

       dula=0;

       delay(7);

}

void tiaojia()

{

       if(key2==0)

              {    

                     delay(8);//消抖

                     if(key2==0)

                            option++;

                     if(option==4)

                            option=0;

                     while(!key2);

                     delay(5);//消抖

                     if(key2==1)

                            while(!key2); 

              }

       if(key1==0&&option==1)

              {    

                     delay(10);//消抖

                     if(key1==0)

                            {

                                   if(shunxu==0)

                                          hour1++;

                                   if(shunxu==2)

                                          hour++;

                            }

                     if(hour==24)

                            hour=0;

                     if(hour1==24)

                            hour1=0;

                     while(!key1);

                     delay(5);//消抖

                     if(key1==1)

                            while(!key1); 

              }

       if(key1==0&&option==2)

              {    

                     delay(10);//消抖

                     if(key1==0)

                            {

                                   if(shunxu==0)

                                          min1++;

                                   if(shunxu==2)

                                          min++;

                            }

                     if(min==60)

                            min=0;

                     if(min1==60)

                            min1=0;

                     while(!key1);

                     delay(5);//消抖

                     if(key1==1)

                            while(!key1); 

              }

       if(key1==0&&option==3)

              {    

                     delay(10);//消抖

                     if(key1==0)

                            {

                                   if(shunxu==0)

                                          sec1++;

                                   if(shunxu==2)

                                          sec++;

                            }

                     if(sec==60)

                            sec=0;

                     if(sec1==60)

                            sec1=0;

                     while(!key1);

                     delay(5);//消抖

                     if(key1==1)

                            while(!key1); 

              }    

}

void tiaojian()

{

       if(key2==0)

              {    

                     delay(8);//消抖

                     if(key2==0)

                            option++;

                     if(option==4)

                            option=0;

                     while(!key2);

                     delay(5);//消抖

                     if(key2==1)

                            while(!key2); 

              }

       if(key3==0&&option==1)

              {    

                     delay(10);//消抖

                     if(key3==0)

                            {

                                   if(shunxu==0)

                                          hour1--;

                                   if(shunxu==2)

                                          hour--;

                            }

                     if(hour==-1)

                            hour=23;

                     if(hour1==-1)

                            hour1=23;

                     while(!key3);

                     delay(5);//消抖

                     if(key3==1)

                            while(!key3); 

              }

       if(key3==0&&option==2)

              {    

                     delay(10);//消抖

                     if(key3==0)

                            {

                                   if(shunxu==0)

                                          min1--;

                                   if(shunxu==2)

                                          min--;

                            }

                     if(min==-1)

                            min=59;

                     if(min1==-1)

                            min1=59;

                     while(!key3);

                     delay(5);//消抖

                     if(key3==1)

                            while(!key3); 

              }

       if(key3==0&&option==3)

              {    

                     delay(10);//消抖

                     if(key3==0)

                            {

                                   if(shunxu==0)

                                          sec1--;

                                   if(shunxu==2)

                                          sec--;

                            }

                     if(sec==-1)

                            sec=59;

                     if(sec1==-1)

                            sec1=59;

                     while(!key1);

                     delay(5);//消抖

                     if(key1==1)

                            while(!key1); 

              }

}

void fenpei()

{

       if(shunxu==0|shunxu==2)

              {

                     tiaojia();

                     tiaojian();

              }

       if(shunxu==1)

              {

                     if(flag1<8)

                            {

                                   display(0,hour1);

                                   display(2,min1);

                                   display(4,sec1);

                                   display(6,msec1);

                            }    

                     if(flag1==8)

                            {

                                   display(0,d);

                                   display(2,c);

                                   display(4,b);

                                   display(6,a);

                            }

                     if(flag1==9)

                            {

                                   display(0,d1);

                                   display(2,c1);

                                   display(4,b1);

                                   display(6,a1);

                            }                  

                     if(flag1==10)

                            {

                                   display(0,d2);

                                   display(2,c2);

                                   display(4,b2);

                                   display(6,a2);

                            }                  

                     if(flag1==11)

                            {

                                   display(0,d3);

                                   display(2,c3);

                                   display(4,b3);

                                   display(6,a3);

                            }                  

                     if(flag1==12)

                            {

                                   display(0,d4);

                                   display(2,c4);

                                   display(4,b4);

                                   display(6,a4);

                            }                  

                     if(flag1==13)

                            {

                                   display(0,d5);

                                   display(2,c5);

                                   display(4,b5);

                                   display(6,a5);

                            }                         

              }

       if(shunxu==0)

              {

                     if(option==0)

                            {

                                   display(0,hour1);

                                   display(2,min1);

                                   display(4,sec1);

                                   display(6,msec1);

                            }

                     if(option==1)

                            {

                                   display(0,hour1);

                            }

                     if(option==2)

                            {

                                   display(2,min1);

                            }

                     if(option==3)

                            {

                                   display(4,sec1);

                            }

              }

       if(shunxu==2)

              {

                     if(option==0)

                            {

                                   display(0,hour);

                                   display(2,min);

                                   display(4,sec);

                                   display(6,msec);

                            }

                     if(option==1)

                            {

                                   display(0,hour);

                            }

                     if(option==2)

                            {

                                   display(2,min);

                            }

                     if(option==3)

                            {

                                   display(4,sec);

                            }

              }

}

void init()

{

       TMOD=0x01;//设置定时器模式

       TH0=(65536-5000)/256;

       TL0=(65536-5000)%256;

    EA=1;

    ET0=1;

       TR0=1;

       hour=0;

       min=0;

       sec=0;

       msec=0;

       hour1=0;

       min1=0;

       sec1=0;

       msec1=0;

       leden=0;

       option=0;

       flag=1;

       flag1=0;

       P1=0xfe;

       shunxu=0;

}


附录B  电路原理图

 

相关推荐