《张光飞杨之建袁欢LED线阵显示屏设计.docx》由会员分享,可在线阅读,更多相关《张光飞杨之建袁欢LED线阵显示屏设计.docx(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2013年滨州学院大学生电子设计竞赛:LED线阵显示屏设计设计报告参赛队员: 张光飞 专业: 12应电专4 参赛队员: 杨之建 专业: 12应电专4 参赛队员: 袁 欢 专业: 12应电专4 日期:2013.05.06摘 要旋转led显示屏是利用机械转动扫描的一种方式,以AT89C52单片机为核心,由键盘、驱动电路、LED显示、语音模块、超声波、12864液晶、点阵、红外控制等功能模块组成。基于题目基本要求,本系统对驱动电路和字形显示进行了重点设计。本系统大部分功能由软件来实现,吸收了硬件软件化的思想,使电路简单明了,系统稳定性大大提高。本系统不仅成功的实现了要求的基本功能,发挥部分也得完全的
2、实现,而且有一定的创能。关键字:单片机 LED旋转屏 字形显示SUMMARY The rotating LED display is a way of using the mechanical rotation scanning, AT89C52 microcontroller as the core, function by the keyboard, drive circuit, LED display, voice module, ultrasonic, 12864 liquid crystal, lattice, infrared control module. Based on th
3、e basic requirements, the system is focused on the design of the driving circuit and the font display. This system most of the functions can be realized by software, absorbed the ideas of hardware and software, so that the circuit is simple, the stability of the system is greatly improved. This syst
4、em not only to achieve the success of the basic functional requirements, play is fully realized, but also have a certain energy.Keyword: MCU LED rotary screen font display目 录摘 要21 系统设计51.1设计背景51.2结构的设计51.3模块方案比较与论证51.3.1 显示部分:61.3.2 芯片的选择:61.3.3键盘选择:61.3.4电机驱动模块:61.3.5液晶的选择:71.4创新点72系统的硬件电路设计72.1 AT
5、89C52单片机系统72.2 键盘模块82.3 led显示驱动82.4电机驱动82.5时钟和时钟电路92.6电刷92.7复位电路102.8电源电路102.9数码管,锁存器112.10超声波测距模块113 软件系统设计及实现软件设计113.1 工作原理123.2程序流程图123.3开发软件及编程语言简介133.4电路图133.5主要源程序133.5.1程序说明:134、测量及其结果分析134.1 基本部分测试与分析144.2 发挥部分测试于分析145总结146、参考文献141 系统设计1.1设计背景基于对视觉暂留效果的想象与发挥,在控制器的管理下,完成一些字形的转换与发挥功能。以及初学者对控制器
6、(单片机)的利用与实践的,以此来满足我对电子设计的热爱,与好奇之心。1.2结构的设计设计总体框图如图:数码管12864液晶点阵显示屏单片机语音控制超声波电机驱动键盘语音模块电 刷红外13个Led灯图一系统框图1.3模块方案比较与论证1.3.1 显示部分:显示部分是本次设计最核心的部分,对于LED线阵以及数码管显示有以下两种方案:方案一:静态显示,将一帧图像中的每一个二极管的状态分别用0 和1 表示,若为1 ,则表示L ED 无电流,即暗状态;若为0则表示二极管被点亮。若给每一个发光二极管一个驱动电路,一幅画面输入以后,所有L ED 的状态保持到下一幅画。对于静态显示方式,所需的译码驱动装置很多
7、,引线多而复杂,成本高,且可靠性也较低。方案二:动态显示,对一幅画面进行分割,对组成画面的各部分分别显示,是动态显示方式。动态显示方式,可以避免静态显示的问题。但设计上如果处理不当,易造成亮度低,闪烁问题。因此合理的设计既应保证驱动电路易实现,又要保证图像稳定,无闪烁。动态显示采用多路复用技术的动态扫描显示方式, 复用的程度不是无限增加的, 因为利用动态扫描显示使我们看到一幅稳定画面的实质是利用了人眼的暂留效应和发光二极管发光时间的长短, 发光的亮度等因素. 我们通过实验发现, 当扫描刷新频率(发光二极管的停闪频率) 为50Hz, 发光二极管导通时间1m s 时, 显示亮度较好, 无闪烁感.。
8、 经过上述两种方案比较, 我们采用方案二 。1.3.2 芯片的选择:方案一:采取并口输入,能更准确的控制到每一个led。使led旋转屏能呈现更好的效果。方案二:选取串口输入,但驱动力弱,对于旋转LED显示屏来说不稳定。经过上述两种方案比较, 我们采用方案一。1.3.3键盘选择:方案一:采用独立式键盘。由于各键相互独立,每个按键各接一根输入线,通过检测输入线的电平状态可以很容易的判断哪个按键被按下。此种键盘适用于按键较少或操作速度较高的场合。方案二:采用行列式键盘。它由行线和列线组成,按键位于行列的交叉点上,行线信号和列线信号分别通过两个接口和CPU相连,通过行列扫描法判定按键的位置。方案三:采
9、用并串转换。将口线数据输入到单片机的串行口,利用串行通信方式0扩展键盘接口,这样节省了IO口,但牺牲了速度。综合考虑,采用方案一与方案二的巧妙结合。1.3.4电机驱动模块:方案一:使用高耐压复合晶体管芯片ULN2003来驱动电机。方案二:使用L298N电机驱动模块。ULN2003最大工作电流为500mA,对于本系统中的直流减速电机驱动能力不足。相反,L298N电机驱动芯片工作电压高,最高工作电压可达46V,内含两个H桥的高电压电流全桥式驱动器可以很好的控制本系统中的直流减速电机。故采用方案二。1.3.5液晶的选择:方案一:带中文字库的128864 是一种具有4 位/8 位并行、2 线或3 线串
10、行多种接口方式,内部含有国标一级、二级简体 中文字库的点阵图形液晶显示模块;利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示84 行1616 点 阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块方案二:12232具有2560位显示RAM(DD RAM),即8084位 具有与68系列或80系列相适配的MPU接口功能,并有专用的指令集,可完成文本显示或 图形显示的功能设置 综合考虑,我们采用方案一的串口,既节省了IO口,和得到更多的显示信息。1.4创新点 1.4.1
11、利用电刷合理巧妙的把单片机和led灯的连接;1.4.2利用键盘控制,红外遥控,语音控制多项控制模式;1.4.3开关控制;1.4.4超声波测距离语音提示功能(当人的距离离显示屏两米之内时系统自动提示“为了您的视觉效果,请到两米以外观看,谢谢”);1.4.5数码管距离的显示以及转速的显示;1.4.6液晶、点阵、显示屏多功能显示的同步结合;2系统的硬件电路设计2.1 AT89C52单片机系统系统包括晶体振荡电路、复位开关和电源部分。下图为AT89C52单片机。系统实物 AT89C52片机2.2 键盘模块键盘模块:为了使软件编程简单,每个按键都通过一个4.7K的上拉电阻接电源VCC,按键的另一端接地。
12、当有键按下时,与该键相连的P3口的相应位变为低电平,单片机检测到该变化后即转到相应的键处理程序,同时在程序中点亮LED。模块电路如图 键盘电路2.3 led显示驱动 在单片机的IO口串联一个电阻与led相连,最后接到VCC上。当IO口为低电平时点亮led灯。2.4电机驱动L298N是直流电机和步进电机两用驱动器。分别为M1和M2。引脚A,B可用于输入PWM脉冲调制信号对电机进行调速控制。实现电机正反转更容易,输入信号IN1接高电平输入段接低电平,电机正传,反之反转。2.5时钟和时钟电路时钟是单片机的核心,相当于单片机的心脏,单片机中的晶振为11.0592M。频率决定了单片机的运行速度,波形的好
13、坏取决于单片机的稳定性,需要在晶振两个引脚接两个电容。2.6电刷在电机旋转部分与静止部分之间传导电流的主要部件之一。具有良好的滑动接触特性,对电阻率和接触电阻等也有特殊要求。2.7复位电路 为确保微机系统中电路稳定可靠工作,复位电路是必不可少的一部分,复位电路的第一功能是上电复位。VCC上电时,C充电,在10K电阻上出现电压,使得单片机复位;几个毫秒后,C充满,10K电阻上电流降为0,电压也为0,使得单片机进入工作状态。工作期间,按下S,C放电。S松手,C又充电,在10K电阻上出现电压,使得单片机复位。几个毫秒后,单片机进入工作状态。2.8电源电路由于单片机工作时有一定的电压范围,当外界电源电
14、压波动时会引起单片机复位活不正常工作。如果我们利用电池供电时,电池会随充电和放电而产生电压波动,因而不能直接给单片机供电的。为了解决这个问题需要加稳压电路。在输入直流电压和负载之间串联入一个三极管,用三极管的管压降代替稳压二极。电源模快 稳压电路管电路中的稳压电阻R。当UI或RL变化引起输出电压UO变化时,UO的变化将反映到三极管的发射结电压UBE上,引起UCE的变化,从而调整UO,以保持输出电压的基本稳定。2.9数码管,锁存器 码管是一种半导体发光器件,其基本单元是发光二极管。数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以
15、分为静态式和动态式两类。锁存器(Latch)是一种对脉冲电平敏感的存储单元电路,它们可以在特定输入脉冲电平作用下改变状态。锁存,就是把信号暂存以维持某种电平状态。锁存器的最主要作用是缓存,其次完成高速的控制其与慢速的外设的不同步问题,再其次是解决驱动的问题,最后是解决一个 I/O 口既能输出也能输入的问题。2.10超声波测距模块一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值。此时就为此次测距的时间。方可算出距离.如此不断的周期测,就可以达到移动测量的值了。3 软件系统设计及实现软件设计3.1 工作原理利用AT
16、89C52单片机作为本系统中的控制模块。LED电子显示屏显示器为主要的显示模块,把单片机内部的数据显示出来。在显示电路中,主要靠按键来实现各种显示要求的选择与切换。本次旋转led可以归纳为动态扫描和机械旋转两部分,实质就是机械转动配合起来的动态扫描技术。旋转扫描有不同的形式,但我们的显示器件只有一列,由机械转动到某一位置时就显示该位置的状态,倒下一位置又显示下一位置的状态,即一列图像完成全部图像的显示,扫描过程由电机转动更换位置来实现的。在显示转动时,显示内容的稳定与否取决于与led发光时间的配合精度,所以用到了定时器和延时中断的程序的高度调节来得以实现,并且我们外加了12864液晶、点阵显示
17、屏等功能更能支直观的与旋转LED显示屏的高度配合得到了完美的效果。3.2程序流程图3.3开发软件及编程语言简介Keil uVision2是德国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,使用接近于传统c语言的语法来开发,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用,而且大大的提高了工作效率和项目开发周期,他还能嵌入汇编,您可以在关键的位置嵌入,使程序达到接近于汇编的工作效率。KEILC51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效,快速的特点。C51编译器的功能不断增强, 使你可以更加贴近C
18、PU本身,及其它的衍生产品。C51已被完全集成到uVision2的集成开发环境中,这个集成开发环境包含:编译器,汇编器,实时操作系统,项目管理器,调试器。uVision2 IDE可为它们提供单一而灵活的开发环境。C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔研究所的D.M.Ritchie于1972年推出,1978年后,C语言已先后被移植到大、中、小及微型机上,它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C
19、语言,适于编写系统软件,三维,二维图形和动画,具体应用比如单片机以及嵌入式系统开发3.4电路图见附表一3.5主要源程序见附表二3.5.1程序说明: 当程序开始运行的时候,首先是要程序进行初始化,主要作用就是让程序按照我们设计的初始值去进行。初始化完成之后,进行数据的输入与接收工作,然后将该数据转换为信号,再存入显示缓冲区,再根据霍尔元件检测的同步信号,对数据进行校对,如果有数据输入的话就将数据进行清零。执行完毕后到初始化操作之后重复以上操作。如果传感器没有检测到数据输入,则直接检测霍尔元件是否有同步信号,有就返回初始化操作,无就直接读取存储器提取字库,然后进行显示。随后返回到初始化操作之后进行
20、循环扫描。 4、测量及其结果分析4.1 基本部分测试与分析6.1.1基本要求部分的测试与分析:(1)系统上电后,接着按键盘(语音提示,红外)后进入显示模式,当有Key3、Key4键按下时,电机可加速减速;(2)显示方式及内容与理论相符;4.2 发挥部分测试于分析(1)多种显示方式分别演示 ,与理论相符; (2) 可实现速度调节,实验结果与理论相符; (3) 可以实现字形左右移动,实验结果与理论相符;(4) 电机的转速的调节可通过随数码管的显示;(5) 键盘,与红外双向控制与理论相符;(6) 超声波语言提示准确;(7) 液晶跟踪显示完美;5总结在整个设计中我们做了很多的实验,硬件电路出现了很多问
21、题,我们自己制作电刷,但存在材料的问题,而没有想象的那种效果。和程序转速与显示的时间的巧妙结合。我们不惜麻烦又从新设计了方案。以此,我们总结出方案的选择的重要性。我们也体会到了团队的力量。在这次大赛中我们学到了很多东西,不单单是印证了时间是检验真理的唯一条件,我们还见证了团队协作的力量和伟大。6、参考文献1基于单片机结构的智能系统设计与实现 沈红卫 编 电子工业出版社2单片机原理与接口技术 黄惠媛 编 海洋出版社3单片机应用技术 周平 伍云辉 编 电子科技大学出版社451单片机入门、提高、开发全攻略 郭天祥 编 电子科技大学出版社5单片机原理及应用张洪润 孙悦 张亚凡 编 清华大学出版社5 参
22、考文献附录一附录二#include #define uchar unsigned char#define uint unsigned int#includesbit dianji=P07; sbit jia=P36; sbit jian=P37; sbit dula=P26; sbit wela=P27; sbit f=P23; void delay(uint) ; void shou(); void di1(); void di2(); void di3(); void di4(); void z1(); void z2(); void z3(); void z4(); void z5();
23、 void di5(); /void di6(); void di101();uint i,j,n,a,b,c;uchar num=0,di=100,gao=5;uchar code table100=祝:滨州学院 ;uchar code table200= 电子设计 ;uchar code table300= 大赛 ;uchar code table400= 圆满成功 ;sbit sclk=P00;/即lcdensbit cs=P02; /片选信号,使用时 置1sbit sid=P01; /即rw,sid为串行数据,每次操作都由3个字节数据组成sbit psb=P37; /串并口选择ucha
24、r code table1=0xfc,0x00,0xfcuchar code table2=0xfc,0x00,0xfc ; /*工*/uchar code table3=0x03,0x49,0x49,0x00,0x49,0x49,0x03,0xff,0xff,0xdc,0xdc,0x0c,0xd4,0xd8uchar code table4=0xff,0xff,0xff,0x00,0xfe, 0xfe,0xf8,0xff,0xff,0xfb,0xfd,0xfe, 0xff,0xff ; /*电子*/uchar code table5=0xfc,0x00,0xfc,0xf3,0xf9,0xf1
25、,0xef,0xdf,0xbf,0x7f,0xff,0x7f,0xcf,0xdf,0xdf,0xcf,0x7f,0xff,0x7f,0xbf,0xdf,0xef,0xf1,0xf9,0xf3uchar code table6=0xfc,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xf9,0xfb,0xff,0xff,0xff,0xff,0xfb,0xf9,0x0b,0xff,0xff,0xff,0xff,0xff,0xff ; /*旋转I*/uchar code table7= 0xff,0xdb,0xd5,0x0e,0xd5,0xdb,0xff
26、uchar code table8= 0xfe,0xfd,0xfb,0xff,0xfb,0xfb,0xfe ; /*小人*/ uchar code table10=0x03,0x49,0x49,0x00,0x49,0x49,0x03 uchar code table11=0xff,0xff,0xff,0x00,0xfe, 0xfe,0xf8 uchar code table12=0xfc,0xf8 uchar code table13= 0xfc,0xf4,0xf8 uchar code table14= 0xdc,0xdc,0x0c,0xd4,0xd8 uchar code table15=
27、 0xdc,0xdc,0x0c,0xd4,0xd8 uchar code table16= 0xfb,0xfd,0xfe, 0xff,0xff void delay(uint m) for (j=m;j0;j-) for (n=110;n0;n-); /*电改子*/void matrixkeyscan() uchar temp; P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0 ) temp=P3; switch(temp) case 0xee:
28、di1(); break; case 0xde: di2(); break; case 0xbe: di3(); break; case 0x7e: di4(); break; while(temp!=0x10) temp=P3; temp=temp&0x10; P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0)delay(10);temp=P3;temp=temp&0xf0; if(temp!=0xf0 ) temp=P3; switch(temp) case 0xed: di5(); break; / case 0xdd:/ key=5;/ brea
29、k;/ case 0xbd:/ key=6;/ break;/ case 0x7d:/ key=7;/ break; while(temp!=0xf0) temp=P3; temp=temp&0xf0;P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0)delay(10);temp=P3;temp=temp&0xf0; if(temp!=0xf0 ) temp=P3; switch(temp) case 0xe7: shou(); break;/ case 0xd7:/ key=13;/ break;/ case 0xb7:/ key=14;/ break
30、;/ case 0x77:/ key=15;/ break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; void di1() /*第1题*/ while(1) P1=0xff ; P2=0xff; delay(95) ; for(i=0;i3;i+) P1=table1i; P2=table2i; f=1; delay(7) ; di101() ; void di2() /*第2题*/ while(1) P1=0xff ; P2=0xff; delay(190) ; for(i=0;i14;i+) P1=table3i; P2=table4i; f=
31、1; delay(3) ; void di3()/*第3题*/ while(1) P1=0xff ; P2=0xff; delay(90) ; for(i=0;i3;i+) P1=table5i; P2=table6i; f=1; delay(3) ; P1=0xff ; P2=0xff; delay(90); for(i=4;i12;i+) P1=table5i; P2=table6i; f=1; delay(3) ; P1=0xff ; P2=0xff; delay(90); for(i=12;i16;i+) P1=table4i; P2=table6i; f=1; delay(3) ;
32、P1=0xff ; P2=0xff; delay(90); for(i=16;i25;i+) P1=table5i; P2=table6i; f=1; delay(3) ; void di4() /*第4题*/ while(1) z1(); z2(); z3(); z4(); z5(); void z1() P1=0xff ; P2=0xff; delay(940) ; for(i=0;i7;i+) P1=table10i; P2=table11i; f=1; delay(2) ; void z2() P1=0xff ; P2=0xff; delay(40) ; P1=0xfc; delay(
33、2) ; for( a=0;a2;a+ ) P1=table12i; f=1; delay(2) ; void z3() P1=0xff ; P2=0xff; delay(40) ; for( b=0;b3;b+ ) P1=table13i; f=1; delay(2) ; void z4() P1=0xff ; P2=0xff; delay(40) ; for( c=0;c5;c+ ) P1=table14i; f=1; delay(2) ; void z5() P1=0xff ; P2=0xff; delay(40) ;for(i=0;i5;i+) P1=table15i; P2=tabl
34、e16i; f=1; delay(2) ; void di5() /*第5题*/ while(1) P1=0xff ; P2=0xff; delay(30) ; for(i=0;i7;i+) P1=table7i; P2=table8i; f=1; delay(1) ; P1=_crol_(P1,8); P2=_crol_(P2,8); void key() /*键盘*/ if(jia=0) delay(5); if(jia=0) num+; if(num=4) num=3; while(jia=0) ; if(jian=0) delay(5) ; if(jian=0) if(num!=0)
35、num-; else num=0; while(jian=0); void dispose() /*电机调速*/ switch(num)case 0: gao=5; di=100; break; case 1: gao=70; di=40; break;case 2: gao=100; di=20; break; case 3: gao=200; di=0; break; void qudong() uchar i; if(di!=0) for(i=0;idi;i+) dianji=0; for(i=0;igao;i+) dianji=1; void write_com(uchar com)u
36、char i;uchar i_com;i_com=0xf8; /写指令发送 1111 1000cs=1;sclk=0;for(i=0;i8;i+) /1个字节有8位sid=(bit)(i_com&0x80); /*(bit)意思为将后面的数强制转换成位,将最高位提出来*/sclk=0; /sclk上升沿有效sclk=1;i_com=i_com1; /依次将i_com的每一位从高到低在sclk的作用下送给sidi_com=com; /将所发送的字节高4位取出,低4位补0i_com&=0xf0;for(i=0;i8;i+)sid=(bit)(i_com&0x80);sclk=0;sclk=1;i_
37、com=i_com1;i_com=com; /将所发送字节的低4位移到高4位的位置上,原来的低4位自动补0i_com=4;for(i=0;i8;i+)sid=(bit)(i_com&0x80);sclk=0;sclk=1;i_com=i_com1;cs=0;delay(10);void write_data(uchar date) uchar i;uchar i_date;i_date=0xfa; /写数据发送 1111 1010cs=1;for(i=0;i8;i+)sid=(bit)(i_date&0x80);sclk=0;sclk=1;i_date=i_date1;i_date=date;
38、i_date&=0xf0;for(i=0;i8;i+)sid=(bit)(i_date&0x80);sclk=0;sclk=1;i_date=i_date1;i_date=date;i_date=4;for(i=0;i8;i+)sid=(bit)(i_date&0x80);sclk=0;sclk=1;i_date=i_date1;cs=0;delay(10);void init()psb=0;dula=0;wela=0;write_com(0x01); /写入空格,清屏幕write_com(0x30); /基本指令操作write_com(0x0c); /开显示,但不开游标write_com(0
39、x02); /地址归位,游标在开头write_com(0x06); /游标及显示右移1位void weizhi(uchar x,uchar y)uchar weizhi;if(x=0)x=0x81;else if(x=1)x=0x91;else if(x=2)x=0x89;else if(x=3)x=0x99;/用switch-case语句也可/switch(x)/case 0:x=0x80;break;/case 1:x=0x90;break;/case 2:x=0x88;break;/case 3:x=0x98;break;weizhi=x+y;write_com(weizhi); voi
40、d shou() uchar i;init();weizhi(0,0);i=0;while(table100i!=0) /检测table里的数不为空,空即0 write_data(table100i); i+;/for(i=0;i10;i+) 用for循环语句也可/write_data(table1i);weizhi(1,0);i=0;while(table200i!=0) write_data(table200i); i+;/delay(50); 加上延时,每个字显示完后停一会显示下一个字weizhi(2,0);i=0;while(table300i!=0) write_data(table300i); i+;weizhi(3,0);i=0;while(table400i!=0) write_data(table400i); i+;while(1); void main() /*主函数/ while(1) dianji=0; key();dispose(); qudong(); P0=0; dula=1; matrixkeyscan();