一.基于51的点阵屏显示:(1)点亮第一个8*8点阵:1.首先在Proteus下选择我们需要的元件,AT89C51、74LS138、MATRIX-8*8-GREEN(在这里使用绿色的点阵)。在Proteus 6.9中8*8的点阵总共有四种颜色,分别为MATRIX-8*8-

所以,干脆去掉这个延时,而将每一次扫描重复5-7次,也就是80-110ms,然后再i++,将图像向上推进 就是在for(z=0;z<8;z++) 外面再加一层for循环 for(m=0;m<10;m++)//m值由实验确定 { for(z=0;z<8;z

用单片机控制8×8点阵的每个LED的亮灭,要采用扫描方式实现。如下图的8×8点阵,用8系列线和8线条行线控制。在8条列线加高电平,逐条行线加低电平,就会逐行点亮。

按照人的常规的视觉停留的频率计算就行了,一般地,扫描频率要50HZ以上肉眼看起来就不闪烁,就拿50HZ阀值,那么一个点阵显示的时间为1S/50=20mS,即需要20mS后再对它进行扫描;但是你每行是5mS,那么一共有8行,重复扫描时

74LS245的第1脚AB/B\A\从字面上看应该是高电平将信号从A传到B,你看看是不是接反了,再查查74LS245的I/O口输出电流有多大,看看能否驱动8个LED点(好像够呛),点阵内部带有限流电阻吗?如果内部没有则要在外部加上,

proteus仿真时ok,而实际应用不行是很正常的,毕竟软件和实际是有区别的。 这种情况下你修改一下你的扫描速度就OK了。 实际当中,LED点阵扫描速度不要太快,不然LED要么不亮,要么乱亮。具体的还得看你程序才行哈。不过你

我做了一个8x8的点阵,可是结果点阵乱亮,甚至不亮,总之与单片机程序...

,,,我也遇到了这个问题,后来我把二极管单独接地,发现就可正常亮起,然后又把二极管接回原来位置,就又正常了玄学

;这个函数=_crol_在哪里 很明显你的HEX文件没有生成,而且你的二极管负端全部都接的高电平,按照你这种接法 必须让你二极管的正端的电压高于VCC,那是不可能的。所以你重新看哈hex文件是否生成,再把二极管换过来

3、应该将电阻接地端改为接电源,LED负极接P0口,这样,输出低电平时,LED正常发光。检查一下单片机的晶振和复位电路,看看单片机是否工作了。用Proteus仿真时,单片机的RST复位引脚是不起作用的,即在RST引脚加高电平,单片机

你的仿真图中的LED是连接到P1口的,可是用了总线的画法,这样,LED并没 有直接连到P1口上,这就需要在P1口的8条线上,和8个LED灯连线上加网络示号。

图画错了。1.二极管支路中的电阻,阻值太大了,应改成470欧姆~1K左右。2.二极管,你画的方向,是向右的,那么,左边就不应该接地了,应该接上+5V。

1.C1有一个脚没连到地;2.复位脚那个开关应该打开,闭合时单片机一直处于复位状态(高电平复位);

你这只画了仿真图不行啊,需要写程序才能亮的,这种点阵的二极管需要进行扫描,可是从你的图片上看,也没有执行程序啊,怎么会亮呢。接二极管正极的三条行线要逐行输出高电平,而接二极管负的三条列线要逐列输出低电平,

Proteus 单片机控制LED阵列为何不亮

“原来的LED是接电源的,我改成了接地”,就是因为这么改了,就改错了,不能只改接地呀,那8个LED的正负也要颠倒一下才对,这样的8个LED的正负就接反了,肯定是不亮的。这样改,一方面8个LED正负要颠倒,P1输出电平也

一定是电路的逻辑错误,LED没有加上信号,它与蜂鸣器并联,那个蜂鸣器响了吗?也不能响吧,蜂鸣器要加脉冲信号的,所以,这个连接在逻辑上有错误,还有那个驱动LED的电路逻辑对吗?

你这只画了仿真图不行啊,需要写程序才能亮的,这种点阵的二极管需要进行扫描,可是从你的图片上看,也没有执行程序啊,怎么会亮呢。接二极管正极的三条行线要逐行输出高电平,而接二极管负的三条列线要逐列输出低电平,

首先,你用的蜂鸣器就是那个喇叭不对,那是个无源的,需要加音频信号或方波信号才能响

while(1) { P1=0;},这样LED应该会全部亮,否则就是总线连接不正确

define LieValue P0 //P0 P1口要和数码管对应上,根据你的描述:P0端控制的是led点阵的正极,因此P0口实际上是数据口,P1口是各列控制口(扫描口)define LieScan P1 // unsigned char code LedChar[10][8]={ {

为什么proteus 仿真中led点阵不亮

程序版本不一样,编出来的程序也会不一样,这个是不能够疏忽的。望采纳,谢谢~

假设P1.3输出高电平,光耦就会导通,这样Q2有BE之间有压降,CE导通,这样继电器的两端就会有压降,并且接近24V,继电器动作。同时D3导通。如果你是用Proteus来仿真的话,你所选的仿真模型是有问题的。应该选LED-RED,Blue,

“原来的LED是接电源的,我改成了接地”,就是因为这么改了,就改错了,不能只改接地呀,那8个LED的正负也要颠倒一下才对,这样的8个LED的正负就接反了,肯定是不亮的。这样改,一方面8个LED正负要颠倒,P1输出电平也

