【51单片机】点阵LED的显示实验

发布时间:2024-04-07  

前言

今天女朋友生日,除了礼物之外,一时想不到能给她点什么不一样的,并且奈何自己不会写诗,没办法从这方面入手。所以就用我会的方式吧。
既然最近自己琢磨琢磨单片机,也准备玩儿点阵LED的显示实验,这时我灵机一动,不如用LED做一个吧。(????????????老理工男了,怎么有的女朋友?)
好,下面就来看看我是怎么做的吧。


一、环境

环境用的是Keil5编译,这是目前比较主流的单片机编译软件,支持汇编和C。其次,我用到了Proteus8软件仿真,没有自己买单片机,仿真软件的东西很全面。具体的软件操作在我的上一篇文章中有说了,这里就不再赘述。需要看软件操作的小伙伴可以参考我的这篇文章(点击阅读)。

二、硬件

这次用到的原件有80C51、MATRIX-8×8-RED、RESPACK-8,以及POWER和GROUND

1.了解Matrix-8×8就像你需要了解女朋友

MATRIX-8×8-RED是8×8的红色LED点阵(除了红色还有其他颜色,也不止有8×8规格的),它共有16个引脚,8个阳极引脚控制列上的LED,8个阴极引脚控制行上的LED。通常我们把控制行上LED的八位二进制数称为列值,控制列的二进制称为列选信号。类似于数据与片选信号的关系。
在这里插入图片描述
上图就是一个matrix-8×8的LED,我们无法从外观上看出它的阴极和阳极,这时候我们就需要自己找出来。方法也很简单,就是给它加电源当列选端口为高电平,列值为低电平时LED点亮,利用这一特点,很容易找出阴极和阳极。如下图:
在这里插入图片描述
我们只需要连接左边或者右边一种即可,这里为方便说明把两端都测试了一遍。打开仿真,即可观察到:
在这里插入图片描述
观察左边发现:上端输入高电平的列有LED发光,说明上端是阳极(列选),下端是阴极(列值)。而右边上端低电平下端高电平并没有LED亮起,佐证了刚才的结论。
进一步,我们看到阴极输入01111011,在一列中,从高到低是10000100B。发现了吗?阴极低电平时对应的LED亮起,01111011就是列值。

2、正确地连接线路就像你需要以正确的方式让她开心。

在对MATRIX8×8有了了解,测出了端口性质。接下来是连接电路。首先我们需要明确一点,80C51的P0口需要上拉电阻才能输出高电平,具体原因是80C51芯片的设计结构,在这里就不解释了(因为我也不甚了解,不献丑了。有大佬可以评论区科普一下吗?)
这里我们选用P0口做列选,用P2口作列值。于是得到如图的电路图:
在这里插入图片描述
其中,RESPACK-8是排阻,其八位端口接P0口,作为上拉电阻。Matrix-8×8-RED的阳极接P0口(列选),阴极接P2口(列值)。

三、软件

1、思路就是有一个给她惊喜的想法

我的设计的是先显示一颗跳动的爱心❤,然后把她的名字首字母显示出来。根据这个想法,我们就很好想到实现办法了。

  • 首先,我们需要设置在开始的一段时间内让爱心跳动,再让字母轮流出现。

  • 爱心怎么跳动?我们可以用一大一小的爱心交替显示表现这种效果。

  • 怎么显示?点阵LED可以用动态扫描法显示,只需控制好循环就能显示图形。
    下面开始编写代码:

2、头文件就是准备工作

#include int Ledcode[5][8]={ {0x0C,0x1E,0x3E,0x7C,0x7C,0x3E,0x1E,0x0C},//大爱心 {0x00,0x0C,0x1C,0x38,0x38,0x1C,0x0C,0x00},//小爱心 {0x32,0x73,0xdb,0xdb,0xdb,0xdb,0xce,0x64},//字母‘S’ {0x01,0x03,0x7f,0xff,0xc3,0xe1,0x60,0x00},//字母‘J’ {0x01,0x03,0x87,0xfc,0xfc,0x86,0x03,0x01}};//字母‘Y’int line[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//列选


上面的代码,因为我想显示一颗跳动的爱心,所以在这个8×8的点阵中设计了一个大爱心和一个小爱心,让大小爱心交替显示,表现出跳动的效果。
后面的字母是名字缩写。列选则是每次选择一列显示。所有这些都是我一个一个画出来再转化的列值。

  • 一开始是这样的在这里插入图片描述
    把它整个画出来了

  • 然后是这样在这里插入图片描述
    把列中对应的二进制数写出来,就是列值了。

  • 最后,还进行了修改,这都是在看到效果后对一些细节修改了。在这里插入图片描述
    让大家见笑了。


