基于单片机的LED电子广告牌设计实现

基于单片机的LED电子广告牌设计实现
基于单片机的LED电子广告牌设计实现

课程设计报告设计名称基于单片机的LED电子广告牌的设计和实现

学校陕西电子科技职业学院

学院电子工程学院

学生姓名雷超凡

班级1507

指导教师聂弘颖

时间2017年10月21日

1 总括

1.1 LED点阵汉字显示系统

由于单片机技术的不断发展和高亮度LED 发光管的出现,使得大屏幕高亮度电子广告屏成为可能。与传统的显示设备相比,LED显示设备具有明显的优势:LED 屏色彩丰富,显示方式变化多样、亮度高;LED 屏可以随意修改显示内容;LED 显示屏可用来与计算机屏幕同步。另外,它以其超大画面、超宽视觉、灵活多变的显示方式等独居一格的优势,广泛应用于金融证券、银行利率、商业广告、文化娱乐等方面。

LED电子显示屏是利用发光二极管构成的点阵模块或像素单元组成可变面积的显示屏幕,它具有高清晰度、色彩鲜艳、视角大、工作稳定、寿命长、功耗低等优点。由干采用单元模块化结构,屏体大小可按用户要求灵活拼制,它的超高亮度,使它在户内外显示中具有不可替代的作用。

本文提供了一种成本低廉的汉字点阵LED显示方案,该方案采用常用的5l系列单片机和可以级联扩展的显示电路,可适用于许多需要汉字和图形显示的场合。本设计的LED点阵显示系统采用字模提取软件,其显示和动态效果的实现主要依靠硬件扫描驱动,该方法方便,且易于实现。本文对点阵显示原理进行了深入的研究,对单片杌控制系统及显示驱动屯路进行了分析。介绍了单片机控制程序的设计方法。设计和制作了基于5 1系列单片机控制系统的64×1 6LED点阵显示屏。该系统对LED显示屏的驱动采用动态扫描驱动方式,可以实现不同的动态显示效果。

2 LED 点阵汉字显示系统总体方案设计

2.1移位寄存器74HC595控制列(方案一)

控制电路主要由单片机AT89C51、3×3矩阵键盘和片外RAM 构成。结构框图如图2.1所示。80C51的PL 口负责将显示数据发送给显示电路。P0口与P2口负责于片外RAM 及内存通讯,

图2.1 控制电路结构框图

显示电路主要由两片译码器74LS138、8片行驱动4953(每片控制两行)、8片列驱动

74HC595(LED

输入

图2.2 显示电路控制结构框图

2.2译码器74HC154控制列(方案二)

该系统由AT89C52最小系统、16×64LED点阵显示屏、列驱动电路、行驱动电路、3×3矩阵键盘构成。AT89C52为主控芯片,显示屏由16块8×8LED共阳极连接组成,其列驱动电路由4块4-16线译码器74HC154构成,输出列选信号,行驱动电路由2片74LS273构成。本屏通过3×3矩阵键盘左移、右移显示“通信学院电子信息工程”,控制点阵汉字的暂停、开始。,控制显示系统框图如图2.3

图2.3 LED点阵系统框图

方案一、方案二均可实现LED点阵汉字的显示,均采用基于KEIL C51的编程,故都具有较好的移植功能,程序可读性强。模块化的设计使程序看起来更加简洁,可非常方便地任意修改所要显示的汉字。方案一用移位寄存器74HC595控制列,易于扩展LED

点阵,但行驱动、列驱动所用芯片过多,PCB版成本过高;方案二用4-16线译码器控制列,不易扩展LED点阵,但使用芯片较少,制作简单、方便,PCB版成本较低。通过比较,方案二成本低、制作方便,故选择方案二实现LED点阵显示系统。

3 系统硬件电路设计

3.1芯片选择

1)ATC89C51单片机

1.ATC89C51系列单片机

ATC89C51是指INTEL公司于1980年推出的新一代8位单片机系列产品(8051)。从严格意义上讲,其他所有具有8051指令系统的单片机都不应直接称为ATC89C51系列单片机,ATMEL只是INTEL公司专用的单片机系列符号。

ATC89C51系列单片机及其兼容产品通常分为以下几类:

⑴基本型:典型产品有8031/8051/8751。基本型采用HMOS工艺,片内集成有8位CPU,片内驻留4K×8位的ROM(8031片内无),128B的数据存储器(RAM)以及21个特殊功能寄存器,32条I/O接口线,1个全双工的串行I/O口(UART),2个16位的定时/计数器,5个中断源和2级中断。数据存储器和程序存储器的寻址能力为128KB,

