如何用单片机让数码管显字

我有at89s52一块,还有数码管8*8的,若干电子元气件,现在我就是求一单片机程序,还有一电路图,告诉我如何连接,让数码管显字,无论静态动态都行。

LED静态显示接口
数码管工作在静态显示方式时,共阴极(共阳极)的公共端COM连接在一起接地(电源)。每位的段选线与一个8位并行口相连。只要在该位的段选线上保持段选码电平,该位就能保持相应的显示字符。这里的8位并行口可以直接采用并行I/O接口片(例如80C51的P1端口、8155和8255的I/O端口等),也可以采用串行输入/并行输出的移位寄存器。考虑到若采用并行I/O接口,占用I/O资源较多,因而静态显示方式常采用串行接口方式,外接8位移位寄存器74HCl64构成显示电路,图2是通过串行口扩展8位LED显示器静态驱动电路,在TXD(P3.1)运行时钟信号,将显示数据由RXD(P3.0)口串行输出,串行口工作在移位寄存器方式(方式0)。

图2中使用的是共阴极数码管,因而各数码管的公共极COM端接地,要显示某字段,则相应的移位寄存器74HC164的输出线必须是高电平。 显然,要显示某字符,首先要把这个字符转换成相应的字形码,然后再通过串行口发送到74HC164。74HC164把串行口收到的数变为并行输出加到数码管上。先建立一个字形码表,以十六进制数的次序存放它们的相应字形码,共阴极字形码表如表1所示。
考虑到本设计成本问题,静态电路需要对应于每一个数码管LED接一个移位寄存器74HC164芯片。而且TXD、RXD端口在上位机通信中要用到,而如果界别的端口,编码就变得比较复杂了,所以静态显示就放弃了。

如要显示字符6,查表可知6的字形码为0x7d,把0x7d送到8位移位寄存器74HC164即可。显然,要显示字符0~9、A~F,其高4位为全0,而低4位为十六进制数。如果要显示的数高半字节不是0,则要通过程序加以变换。这种静态LED显示法有着显示亮度大,软件较为简单的特点,但硬件上使用芯片多,每个LED显示器需要一个驱动电路。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-05-27
晕。你太懒了吧,什么都要现成的可能吗。
给你思路
硬件设计方面:看你的数码管的资料,一般就几个数据线,地址线等。与单片机的普通IO相连就可以了。
软件设计方面:建立一个字库表,然后直接,然后控制与数码管相连的IO就行了。
如果你没有弄个单片机程序,建议你先学习下,要不想学习,就想不劳而获,建议你改行。
第2个回答  2010-06-04
去看单片机教程吧,搜索郭天祥的吧本回答被提问者采纳
第3个回答  2010-05-27
这样做学问是学不来的!
建议自己先充电!
充电过程中如果有不会或者是不明白的,我们可以商讨!
第4个回答  2010-05-27
我刚好才学完单片机,AT89S52是我上手的芯片,我没法发图,要的话给我邮箱,我发给你。程序先给你吧,四个,先静态,后动态,第四个时钟形式自加
1。 #include<reg52.h>
sbit dula=P2^6;
sbit wela=P2^7;

void main()
{
wela=1;
P0=0xc0;
wela=0;

dula=1;
P0=0x06;
dula=0;
while(1);
}

2。 #include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
uchar num;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
void main()
{
wela=1;//11101010
P0=0xea;
wela=0;
while(1)
{
for(num=0;num<16;num++)
{
dula=1;
P0=table[num];
dula=0;
delay(1000);
}
}
}

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

3。 #include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit d1=P1^0;
uchar num;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
void main()
{
EA=1;//开总中断
EX0=1;//开外部中断0
//IT0=1;
TCON=0x01;
wela=1;//11101010
P0=0xea;
wela=0;
while(1)
{
for(num=0;num<16;num++)
{
d1=1;
dula=1;
P0=table[num];
dula=0;
delay(1000);
}
}
}

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void exter0() interrupt 0
{
d1=0;
}

4。 #include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit d1=P1^0;
uchar num,num1;tt;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
void main()
{
num=0;
tt=0;
TMOD=0x11;//设置定时器0为工作方式1
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=(65536-20000)/256;
TL1=(65536-20000)%256;
// EA=1;//开总中断
ET0=1;//开定时器0中断
ET1=1;
TR0=1;//启动定时器0
TR1=1;
wela=1;//11101010
P0=0xea;
wela=0;
dula=1;
P0=0x3f;
dula=0;
while(1)
{
if(num1==25)
{
num1=0;
P1=~P1;
}
if(tt==100)
{
tt=0;
num++;
if(num==16)
num=0;
dula=1;
P0=table[num];
dula=0;
}
}
}

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void time0() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
tt++;
}
void time1() interrupt 3
{
TH1=(65536-20000)/256;
TL1=(65536-20000)%256;
num1++;
}

要图得用邮箱了。
相似回答