视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
基于51单片机的led点阵显示
2025-09-29 17:09:12 责编:小OO
文档
项目名称:基于51单片机的LED点阵显示器

一、项目介绍……………………………………… 2

     1.1   项目背景

1.2   功能介绍

二、电路结构……………………………………… 3

三、实现模块……………………………… 5

四、运行程序……………………………………… 7

一、项目介绍

1.1项目背景

  当今世界,电子技术迅猛发展,点阵式显示器件作为现代信息显示的重要媒体,在金融证券、体育、机场、交通、商业、广告宣传、邮电电信、指挥调度、国防军事等许多领域中得到了广泛应用。因此点阵式显示器件的研制、生产也的到了迅速的发展,并逐步形成产业,成为光电子行业的新兴产业领域。目前,点阵式显示器件具体包括LED显示模块和LCD显示模块等。现在发展的LCD比较先进,LCD的优点较为明显,他体积小,容易控制,功能强,价格适宜,能够适应显示器的发展方向,因而在通信、家电、大屏幕投影等领域得到了越来越广泛的应用;随着社会经济的迅猛发展,工业生产逐渐实现了自动化,其中,设备的工作状态和生产过程状态的显示与监控起到了非常重要的作用,对于那些需要显示的信息量不是很大,分辨率不是很高,又需要制造成本相对比较低的场合,使用大、小屏幕LED点阵显示器是比较经济适用的,他可以显示字符、数字、汉字和简单图形,可以根据需要使用不同字号、字型,显示亮度较高,并且对环境条件要求比较低。LED显示又可以分为单色显示和双色显示,可以按照需要的大小、形状和颜色进行组合,并用单片机控制实现各种文字或图形的变化,达到宣传和提示的目的。

1.2功能介绍

2本次设计的用单片机控制的显示电路使用比较简单,操作方便。它主要是通过一个8×8点阵来显示图案,通过不同的按键来选择控制图案的种类及显示方式。在通电以后,显示屏全亮,随后进入逐字显示状态。按下复位键K1,系统自动复位,显示diligent,随后进入待命状态。按键1、2、3、4分别控制不同的图案。另外,我们可以通k5键来控制字符移动速度的快慢。

二、电路结构

单片机最小系统设计

2.2.1 各部分具体电路

1 单片机的时钟电路

   AT89C52单片机内部的振荡电路是一个高增益反向放大器,引线XTAL1和XTAL2分别是放大器的输入端和输出端。单片机内部虽然有振荡电路,但要形成时钟,外部还需附加电路。ATC52的时钟产生方式有两种:内部时钟电方式和外部时钟方式。由于外部时钟方式用于多片单片机组成的系统中,所以此处选用内部时钟方式。

   内部时钟方式:利用其内部的振荡电路在XTAL1和XTAL2引线上外接定时元件,内部振荡电路产生自激振荡。最常用的是在 XTAL1和XTAL2之间接晶体振荡器与电路构成稳定的自激振荡器,如图2-1电路所示为单片机最常用的时钟振荡电路的接法,其中晶振可选用振荡频率为6MHz的石英晶体,电容器一般选择30PF左右。

XTAL1

XTAL2

图2-1使用片内振荡电路的时钟电路

2 单片机的复位电路

   本设计中ATC52是采用上电自动复位和按键复位两种方式。最简单的复位电路如图2-2所示。上电瞬间,RC电路充电,RST引线端出现正脉冲,只要RST端保持10ms以上的高电平,就能使单片机有效地复位。其中R1和R2分别选择200Ω和1KΩ的电阻,电容器一般选择22μF。

Vcc

RST

Vcc

+

C

22uF

RESET

R1

200

R2

1K

图2-2 AT89C52的复位电路

3 AT89C52的最小应用系统

   ATC52是片内有程序存储器的单片机,要构成最小应用系统时只要将单片机接上外部的晶体或时钟电路和复位电路即可,如图2-3所示。这样构成的最小系统简单可靠,其特点是没有外部扩展,有可供用户使用的大量的I∕O线。

XTAL1

XTAL2

RES

EA

ATC52

+5V

+5V

C1

C2

C3

R1

R2

图2-3 AT89C52单片机构成的最小系统

2.3 按键及接口设计

2.3.1 式按键接口设计

本设计按键较少,采用式按键简单而方便。式按键就是各键相互,每个按键各接一根输入线,一根输入线上的按键工作状态不会影响其它输入线上的工作状态。因此,通过检测输入线的电平状态很容易判断哪个按键被按下了。

设计采用的是中断方式的式按键工作电路,按键直接与AT89C52的I/O口线相接,通过读I/O口,判定各I/O口线的电平状态,即可识别出按下的键。

式按键电路中,一般采用上拉电阻,这是为了保证在按键断开时,各I/O口线有确定的高电平。而AT89C52芯片内已有上拉电阻,则外部的上拉电阻可以省去。

    

三、实现模块

1. 单片机最小系统

2. 按键及接口

3. 显示及接口

4. 驱动电路

5. 电源电路

8×8点阵LED显示器的组成原理及控制方式

   本次设计中采用8×8点阵LED显示器,简称LED点阵板或LED矩阵板。它是以发光二极管为像素,按照行与列的顺序排列起来,用集成工艺制成的显示器件。有单色和双色之分,这种显示器有共阳极接法和共阴极接法两种,设计中用到的是共阳极的显示器。共阳极接法的原理图如图2-4所示,图中画出了8×8点阵的二极管。每一行发光二极管的阳极接在一起,有一个引出端r,每一列发光二极管的阴极接在一起,有一个引出端c。当给发光二极管阳极引出端r1加高电平,阴极引出端c1加低电平时,左上角的二极管被点亮因此,对于行和列的电平进行扫描控制时,可以达到显示不同汉字的目的。

图2-4  8×8点阵LED显示器组成原理图

8×8点阵LED

r1

r2

r3

r4

r5

r6

r7

r8

c1

c2

c3

c4

c5

c6

c7

c8

图2-5 8×8点阵LED引脚的排列图

电路图如下所示: 

 四、程序

/*

必要操作:正确连接点阵到学习板

*/

#include ﻩ//包含头文件

unsigned char mode0,mode1,mode2,mode3,mode4;ﻩﻩ//显示模式

sbit k1=P2^7;

sbit k2=P2^6;

sbit k3=P2^5;

sbit k4=P2^4;

sbit k5=P2^0;

unsigned char xin1[8]={

0x0,0x0,0x0,0x6C,0x92,0x44,0x28,0x10

};//心形1

unsigned char bxin1[8]={

0x0,0x0,0x0,0x6C,0x82,0x0,0x28,0x10

};//半心形1

unsigned char xin2[8]={

0x0,0x36,0x49,0x22,0x14,0x8,0x0,0x0

};//心形2

unsigned char bxin2[8]={

0x0,0x36,0x41,0x0,0x14,0x8,0x0,0x0

};//半心形2

unsigned char xin[8]={

0x0,0x36,0x41,0x6E,0x96,0x4C,0x28,0x10

};//双心形2

unsigned char zimu0[8]={

0x38,0x24,0x22,0x22,0x22,0x22,0x24,0x38

};//D

unsigned char zimu1[8]={

0x3C,0x18,0x18,0x18,0x18,0x18,0x18,0x3C

};//I

unsigned char zimu2[8]={

0x1E,0x20,0x40,0x40,0x4E,0x42,0x22,0x1E

};//G

unsigned char zimu3[8]={

0x3C,0x18,0x18,0x18,0x18,0x18,0x18,0x3C

};//I

unsigned char zimu4[8]={

0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3E

};//L

unsigned char zimu5[8]={

0x7E,0x40,0x40,0x7E,0x7E,0x40,0x40,0x7E

};//E

unsigned char zimu6[8]={

0x0,0x42,0x62,0x52,0x4A,0x46,0x42,0x0

};//N

unsigned char zimu7[8]={

0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18

};//T

unsigned char name0[8]={

0xE9,0x2A,0xEC,0x9F,0xE8,0x2C,0x6A,0x29

};//张

unsigned char name1[8]={

0x42,0x24,0x7E,0x0,0x3C,0x0,0xFF,0x0

};//兰

unsigned char name2[8]={

0x26,0x74,0x25,0xFE,0x56,0x55,0x56,0x94

};//郝

unsigned char ai0[8]={

0x3C,0x18,0x18,0x18,0x18,0x18,0x18,0x3C

};//I

unsigned char ai1[8]={

0x0,0x66,0xFF,0xFF,0x7E,0x3C,0x18,0x0

};//实心

