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

发布者:EuphoricMelody最新更新时间:2024-04-07 来源: elecfans关键字:51单片机  点阵LED  显示实验 手机看文章 扫描二维码
随时随地手机看文章

前言

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


这篇文章(点击阅读)。

二、硬件

这次用到的原件有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;

}

}

 }


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

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


总结

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


关键字:51单片机  点阵LED  显示实验 引用地址:【51单片机】点阵LED的显示实验

上一篇:51单片机学习笔记之基础部分
下一篇:【51单片机】DAC0832制作信号发生器(方波,三角波,锯齿波)

推荐阅读最新更新时间:2026-03-24 09:45

8051单片机实战分析(以STC89C52RC为例) | 09 - LED点阵显示数字
1 LED点阵 LED 点阵是由发光二极管排列组成的显示器件,在我们日常生活的电器中随处可见,被广泛应用于汽车报站器,广告屏等。 通常应用较多的是 8* 8 点阵,然后使用多个 8 * 8 点阵可组成不同分辨率的 LED点阵显示屏,比如 16* 16 点阵可以使用 4 个 8* 8 点阵构成。因此理解了 8* 8LED点阵的工作原理,其他分辨率的 LED 点阵显示屏都是一样的。这里以 8* 8LED 点阵来做介绍。 工作原理: 8* 8 点阵共由 64 个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置 1 电平(行所接的是二极管的阳极,所以为高电平),某一列置 0 电平(列所接的是二极管的阴
[单片机]
80<font color='red'>51单片机</font>实战分析(以STC89C52RC为例) | 09 - <font color='red'>LED</font><font color='red'>点阵</font><font color='red'>显示</font>数字
51单片机复习:8*8led点阵
有两种,一种列为低电压通,行为高电压为通,我们可以依次将每一列接低电压,也就依次点亮 然后利用行的电压来控制点亮,如果有一行电压为低,那一行的Led灯都不会亮 第二种反之,列为高低压则通,行为低电压则通,两者同时符合,则对应的灯点亮 74H595芯片 在我使用的普中51单片机中,其控制行电压,而P0口则控制列电压 其有三个引脚,SER(串行数据输入),SCLK(移位储存器时钟输入),CLK(数据储存器时钟输入) 我是这样理解他们的,SER负责传送数据,每一次只能接受一位,而SCLK上升沿让移位有效,而CLK上升沿让整个数据的传输有效
[单片机]
C51单片机学习---8*8LED点阵
关于8*8LED点阵屏 1.8*8LED点阵屏原理图 74HC595移位器:将串行输入— 并形输出 LED:单色光,三色光(红,绿,蓝– 组成多种颜色) pitch:相邻两个点之间的间距。 2mm=2pitch 实际应用: 广告 //点亮最右边的led #include reg52.h #include intrins.h typedef unsigned char u8; typedef unsigned int u16; sbit SCK =P3^6; sbit RCK =P3^5; sbit SER =P3^4; void Hc595SendByte(u8 dat); void main(void )
[单片机]
C<font color='red'>51单片机</font>学习---8*8<font color='red'>LED</font><font color='red'>点阵</font>屏
51单片机复习:8*8led点阵
有两种,一种列为低电压通,行为高电压为通,我们可以依次将每一列接低电压,也就依次点亮 然后利用行的电压来控制点亮,如果有一行电压为低,那一行的Led灯都不会亮 第二种反之,列为高低压则通,行为低电压则通,两者同时符合,则对应的灯点亮 74H595芯片 在我使用的普中51单片机中,其控制行电压,而P0口则控制列电压 其有三个引脚,SER(串行数据输入),SCLK(移位储存器时钟输入),CLK(数据储存器时钟输入) 我是这样理解他们的,SER负责传送数据,每一次只能接受一位,而SCLK上升沿让移位有效,而CLK上升沿让整个数据的传输有效
[单片机]
51单片机LED点阵显示文字
51单片机LED点阵显示文字 代码如下。 #include REGX51.H #define u8 unsigned char sbit SER = P3^4; sbit RCLK = P3^5; sbit SCLK = P3^6; //横向 D0- D7 u8 tao ={8,240,8,15,8,136,126,145,8,82,8,2,62,8,8,231,8,129,126,129,72,231,72,129,88,129,40,129,8,255,8,129}; u8 heng = { 0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08, 0x00,0x10,0x00,0x
[单片机]
<font color='red'>51单片机</font><font color='red'>LED</font><font color='red'>点阵</font><font color='red'>显示</font>文字
51单片机----16*16LED点阵
一、LED点阵发光原理 想要点亮点阵中的某一个LED灯。只要使得那个灯所在的行输出高电平,所在列输出低电平就好。 二、点阵扫描实验 1 /*********************************************** 2 实验名称: 点阵扫描 3 实验说明: 扫描每个LED灯,检查点阵是否完好 4 实验时间: 2014/12/24 5 ***********************************************/ 6 #include 7 #include 8 9 #define uchar unsigned char 10 #define uint unsigned int 11 12 sbi
[单片机]
51单片机8*8点阵LED显示原理及程序设计
在8X8点阵LED上显示柱形,让其先从左往右平滑移动三次,其次从右往左平滑移动三次,再次从上往下平滑移动三次,最后从下往上平滑移动三次,如此循环。 1. 程序设计内容 8X8点阵LED工作原理说明 :8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,如图49所示,对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述: 一根竖柱:对应的列置1,而行则采用扫描的方法来实现。 一根横柱:对应的行置0,而列则采用扫描的方法来实现。 2. 硬件电路 3.汇编源程
[单片机]
<font color='red'>51单片机</font>8*8<font color='red'>点阵</font><font color='red'>LED</font>的<font color='red'>显示</font>原理及程序设计
51单片机8×8LED点阵显示数字与字符
#include AT89X52.H unsigned char code tab ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char code digittab ={ {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},// ,0*/ {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},// ,0*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF},// _ ,0*/ {0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF}
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved