《基于单片机LED显示器的数字钟设计报告.doc》由会员分享,可在线阅读,更多相关《基于单片机LED显示器的数字钟设计报告.doc(16页珍藏版)》请在三一办公上搜索。
1、基于单片机LED显示器的数字钟设计本设计基于8031单片机控制,采用LED显示器设计一数字钟的设计方案。该数字钟能稳定显示时分秒,同时实现时分秒的数值调整。本文详细讨论了具体硬件电路,相关原器件的选择以及软件实现过程。比较时钟调整的查询方式和中断方式,对数字钟的稳定性和计时的精确性作了相关的讨论。在实验室通过硬件电路和仿真器进行模拟实验,验证电路和程序的正确性。最后给出采用中断方式实现的数字钟的源程序。1.引 言 在单片机技术日趋成熟的今天,其灵活的硬件电路的设计和软件的设计,让单片机得到了广泛的应用,几乎是从小的电子产品,到大的工业控制,单片机都起到了举足轻重的作用。单片机小的系统结构几乎是
2、所有具有可编程硬件的一个缩影,可谓是“麻雀虽小,肝胆俱全”,单片机的学习和研究是对微机系统学习和研究的简捷途径。单片机以其体积小,使用灵活方便,成本低,易于产品化,抗干扰能力强,可在各种恶劣环境下工作等特点,广泛的应用于工业控制,智能仪表,家用电器,机器人,医疗仪器,军事装备等方面。为了加深对单片机应用的认识,巩固所学的单片机知识,本次科研训练特选题“基于单片机数码管显示的数字钟设计”,尝试基本电路设计和汇编语言编程以及锻炼实践动手能力。数字钟的实现方法多种多样,简单的可以由一些集成电子电路实现,精确点的可以通过某些时钟芯片,如MSM5832,DS1216,以及MC146818,结合相应的硬件
3、电路和软件实现。本次科研训练本着锻炼为主的原则,不采用任何现成的时钟芯片,通过简单的硬件电路,通过编写相应程序进行计时与时间调整。本文采用8031单片机,以8255A作其扩展,LED显示器采用共阴极的七段数码管,驱动器采用74LS07芯片,以及普通的按键作为基本元器件。2.数字钟硬件电路设计数字钟的整体框图如图1所示图1整体框图按键与8031的连接如图2所示。单片机8031与8255A的硬件连接如图3所示:图3. 8031与8255A的连接电路 8255A是一种通用的可编程并行I/O接口芯片,在微型计算机系统中,可不需要附加外部逻辑电路就可直接为CPU与外设之间提供数据通道。在单片机8031与
4、8255芯片连接中应接一个74LS373译码器,8255A作为8031的数据扩展口,输出所显示的段码及位选信号。8255A的片选信号与8031的P2.7相连,所以P2.7作为8255A的片选信号,所以8255A的控制口地址为:EFFFH,相应的,A口的地址为:EFFCH,B口的地址为:EFFDH。8255A的读写信号分别与8031的读写信号相连,使其有效时CPU从8255A读取数据或状态信息,或向8255A写入数据或控制字。RESET是复位控制信号,高电平有效。该信号有效时,将8255A控制寄存器内容都清零,并使所有饿断口都置成输入方式。当引脚悬空时,芯片默认为高电平,所以,为了让8255A在
5、电路中正常工作,将RESET接地,强制使复位控制位失效。 8255A驱动数码管的电路如图4所示:图4. 8255A驱动数码管电路图8255A的A口和B口都作为输出,根据CPU输出的BCD码得到A口相对应的段码,A口将段码通过一个同相驱动器(图中因未找到同相驱动器而用反相驱动器代替)给数码管的abcdefg,同时,由B口输出位选信号,因为本次设计中使用的数码管都是共阴极的,所以,当B口输出为高电平时,经过74LS00与非门后得到低电平,即选中数码管。数字钟显示中有八个这样的数码管,他们的数据端都是通过A口获得,其位选信号分别接B口的八个口线。这样,使PB0置1,则最高位选中,然后将B口数据循环左
6、移,则可依次使各个数码管选中显示。3.系统软件设计 3.1软件总体设计思想主程序主要由定时模块,显示模块和调整模块组成。定时部分采用经典的定时器定时,结合相应的时钟软件实现计时功能。显示模块是实现数字钟的另一重要部分,其模块的独立程度直接影响到数字钟的可视化程度。调整模块采用中断方式,通过按键可以调整数字钟时分秒的数值。3.2定时模块程序中定时器,一直处于运行状态,也就是说定时器是理想运作的,其中断程序每隔0.1秒执行一次,在理想状态下,定时器定时是没有系统误差的,但由于定时器中断溢出后,定时器从0开始计数,直到被重新置数,才开始正确定时,这样中断溢出到中断响应到定时器被重新置数,其间消耗的时
7、间就造成了定时器定时的误差。如果在前述定时器不关的情况下,在中断程序的一开始就给定时器置数,此时误差最小,误差大约为:每0.1秒,误差712个机器周期。当然这是在定时器定时刚好为0.1秒时的情况,由以上分析,如果数字钟设计为查询的方式或是在中断的方式下将定时器中断设置为最高级,我们在定时值设置时,可以适当的扣除9个机器周期的时间值。但如果在中断的情况下,没有将定时器中断设置为最高级,那就要视中断程序的大小,在定时值设置时,扣除相应的时间值。3.3显示模块显示模块的独立性强,增强了数字钟的可视化程度。在此模块的设计中,设置专用显示数据缓冲区20H-27H与时分秒及其他数据缓冲区数据区别,在其中存
8、放的是各个数码管要显示数字,而其他缓冲区存放的是时间数据。在显示时,首先分别将时分秒BCD码数据转化为各个数码管要显示的数字,分别存储于相应的专用显示区,然后通过8255A的A口输出段码至数码管,B口输出位选信号,接着A口输出下一个段码,B口输出下一个位选信号,依此循环则可实现八位数码管的静态输出。但由于人眼视觉分辨率远远低于数码管循环点亮的速度,所以人们看到的数字钟还是相对稳定的。图6.显示模块流程图3.4 调整模块 数据调整有多种方式:可以直接进入相关状态进行有关操作;可将调整分两步,先进入状态,然后执行操作,分别由两个键控制。前者比较直接,设计思想也比较简单,但是,这种方式存在操作时间和
9、控制键数目的矛盾。如果用比较少的键,那么可能会在进入状态后处于数据调整等待状态,这样会影响到显示的扫描速度。当然在这种方式下,还可以使用多个状态键,每个状态键,完成一个对应数据的调整。后者则不同,因为状态的调整,与状态的操作可以分别由两个键控制,其状态的调整数可以多达256个(理论上),操作的完成是这样的,一键控制状态的调整,一键控制数据的调整。以上两种方式的实现都可以采用查询和中断的方式,且两者进行相关操作的过程不能太长否则会影响显示的扫描。本文中采用的方法是前者,通过四个按键,进行简单的时分秒的调整。当按键K4按下时启动外中断,然后通过按键K1,K2,K3即可调整时分秒的数值。另外,采用中
10、断的方式,最好将定时器中断的优先级设置为最高级。图7.调整模块流程图3.5软件消抖消抖可以采用硬件(施密特触发器)的方式,也可以采用软件的方式。在此只讨论软件方式。软件消抖有定时器定时,和利用延时子程序两种方式。一,定时器定时消抖可以不影响显示模块扫描速度,其实现方法是:设置标志位,在定时器中断中将其置位,然后在程序中查询。将其中断优先级设置为低于时钟定时中断,那么它就可以完全不影响时钟定时。二,在采用延时子程序时,如果显示模块的扫描速度本来就不是很快,此时可能会影响到显示的效果,一般情况下,每秒的扫描次数不应小于50次,否则,数码的显示会出现闪烁的情况。因此,延时子程序的延时时间应该小于20
11、毫秒,如果采用定时器定时的方式,延时时间不影响时钟。如果,设计时采用的是中断的方式来完成有关操作,同样可以采用软件的方式来消抖,其处理思想是:中断不能连续执行,两次之间有一定的时间间隔。a.子程序延时 b.定时器延时图8.查询方式消抖流程图图9.中断方式消抖流程图3.6主程序流程图 图10.主程序流程图4.实验在实验中利用伟福仿真器及其仿真软件,按照前述的硬件电路图连接电路,按照上述各步的软件流程图编写汇编语言程序,将软硬件相连运行程序对软硬件进行调试。观察各位数码管的显示状态,并与理论值进行比较分析。实验过程中,显示模块能很好的实现,无论是在单步跟踪还是全速执行的时候,LED显示器都能将要显
12、示的数值准确且稳定的显示出来。虽然在硬件电路中增加了驱动电路,但是一个8255A芯片驱动8个LED显示器效果仍然不是很好,特别是在全速执行时,LED的亮度及稳定性仍有待改进。计时模块的实验过程不是很理想。实验中分别利用一个定时器T0进行定时,定时4000微秒,一个计数器T1进行计数,计数250次。当T0定时一次后T1计数一次,这样T1计数溢出时即可计满1秒,然后对当前时间秒值进行加1处理,以及相应的分值时值处理。在程序运行中,可能由于程序编写得具体细节,定时器中断返回无法实现,从而导致全速执行后LED显示器一直保持初始值不变。数字钟正常显示时,按K4键,启动外部中断子程序,按K1键K2键K3键
13、调整时间值,记录调整后的时间值,与希望得到的时间值进行比较。调整模块在实验中得到较好的实现,调整相应按键后,LED显示器的显示数值也随之出现了相对应的调整。综上所述,本次科研训练的实验还是有所收获,虽然没能将一个完整的数字钟做出来,但也基本实现了数字钟个部分的主要功附录本文对应的汇编语言程序如下: ORG 0000H LJMP MAIN ORG 0003H LJMP INT0 ORG 000BH LJMP TIM0 ORG 0100HMAIN:MOV SP,#70H MOV 2AH,#12H MOV 2BH,#34H MOV 2CH,#56H MOV DPTR,#7FFFH MOV A,#80
14、H MOVX DPTR,A MOV TMOD,#51H MOV TH1,#0FFH MOV TL1,#06H MOV TH0,#0F0H MOV TL0,#74H MOV IP,#02H MOV IE,#13H MOV IP,#02H SETB TR0 SETB TR1 ACALL DISPTIM0:CLR P3.3 MOV TH0,#0F0H MOV TL0,#74H CALL DISP JNB TF1,$ CLR TF1 SETB TR1 MOV A,2CH ADD A,#1 DA A MOV 2CH,A CALL DISP CJNE A,#60H,X4 MOV 2CH,#00H CALL
15、 DISP MOV A,2BH ADD A,#1 DA A MOV 2BH,A CALL DISP CJNE A,#60H,X4 MOV 2BH,#00H CALL DISPMOV A,2AH ADD A,#1 DA A MOV 2AH,A CALL DISP CJNE A,#24H,X4 MOV 2AH,#00H CALL DISPX4: RETIDISP: MOV R1,#20H MOV R0,#2CH MOV R6,#03HDIS0:MOV A,R0 MOV B,#10H DIV AB MOV R1,B INC R1 MOV R1,A INC R1 DEC R0 DJNZ R6,DIS0
16、 MOV A,#0AH MOV R1,A INC R1 MOV R1,A MOV R1,#20H MOV R2,#01H MOV R7,#08HDIS1: MOV A,R1 MOV DPTR,#SEG MOVC A,A+DPTR MOV DPTR,#7FFCH MOVX DPTR,A INC DPTR MOV A,R2 MOVX DPTR,A ACALL DIMS INC R1 MOV A,R2 RL A MOV R2,A DJNZ R7,DIS1 RETDIMS:MOV R3,#07H DJNZ R3,$ RETSEG: DB 37H,06H,5BH,4FH DB 66H,6DH,7DH,0
17、7H DB 7FH,6FH,40HINT0: NOPLOOP:JB P1.3,N2 CALL DIMS MOV A,2CH ADD A,#01 DA A MOV 2CH,A CJNE A,#60H,N1 MOV 2CH,#00H AJMP DISPN1: JNB P1.3,$ AJMP DISP CALL DIMSN2: JB P1.4,N4 CALL DIMS MOV A,2BH ADD A,#01 DA A MOV 2BH,A CJNE A,#60H,N3 MOV 2BH,#00H AJMP DISPN3: JNB P1.4,$ AJMP DISP CALL DIMSN4: JB P1.5,N6 CALL DIMS MOV A,2AH ADD A,#01 DA A MOV 2AH,A CJNE A,#24H,N5 MOV 2AH,#00H AJMP DISPN5: JNB P1.5,$ AJMP DISP CALL DIMSN6: RETI