3、点阵LED显示就是把想法变成现实

这里采用的是动态扫描的方式,因为每一列显示的列值都不一样,所以用动态扫描每次显示一列,只要循环的速度足够快,就能看到一幅静态的图案,这利用的是人眼的视觉暂留现象。


1)跳动爱心的代码:

int times=0;

while(times<1500){

P0=line[n];

if(times<=1000) P2=~Ledcode[0][n++];//循环显示大爱心1000次。

else P2=~Ledcode[1][n++];//小爱心再显示小爱心500次.

if(n==8) n=0;//让列值在数组中的一行循环。

times++;

delayms(1);//延时程序。

}

先循环显示大爱心约1秒,再显示小爱心0.5秒,形成一次跳动效果。需要跳动多次只需要再嵌套一层for循环即可。:


int times,n=0;

for(i=0;i<3;i++){

times=0;

while(times<1500){

P0=line[n];

if(times<=1000) P2=~Ledcode[0][n++];

else P2=~Ledcode[1][n++];

if(n==8) n=0;

times++;

delayms(1);

}

}

这样就跳动了三次。


然后,当爱心跳动了三次,就会交替显示字母。利用同样的方法就能实现。


2)显示字母的代码:

times=0;

n=0;

while(times<=6000){

P0=line[n];

if(times<=2000) P2=~Ledcode[2][n++];

else if(times>2000&×<=4000) P2=~Ledcode[3][n++];

else P2=~Ledcode[4][n++];//三个字母各显示2000次,视觉上显示了约2秒。

times++;

if(n==8) n=0;

delayms(1);

}

以上是一次的整个流程,现在需要一直循环显示,只需要再嵌套一层大的循环即可。

如下:


void main(void)

 { 

int i;

int n=0;

while(1){

int times;

for(i=0;i<3;i++){

times=0;

while(times<1500){

P0=line[n];

if(times<=1000) P2=~Ledcode[0][n++];

else P2=~Ledcode[1][n++];

if(n==8) n=0;

times++;

delayms(1);

}

}

times=0;

n=0;

while(times<=6000){

P0=line[n];

if(times<=2000) P2=~Ledcode[2][n++];

else if(times>2000&×<=4000) P2=~Ledcode[3][n++];

else P2=~Ledcode[4][n++];

times++;

if(n==8) n=0;

delayms(1);

}

}

 }

现在主程序完成了,这也只是一个简单的小程序。但是刚才用到了延时程序,把延时程序补上就大功告成了。


void delayms(int n){

int i;

int j;

for(i=0;i for(j=0;j<110;j++);

}

3)附上完整代码:

int Ledcode[5][8]={ {0x0C,0x1E,0x3E,0x7C,0x7C,0x3E,0x1E,0x0C},//大爱心的列值

{0x00,0x0C,0x1C,0x38,0x38,0x1C,0x0C,0x00},//小爱心的列值

{0x32,0x73,0xdb,0xdb,0xdb,0xdb,0xce,0x64},//字母‘S’列值

{0x01,0x03,0x7f,0xff,0xc3,0xe1,0x60,0x00},//字母‘J’列值

{0x01,0x03,0x87,0xfc,0xfc,0x86,0x03,0x01}};//字母‘Y’列值

int line[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//列选

void delayms(int n){

int i;

int j;

for(i=0;i for(j=0;j<110;j++);

}

 

void main(void)

 { 

int i;

int n=0;

while(1){

int times;

for(i=0;i<3;i++){

times=0;

while(times<1500){//显示跳动爱心

P0=line[n];

if(times<=1000) P2=~Ledcode[0][n++];//显示大爱心

else P2=~Ledcode[1][n++];//显示小爱心

if(n==8) n=0;

times++;

delayms(1);

}

}

times=0;

n=0;

while(1){//轮流显示字母

P0=line[n];

if(times<=2000) P2=~Ledcode[2][n++];//显示字母‘S’

else if(times>2000&×<=4000) P2=~Ledcode[3][n++];//显示字母‘J’

else P2=~Ledcode[4][n++];//显示字母‘Y’

times++;

if(n==8) n=0;

delayms(1);

if(times==6000) break;

}

}

 }


四、效果——女朋友获得爱意,你获得女朋友

在这里插入图片描述
点阵太小,放大了看不清楚,所以缩小了看更能把图形显示清楚。


总结

代码很简单,程序也很简单,但是重要的是心意嘛。她还是很喜欢的,当然,女生可能对硬件是没多少兴趣的,她更注重的是显示的效果和我为了这个效果做的努力。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>