你这只画了仿真图不行啊,需要写程序才能亮的,这种点阵的二极管需要进行扫描,可是从你的图片上看,也没有执行程序啊,怎么会亮呢。接二极管正极的三条行线要逐行输出高电平,而接二极管负的三条列线要逐列输出低电平,

首先,你用的蜂鸣器就是那个喇叭不对,那是个无源的,需要加音频信号或方波信号才能响

while(1) { P1=0;},这样LED应该会全部亮,否则就是总线连接不正确

define LieValue P0 //P0 P1口要和数码管对应上,根据你的描述:P0端控制的是led点阵的正极,因此P0口实际上是数据口,P1口是各列控制口(扫描口)define LieScan P1 // unsigned char code LedChar[10][8]={ {

为什么proteus仿真led点阵时不会亮?

首先,你用的蜂鸣器就是那个喇叭不对,那是个无源的,需要加音频信号或方波信号才能响
LED左侧是高电平,右侧应该是低电平才会亮,所以LED右边小方块应该是蓝色。但你图中的是红色,说明右侧电平不对。根据你右侧端口,找到芯片对应的接口P1.0-P1.3全部是高电平,看看是不是程序有问题,导致接口输出电平不对。或者你把LED改成共阴极的。这样芯片接口输出高电平,接地端是低电平,试试能不能亮
#include #define LieValue P0 //P0 P1口要和数码管对应上,根据你的描述:P0端控制的是led点阵的正极,因此P0口实际上是数据口,P1口是各列控制口(扫描口) #define LieScan P1 // unsigned char code LedChar[10][8]={ {0xff,0xef,0xcf,0xef,0xef,0xc7,0xff,0xff}, {0xff,0xc3,0xfb,0xc3,0xdf,0xc3,0xff,0xff}, {0xff,0xc3,0xfb,0xc3,0xfb,0xc3,0xff,0xff}, {0xff,0xd7,0xd7,0xd7,0xc3,0xf7,0xff,0xff}, {0xff,0xc3,0xdf,0xc3,0xfb,0xc3,0xff,0xff}, {0xff,0xc3,0xdf,0xc3,0xdb,0xc3,0xff,0xff}, {0xff,0xc3,0xfb,0xfb,0xfb,0xfb,0xff,0xff}, {0xff,0xc3,0xdb,0xc3,0xdb,0xc3,0xff,0xff}, {0xff,0xc3,0xdb,0xc3,0xfb,0xfb,0xff,0xff}, {0xff,0xb0,0x36,0xb0,0xb6,0x10,0xff,0xff}, }; void main() { unsigned int cnt=0; unsigned char k=0; unsigned char sec=0x80; unsigned char w=0; TMOD=0x01; TH0=0xFC; TL0=0x67; TR0=1; //test // P0 =0x05f; //高电平有效,列值 // P1 =0xf0; //低电平有效,控制列 //test while(1) { if(TF0==1) { TF0=0; TH0=0xFC; TL0=0x67; cnt++; if(cnt>=1000) { cnt=0; k++; if(k>=10) k=0; //【要加上限制k<=9】 } LieScan=0xFF; switch(w) { //根据你的描述:P0端控制的是led点阵的正极,P0口和P1口要先将sec、ledchar取反后在输出。还有,根据你的接线,sec的初始值要改为0x80,移位方式也要修改。 case 0:LieScan=~sec;LieValue=~LedChar[k][0];w++;sec>>=1;break; case 1:LieScan=~sec;LieValue=~LedChar[k][1];w++;sec>>=1;break; case 2:LieScan=~sec;LieValue=~LedChar[k][2];w++;sec>>=1;break; case 3:LieScan=~sec;LieValue=~LedChar[k][3];w++;sec>>=1;break; case 4:LieScan=~sec;LieValue=~LedChar[k][4];w++;sec>>=1;break; case 5:LieScan=~sec;LieValue=~LedChar[k][5];w++;sec>>=1;break; case 6:LieScan=~sec;LieValue=~LedChar[k][6];w++;sec>>=1;break; case 7:LieScan=~sec;LieValue=~LedChar[k][7];w=0;sec=0x80;break; default:break; } }//*/ } } 程序实测通过。显示的是1~10.
cathode表示阴极
//硬件,51CPU,晶振11.0592 //软件 #include sbit LED_Pin = P1^0; unsigned int Time; void Time_Init(void) { TMOD &= 0xf0; // 方式1 TMOD |= 0x01; TL0 = 0x66; // 1mS初始值 TH0 = 0xfc; ET0 = 1; // 允许定时器中断 TR0 = 1; // 启动定时器 } void Time_Int(void)interrupt 1 { TR0 = 0; // 暂时关闭定时器 TL0 = 0x66; // 1mS 定时值重装 TH0 = 0xfc; TR0 = 1; Time++; if(Time >= 500) { Time = 0; LED_Pin = !LED_Pin; } } void main(void) { Time_Init(); EA = 1; while(1) { } }
先编译目标文件,如LED.hex.在AT89c51指定这个文件的路径,放好模型,点运行就行了,可以操作开关,观察状态了
对这种,首先用定时中断,完成一次扫描的时间少于20MS,建议用1MS的中断,这样,做一个数组,当缓存用,只需要更改数组中对应的LED的位的值就可以完成显示了,一个位对应一个LED。那常亮的就常期为1,不常亮为闪的,按时间要求刷新就可以了。LED越多,中断时间越短就可以了。
你可以仿真一下看看io输出的电平,如果对的话那很有可能就是硬件问题了