基于AT89C2051串口的LED数码管显示电路
扫描二维码
随时随地手机看文章
AT89C2051单片机内有一个串行I/O端口,通过引脚RXD[P3.0]和TXD[P3.1]可与外部电路进行全双工的串行异步通信,发送数据时由TXD端送出,接收时数据由RXD端输入。串口有四种工作方式,通过编程设置,可以使其工作在任一方式以满足不同的场合。其中,方式0是8位移位寄存器输入/输出方式,多用与外接移位寄存器以扩展I/O端口。串口的工作方式可以参看相关的书籍,此处不做详细介绍。方式 0的输出是8位串行数据,通过移位寄存器可将8位串行数据变成8位并行数据输出,也可以将外部的8位并行数据变成8位串行数据输入。因此外接一个移位寄存器就可扩展一个8位的并行输入/输出接口,如果想多扩展几个并口就需要在外部级连几个移位寄存器。但是这种扩展也不是无限的,因为串口的数据是一位一位串行输入/输出的。如果外接的移位寄存器比较多的话那么是必影响数据输入/输出的速度。
串口外接的移位寄存器有两种,一种是“串行输入/并行输出移位寄存器”(如:741一S164),另一种是“并行输入/串行输出”移位寄存器(如: 74LS165)。通过寄存器的名称就可以看出“串行输入/并行输出移位寄存器”是用于串口扩展并行输出接口,“并行输入/串行输出”是用于串口扩展并行输入接口。
图1(a)是串行输入/并行输出移位寄存器74LS164的管脚排列图。其功能表见表1所示。74LS164有两个串行数据A、B输入端,使用时一般把它们连在一起;丽为清零输入端,低电平有效,当该端加入低电平时,寄存器输出Q0~Q7全为低电平。在正常情况下,清零输入端接高电平,当CP信号上升沿到来时,数据从A、B端输入并右移一位; Q0~Q7为并行数据输出端,同时Q7端也是串行数据输出端,对于串行输入的数据,最先输入的从Q7输出,最后进入的从Q0输出。CP为移位脉冲。
图1(b)是另一种常用的“并行(串行)输入/串行输出”移位寄存器74LS165的管脚排列图。该器件的功能表见表2。该器件能在一个信号的控制下并行置入一个8位数据,然后在时钟脉冲的作用下逐位移出,也能使数据从另外一个引脚串行输入。在图1(b)中,DO~D7是并行数据输入端。S/L端是控制信号输入端,当为高电平时,具有移位功能;当为低电平时,将DO~D7端的数据置入到内部的移位寄存器保存。CP端为时钟(即移位脉冲)输入端,当S/L= 1时,CP端的每一次正跳变,都会使已存入内部的数据DO~D7从Q7端移出一位,移位的顺序是D7最先从Q7端移出,Q0最后从Q7端移出。CI端为时钟脉冲禁止端,当该端为低电平时,时钟信号(移位脉冲)不能进入,正常工作时必须接高电平。S1为串行数据输入端,在S/L=1时,SI端的数据在CP脉冲上升沿作用下置入Q0,因此,当CP脉冲上升沿到来时内部的数据DO~D7从Q7端移出一位同时外部数据通过SI移入一位,当经过8次CP上升沿后 DO~D7这8个数据就全部通过Q7输出,而内部的DO~D7全部更新为通过SI的输入的信号。例如:如果SI外接电源电压,那么当CP上升沿到来时,Q7会移出一位数据,而S1会移入一个“1”,当经过8个上升沿后,原先置入的DO~D7全被移出,内部的Q0~Q7全被更新为 “1”。如果CP上升沿再次到来时,输出的就是“1”。因此当8个输入数据都通过Q7输出后,如果还想输入就再次必须置入新的数据。
通过对两种移位寄存器的分析可以得出。通过串口扩展单片机的I/O口的具体电路如图2所示:
图2(a)是通过串口扩展的并行输出接口。RXD作为数据输出线,TXD作为移位时钟脉冲。每一个时钟信号的上升沿加到74LS164的CP端时,移位寄存器将串口输出的数据移入一位,8个时钟脉冲过后串口输出的8位二进制数全部移入74LS164,通过Q0-Q7并行输出。[!--empirenews.page--]
图2(b)是通过串口扩展的并行输入接口。同样RXD作为数据输入线,TXD作为移位时钟脉冲。每一个时钟信号的上升沿加到74LS165的CP端时,移位寄存器就将内部的数据向外移一位,通过Q7输出。8个时钟脉冲过后,并行输入的8位二进制数全部移出,通过Q7串行输入。
基于串口的LED数码管静态显示电路
在串口扩展中最常用的就是基于串口的LED数码管显示电路。在单片机应用系统中,LED数码管的显示常用两种方法:静态显示和动态扫描显示。所谓静态显示,就是每一个显示器都要占用单独的具有锁存功能的I/O接口用于笔划段字形代码。这样单片机只要把要显示的字形代码发送到接口电路,就不用管它了,直到要显示新的数据时,再发送新的字形码,因此,使用这种方法单片机中CPU的开销小。可以提供单独锁存的I/O接口电路很多,常用的就是通过串口外接串并转换器74LS164,扩展并行的I/O口。需要几个数码管就扩展几个并行接口,数码管直接接在74LS164的输出脚上,单片机通过串口将要显示数据的字形码逐一的串行移出至74LS164的输出脚上数码管就可以显示相应的数字。
如图3所示:
1. 硬件设计
单片机AT89C2051的串口外接1片74LS164作为LED显示器的静态显示接口,把AT89C2051的RXD作为数据输出线,TXD作为移位时钟脉冲。Q0-Q7(第3—6和10—13引脚)并行输出端分别接LED显示器的DP---A各段对应的引脚上。图中采用的是共阴极数码管,因而各数码管的公共极接电源GND,要显示某字段则相应的移位寄存器74LS164的输出线必须是高电平。P1口接8个按键,分别编号为KEY1--KEY8。当某个按键按下时。某个数就显示在数码管上。
2. 软件设计
软件设计流程图如图4所示。图(a)为主程序流程图,图(b)为显示子程序流程图。
开机时,初始化数码管,通过串口将“0”的字形码输出使数码管显示“O”。然后判断P1口是否有键按下,如果没键按下继续判断。
当确认有键按下后单片机将P1口的值赋给累加器A,由于按键没被按下时是低电平,被按下后为高电平因此判断A中哪一位为高电平就能得出哪个按键被按下。将此按键的编号读入显示缓冲区65H中,然后调用显示子程序将按键编码显示在数码管上。这样程序就完成了一次的执行过程。
[!--empirenews.page--]
显示子程序首先初始化串口,使串口工作在方式0,再读取显示缓冲区内的数据(显示缓冲区主要是用来存放即将要显示的数据),然后通过查表的方式找到对应的字形码,最后把字形码写入串口寄存器SBUF通过串口方式0发送出去。当8个时钟脉冲后,字形码都移至74Ls164的Q0-Q7,数码管就显示相应按键的编码。
显示子程序是怎么将显示缓冲区中的数据变成相应的字形码呢?具体的方法是将每个数字的字形码以16进制数从小到大的次序依次存放在存储器中的固定区域中,构成显示代码表。当要显示某字符时,把表格的起始地址送入数据指针寄存器DPTR中作为基址,将显示缓冲区内的数据作为偏移量送入变址寄存器A,执行查表指令“MOVCA,@A+DPTR”,则累加器A中得到的结果即表格中取出的对应数字的字形码。
注意:MOVC指令是将程序存储器内相应地址的值赋给累加器A。MOVC指令只有两种,一种是:MOVCA,@A+DPTR,将程序存储器中地址为A+ DPTR内的数据赋给A,例如:累加器A内的数据为01H,而DPTR内的数据为2000H,程序存储器中地址2001H内的数据为50H,那么执行 MOVCA,@A+DPTR指令后,累加器A内的数据变为50H。另一种是MOVCA,@A+PC。将程序存储器中地址为A+PC内的数据赋给A。两种指令的功能基本是一样。只是第一种中的地址是存放在DPTR中,而第二种是直接使用PC指针的地址。
对于电路中的74LS164共阴极数码管数据位和字形的对应关系如下表。
由于单片机在以方式0串行发送数据的时候数据从RXD引脚从低位到高位依次输出,而最先输出的数据经过74LS164串转并后到达Q7,也就是说单片机内的DO通过串口发送并经过74LS164后到达74LS164的Q7脚即数码管的A脚,因此在单片机内字型码与74LS164所对应的字型码正好相反,所以在单片机内O-8所对应的字型码分别是:
3FH,06H,5BH,4FH,66H,6DH,7DH,07H.7FH。