单片机课程设计LED点阵屏滚动.docx
- 文档编号:23521042
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:15
- 大小:108.05KB
单片机课程设计LED点阵屏滚动.docx
《单片机课程设计LED点阵屏滚动.docx》由会员分享,可在线阅读,更多相关《单片机课程设计LED点阵屏滚动.docx(15页珍藏版)》请在冰豆网上搜索。
单片机课程设计LED点阵屏滚动
《单片机原理与接口》
课程设计报告
题目:
点阵LED显示屏
专业名称:
通信工程
班级:
1
学号:
姓名:
2015年1月
1设计目标
设计一个16×16的LED点阵显示屏可想死图形和文字,显示图形和文字应稳定,清晰,个点亮度均匀。
3设计原理及方案
3.1设计原理
LED点阵显示系统中各模块的显示方式:
有静态和动态显示两种。
不论显示图形还是文字,只要控制与组成这些图形或文字的各个点所在的位置相对应的LED器件发光,就可以得到我们想要的显示结果,这种同时控制各个发光点亮灭的方法称为静态驱动显示方式,静态显示原理简单、控制方便,但硬件接线复杂,在实际应用中一般采用动态显示方式。
动态显示采用扫描的方式工作,由峰值较大的窄脉冲电压驱动,从上到下逐次不断地对显示屏的各行进行选通,同时又向各列送出表示图形或文字信息的列数据信号,反复循环以上操作,就可显示各种图形或文字信息。
动态扫描显示方式巧妙地利用了人眼的视觉暂留特性。
将连续的几帧画面高速的循环显示,只要帧速率高于24帧/秒,人眼看起来就是一个完整的,相对静止的画面。
最典型的例子就是电影放映机。
在电子领域中,因为这种动态扫描显示方式极大的缩减了发光单元的信号线数量,因此在LED显示技术中被广泛使用。
下面以16x16的点阵来说明动态扫描,把所有同1行的发光管的阳极连在一起,把所有同1列的发光管的阴极连在一起(共阳极的接法),先送出对应第一行发光管亮灭的数据并锁存,然后选通第1行使其燃亮一定时间,然后熄灭;再送出第二行的数据并锁存,然后选通第2行使其燃亮相同的时间,然后熄灭;以此类推,第16行之后,又重新燃亮第1行,反复轮回。
当这样轮回的速度足够快,就能够看到显示屏上稳定的图形了。
3.2设计方案
本文主要讲述的是“LED点阵字符显示电路”,本课题的实现主要有两种方案。
方案一:
由数字电路来实现,由移位寄存器与锁存器对字符数据进行存储,然后并行输入到显示屏,来实现汉字的显示。
方案二:
由单片机编程控制来实现,方案利用单片机控制移位寄存器和译码器,由移位寄存器和译码器送出行选和列选来控制LED屏的亮灭,从而显示汉字。
方案论证:
不难看出,选用数字电路来实现比较复杂。
因为用数字电路实现必须要有移位寄存器与锁存器对字符数据进行存储,然后并行输入到显示屏,不但如此,而且需要很大一部分的扩展电路才能实现。
用数字电路实现不但大大提高成本,而且设计出的电路的灵活性差、不易调试、成本高等缺点。
方案二不仅能够改进方案一设计的不灵活,还可进行扩展。
通过比较,从设计方案的优点及所设计的方便实用性,选择第二种设计方案。
4硬件设计
4.1设计总体框图及介绍
LED点阵总体框图如图4-1所示,点阵电路大体上可以分成微机本身的硬件、显示驱动电路、控制信号电路三部分。
控制电路部分包括一个51CUP和一些外围电路。
点阵包括显示屏体、以及它的行和列的各个驱动电路。
此显示电路采用扫描方式进行显示时,每行有一个行驱动器,从第一行开始,按顺序依次对各行进行扫描。
另一方面,根据各列锁存的数据点亮相应的LED。
图4-1点阵显示总体框图
4.2芯片简介
(1)单片机AT89C52
引脚图(如图4-2):
图4-2AT89C52
AT89C52有四个I/O口,每个口有8位,具有3个可编程定时器,串行口是全双工可编程串行通信口,片内数据存储器有256KB的RAM。
(2)移位寄存器74LS595
引脚图(如图4-3):
图4-374LS595
74LS595是一款集电极开路输出的移位寄存器,输出端口为可控的三态输出端,亦能串行输出控制下一级级联芯片。
11脚SH_CP是数据输入时钟线,上升沿有效。
12脚ST_CP输出存储器锁存时钟线,上升沿有效。
13脚OE输出使能,低电平为输出有效。
14脚DS数据线,串行输入数据,亦能串行输出数据到下一级级联芯片。
4.3硬件电路设计
(1)单片机时钟和复位
如图4-4所示,XTAL1和XTAL2接有一个晶振,再接两个电容到地,形成时钟电路。
接有电容和开关实现上电复位和手动复位。
图4-4时钟和复位
(2)行驱动电路
如图4-5所示,由P3口低四位控制译码器的四个输入端,输出端接有十六个反相器,因为点阵连接形式是共阳的,将译码器输出的低电平转化为高电平。
这十六个输出接到点阵屏上,控制点阵十六行的显示。
图4-5行驱动
(3)列驱动电路
如图4-6所示,接有2块74LS595,来控制点阵屏的16列。
因为每个汉字需要4个8*8的LED点阵,把这4个8*8的LED点阵拼在一起构成一个16*16的点阵来显示一个汉字,所以需要2个74LS595来驱动一个汉字。
以下8个来驱动4个汉字,显示在点阵屏的第一行。
图的连接就是将引脚SH_CP、ST_CP、DS与单片机相接,由P2口的引脚控制,74LS595的Q0~Q7输出数据到点阵屏,Q7’用来级联,接到下一块的DS上。
图4-6列驱动
(4)点阵屏
如图4-7所示,整块点阵屏4个8*8的LED点阵拼在一起构成一个的点阵。
。
图4-7点阵屏
(5)总电路图
如图4-8所示,除上述部分电路的叙述外,现将各个电路模块合在一起。
图中有1个74HC154译码器,输出16行来控制点阵屏的16行。
总共用了2块74LS595,图中点阵屏上方的8个是用来控制点阵屏第一行汉字的显示,点阵屏下方的8个是用来控制点阵屏第二行汉字的显示。
此外还用到AT24C512B,用作掉电保护芯片,不过没能真正实现其功能,只是体验了这块芯片的使用,将在心得中具体讲述。
图4-8总图
5软件设计
5.1程序流程图
本文设计的系统在目测条件下LED显示屏各点亮度均匀、充足,可显示图形和文字,显示图形和文字应稳定、清晰无串扰,实现21个文字循环滚动显示。
系统主程序开始以后,首先是对系统环境初始化,然后将数据写入74LS595,之后将74LS595中的数据输出到点阵屏的列上,接着是译码器控制行点亮,由此构成一个循环。
最后不断重复主程序的执行。
主程序如图5-1所示:
图5-1系统主程序流程图
6调试结果
本设计系统是在Protues软件中仿真调试的,按照要求连接好电路图后,用Keil软件生成Hex文件,将它写入单片机中,点击仿真软件中的运行按钮,即可看到仿真结果。
下面截有两个图来体现动态的显示过程。
分别如图6-1和图6-2所示:
图6-1头显示
图6-2末显示
7收获和体会
经过几天的努力,终于完成了一个还算可以的设计,看着自己的劳动成果,觉得还好,遗憾的就是自己做了很久的掉电保护程序还是没能实现其功能,刚开始做这块时,我是根据自己以前学过AT24C02芯片的知识,把掉电保护程序整合到主程序中,显示结果只有一些零散的点在循环闪动,经过调试我知道是自己把掉电程序和点阵显示程序一起执行的原因,由于AT24C02芯片读写时间过长,导致点阵不能快速显示。
后来我将掉电程序单独执行,将数组中所有元素先存储进芯片,等了很久,点阵屏上才有显示,这就是在等待AT24C02芯片读写结束。
不过不知哪里有问题,将数组存入再读出,显示到点阵屏的已不是原来的字。
接着在网上查找了一些资料,没有找到比较有用的资料,所以只好自己思考,可是没能解决,具体程序将放在文件夹中。
这次设计让我知道了自学能力的重要性,期间遇到的许多问题,都需要自己通过XX查找慢慢解决。
我的设计有不足之处,希望老师批评指正,下次一定会做得更好。
8附录
源程序及说明:
#include
#define uchar unsigned char
#define uint unsigned int
uchar yid,h;
//YID为移动计数器,H为行段计数器
uint zimuo;
//字模计数器
uchar code hanzi[];
//汉字模板
uchar BUFF[18];
// 缓存
void in_data(void);
//调整数据
void rxd_data(void);
//发送数据
void sbuf_out();
// 16段扫描
uchar code table[]={
0x08,0x08,0x10,0x04,0x20,0x02,0xFC,0x1F,0x84,0x10,0x84,0x10,0xFC,0x1F,0x84,0x10,
0x84,0x10,0xFC,0x1F,0x80,0x00,0x80,0x00,0xFF,0x7F,0x80,0x00,0x80,0x00,0x80,0x00,/*"单",0*/
0x00,0x02,0x08,0x02,0x08,0x02,0x08,0x02,0x08,0x02,0xF8,0x3F,0x08,0x00,0x08,0x00,
0x08,0x00,0xF8,0x07,0x08,0x04,0x08,0x04,0x08,0x04,0x04,0x04,0x04,0x04,0x02,0x04,/*"片",1*/
0x08,0x00,0x88,0x0F,0x88,0x08,0x88,0x08,0xBF,0x08,0x88,0x08,0x8C,0x08,0x9C,0x08,
0xAA,0x08,0xAA,0x08,0x89,0x08,0x88,0x48,0x88,0x48,0x48,0x48,0x48,0x70,0x28,0x00,/*"机",2*/
0x00,0x00,0xC2,0x1F,0x44,0x12,0x44,0x12,0xC0,0x1F,0x40,0x12,0x47,0x12,0xC4,0x1F,
0x04,0x02,0xE4,0x3F,0x04,0x07,0x94,0x0A,0x4C,0x12,0x24,0x62,0x00,0x02,0x00,0x02,/*"课",3*/
0x10,0x00,0xB8,0x3F,0x8F,0x20,0x88,0x20,0x88,0x20,0xBF,0x3F,0x08,0x00,0x0C,0x00,
0x9C,0x7F,0x2A,0x04,0x2A,0x04,0x89,0x3F,0x08,0x04,0x08,0x04,0xC8,0x7F,0x08,0x00,/*"程",4*/
0x00,0x00,0x84,0x0F,0x88,0x08,0x88,0x08,0x80,0x08,0x40,0x70,0x2F,0x00,0xC8,0x1F,
0x88,0x10,0x88,0x08,0x08,0x09,0x28,0x05,0x18,0x02,0x08,0x05,0xC0,0x18,0x30,0x60,/*"设",5*/
0x00,0x02,0x04,0x02,0x08,0x02,0x08,0x02,0x00,0x02,0x00,0x02,0xEF,0x7F,0x08,0x02,
0x08,0x02,0x08,0x02,0x08,0x02,0x08,0x02,0x28,0x02,0x18,0x02,0x08,0x02,0x00,0x02,/*"计",6*/
};
void main(void)
{
uchar i,d=10;
yid=0;
zimuo=0;
while
(1)
{
while(yid<16) //数据移位
{
for(i=0;i { sbuf_out(); } yid++; //移动一步 } yid=0; zimuo=zimuo+32; //后移一个字 if(zimuo>=192) //到最后从头开始,有字数决定 zimuo=0; } } /********************************/ void sbuf_out() { for(h=0;h<16;h++) //16行扫描 { in_data(); //调整数据 rxd_data(); //串口发送数据 P1=0x7f; //关闭显示 P1_7=1; //锁存为高,595锁存信号 P1=h; //送行选 } } /******************************************************/ void in_data(void) { char s; for(s=2;s>=0;s--) //h为向后择字节计数器,zimuoo为向后选字计数器 { BUFF[2*s+1]=table[zimuo+1+32*s+2*h]; //把第一个字模的第一个字节放入BUFF0中 ,把第二个字模的第一个字节放入BUFF2中 , BUFF[2*s]=table[zimuo+32*s+2*h]; // 把第一个字模的第二个字节放入BUFF1中 ,把第二个字模的第二个字节放入BUFF3中 } } /*******************************************************/ void rxd_data(void) //串行发送数据 { char s; uchar inc,tempyid,temp; if(yid<8) inc=0; else inc=1; for(s=0+inc;s<2+inc;s++) //发送2字节数据 { if(yid<8) tempyid=yid; else tempyid=yid-8; temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid)); //左移 _tempyid位后和h2右移 _8-tempyid相或,取出移位后的数据 SBUF=temp; //把BUF中的字节从大到小移位相或后发送输出 while(! TI); //注;这里使用了串口,把串口数据的发送为最低位在前 TI=0; //等待发送中断 } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 LED 点阵 滚动