1、图3. 8031与8255A的连接电路 8255A是一种通用的可编程并行I/O接口芯片,在微型计算机系统中,可不需要附加外部逻辑电路就可直接为CPU与外设之间提供数据通道。在单片机8031与8255芯片连接中应接一个74LS373译码器,8255A作为8031的数据扩展口,输出所显示的段码及位选信号。8255A的片选信号与8031的P2.7相连,所以P2.7作为8255A的片选信号,所以8255A的控制口地址为:EFFFH,相应的,A口的地址为:EFFCH,B口的地址为:EFFDH。8255A的读写信号分别与8031的读写信号相连,使其有效时CPU从8255A读取数据或状态信息,或向8255A
2、写入数据或控制字。RESET是复位控制信号,高电平有效。该信号有效时,将8255A控制寄存器内容都清零,并使所有饿断口都置成输入方式。当引脚悬空时,芯片默认为高电平,所以,为了让8255A在电路中正常工作,将RESET接地,强制使复位控制位失效。 8255A驱动数码管的电路如图4所示:图4. 8255A驱动数码管电路图8255A的A口和B口都作为输出,根据CPU输出的BCD码得到A口相对应的段码,A口将段码通过一个同相驱动器(图中因未找到同相驱动器而用反相驱动器代替)给数码管的abcdefg,同时,由B口输出位选信号,因为本次设计中使用的数码管都是共阴极的,所以,当B口输出为高电平时,经过74
3、LS00与非门后得到低电平,即选中数码管。数字钟显示中有八个这样的数码管,他们的数据端都是通过A口获得,其位选信号分别接B口的八个口线。这样,使PB0置1,则最高位选中,然后将B口数据循环左移,则可依次使各个数码管选中显示。3.系统软件设计 3.1软件总体设计思想主程序主要由定时模块,显示模块和调整模块组成。定时部分采用经典的定时器定时,结合相应的时钟软件实现计时功能。显示模块是实现数字钟的另一重要部分,其模块的独立程度直接影响到数字钟的可视化程度。调整模块采用中断方式,通过按键可以调整数字钟时分秒的数值。3.2定时模块程序中定时器,一直处于运行状态,也就是说定时器是理想运作的,其中断程序每隔
4、0.1秒执行一次,在理想状态下,定时器定时是没有系统误差的,但由于定时器中断溢出后,定时器从0开始计数,直到被重新置数,才开始正确定时,这样中断溢出到中断响应到定时器被重新置数,其间消耗的时间就造成了定时器定时的误差。如果在前述定时器不关的情况下,在中断程序的一开始就给定时器置数,此时误差最小,误差大约为:每0.1秒,误差712个机器周期。当然这是在定时器定时刚好为0.1秒时的情况,由以上分析,如果数字钟设计为查询的方式或是在中断的方式下将定时器中断设置为最高级,我们在定时值设置时,可以适当的扣除9个机器周期的时间值。但如果在中断的情况下,没有将定时器中断设置为最高级,那就要视中断程序的大小,
5、在定时值设置时,扣除相应的时间值。3.3显示模块显示模块的独立性强,增强了数字钟的可视化程度。在此模块的设计中,设置专用显示数据缓冲区20H-27H与时分秒及其他数据缓冲区数据区别,在其中存放的是各个数码管要显示数字,而其他缓冲区存放的是时间数据。在显示时,首先分别将时分秒BCD码数据转化为各个数码管要显示的数字,分别存储于相应的专用显示区,然后通过8255A的A口输出段码至数码管,B口输出位选信号,接着A口输出下一个段码,B口输出下一个位选信号,依此循环则可实现八位数码管的静态输出。但由于人眼视觉分辨率远远低于数码管循环点亮的速度,所以人们看到的数字钟还是相对稳定的。图6.显示模块流程图3.
6、4 调整模块 数据调整有多种方式:可以直接进入相关状态进行有关操作;可将调整分两步,先进入状态,然后执行操作,分别由两个键控制。前者比较直接,设计思想也比较简单,但是,这种方式存在操作时间和控制键数目的矛盾。如果用比较少的键,那么可能会在进入状态后处于数据调整等待状态,这样会影响到显示的扫描速度。当然在这种方式下,还可以使用多个状态键,每个状态键,完成一个对应数据的调整。后者则不同,因为状态的调整,与状态的操作可以分别由两个键控制,其状态的调整数可以多达256个(理论上),操作的完成是这样的,一键控制状态的调整,一键控制数据的调整。以上两种方式的实现都可以采用查询和中断的方式,且两者进行相关操
7、作的过程不能太长否则会影响显示的扫描。本文中采用的方法是前者,通过四个按键,进行简单的时分秒的调整。当按键K4按下时启动外中断,然后通过按键K1,K2,K3即可调整时分秒的数值。另外,采用中断的方式,最好将定时器中断的优先级设置为最高级。图7.调整模块流程图3.5软件消抖消抖可以采用硬件(施密特触发器)的方式,也可以采用软件的方式。在此只讨论软件方式。软件消抖有定时器定时,和利用延时子程序两种方式。一,定时器定时消抖可以不影响显示模块扫描速度,其实现方法是:设置标志位,在定时器中断中将其置位,然后在程序中查询。将其中断优先级设置为低于时钟定时中断,那么它就可以完全不影响时钟定时。二,在采用延时
8、子程序时,如果显示模块的扫描速度本来就不是很快,此时可能会影响到显示的效果,一般情况下,每秒的扫描次数不应小于50次,否则,数码的显示会出现闪烁的情况。因此,延时子程序的延时时间应该小于20毫秒,如果采用定时器定时的方式,延时时间不影响时钟。如果,设计时采用的是中断的方式来完成有关操作,同样可以采用软件的方式来消抖,其处理思想是:中断不能连续执行,两次之间有一定的时间间隔。a.子程序延时 b.定时器延时图8.查询方式消抖流程图图9.中断方式消抖流程图3.6主程序流程图 图10.主程序流程图4.实验在实验中利用伟福仿真器及其仿真软件,按照前述的硬件电路图连接电路,按照上述各步的软件流程图编写汇编
9、语言程序,将软硬件相连运行程序对软硬件进行调试。观察各位数码管的显示状态,并与理论值进行比较分析。实验过程中,显示模块能很好的实现,无论是在单步跟踪还是全速执行的时候,LED显示器都能将要显示的数值准确且稳定的显示出来。虽然在硬件电路中增加了驱动电路,但是一个8255A芯片驱动8个LED显示器效果仍然不是很好,特别是在全速执行时,LED的亮度及稳定性仍有待改进。计时模块的实验过程不是很理想。实验中分别利用一个定时器T0进行定时,定时4000微秒,一个计数器T1进行计数,计数250次。当T0定时一次后T1计数一次,这样T1计数溢出时即可计满1秒,然后对当前时间秒值进行加1处理,以及相应的分值时值
10、处理。在程序运行中,可能由于程序编写得具体细节,定时器中断返回无法实现,从而导致全速执行后LED显示器一直保持初始值不变。数字钟正常显示时,按K4键,启动外部中断子程序,按K1键K2键K3键调整时间值,记录调整后的时间值,与希望得到的时间值进行比较。调整模块在实验中得到较好的实现,调整相应按键后,LED显示器的显示数值也随之出现了相对应的调整。综上所述,本次科研训练的实验还是有所收获,虽然没能将一个完整的数字钟做出来,但也基本实现了数字钟个部分的主要功附录本文对应的汇编语言程序如下: ORG 0000H LJMP MAIN ORG 0003H LJMP INT0 ORG 000BH LJMP
11、TIM0 ORG 0100HMAIN:MOV SP,#70H MOV 2AH,#12H MOV 2BH,#34H MOV 2CH,#56H MOV DPTR,#7FFFH MOV A,#80H MOVX DPTR,A MOV TMOD,#51H MOV TH1,#0FFH MOV TL1,#06H MOV TH0,#0F0H MOV TL0,#74H MOV IP,#02H MOV IE,#13H SETB TR0 SETB TR1 ACALL DISPTIM0:CLR P3.3 CALL DISP JNB TF1,$ CLR TF1 MOV A,2CH ADD A,#1 DA A MOV 2
12、CH,A CJNE A,#60H,X4 MOV 2CH,#00H MOV A,2BH MOV 2BH,A MOV 2BH,#00HMOV A,2AH MOV 2AH,A CJNE A,#24H,X4 MOV 2AH,#00HX4: 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 DEC R0 DJNZ R6,DIS0 MOV A,#0AH MOV R2,#01H MOV R7,#08HDIS1: MOV A,R1 MOV DPTR,#SEG
13、 MOVC A,A+DPTR MOV DPTR,#7FFCH INC DPTR MOV A,R2 ACALL DIMS RL A MOV R2,A DJNZ R7,DIS1 RETDIMS:MOV R3,#07H DJNZ R3,$SEG: DB 37H,06H,5BH,4FH DB 66H,6DH,7DH,07H DB 7FH,6FH,40HINT0: NOPLOOP:JB P1.3,N2 CALL DIMS ADD A,#01 CJNE A,#60H,N1 AJMP DISPN1: JNB P1.3,$N2: JB P1.4,N4 CJNE A,#60H,N3N3: JNB P1.4,$N4: JB P1.5,N6 MOV A,2AH CJNE A,#24H,N5N5: JNB P1.5,$N6:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1