指令系统除加、减、乘、除运算外,还提供了查表和位操作指令,主时钟频率为12MHZ,运算速度增强。

⑵增强型:典型产品有8032/8052/8752。与基本型的差异在于内部RAM增到256B,8052、8752的内部程序存储器扩展到8KB,16位定时/计数器增至3个。

⑶低功耗型:典型产品有80C31/87C51/80C51。其基本结构和功能与基本型相同。由于采用CMOS工艺,因此适于电池供电或其他低功耗的场合。

⑷专用型:典型产品有8044/8744。在基本型的基础上用一个HSLC/SDLC通信控制器取代了基本型的UART,适用于总线分布式多机测控系统。

⑸超8位型:典型产品有PHILIPS公司的80C552/87C552/83C552系列单片机。其基本结构和功能与ATC89C51系列完全相同,但又将ATC系列(16位单片机)I/O部件如高速输入/输出(HIS/HSO)、A/D转换器、脉冲宽度调制(PWM)、看门狗定时器(WDT)等移植进来构成新一代ATC89C51产品。这类产品的功能介于ATC89C51和MSC-96之间,目前已得到了较广泛的适用。

⑹片内闪烁存储器:典型产品有ATMEL公司的AT89C52单片机。其内部含有FLASH 存储器,使得存储和程序改写更加方便,从而受到了应用设计者的欢迎。

ATC89C51系列以及80C51系列单片机有多种类型,它们是具有ATC89C51内核的各种型号单片机的基础,也是各种增强型、扩展型等衍生品种的核心。

3.2 LED点阵汉字PROTUES仿真原理

3.2.1 8×8LED点阵构成16×16LED点阵

⑴从PROTUES元器件库中找出“MATRIX-8X8-RED”元器件,将4块该元器件放在文本文档区编辑窗口中。

⑵然后行线连、列线分别相连,排列LED如图3.5所示

图3.5 排列LED

⑶进一步组合靠拢,16×16LED点阵如图3.6所示

图3.6 16×16LED点阵

3.2.2 LED点阵显示系统的protues仿真

整个电路主要由单片机控制及其接口电路、驱动显示电路、电源电路、3×3矩阵键盘、16×64LED点阵等部分组成。PROTUES仿真原理图如图3.7所示

图3.7 PROTUES仿真原理图

点阵的阴极驱动是由单片机的P0口经过2片输出缓存器74LS237向16×64LED点阵输出字型码作为行驱动信号。点阵的阳极驱动由单片机P0口经过1片输出缓存器74LS237,再经过4-16线译码器74HC154译码后输出列选信号,对16×64LED点阵进行列扫描,1片74HC154控制4个8×8LED,因此需要4片74HC154,在进行汉字分批显示输出时采用逐列扫描方式。

LED点阵显示系统由LED单片机P1口连接3×3矩阵键盘,通过键盘扫描控制LED

点阵显示屏汉字的左右移动方向、移动速度、不同汉字间的切换、暂停等。

16×64LED显示屏通过键盘控制左移显示汉字字符“通信学院电子信息工程”、“祝天下有情人终成眷属”、“浮名本是身外物”,右移显示“通信学院电子信息工程”、“不着分寸也风流”、“祝天下有情人终成眷属”、“世事如棋,乾坤莫测,笑尽英雄”。这些汉字可通过建立数据表格的形式进行,通过16×16点阵汉字字模提取软件,可提取各显示汉字的字模数据。通过列扫描方式把字符码传给LED点阵显示屏。某一时刻,只有L行或L列发光二极管被对应的字模数据驱动点亮,但只要扫描间隔时间合适(一般为数毫秒),利用人眼的视觉暂留特性,看上去整批字符就显示在LED点阵显示器上。

3.2.3LED点阵系统显示仿真结果

(1)右移显示“祝天下有情人终成眷属”,仿真结果如图3.1所示

图3.1 右移显现“祝天下有情人终成眷属”

(2)左移显示“世事如棋,乾坤莫测,笑尽英雄!”,仿真结果如图3.2所示

图3.2 左移显示“世事如棋,乾坤莫测,笑尽英雄!”

3.3 LED点阵显示系统硬件电路设计

3.3.1 单片机最小系统设计

单片机AT89C51最小系统应该有电源,复位电路,时钟振荡电路。下面是单片机最小系统时钟、复位电路简介:

(1)时钟源电路

单片机内部具有一个高增益反相放大器,用于构成振荡器。通常在引脚XTALL和XTAL2跨接石英晶体和两个补偿电容构成自激振荡器,可以根据情况选择6MHZ、12MHZ

