数字时钟设计开发项目报告概要_第1页
数字时钟设计开发项目报告概要_第2页
数字时钟设计开发项目报告概要_第3页
数字时钟设计开发项目报告概要_第4页
数字时钟设计开发项目报告概要_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

常州工程职业技术学院计算机技术系项目工作报告课程名称单片机与接口技术(C51)班级计算机1213学号姓名项目序号项目一项目名称数字时钟设计开发实训日期/时间2014.22014.5地点指导教师同组成员仪器设备(参考资料)计算机、Keil uVision2、Proteus ISIS实训内容(任务安排)1-1需求分析、硬件设计方案确定1-2软件开发与实现1-3软硬件联调1-4项目验收总结1、 项目概述以单片机STC89C52RC作为主控芯片,利用按键、数码管显示模块,结合中断、定时器功能,构成一个数字时钟,通过项目实训掌握单片机基本输入输出系统的设计与应用。2、 项目要求针对每个项目,教师给出所需背景知识、参考资料、师生交流平台、项目要求、相关案例、开发流程、注意事项等指导学生。根据项目开发流程组成学生开发团队,创建协作学习环境。每个团队由6-8人组成,分别担当不同角色。这种模拟教学法的做法模拟了企业中真实开发情景,使学生在学习过程中感受到公司工作的气氛。具体要求如下:1、能够简单分析实际项目的功能需求;2、能够进行IO接口电路设计与元器件选型;3、能够使用Proteus绘制电路原理图并仿真;4、能用C51设计应用程序;5、能够对系统进行测试与优化;6、能够编制规范的技术文档;7、能对系统软硬故障进行检测与排除;8、培养自主学习能力、收集分析、处理信息能力、团队协作能力;9、培养职业道德素质、心理素质、沟通、组织和执行任务的能力;10、培养汇报发言时,条理清晰,表达清楚,体现出认真细致、全面的思维习惯。11、培养学生良好的工作设计习惯。12、培养实事求是、客观公正的评价自己,体现在社会交往中的承受挫折与迎接挑战的意识。3、 系统设计1、 框图设计 AT89C51 晶振电路 数码管 复位按键 时分秒按键2、 知识点1)单片机型号的选择 89C51是最理想的电子时钟开发芯片。89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,而且它与MCS-51兼容,且具有4K字节可编程闪烁存储器和1000写/擦循环,数据保留时间为10年等特点,是最好的选择。2)数码管显示工作原理 数码管是一种把多个LED显示段集成在一起的显示设备。有两种类型,一种是共阳型,一种是共阴型。共阳型就是把多个LED显示段的阳极接在一起,又称为公共端。共阴型就是把多个LED显示段的阴极接在一起。阳极即为二极管的正极,又称为正极,阴极即为二极管的负极,又称为负极。通常的数码管又分为8段,即8个LED显示段,这是为工程应用方便如设计的,分别为A、B、C、D、E、F、G、DP,其中DP是小数点位段。而多位数码管,除某一位的公共端会连接在一起,不同位的数码管的相同端也会连接在一起。数码管显示方法可分为静态显示和动态显示两种。静态显示就是数码管的8段输入及其公共端电平一直有效。动态显示的原理是,各个数码管的相同段连接在一起,共同占用8位段引管线;每位数码管的阳极连在一起组成公共端。利用人眼的视觉暂留性,依次给出各个数码管公共端加有效信号,在此同时给出该数码管加有效的数据信号,当全段扫描速度大于视觉暂留速度时,显示就会清晰显示出来3)键盘电路设计 该设计用到了个键盘,实现的功能比较完善,减少了硬件资源的损耗,该键盘可以实现小时和分钟的调节以及复位的控制。直接按下不松开,则可以通过按键实现分钟的累加,每按一次分钟加一;而连续两次按下按键不放松,则可实现小时的调节,同样每按一次小时加一。达到时间调节的目的。4)晶振振荡器电路 单片机系统里都有晶振,在单片机系统里晶振作用非常大,全程叫晶体振荡器,他结合单片机内部电路产生单片机所需的时钟频率,单片机晶振提供的时钟频率越高,那么单片机运行速度就越快,单片接的一切指令的执行都是建立在单片机晶振提供的时钟频率。在通常工作条件下,普通的晶振频率绝对精度可达百万分之五十。高级的精度更高。有些晶振还可以由外加电压在一定范围内调整频率,称为压控振荡器(VCO)。晶振用一种能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡。 单片机晶振的作用是为系统提供基本的时钟信号。通常一个系统共用一个晶振,便于各部分保持同步。有些通讯系统的基频和射频使用不同的晶振,而通过电子调整频率的方法保持同步。 晶振通常与锁相环电路配合使用,以提供系统所需的时钟频率。如果不同子系统需要不同频率的时钟信号,可以用与同一个晶振相连的不同锁相环来提供。下面我就具体的介绍一下晶振的作用以及原理,晶振一般采用如图1a的电容三端式(考毕兹) 交流等效振荡电路;实际的晶振交流等效电路如图1b,其中Cv是用来调节振荡频率,一般用变容二极管加上不同的反偏电压来实现,这也是压控作用的机理;把晶体的等效电路代替晶体后如图1c。其中Co,C1,L1,RR是晶体的等效电路。 分析整个振荡槽路可知,利用Cv来改变频率是有限的:决定振荡频率的整个槽路电容C=Cbe,Cce,Cv三个电容串联后和Co并联再和C1串联。可以看出:C1越小,Co越大,Cv变化时对整个槽路电容的作用就越小。因而能“压控”的频率范围也越小。实际上,由于C1很小(1E-15量级),Co不能忽略(1E-12量级,几PF)。所以,Cv变大时,降低槽路频率的作用越来越小,Cv变小时,升高槽路频率的作用却越来越大。这一方面引起压控特性的非线性,压控范围越大,非线性就越厉害;另一方面,分给振荡的反馈电压(Cbe上的电压)却越来越小,最后导致停振。通过晶振的原理图你应该大致了解了晶振的作用以及工作过程了吧。采用泛音次数越高的晶振,其等效电容C1就越小;因此频率的变化范围也就越小。微控制器的时钟源可以分为两类:基于机械谐振器件的时钟源,如晶振、陶瓷谐振槽路;RC(电阻、电容)振荡器。一种是皮尔斯振荡器配置,适用于晶振和陶瓷谐振槽路。另一种为简单的分立RC振荡器。 用万用表测量晶体振荡器是否工作的方法:测量两个引脚电压是否是芯片工作电压的一半,比如工作电压是51单片机的+5V则是否是2.5V左右。另外如果用镊子碰晶体另外一个脚,这个电压有明显变化,证明是起振了的。晶振的类型有SMD和DIP型,即贴片和插脚型 。 5)单片机的复位电路 在上电或复位过程中,控制CPU的复位状态:这段时间内让CPU保持复位状态,而不是一上电或刚复位完毕就工作,防止CPU发出错误的指令、执行错误操作,也可以提高电磁兼容性能。 无论用户使用哪种类型的单片机,总要涉及到单片机复位电路的设计。而单片机复位电路设计的好坏,直接影响到整个系统工作的可靠性。许多用户在设计完单片机系统,并在实验室调试成功后,在现场却出现了“死机”、“程序走飞”等现象,这主要是单片机的复位电路设计不可靠引起的。 基本的复位方式单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。89系列单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。单片机系统的复位方式有:手动按钮复位和上电复位6)中断中断就是一个资源面对多项任务的处理方式,由于资源有限,面对多项任务同时要处理时,就会出现资源竞争的现象。中断技术就是为了解决资源竞争的一个可行的方法,采用中断技术可使多项任务共享一个资源。CPU正在执行原程序,突然,被意外事情打断,转去执行新程序。CPU执行新程序结束后,又回到原程序中继续执行。这样的过程就叫中断。首先来了解程序的格式:void 函数名() interrupt m using n关键字 interrupt m using n 表示这是一个中断函数m为中断源的编号,有五个中断源,取值为0,1,2,3,4,中断编号会告诉编译器中断程序的入口地址,执行该程序时,这个地址会传个程序计数器PC,于是CPU开始从这里一条一条的执行程序指令。n为单片机工作寄存器组(又称通用寄存器组)编号,共四组,取值为0,1,2,3 中断号 中断源0 外部中断01 定时器02 外部中断13 定时器1中断4 串行口中断这5个中断源的中断入口地址为:(在上一篇文章中讲到的ROM前43个存储单元就是他们,这40个地址用来存放中断处理程序的地址单元,每一个类中断的存储单元只有8B,显然不是中断处理的程序,而是存放着中断处理程序的真正地址)INT0:0003H 0T0: 000BH 1INT1:0013H 2T1: 001BH 3串口: 0023H 4中断向量(中断入口地址)= 中断号x8 +3前面m意思很清楚,不同的m值表示这个函数是针对不同的中断源,比如m为1是表示它是定时器0的中断函数,如void time0() interrupt 1那么后面的using n 又是什么意思呢?在正在执行一个特定任务时,有更紧急的事情需要CPU来处理,涉及到中断优先权。高优先权中断低优先权正在处理的程序,所以最好给每个优先程序分配不同的寄存器组。CPU正在处理某个事件,突然另外一个事件需要处理,于是进入中断后,而你不想将现在执行的程序的各寄存器状态入栈,那么可以把这个中断程序放入另一个寄存器组,如切换到1组,然后退出中断时,再切回到0组(原来的程序在0组)。为了更好的了解这里意思,你可以看看工作寄存器组的作用是什么。下面的注意事项(1)中断函数不能进行参数传递(2)中断函数没有返回值(3)在任何情况下都不能直接调用中断函数(4)中断函数使用浮点运算要保存浮点寄存器的状态。(5)如果在中断函数中调用了其它函数,则被调用函数所使用的寄存器必须与中断函数相同,被调函数最好设置为可重入的。(6)C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容,具体如下:在程序开始处对ACC、B、DPH、DPL和PSW入栈,结束时出栈。中断函数未加using n修饰符的,开始时还要将R0R1入栈,结束时出栈。如中断函数加using n修饰符,则在开始将PSW入栈后还要修改PSW中的工作寄存器组选择位。(7)C51编译器从绝对地址8m+3处产生一个中断向量,其中m为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。(8)中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明。防止其它程序调用。(9)在设计中断时,要注意的是哪些功能应该放在中断程序中,哪些功能应该放在主程序中。一般来说中断服务程序应该做最少量的工作,这样做有很多好处。首先系统对中断的反应面更宽了,有些系统如果丢失中断或对中断反应太慢将产生十分严重的后果,这时有充足的时间等待中断是十分重要的。其次它可使中断服务程序的结构简单,不容易出错。中断程序中放入的东西越多,他们之间越容易起冲突。简化中断服务程序意味着软件中将有更多的代码段,但可把这些都放入主程序中。中断服务程序的设计对系统的成败有至关重要的作用,要仔细考虑各中断之间的关系和每个中断执行的时间,特别要注意那些对同一个数据进行操作的ISR.7)定时器 实质是计数器,脉冲每一次下降沿,计数寄存器数值将加1。 计数的脉冲如果来源于单片机内部的晶振,由于其周期极为准确,这时称为定时器。计数的脉冲如果来源于单片机外部的引脚,由于其周期一般不准确,这时称为计数器。定时器/计数器的结构 定时器/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。TMOD是定时器/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。定时器/计数器的工作原理 计数器输入的计数脉冲源 系统的时钟振荡器输出脉冲经12分频后产生; T0或T1引脚输入的外部脉冲源。计数过程 每来一个脉冲计数器加1,当加到计数器为全1(即FFFFH)时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON中TF0或TF1置1,向CPU发出中断请求(定时器/计数器中断允许时)。如果定时器/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。定时应用用作定时器:此时设置为定时器模式,加1计数器是对内部机器周期计数(1个机器周期等于12个振荡周期,即计数频率为晶振频率的1/12)。计数值N乘以机器周期Tcy就是定时时间t 。计数运用用作计数器:此时设置为计数器模式,外部事件计数脉冲由T0或T1引脚输入到计数器。每来一个外部脉冲,计数器加1。但单片机对外部脉冲有基本要求:脉冲的高低电平持续时间都必须大于1个机器周期。工作方式寄存器(TMOD) GATE:门控位。GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时器/计数器工作;(即需要一个启动条件)GATE=1时,要用软件使TR0或TR1为1,同时外部中断引脚也为高电平时,才能启动定时器/计数器工作,即需要两个启动条件。C/T :定时/计数模式选择位。C/T =0为定时模式; C/T =1为计数模式。M1M0:工作方式设置位。计数器工作方式选择M1 M0 工 作 方 式 功 能 说 明0 0 方式0 13位计数器0 1 方式1 16位计数器1 0 方式2 自动重装8位计数器1 1 方式3 定时器0:分成两个8位定时器1:停止计数定时器/计数器的控制控制寄存器TCONTCON的低4位用于控制外部中断,已在前面介绍。TCON的高4位用于控制定时器/计数器的启动和中断申请。其格式如下:TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。TR1(TCON.6):T1起/停控制位。1:启动 0:停止TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。TR0(TCON.4):T0起/停控制位。1:启动 0:停止定时器/计数器的工作方式方式0方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。方式1方式1的计数位数是16位,由TL0(TL1)作为低8位、TH0(TH1)作为高8位,组成了16位加1计数器 。方式2方式2为自动重装初值的8位计数方式。在方式2下,当计数器计满255(FFH)溢出时,CPU自动把TH 的值装入TL中,不需用户干预。因此特别适合于用作较精确的脉冲信号发生器。方式3方式3只适用于定时器/计数器T0,定时器T1方式3时相当于TR1=0,停止计数。工作方式3将T0分成为两个独立的8位计数器TL0和TH0 。扩展阅读:计数器/定时器的C编程8)最小化系统单片机要正常运行,必须具备一定的硬件条件,其中最主要的就是三个条件:(1) 电源正常; (2) 时钟正常; (3) 复位正常。 在AT89C51单片机的40个引脚中,电源引脚两根,晶振引脚4根,可编程输入输出引脚32根。 (1)工作电源电源是单片机工作的动力源泉,对应的接线方法为:40引脚(VCC)电源引脚,工作是接+5V电源,20引脚(GND)为接地线。 (2)时钟电路时钟电路为单片机产生时序脉冲,单片机所有运算与控制过程都是在同一时序脉冲的驱动下进行的,时钟电路就好比人的心脏一样重要。当采用内部时钟时,在晶振XTAL(19引脚)和XTAL(18引脚)之间接入一个晶振,两个引脚对地分别接入一个电容可产生所需的时钟信号,电容的容量一般取30pf。 (3)复位电路 在复位引脚(9引脚)持续出现24个振荡器脉冲周期(即2个机器周期)的高平信号将使单片机复位。电容C和电阻R构成了单片机上电自动复位电路。复位后,单片机从0000H单元开始执行程序,并初始化一些专用寄存器为复位状态值,受影响的专用寄存器如表所示。 (4)控制引脚EA接法 EA/VPP(31引脚)为内外程序存储器选择控制引脚,当EA为低电位时,单片机从外部存储器取指令;当EA接高电平时,从单片机内部程序存储器取指令。AT89C51单片机内部有4KB可反复擦写1000次以上的程序存储器,因此要把EA接+5V高电平,让单片机运行内部的程序,这样就可以反复来验证程序了。这就是AT89C51单片机最小化系统的连接,只要把编写好的程序烧写到单片机内部,并接上5V电源就可以正常运行了,在17引脚上街上的发光二极管可以用来验证系统是否正常。9)C语言单片机产生于19世纪70年代,80年代人们开始使用C语言作为单片机的开发语言,在1985年许多公司都推出51系列单片机的C语言编辑器,我们把面向51单片机的C语言简称为C51。目前C51软件中最为流行的就是Keil C。一、C语言编程与汇编语言编程相比的优势1编程调试灵活方便。因为它是一门高级语言,高级语言的特点就是编程方式灵活,同时,当前所有的单片机都有相应的C语言级别的仿真调试系统,使得它的调试十分方便。2生成的代码编译效率高。尤其是用于较为复杂的单片机系统,用C语言开发更具明显优势,当前较好的C语言编辑系统的编译效率已经基本达到中高级程序人员的开发水平。3完全模块化。C语言的基本构成单位是函数,其本身就是模块化的开发方式。程序的模块化可以最大程度地实现资源共享,十分有利于多人协作,进行大系统项目的开发。4可移植性好。当对C语言程序进行移植时,只需将部分与硬件相关的地方进行适度修改,如:头文件。完全是算法类的程序无需修改就可以直接从一种单片机移植到另外一种单片机上。5便于项目维护管理。用C语言开发的代码便于开发小组计划项目、灵活管理、分工合作以及后期维护,基本上可以杜绝因开发人员变化而给项目进度或后期维护或升级所带来的影响,从而保证了整个系统的高品质、高可靠性及可升级性。二、与ANSI C的区别1C51针对的是硬件系统,所以在程序的最开始应加载关于该系列芯片的头文件,如reg51.h或reg52.h,头文件中定义了各种SFR和SFR中可寻址位的信息。2从数据类型上讲,C51多了一种位类型,可以使得单片机的位操作更加方便。3从数据的存储类型上说,C51可分为data、code、bdata、idata、pdata、xdata等类型,不同的数据存储类型有着不同的执行效率。4由于单片机系统资源有限,所以编译系统不允许有太多的程序嵌套。5C51不支持扩展16位字符,同时不支持递归特性。6printf和scanf函数在C51中不再是用于屏幕打印和接收字符,而是用于串行口通信时数据的收发。三、C51的关键字关键字是编程语言保留的特殊标识符,在程序中不允许另做他用。ANSI C中有32个关键字,C51在此基础上又扩展了20个,包括_at_, alien, bdata, bit, code, compact, data, idata, interrupt, large, pdata, _priority_, reentrant, sbit, sfr, sfr16, small, _task_, using,xdata。四、C51的数据类型ANSI C包括的数据类型有char、int、short、long、float、double、指针型,在C51中,short等同于int,double等同于float,除此之外,还增加了bit、sfr、sfr16、sbit这些特殊的数据类型。char(1B)、int(2B)、long(4B)、float(4B)。bit用于定义一个位标量,该位标量的值不是0就是1,类似某些高级语言中的Boolean类型数据。sfr可以访问51单片机内所有的SFR,用于声明一个8位的SFR。如sfr P1=0x90;sfr16用于定义存在于51单片机内部RAM的16位的特殊功能寄存器。如sfr16 T0=0x8c;sbit用于访问位地址空间中的可寻址位或SFR中的可寻址位。如:sbit OV=0xD2; sbit CY=0XD7;* sfr SCON=0x98; sbit RI=SCON0; sbit RB8=SCON2;*sbit OV=0xD02;五、数据的存储器类型data 存储在可直接寻址的片内低128B的RAM中,访问速度最快。bdata 存储在可位寻址的内部RAM中(20H-2FH),允许位和字节混合访问。idata 存储在可间接寻址的片内RAM的256B。允许访问全部片内地址。pdata 存储在可分页寻址的外部RAM的256B空间内,相当于MOVX Ri指令。xdata 存储在可寻址的片外RAM的全部64KB空间,相当于MOVX DPTR指令。code 存储在全部64KB的程序存储区,相当于MOVC A+DPTR指令。六、绝对地址的访问方法1使用指针。char data *dp;dp=0x61;*dp=0x23;2使用预定义宏(需包含absacc.h)CBYTE DBYTE PBYTR XBYTRCWORD DWORD PWORD XWORD例如: val2=XBYTE0x7fdd;3使用关键字_at_unsigned char xdata com8255 _at_ 0xffef;com8255=0x90;七、中断服务程序格式: void 函数名() interrupt n using mn是中断号,取值为04,using m指明该中断服务程序对应的工作寄存器组,取值范围:03。使用C51编写中断服务程序,无需关心ACC、B、DPH、DPL、PSW等寄存器的保护,C51会自动增加入栈和出栈对这些寄存器进行保护。八、C51的运算符和表达式1赋值运算符:=2算术运算符:+ - * / %3关系运算符: = = = !=4逻辑运算符:& | !5位运算符:& | 6复合运算符:+= = %= &=等7指针和地址运算符:* &九、C51库函数:1本征函数 注意:调用这些函数时,需包含intrins.h_crol_(x,n); _cror_(x,n);_iror_(x,n); _irol_(x,n);_lrol_(x,n); _lror_(x,n);_nop_();_testbit_(bitbar);_chkfloat_(fltbar);2非本征函数reg51.h或reg52.h,其中包括了所有SFR的定义。absacc.h 该文件中定义了几个宏,以确定各存储空间的绝对地址。string.h 包括复制、比较、移动等函数如:memccpy, memchr, memcmp, memcpy, memmove, memset等。stdio.h 通过51单片机的串口或用户定义的I/O口读写数据,默认为串口,如需修改,可以修改LIB目录中的getkey.c及putchar.c源文件。maths.h 各种数学函数如:sqrt、exp等。十、C51语法结构1单分支结构:if(条件)else2多分支结构:switch(变量)case 值1:.;case 值2:.;.case 值n:;default:;3for循环:for(起始条件;循环条件;变量递增) 4while循环:while(条件)5do while循环:dowhile(条件);6goto 标号7死循环:while(1);here:goto here;for(;);十一、C51应用技巧1灵活选择变量的存储器类型。由于单片机系统的存储器资源有限,为了提高执行效率,对存储器类型的设定应该根据以下原则:只要条件满足,尽量先使用内部直接寻址存储器(data),其次设定变量为间接寻址存储器(idata),在内部存储器数量不够的情况下,才使用外部存储器,而且在外部存储器,优先选择pdata,最后才是xdata,而且,在内部和外部存储器共同使用的情况下,要合理分配存储器,对经常使用和计算频繁的数据,应该使用内部存储器,其他的则使用外部存储器。2另一个提高代码效率的方法就是减小变量的长度,51单片机是8位的,若使用int型的无疑是空间上的极大浪费。应尽可能选择的char、unsigned char、或bit,它们只占用1B或1位。3再一个提高代码效率的方法是使用无符号类型,原因是51单片机指令不支持符号运算。若使用有符号类型的变量,C51编译器将要增加相应的库函数去处理符号运算。4尽量避免使用浮点变量。浮点数占用4个字节,对单片机的存储器资源来说就是极大的浪费。浮点运算应尽量通过提高数值数量级或使用整型运算代替浮点运算。尽量减少乘除法运算,如*2或/2,可以使用移位操作代替,这样不仅可以减少代码量,同时还能大大提高程序执行效率。5尽量使用库函数。C51的库函数提供的许多调令,尤其是本征函数,直接对应着汇编指令,编译效率较高。6使用宏替换。宏替换可以使程序具有更好的可读性,且当需要修改宏时,只要修改宏定义处即可。7灵活设置变量,高效利用存储器。对于标志位要使用bit或sbit定义,而不要使用unsigned char。这样可以大量节省内存,编写C51程序时,不是特别必要的地方一般不要使用全局变量,尽量使用局部变量。4、 硬件设计1、 电路原理图 图1 电路原理图 采用定时器0的工作方式1定时500ms,等待20次定时1s进行时钟计数。通过定时器1的工作方式1定时500ms,用来调整数码管闪烁的时间。K1是用来选中时分秒,按一下选中时,再按一下选中分,再按一下选中秒,再按一下退出选中状态。K2按一下数加一,K3按一下数减一。在调整时间时,时钟停走。 2、元件清单表1 元件清单元件清单名称型号数量芯片AT89C511数码管7SEG-MPX6-CA1锁存器74HC3731电容CERAMC 33P2晶振CRYSTAL 12MHZ1电容GEN-ELEC1二极管LED-BLUE1电阻MIN-RES2排阻RESPACK-8 1K1BUTTON35、 软件设计1.程序流程图开始 启动定时器TR0=1; /启动定时器按键检测 时间显示display(tablehour/10,tablehour%10,tablemin/10,tablemin%10,tablesec/10,tablesec%10,0xff)图2 主程序流程图开始Y一秒时间 sec=0sec+秒加一Y sec=6060秒时间sec=0;min+;秒单元清零 分单元加一YN60分钟min=60分单元清零 时单元加一min=0; hour+NY24小时hour=24时单元清零hour=0 display(tablehour/10,tablehour%10,tablemin/10,tablemin%10,tablesec/10,tablesec%10,0xff)时间显示中断返回 图3 调整时间流程图开始秒个位计算显示秒十位计算显示分个位计算显示 分十位计算显示时个位计算显示时十位计算显示结束 图4 时间显示流程图1、 程序清单 总程序实现数字时钟的计时,功能是数码管通过动态扫描显示时间,时间可设定,调整时间时时钟不走.(1) 主程序void main()P2=0xff; hour=12; min=0; sec=0;TMOD=0x11; /工作方式 TH0=(65536-50000)/256;/定时器初始值TL0=(65536-50000)%256; TH1=(65536-50000)/256;TL1=(65536-50000)%256; EA=1; ET0=1;ET1=1; /允许定时器1中断 TR0=1;/启动定时器 TR1=1; aa=0xff;while(1) time_change(); /显示时,分,秒的各位和十位 display(tablehour/10,tablehour%10,tablemin/10, tablemin%10,tablesec/10,tablesec%10,0xff); (2) 定时器中断程序 void timer0() interrupt 1 TH0=(65536-50000)/256; /定时器重新赋初值/TL0=(65536-50000)%256;temp+;void timer1() interrupt 3 TH1=(65536-50000)/256;TL1=(65536-50000)%256;count+;if(count=20)count=0;/控制次数/秒计时(3)时间控制void time_change() read_key();if(temp=20) /等待大于等于20次/ temp=0; sec+; if(sec=60) /直到大于60秒/ sec=0; min+; /分开始加/ if(min=60)/直到大于等于60分/ min=0; hour+; /小时开始加/ if(hour=24) /小时大于24/ hour=0; /小时清零/ /时间设置(4)显示函数void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f,uchar aa) if(num=1)P1=0x01&aa;P0=a;delay(2);elseP1=0x01;P0=a;delay(2); /hourif(num=1)P1=0x02&aa;P0=b;delay(2);elseP1=0x02;P0=b;delay(2); /hourif(num=2)P1=0x04&aa;P0=c;delay(2);elseP1=0x04;P0=c;delay(2); /minif(num=2)P1=0x08&aa;P0=d;delay(2);elseP1=0x08;P0=d;delay(2); /minif(num=3)P1=0x10&aa;P0=e;delay(2);elseP1=0x10;P0=e;delay(2); /secif(num=3)P1=0x20&aa;P0=f;delay(2);elseP1=0x20;P0=f;delay(2); /sec(5)按键控制void read_key() if(key1=0) _led=0; delay(100); if(key1=0) delay(100);_led=1;num+;if(num3)num=0; whil

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论