上一节我们讲述了单只LED与单片机的接口电路及编程实例,目的在于让初学者了解LED在单片机中的应用原理,单只LED显示在实际应用中并无多大用途,一般都是多位的LED显示。现在我们作进一步学习,我们要讲解的是8位LED的显示原理及实际的编程方法。这里我们没有采用多I/O口的8051系列单片机,而是采用了完全兼容C51指令系统的质优价廉的AT89C2051单片机,它的软件编程与C51完全一致。
在多数的应用场合中,我们并不希望使用多I/O端口的单片机,原则上是使用尽量少引脚的器件。在没有富余端口的情况下,怎样通过扩展电路达到预期的目的呢?我们希望通过此例使设计人员在实际应用中了解一点电路扩展的原理,对实际的应用有所帮助。
左图是显示电路,由于AT89C2051外部15个I/O引脚,即P1口和P3口,单P3口的P3.6是不引出的,15个I/O口要直接驱动8位LED显然是不够的,我们通过一片面74LS273对地址进行锁存,如果P1口仅用于显示驱动,而没有与其它外设进行数据交换,可省略这个锁存器,直接或通过其他驱动电路驱动连接LED。地址线我们通过一片74LS138三—八译码器对8位LED进行分时选通,这样在任一时刻,只有一位LED是点亮的,但只要扫描的频率足够高(一般大于25Hz),由于人眼的视觉暂留特性,直观上感觉却是连续点亮的,这就是我们常说的动态扫描电路。

此电路中,74LS273用于驱动LED的8位段码,8位LED相应的"a"—"g"段连在一起,它们的公共端分别连至由74LS138(点击芯片型号可浏览其详细的技术手册)译码选通后经74LS04反相驱动的输出端。这样当选通某一位LED 时,相应的地址线(74LS04输出端)输出的是高电平,所以我们的LED选用共阳LED数码管。
动态扫描的频率有一定的要求,频率太低,LED将出现闪烁现象。如频率太高,由于每个LED点亮的时间太短,LED的亮度太低,肉眼无法看清,所以一般均取几个ms左右为宜,这就要求在编写程序时,选通某一位LED使其点亮并保持一定的时间,程序上常采用的是调用延时子程序。在C51指令中,延时子程序是相当简单的,并且延时时间也很容易更改,可参见程序清单中的DELAY延时子程序。
为简单起见,我们只是编写了8位LED同步显示"00000000"—"11111111"直到"99999999"数字,并且反复循环。程序很简单,流程图略去。
程序清单:
ORG 0100H
MAIN: MOV R3,#00H ;字型码初始地址
LOOP: MOV DPRT,#TABLE ;字型码送数据指针
MOV A,R3
MOV A,@A+DPTR
MOV P1,A ;送显示
MOV R4,#0E8H ;循环显示某个字符1S
DELAY: ACALL DISPLAY ;显示
DJNZ R4,#DELAY ;延时显示时间示到继续
INC R3 ;显示下个字符
CJNE R3,#0AH,LOOP ;示显示到9续续
AJMP MAIN ;返回主程序
DISPLAY:MOV R1,#08H ;共显示8位LED
MOV R5,#00H ;从第一位开始显示
DISP: MOV A,R5
MOV P3,A ;送地址数据
ACALL DELAY1 ;送位显示15MS
INC R5 ;指向下一位LED
DJNZ R1,DISP ;8位未显示完继续
RET
DELAY1: MOV R6,#10H ;延时子程序
LOOP1: MOV R7,#38H
LOOP2: DJNZ R7,LOOP2
DJNZ R6,LOOP1
RET
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H
END ;程序结束
1.部分资源来自网络,经ET电子归类整理,旨在服务电子爱好者并无商业目的,不保证正确性与完整性.
2.如果您觉得本站资源对您有用,请告知您的好友,用搜索引擎搜"ET电子"即可.