或24MHZ等频率的石英晶体,补偿电容通常选择30PF左右的瓷片电容。

(2)复位电路

单片机小系统采用上电自动复位和手动按键复位两种方式实现系统的复位操作。上电复位要求接通电源后,自动实现复位操作。手动复位要求在电源接通的条件下,在单片机运行期间,用按钮开关操作使单片机复位。本次采用手动按键复位。

3.3.2 3×3矩阵键盘

把所有按键排列成行列矩阵形式的键盘,选用P1端口中的P1.4~P1.6为四根行线,P1.0~P1.2为四根列线,行线和列线的交叉处放置一按键,当健按下时行列线接通,构成一个3×3的矩阵键盘,可定义9个按键。80C51的I/O口具有输出锁存和输入缓冲的功能,因而用它们组成键盘电路时,可以省掉输出锁存器和输入缓冲器。

⑴该LED点阵显示系统的键盘由ATC89C51单片机本身的P1口来构成3×3矩阵

式键盘。LED点阵屏的3×3矩阵式控制键盘:

S1、S4、S7:控制右移字体显示速度,S1最快,S7最慢;

S3、S6、S9:控制左移字体显示速度,S3最快,S9最慢;

S2:切换不同的左移显示汉字;

S8:切换不同的右移显示汉字;

S5:暂停。

⑵键盘扫描过程

1).判断是否有键按下

2).键盘消抖

3).再次判断是否有键按下

4).识别键码

3.3.3 LED点阵显示模块

16×64LED点阵显示驱动

点阵的阴极驱动是由单片机的P0口经过2片输出缓存器74LS237向16×64LED 点阵输出字型码作为行驱动信号。点阵的阳极驱动由单片机P0口经过1片输出缓存器74LS237。

4 软件程序设计

4.1 LED点阵系统主程序流程图

LED点阵系统主程序流程图如图4.1所示

N

图4.1 主程序流程图4.2 LED点阵系统主程序关键代码

void main()

{

while(1)

{

uchar s=1;

while(s)

{P1=0x70;

if(P1!=0x70)

{s=0;

key=key_scan();

}

}

while(!s)

{P1=0x70;

if(P1==0x70) s=1;

}

switch(key)

{

case 1:

case 2:

case 3:

youyi();

break;

case 9:

case 8:

case 7:

zuoyi();

break;

case 4:

r++;

if(r==3)r=0;

break;

case 5:

zanting();

break;

case 6:

l++;

if(l==4)l=0;

break;

}

}

}

4.3 3×3的矩阵键盘扫描流程图

矩阵键盘扫描程序如图4.2所示

|

图4.2 矩阵键盘扫描程序4.4 3×3的矩阵键盘扫描程序

unsigned char key_scan() {

unsigned char i,j,key;

P1=0x70;

while(P1!=0x70)

{delay(10);

P1=0x70;

while(P1!=0x70)

{

for(i=0;i<=2;i++)

{

P1=ksp0[i];

if(P1!=ksp0[i]) break;

}

for(j=0;j<=2;j++)

{

P1=ksp1[j];

if(P1!=ksp1[j]) break;

}

key=i*3+j+1;

return(key);

}return(0);

}return(0);

}

总结

经过了两个多月的查阅资料、学习和实践,终于完成了《LED点阵广告牌的设计》的设计。从开始接触LED点阵显示系统时的一片茫然,无从下手,到LED点阵系统仿真、PCB板设计、焊接调试、再到论文的完成,对我来说每一步都是新的尝试与挑战。这是大学四年中我唯一一次独立完成设计、焊接、调试。学到了知识的同时也锻炼了自己查阅资料、自学知识、遇到问题时提出问题解决问题的能力。此外,整个设计过程中悲喜交加,有时遇到问题整夜冥思苦想,偶尔梦到自己在做毕业设计,经过不断地学习、多次尝试解决问题之后,往往给自己带来无比的兴奋。

毕业论文是本科学习阶段一次非常难得的理论与实际相结合的机会,通过这次比设计,我摆脱了单纯的理论知识学习状态,和实际设计的结合锻炼了我的综合运用所学的专业基础知识,同时也提高我查阅文献资料和电脑制图等能力水平,而且通过多次去电子市场,都使我的能力得到了锻炼,经验得到了丰富。这是我们都希望看到的也正是我们进行毕业设计的目的所在。

这次做论文的经历也会使我终身受益,我感受到做论文是要真真正正用心去做的一件事情,是真正的自己学习的过程和研究的过程,没有学习就不可能有研究的能力,没有自己的研究,就不会有所突破,那也就不叫论文了。希望这次的经历能让我在以后学习中激励我继续进步。

