❶ 51单片机8*8点阵接口电路的原理图
见下图
❷ 51单片机的8x8LED点阵控制,主要研究什么
LED点阵,与51单片机没有必然的关系。一般的单片机都能控制它。主要的问题在于,点阵的控制方式:是用专门的控制芯片,还是由单片机的IO口进行控制。
要处理的问题主要是LED的驱动电压及控制方式,比如共阳还是共阴,是静态,还是动态等。一般单片机应用的书都会讲到它。
❸ 单片机 8*8点阵C51程序
一.基于51的点阵屏显示:(1)点亮第一个8*8点阵:
1.首先在Proteus下选择我们需要的元件,AT89C51、74LS138、MATRIX-8*8-GREEN(在这里使用绿色的点阵)。在Proteus
6.9中8*8的点阵总共有四种颜色,分别为MATRIX-8*8-GREEN,MATRIX-8*8-BLUE,MATRIX-8*8-ORANGE
,MATRIX-8*8-RED。
在这里请牢记:红色的为上列选下行选;其它颜色的为上行选下列选!而所有的点阵都是高电平选中列,低电平选中行!也就是说如果某一个点所处的行信号为低,列信号为高,则该点被点亮!此结论是我们编程的基础。
2.在选择完以上三个元件后,我们开始布线,具体如下图:
这里P2是列选,P3连接38译码器后作为行选。
选择38译码器的原因:38译码器每次可输出相应一个I/O口的低电平,正好与点阵屏的低电平选中行相对,并且节省了I/O口,大大方便了我们的编程和以后的扩展。
3.下面让我们把它点亮,先看一个简单的程序:
(将奇数行偶数列的点点亮,效果如下图)
下面是源代码:
/************8*8LED点阵屏显示*****************/
#include<reg51.h>
void
delay(int
z)
//延时函数
{
int
x,y;
for(x=0;x<z;x++)
for(y=0;y<110;y++);
}
void
main()
{
while(1)
{
P3=0;
//行选,选择第一行
P2=0x55;
//列选,即该行显示的数据
delay(5);
//延时
/*****下同*****/
P3=2;
//第三行
P2=0x55;
delay(5);
P3=4;
//第五行
P2=0x55;
delay(5);
P3=6;
//第七行
P2=0x55;
delay(5);
}
}
上面的程序实现了将此8*8点阵的奇数行偶数列的点点亮的功能。重点让我们看while循环内,首先是行选P3=0,此时38译码器的输入端为000,则输出端为01111111,即B0端为低电平,此时选中了点阵屏的第一行,接着列选我们给P2口赋0x55,即01010101,此时又选中了偶数列,紧接着延时。然后分别对第三、五、七行进行相同的列选。这样就点亮了此点阵屏奇数行偶数列交叉的点。
完成这个程序,我们会发现其实点阵屏的原理是如此简单,和数码管的动态显示非常相似,只不过换了一种方式而已。
对不起啦,我传了三次图片都没传上,郁闷哪!希望你能理解哈!
不过我有传一份WORD文档在我的空间里面
❹ 单片机 8×8点阵LED 驱动电路
我看了你写的,感到秋收的关键问题是不理解8×8点阵LED驱动电路是如何工作的。
这个8×8点阵LED驱动电路是“行”和“列”的扫描方式工作的,这64个发光管,在每个瞬间只有一个亮。我画了一个简图,图中,红色的仅在1高,A低时工作,同样绿色的仅在2高,D低时工作,黄色的仅在6高,E低时工作,不是同时都亮。
只要64个发光管在1/25秒内扫描一次(或是说整个64只管子,每秒扫描35次以上)视觉上是看不出是扫描的。
行和列的扫描频率是1比8,这样就能有序的工作了。
你的R1,R2电阻也好确定了,你只要按一个发光管的工作来考虑。这里也用不上什么3态,你将OE接0电平就行了。
好好想想吧,搞不清可以HI我,我一般晚上都在。
❺ 怎么控制单片机8*8点阵每个点亮或不亮,每个点对应的十六进制是多少
用单片机控制8×8点阵的每个LED的亮灭,要采用扫描方式实现。如下图的8×8点阵,用8系列线和8线条行线控制。在8条列线加高电平,逐条行线加低电平,就会逐行点亮。
❻ 哪位高手能给我解释解释单片机点阵扫描原理不谢谢
谈LED点阵的扫描原理,只要一看LED点阵的原理图就一目了然了,如下图:
图中,A--H可以看做行,1--7看做列;假如我们给点阵送人一个列数据0x80(1000 0000),并且同时送人一个行数据0x7f(0111 1111),此时我们就点亮了这个点阵左上角的那颗LED发光管,如果我们不停的行数据:0111 1111;1011 1111;1101 1111;1110 1111;1111 0111;1111 1011;1111 1101;1111 1110,这8个数据周而复始的送人点阵就是行扫描的过程,这个过程一般采用74HC138等译码器来完成,而在对应的行数据送人的同时也送人1--7的列数据,例如:
行=0111 1111,列=1000 0000
行=1011 1111,列=0100 0000
行=1101 1111,列=1010 0000
行=1110 1111,列=1001 0000
行=1111 0111,列=1000 1000
行=1111 1011,列=1000 0100
行=1111 1101,列=1000 0010
行=1111 1110,列=1000 0001
此时程序循环执行的结果会在点阵屏上显示左上至右下的对角斜线。
仔细想想应该不难理解。
在代码编写上,实现上述功能有很多方法,最长用的就是for循环,如果你网络资料会发现,大凡点阵显示代码中都会在显示函数中引用for循环,而且根据点阵数的不同会有:
for(i=0;i<8;i++)或for(i=0;i<16;i++)或for(i=0;i<32;i++)这就是对于8行、16行、32行点阵的扫描算法。
就说到这里吧,更多的知识请网络搜索吧。
❼ 用51单片机驱动8*8点阵 的代码
8X8点阵LED工作原理说明 :8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮。
不知道你要实现什么样的显示,不过基本方法是一样的。我这有一个现成的8*8的程序,你可以根据这个去修改:
在8X8点阵LED上显示柱形,让其先从左到右平滑移动三次,其次从右到左平滑移动三次,再次从上到下平滑移动三次,最后从下到上平滑移动三次,如此循环下去。(要实现一根柱形的亮法:一根竖柱,对应的列置1,而行则采用扫描的方法来实现。 一根横柱,对应的行置0,而列则采用扫描的方法来实现。)
汇编源程序:
ORG 00H
START: NOP
MOV R3,#3
LOP2: MOV R4,#8
MOV R2,#0
LOP1: MOV P1,#0FFH
MOV DPTR,#TABA
MOV A,R2
MOVC A,@A+DPTR
MOV P3,AINC R2
LCALL DELAY
DJNZ R4,LOP1
DJNZ R3,LOP2
MOV R3,#3
LOP4: MOV R4,#8
MOV R2,#7
LOP3: MOV P1,#0FFH
MOV DPTR,#TABA
MOV A,R2
MOVC A,@A+DPTR
MOV P3,A
DEC R2
LCALL DELAY
DJNZ R4,LOP3
DJNZ R3,LOP4
MOV R3,#3
LOP6: MOV R4,#8
MOV R2,#0
LOP5: MOV P3,#00H
MOV DPTR,#TABB
MOV A,R2
MOVC A,@A+DPTR
MOV P1,A
INC R2
LCALL DELAY
DJNZ R4,LOP5
DJNZ R3,LOP6
MOV R3,#3
LOP8: MOV R4,#8
MOV R2,#7
LOP7: MOV P3,#00H
MOV DPTR,#TABB
MOV A,R2
MOVC A,@A+DPTR
MOV P1,A
DEC R2
LCALL DELAY
DJNZ R4,LOP7
DJNZ R3,LOP8
LJMP START
DELAY: MOV R5,#10
D2: MOV R6,#20
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,D2
RET
TABA: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH
TABB: DB 01H,02H,04H,08H,10H,20H,40H,80H
END
C51语言源程序
#include <AT89X52.H>
unsigned CHAR code taba[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned CHAR code tabb[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void DELAY(void) { unsigned CHAR i,j; for(i=10;i>0;i--) for(j=248;j>0;j--); }
void DELAY1(void) { unsigned CHAR i,j,k; for(k=10;k>0;k--) for(i=20;i>0;i--) for(j=248;j>0;j--); }
void main(void)
{ unsigned CHAR i,j;
while(1)
{ for(j=0;j<3;j++) //FROM left to right 3 time
{ for(i=0;i<8;i++){ P3=taba[i]; P1=0xff; DELAY1();} }
for(j=0;j<3;j++) //FROM right to left 3 time
{ for(i=0;i<8;i++) { P3=taba[7-i]; P1=0xff; DELAY1();}}
for(j=0;j<3;j++) //FROM top to bottom 3 time
{ for(i=0;i<8;i++) { P3=0x00; P1=tabb[7-i]; DELAY1();}}
for(j=0;j<3;j++) //FROM bottom to top 3 time
{ for(i=0;i<8;i++) { P3=0x00; P1=tabb[i]; DELAY1();}}
}
}
❽ 51单片机 汇编语言 88点阵显示英文字母 逐个显示
LED点阵的核心原理跟4位LED数码管一样,都是需要行列扫描的。仔细查一下点阵的管脚,不是顺序排列,把字体做成数组,直接把数组一个一个字节的发送到端口上(你没有说明P0和P2那个是行,那个是列,其中一个直接发,一个是按位发)。不断的发送会导致点阵刷新,速度够快的话,效果就出来了
❾ 课程设计:单片机的8乘8LED点阵显示屏的设计
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code Table_of_Digits[]=
{
0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00, //0
0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00, //1
0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00, //2
0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00, //3
0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00, //4
0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00, //5
0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00, //6
0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00, //7
0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00, //8
0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00, //9
0xff,0x81,0x81,0x81,0x81,0x81,0x81,0xff
};
uchar code xdat[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
uchar code ydat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar i=0,j=0,t=0,Num_Index,key,xi,yi;
//主程序
void main()
{
P1=0x80;
Num_Index=0; //从0 开始显示
TMOD=0x01; //T0 方式0
TH0=(65536-2000)/256; //2ms 定时
TL0=(65536-2000)%256;
IE=0x82;
key=0;
xi=0;
yi=0;
EX0=1;
IT0=1;
TR0=1; //启动T0
while(1);
}
//T0 中断函数
void ext_int0() interrupt 0
{
key++;
key&=0x03;
}
void LED_Screen_Display() interrupt 1
{
TH0=(65536-2000)/256; //2ms 定时
TL0=(65536-2000)%256;
switch(key)
{
case 0:
P0=0xff; //输出位码和段码
P0=~Table_of_Digits[Num_Index*8+i];
P1=_crol_(P1,1);
if(++i==8) i=0; //每屏一个数字由8 个字节构成
if(++t==250) //每个数字刷新显示一段时间
{
t=0;
if(++Num_Index==10) Num_Index=0; //显示下一个数字
}
break;
case 1:
P0=~xdat[xi];
P1=0xff;
P1=ydat[yi];
if(++t==250) //每个数字刷新显示一段时间
{
t=0;
yi++;
if(yi>7){yi=0;xi++;}
if(xi>7)xi=0;
}
break;
case 2:
P0=0xff; //输出位码和段码
P0=~Table_of_Digits[80+j];
if(j==0)P1=0x80;
P1=_crol_(P1,1);
if(++j==8) j=0; //每屏一个数字由8 个字节构成
break;
default:
key=0;
i=0;
j=0;
t=0;
xi=0;
yi=0;
Num_Index=0;
P0=0xff;
P1=0x80;
break;
}
}