基于单片机的led单色显示屏控制系统设计毕业论文内容摘要:

电路的设计 单片机 P2 口低 4 位输出的行选信号经 74LS244 八 位数据 缓冲器 将数据缓冲后送往 3/8 译码器 74LS138 译码的输入端,生成 8 条行选通信号线,再经过 SN7406 六 路高 电 压输出反相器 将信号取反后使 IRF540 导通再去驱动对应的行 LED 显示。 其硬件电路如图 所示: A1B2C3G 2 A4G 2 B5G16Y77Y69Y510Y411Y312Y213Y114Y015U27 4 L S 1 3 89 8U 3 DS N 7 4 0 611 10U 4 ES N 7 4 0 65 6U 3 CS N 7 4 0 63 4U 3 BS N 7 4 0 61 2U 3 AS N 7 4 0 613 12U 4 FS N 7 4 0 63 4U 4 BS N 7 4 0 61 2U 4 AS N 7 4 0 61G1A121 Y 118A241 Y 216A361 Y 314A481 Y 4122G19B1112 Y 19B2132 Y 27B3152 Y 35B4172 Y 43U 3 87 4 L S 2 4 4ABCY 1 0SESY 1 1ABCEI R F 1Y0Y1Y2Y3Y4Y5Y6Y7Y01 2 3 4 5 6 7 8 9RR13 .3 kQ1I R F 5 4 0Q2I R F 5 4 0Q3I R F 5 4 0Q4I R F 5 4 0Q5I R F 5 4 0Q6I R F 5 4 0Q7I R F 5 4 0Q8I R F 5 4 0IRF1IRF2IRF3IRF4IRF5+ 3 . 3IRF6h a n g 1IRF7h a n g 2IRF8h a n g 3h a n g 4h a n g 8+9I R F 1I R F 2I R F 3I R F 4I R F 5I R F 6I R F 7I R F 8h a n g 5h a n g 6h a n g 7I R F 2I R F 3I R F 4I R F 5I R F 6I R F 7I R F 8Y1Y2Y3Y4Y5Y6Y7 图 点阵显示屏行驱动硬件原理图 12 3— 8 线译码器 74LS138 我们前面的列驱动电路里面只是用了单片机的串口跟 P1 口,还剩下 P0 以及 P2口可以直接接到 8个 LED 的行选端,但是为了整个大屏幕方便以后扩展控制,防止直接驱动损坏单片机以及隔离外界干扰信号,使用了 74LS138 这个 3— 8 译码器作为行选芯片。 74LS138 译码器的引脚图,逻辑图及真值表如下图 、图 : 图 74LS138 的外部引脚图 以及内部原理图 图 3线 8 线译码器 74LS138 的真值表 由上看以看出,只要在信号输入端 A, B, C 输入特定组合的 0 的组合序列, 13 就可以在输出端轮只有一个流输出低电压 0,这样我们就可以有选择的控制行电路。 六 路 高 电 压输出反相器 SN7406 由于我们的 74LS138 输出的行选信号是低电平,而驱动 IRF540N 时必须在 G端接比 D端高 3V以上的电压才能导通,所以我们加了 SN7406这个 六 路 高 电 压输出反相器 ,图 是它的外部管脚图,图 SN7406 则是它一路输入输出的内部原理图: 当输入端 A输入低电压时,在对应的输出端 Y 就会输出高电压。 大电流 MOSFET管 IRF540 IRF540 是一个 28A 100V 的 N沟道的 MOSFET 管, Rds(on )= , Vgd=100V,它的原理图如下图 ,当 G端有高电平时, DS之间就导通,电流从 D 端流向S端。 因为一条行线上要带动 128 列的 LED 进行显示,按每一 LED 器件 20mA 电流计算,128个 LED同时点亮时,需要 2560mA 即 电流,所以选用 IRF540 作为驱动管,它的最大工作电流可达 28A,所以不需要加散热既可稳定工作。 图 IRF540 内部原理及管脚图 14 八 位数 据 缓冲器 74LS244 我们为了隔离外界的干扰信号,使用了 74LS244 八 位数据 缓冲器。 因为任何时候74HC595 里面的数据是不确定的,只要显示屏只要稍微有一点外界干扰,导致 74LS138使能端 E 变低, 74LS138 就是会有输出信号的(通过它的真值表可以看到全 0 全 1都有一行是被选中输出低电位的), SN7406 就输出高电位, IRF540 被电阻拉到高电平这样显示屏就显示一些不确定的图案,就不符合我们的设计要求了。 74LS244 是一个常用的 八缓冲器 ,它的管脚图以及控制表如图 所示: 小结 本章介绍了硬 件的连接方法以及原理,并且包含了部分电路图,此电路已经试验证明可以显示汉字信息,并且可动态显示,其中运用了 74HC595 以及 74LS244 芯片,74HC595 的功能是串入并出,并且带有锁存和移位的功能;而 74LS244 的作用就是完全屏蔽掉外界的干扰,只有单片机发出的正确的信号才被它选择通过,一般的电路干扰,电磁干扰不会对显示屏造成乱码。 而行驱动则是使用了 3- 8 线译码器 74LS138驱动 六 路 高 电 压输出反相器 SN7406,用 SN7406 再驱动 IRF540 大电流低电阻的 N沟道场效应管,因为如果用单片机直接连接 LED点阵,引脚不够,同时驱动能力也不行,而用了这个译码器,可以节省引脚,并且方便以后扩展。 15 3 系统软件设计 显示屏软件的主要功能是向显示屏提供显示数据,并产生各种控制信号,使屏幕按设计的要求显示。 根据软件分层次设计的原理,可把显示屏的软件系统分成两大层:第一层是底层的显示驱动程序,第二层是上层的系统应用程序。 显示驱动程序负责向点阵屏传送特定组合的显示数据,并负责产生行扫描信号和其它控制信号,配合完成LED显示屏的扫描显示工作。 显示驱动程序由显示子程序实现;系统环境设置 (初始化 )由系统初始化程序完成;显示效果处理 等工作,则由主程序通过调用子程序来实现。 显示驱动程序 然后显示驱动程序查询当前燃亮的行号,从显示缓存区内读取下一行的显示数据,并通过串口发送给移位寄存器。 为消除在切换行显示数据的时候产生拖尾现象,驱动程序先要关闭显示屏,即消隐,等数据发送完毕后输出 74HC595 的锁存信号,将显示数据打入输出锁存器并锁存,然后再输出新的行号,并打开显示。 图 为显示驱动程序 (显示屏扫描函数 )流程图。 图 显示驱动程序流程图 系统主程序 系统主程序开始以后,首先是对系统环境初始化,包括设置串口,端口以及一些 16 参数 ;然后以分屏效果显示“勤奋求实开拓创新桂林工学院电子与计算机系毕业设计电子信息工程 023 班张涛制作。 谢谢各位老师。 ”;关闭屏 3 秒钟,再静止显示“勤奋求实开拓创新”停留约 3秒,接着开始左跑马滚动显示“勤奋求实开拓创新桂林工学院电子与计算机系毕业设计电子信息工程 023 班张涛制作。 谢谢各位老师。 ”。 设置系统程序不断地循环执行上述显示效果。 图。 图 系统主程序流程图 部分源程序 分屏显示子程序 以下是 32x64 点阵 LED 电子 显示屏的源程序,采用 C 语言编写,在 Keil μ( )以及 MedWin 版环境下均测试通过。 /**********分屏显示 ***********/ void fen(void) { do{ xianshi()。 }while(xx++=5)。 //调用单屏显示 xx=0。 } /************单屏显示 *************/ void xianshi(void) { unsigned char ii,jj。 unsigned int kk,aa。 for (kk=500。 kk0。 kk) //每屏显示 500次 开始 系统初始化 分屏显示 左移显示 17 {for(ii=1。 ii16。 ii+=2) //每个汉字分 8行扫描 {for (jj=0。 jj8。 jj++) //每次要发送 8个汉字的 2个字节 ,发送 8次 { aa=(xx*8+jj)*32+ii。 out_rxd(amp。 hanzi[aa])。 //从串口输出第 1个字的第 1字节。 out_rxd(amp。 hanzi[aa1])。 //从串口输出第 1个字的第 1字节。 } for (jj=0。 jj8。 jj++) //每次要发送 8个汉字的 2个字节 ,发送 8次 { aa=(xx*8+jj)*32+ii。 out_rxd(amp。 hanzi[aa+16])。 //从串口输出第 1个字的第 17字节。 out_rxd(amp。 hanzi[aa+15])。 //从串口输出第 1个字的第 18字节 } P2=0x0ff。 P1=0xff。 P1=0。 //锁存为高, 74HC595 锁存信号 P2=sw[h]。 //输出行信号 h++。 //行加一 if(h==8)h=0。 } } } /*************分屏显示的数据发送 ************/ void out_rxd(unsigned char *d) /*从串口发送数据 */ { SBUF=*d。 while(!TI)。 //等待发送完毕 TI=0。 } 左移显示子程序 void zuo(void) { unsigned char i,d=5。 while(zimo=1200) { while(yid16) //数据移位。 { for(i=0。 id。 i++) //移动速度 {for(h=0。 h8。 h++) //8行扫描 18 { in_data()。 //调整数据 rxd_data()。 //串口发送数据 P2=sw[h]。 //送段码 P1=0xFF。 //锁存为高, 595 锁存信号 P1=0。 } } yid++。 //移动一步 } yid=0。 zimo=zimo+32。 //后移一个字, } qing()。 zimo=0。 } /***********读取数据 ***********/ void in_data(void) {char s,w。 unsigned int qqq。 for(s=8。 s=0。 s) { w=s+s。 qqq=zimo+h+h+s*32。 BUFF[w+1]=hanzi[qqq]。 BUFF[w]=hanzi[qqq+1]。 BUFF2[w+1]=hanzi[qqq+16]。 BUFF2[w]=hanzi[qqq+17]。 } } /**************调整数据并发送 *******************/ void rxd_data(void) //串行发送数据 {char s。 unsigned char inc,tempyid,temp。 19 if(yid8) inc=0。 else inc=1。 for(s=0+inc。 s16+inc。 s++) //发送数据 { if(yid8) tempyid=yid。 else tempyid=yid8。 temp=(BUFF[s]tempyid)|(BUFF[s+1](8tempyid))。 SBUF=temp。 //把 BUFF 中的字节从大到小移位相或后发送输出。 while(!TI)。 TI=0。 //等待发送中断 } for(s=0+inc。 s16+inc。 s++) //发送 8字节数据 { if(yid8) tempyid=yid。 else tempyid=yid8。 temp=(BUFF2[s]tempyid)|(BUFF2[s+1](8tempyid))。 SBUF=temp。 //把 BUFF 中的字节从大到小移位相或后发。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。