单片机课程设计1616 LED广告屏Word下载.docx
《单片机课程设计1616 LED广告屏Word下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计1616 LED广告屏Word下载.docx(11页珍藏版)》请在冰豆网上搜索。
二、单片机组成部分
图1系统结构框图
三、硬件电路设计
本电路是由AT89C51单片机为控制核心,低功耗;
时钟源电路有很多种,比如阻容低速时钟源、普通晶体时钟源、带缓冲放大的晶体时钟源等等,考虑到电路稳定及材料选购等方面,决定采用普通晶体时钟源,其中晶体用12MHZ的石英晶振;
复位电路结合实际应用功能的实现,采用上电复位;
显示部分由16×
16点阵LED显示屏显示;
行驱动电路采用74LS154,列驱动电路采用74LS595。
四、16×
16点阵LED显示屏上滚屏显示原理
在UCDOS中文宋体字库中,每一个字由16行16列的点阵组成显示。
如果要在16×
16点阵屏以上滚屏的方式显示以字体,则需以以下方式进行显示。
在16×
16点阵屏中,我们可以把点阵屏看成16行LED组成,且每行有16个LED灯。
在本例中单片机首先将第二行的显示信息给第一行,使第一行显示图像变成第二行所要显示的。
以“我”字为例,原第一行由左到右排列,为A灭,B灭,C灭,D灭,E灭,F亮,G亮,H灭,I灭,J亮,K灭,M灭,N灭,O灭,P灭。
即二进制111110*********1转换为16进制为F9h,BFh。
原第二行由左到右排列,为A灭,B灭,C亮,D亮,E亮,F灭,G灭,H灭,I灭,J亮,K灭,L亮,M灭,N灭,O灭,P灭。
即二进制110001*********1转换为16进制为C7h,Afh。
单片机将第二行信息给第一行取代第一行原信息,故第一行由左到右排列,为A灭,B灭,C灭,D灭,E灭,F亮,G亮,H灭,I灭,J亮,K灭,L灭,M灭,N灭,O灭,P灭。
接着将第一行的信息给第十六行,第三行的信息给第二行,第四行的信息给第三行,依此类推。
按照这个方法,继续进行下面的扫描。
最终点阵屏在视觉上的显示效果是“我”字慢慢往上移。
五、16×
16点阵LED显示屏左跑马显示原理图
图2中断原理图3调用子程序原理
图4显示驱动程序流程图图5系统主程序流程图
附录
附录1:
电路图
图6总电路图
图774LS154行驱动模块
图82个74HC595级联
附录二:
实验仪器清单
1、51单片机开发板
2、LED灯256个及配套灯座256个
3、三极管8550二十个
4、排针40个
5、杜邦线、导线若干条
6、74HC589芯片及配套芯片座2套
7、芯片74LS154及配套芯片座1套
8、电阻47Ω16个,200Ω16个
附录三:
系统程序清单
#include<
reg51.h>
#defineBLKN2//列锁存器数
sbitG=0x97;
//P1.7为显示允许控制信号端口
sbitRCLK=0x96;
//P1.6为输出锁存器时钟信号端
sbitSCLR=0x95;
//P1.5为移位寄存器清○端
voiddelay(unsignedint);
//延时函数
unsignedchardatadispram[32];
//显示缓存
voidmain(void)
{
unsignedcharcodeBmp[][32]={
{
0xF9,0xBF,0xC7,0xAF,0xF7,0xB7,0xF7,0xB7,
0xF7,0xBF,0x00,0x01,0xF7,0xBF,0xF7,0xB7,
0xF1,0xD7,0xC7,0xCF,0x37,0xDF,0xF7,0xAF,
0xF6,0x6D,0xF7,0xF5,0xD7,0xF9,0xEF,0xFD
}/*我*/,
0xFF,0x07,0xC0,0x6F,0xED,0xEF,0xF6,0xDF,
0xC0,0x01,0xDD,0xFD,0xBD,0xFF,0xC0,0x03,
0xFB,0xFF,0xF8,0x0F,0xF3,0xDF,0xF4,0xBF,
0xEF,0x3F,0x9C,0xCF,0x73,0xF1,0xCF,0xFB
}/*爱*/,
0xF7,0xDF,0xF9,0xCF,0xFB,0xBF,0xC0,0x07,
0xDE,0xF7,0xC0,0x07,0xDE,0xF7,0xDE,0xF7,
0xC0,0x07,0xDE,0xF7,0xFE,0xFF,0x00,0x01,
0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF
}/*单*/,
0xFF,0xBF,0xEF,0xBF,0xEF,0xBF,0xEF,0xBB,
0xE0,0x01,0xEF,0xFF,0xEF,0xFF,0xEF,0xFF,
0xE0,0x0F,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,
0xDF,0xEF,0xDF,0xEF,0xBF,0xEF,0x7F,0xEF
}/*片*/,
0xEF,0xFF,0xEF,0x07,0xEF,0x77,0x01,0x77,
0xEF,0x77,0xEF,0x77,0xC7,0x77,0xCB,0x77,
0xAB,0x77,0xAF,0x77,0x6E,0xF7,0xEE,0xF5,
0xED,0xF5,0xED,0xF5,0xEB,0xF9,0xEF,0xFF
}/*机*/,
0xF8,0x3F,0xE7,0xCF,0xDF,0xF7,0xBF,0xFB,
0xB3,0x9B,0x73,0x9D,0x7F,0xFD,0x7F,0xFD,
0x6F,0xED,0x67,0xCD,0xB3,0x9B,0xB8,0x3B,
0xDF,0xF7,0xE7,0xCF,0xF8,0x3F,0xFF,0xFF
}/**/
};
registerunsignedchari,j,k,l;
SCON=0x00;
//串口工作模式0:
移位寄存器方式
TMOD=0x01;
//定时器T0工作方式1:
16位方式
TR0=1;
//启动定时器T0
P1=0x3f;
//P1端口初值:
允许接收、锁存、显示
IE=0x82;
//允许定时器T0中断
while
(1)
delay(2000);
//延时2秒
for(i=0;
i<
32;
i++)//显示效果:
卷帘出
dispram[i]=Bmp[5][i];
if(i%2)
delay(100);
}
delay(3000);
i<
6;
i++)//显示效果:
上滚屏
for(j=0;
j<
16;
j++)
for(k=0;
k<
15;
k++)
dispram[k*BLKN]=dispram[(k+1)*BLKN];
dispram[k*BLKN+1]=dispram[(k+1)*BLKN+1];
}
dispram[30]=Bmp[i][j*BLKN];
dispram[31]=Bmp[i][j*BLKN+1];
delay(100);
delay(3000);
左跑马
2;
for(k=1;
9;
for(l=0;
l<
l++)
dispram[l*BLKN]=dispram[l*BLKN]<
<
1|dispram[l*BLKN+1]>
>
7;
dispram[l*BLKN+1]=dispram[l*BLKN+1]<
1|Bmp[i][l*BLKN+j]>
(8-k);
}
卷帘入
dispram[i]=0x00;
/*延时函数*/
voiddelay(unsignedintdt)
{
registerunsignedcharbt;
for(;
dt;
dt--)
for(bt=0;
bt<
255;
bt++);
/*显示屏扫描(定时器T0中断)函数*/
voidleddisplay(void)interrupt1using1
registerunsignedchari,j=BLKN;
TH0=0xF8;
//设定显示屏刷新率每秒62.5帧
TL0=0x30;
i=P1;
//读取当前显示的行号
i=++i&
0x0f;
//行号加1,屏蔽高4位
do
j--;
SBUF=dispram[i*BLKN+j];
//送显示数据
while(!
TI);
TI=0;
while(j);
//完成一行数据的发送
G=1;
//消隐(关闭显示)
P1&
=0xf0;
//行号端口清○
RCLK=1;
//显示数据打入输出锁存器
P1|=i;
//写入行号
RCLK=0;
//锁存显示数据
G=0;
//打开显示