附录Ⅰ. LED点阵显示系统电路图

图一LED点阵显示系统电路图

附录Ⅱ. LED点阵显示系统主要程序

#include #include #define uchar unsigned

char

#define uint unsigned

int

#define hang0 XBYTE[0X7FFF]

#define hang1 XBYTE[0XbFFF]

#define lie XBYTE[0XDFFF]

uchar key=0,l=0,r=0; unsigned char key_code[]={0x79,0x24 ,0x30,0x19,0x12,0x02, 0x78,0x00,0x10}; uchar

ksp0[3]={0x76,0x75,0x 73};

uchar

ksp1[3]={0x37,0x57,0x 67};

void delay(uchar); uchar key_scan();

void youyi();

void zanting();

void kaishi();

void zuoyi();

char code *tabler; char code *tablel;

/**********************字符码略**************************** ***/

/************************mi an

funcation***************** ********/

void main()

{

while(1)

{

uchar s=1;

while(s)

{P1=0x70;

if(P1!=0x70)

{s=0;

key=key_scan();

}

}

while(!s)

{P1=0x70;

if(P1==0x70)

s=1;

}

switch(key)

{

case 1:

case 2:

case 3:

youyi();

break;

case 9:

case 8:

case 7:

zuoyi();

break;

case 4:

r++;

if(r==3)r=0;

break;

case 5:

zanting();

break;

case 6:

l++;

if(l==4)l=0;

break;

}

}

}

//键盘扫描

unsigned char

key_scan()

{

unsigned char

i,j,key;

P1=0x70;

while(P1!=0x70)

{delay(10);

P1=0x70;

while(P1!=0x70)

{

for(i=0;i<=2;i++)

{

P1=ksp0[i];

if(P1!=ksp0[i]) break;

}

for(j=0;j<=2;j++)

{

P1=ksp1[j];

if(P1!=ksp1[j]) break;

}

key=i*3+j+1;

return(key);

}return(0);

}return(0);

}

/*********************dela y time funcation***************** *******/

void delay(uchar c)

{

uchar i;

for(i=0;i

}

void zuoyi()

{

uint b=0; //显示偏移控制,char类型最多只能显示14个汉字+一个空白位字符

uchar a=0; //控制移动间隔时间

uchar i,j,k; //i:每个字的显示循环;

j每个字的显示码除以

2;k每列刷新次数

uchar m,n;

m=key;

if(m==7)n=2;

else

if(m==8)n=4;

else if

(m==9)n=5;

else n=5;

if(l==0)tablel=table

l1;

else

if(l==1)tablel=tablel2;

else

if(l==2)tablel=tablel3;

else

if(l==3)tablel=tablel4;

while(1)

{

j=0;

if(a==6)

//移动间隔时间;取值

0--255

{ a=n;

b+=2;

key=0;

key=key_scan();

if(key!=0)

return;//unsigned char

n;

if(b==448) //显

示到最后一个字,回头显

示,判断值=字数*32

{

b=0;

for(i=0;i<64;i++)

{

lie=i;

//for(;j

//{

hang0=0x00;

//清屏

hang1=0x00;

//hang0=0x00;

//hang1=0x00;

//}

}

}

}

for(i=0;i<64;i++)

{

lie=i;

for(k=0;k<5;k++)

{

hang0=tablel[j+b];

hang1=tablel[j+b+1 ];

hang0=0x00;

//清屏

hang1=0x00;

}

j+=2;

}

a++;

}

}

void youyi()

{

uchar i,j,k; //i:每个字的显示循环;j每个字的显示码除以2;k每列刷新次数

uint b=448; //显示偏移控制,char类型最多只能显示14个汉字+一个空白位字符

uchar a;

uchar m,n;

m=key;

if(m==1)n=2;

else if(m==2)n=4;

else if

(m==3)n=5;

//控制移动间隔时间

else n=5;

if(r==0)tabler=tabl

er1;

else

if(r==1)tabler=tabler2;

else

if(r==2)tabler=tabler3;

while(1)

{

j=0;

if(a==6)

//移动间隔时间;取值

0--255

{

a=n;

b-=2;

key=0;

key=key_scan();

if(key!=0) return;

if(b==0) //显示

到最后一个字,回头显

示,判断值=字数*32

{

b=448;

for(i=0;i<64;i++)

{

lie=i;

hang0=0x00;

//清屏

hang1=0x00;

}

}

}

for(i=0;i<64;i++)

{

lie=i;

for(k=0;k<5;k++)

{

hang0=tabler[j+b];

hang1=tabler[j+b+1

];

hang0=0x00;

//清屏

相关主题
相关文档
最新文档