unsigned char ai2[8]={

0x0,0x66,0x99,0x81,0x42,0x24,0x18,0x0

};//空心

unsigned char ai3[8]={

0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C

};//U

unsigned char xie0[8]={

0x0,0x3E,0x8,0x8,0x8,0x8,0x8,0x0

};//T

unsigned char xie1[8]={

0x0,0x24,0x24,0x24,0x3C,0x24,0x24,0x24

};//H

unsigned char xie2[8]={

0x0,0x8,0x14,0x3E,0x41,0x41,0x0,0x0

};//A

unsigned char xie3[8]={

0x0,0x0,0x22,0x26,0x2A,0x32,0x22,0x0

};//N

unsigned char xie4[8]={

0x22,0x24,0x28,0x30,0x28,0x24,0x22,0x0

};//K

unsigned char xie5[8]={

0x1C,0x22,0x20,0x10,0xC,0x2,0x22,0x1C

};//S

void delay()ﻩﻩ        ﻩﻩ//延时函数

{

    unsigned int c;

ﻩc=300;

    while(c--){}

}

void main(void)    ﻩﻩﻩﻩﻩ//主函数

{

ﻩunsigned int i,j,k,m;

ﻩk1=1;

ﻩk2=1;

ﻩk3=1;

ﻩk4=1;

ﻩk5=1;

ﻩm=10;

    mode0=0;

ﻩfor(k=0;k<8;k++)

    ﻩ{

ﻩﻩ    for(j=0;j<30;j++)        //调节字母变化速度

ﻩﻩﻩfor(i=0;i<8;i++)ﻩ    //点阵8列动态扫描法显示,每次扫描一列并发送数据码

    ﻩ    {

ﻩﻩﻩﻩif(mode0==0)        ﻩ//模式0-3分别对应4种表情,根据模式选择表情所对应的显示码

ﻩﻩ    ﻩ    P0=zimu0[i];    ﻩ

ﻩ        ﻩif(mode0==1)

ﻩﻩﻩﻩﻩP0=zimu1[i];    ﻩ

    ﻩ    ﻩif(mode0==2)

ﻩﻩ    ﻩ    P0=zimu2[i];ﻩﻩ

    ﻩ        if(mode0==3)

ﻩ            ﻩP0=zimu3[i];

ﻩﻩ        if(mode0==4)

ﻩ    ﻩﻩﻩP0=zimu4[i];

    ﻩ    ﻩif(mode0==5)

ﻩ    ﻩﻩ    P0=zimu5[i];

            ﻩif(mode0==6)

ﻩ    ﻩ        P0=zimu6[i];

ﻩ    ﻩ    if(mode0==7)

ﻩﻩ    ﻩﻩP0=zimu7[i];ﻩﻩ

ﻩ            P1=~(1<<i);ﻩ    ﻩ//扫描该列

ﻩﻩﻩﻩdelay();ﻩ    ﻩ//延时

        ﻩ}

            mode0++;

ﻩﻩif(mode0>7)

ﻩﻩ    ﻩmode0=0;

ﻩ    }

    P0=0;ﻩ        ﻩ    ﻩ//P0口各脚输出高电平,点阵不显示

ﻩwhile(1)

    {    

    ﻩ    mode1=0;

            mode2=0;

        ﻩmode3=0;

ﻩ        mode4=0;

ﻩﻩif(k5==0)

        {

            //delay(5);

            if(k4==0)  //消抖

    ﻩ    {

        ﻩﻩm=m+30;

ﻩ            if(m>100)

        ﻩﻩ    m=10;

    ﻩﻩ}

ﻩ    }

        while(!k5);//松手检测

        while(k1==0)            //图形1

    ﻩ{

        ﻩfor(j=0;j<m;j++)          //调节表情变化速度

    ﻩ    for(i=0;i<8;i++)ﻩﻩ//点阵8列动态扫描法显示,每次扫描一列并发送数据码

        ﻩ{

ﻩﻩﻩﻩif(mode1==0)    ﻩ    //模式0-3分别对应4种表情,根据模式选择表情所对应的显示码

                ﻩP0=bxin1[i];    ﻩ

    ﻩ    ﻩif(mode1==1)

        ﻩ        P0=xin1[i];        

    ﻩﻩﻩif(mode1==2)

                ﻩP0=bxin2[i];        

        ﻩ    if(mode1==3)

        ﻩ    ﻩP0=xin2[i];

ﻩﻩ        if(mode1==4)

ﻩ            ﻩP0=xin[i];ﻩﻩ

    ﻩ    ﻩP1=~(1<<i);ﻩ        //扫描该列

ﻩﻩﻩﻩdelay();ﻩ    ﻩ//延时

    ﻩﻩ}

ﻩﻩﻩﻩmode1++;

ﻩ    ﻩ    if(mode1>4)

            ﻩ    mode1=0;

ﻩ    }

    ﻩwhile(k2==0)                //图形2

ﻩ    {

ﻩ    ﻩfor(j=0;jﻩ    ﻩfor(i=0;i<8;i++)    ﻩ//点阵8列动态扫描法显示,每次扫描一列并发送数据码

ﻩ    ﻩ{

        ﻩ    if(mode2==0)    ﻩ    //模式0-3分别对应4种表情,根据模式选择表情所对应的显示码

    ﻩ    ﻩﻩP0=name0[i];ﻩ    

    ﻩﻩﻩif(mode2==1)

    ﻩﻩ    ﻩP0=name1[i];    ﻩ

ﻩ    ﻩ    if(mode2==2)

ﻩﻩﻩ        P0=name2[i];        ﻩﻩ

    ﻩﻩ P1=~(1<    ﻩﻩ    delay();    ﻩ    //延时

ﻩﻩﻩ}

ﻩ    ﻩ    mode2++;

    ﻩ        if(mode2>2)

ﻩ    ﻩ        mode2=0;

        }

        while(k3==0)                   //图形3

ﻩﻩ{

ﻩﻩﻩfor(j=0;j<m;j++)          //调节表情变化速度

ﻩﻩﻩfor(i=0;i<8;i++)        //点阵8列动态扫描法显示,每次扫描一列并发送数据码

ﻩﻩﻩ{

    ﻩ    ﻩif(mode3==0)ﻩﻩﻩ//模式0-3分别对应4种表情,根据模式选择表情所对应的显示码

        ﻩ    ﻩP0=ai0[i];    ﻩ

ﻩﻩ        if(mode3==1)

            ﻩﻩP0=ai1[i];ﻩﻩ

    ﻩ        if(mode3==2)

    ﻩﻩ    ﻩP0=ai2[i];ﻩﻩ

    ﻩﻩﻩif(mode3==3)

ﻩﻩﻩﻩﻩP0=ai3[i];        

ﻩ            P1=~(1<<i);ﻩ        //扫描该列

ﻩ        ﻩdelay();ﻩﻩ    //延时

ﻩﻩ    }

    ﻩ        mode3++;

ﻩﻩ        if(mode3>3)

    ﻩﻩ    ﻩmode3=0;

ﻩ    }

    ﻩwhile(k4==0)                   //图形4

ﻩ    {

ﻩﻩﻩfor(j=0;j<20;j++)          //调节表情变化速度

        ﻩfor(i=0;i<8;i++)ﻩﻩ//点阵8列动态扫描法显示,每次扫描一列并发送数据码

ﻩ        {

ﻩﻩﻩ    if(mode4==0)ﻩﻩ    //模式0-3分别对应4种表情,根据模式选择表情所对应的显示码

ﻩ    ﻩ    ﻩP0=xie0[i];ﻩﻩ

    ﻩﻩﻩif(mode4==1)

ﻩﻩ    ﻩ    P0=xie1[i];ﻩﻩ

ﻩﻩ        if(mode4==2)

    ﻩﻩﻩﻩP0=xie2[i];        

    ﻩ    ﻩif(mode4==3)

                ﻩP0=xie3[i];

    ﻩﻩ    if(mode4==4)

            ﻩﻩP0=xie4[i];

ﻩ        ﻩif(mode4==5)

ﻩ        ﻩ    P0=xie5[i];ﻩ    

ﻩﻩﻩﻩP1=~(1<ﻩﻩ    ﻩdelay();ﻩﻩ    //延时

    ﻩﻩ}

            ﻩmode4++;

    ﻩﻩﻩif(mode4>5)

        ﻩ        mode4=0;

    ﻩ}

ﻩ    P0=0X00;

ﻩ    P1=0XFF;

    }

}下载本文

显示全文
专题