1 / 19
文档名称:

基于单片机的LED数码管静态显示系统的设计与实现.pdf

格式:pdf   大小:2,138KB   页数:19页
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

基于单片机的LED数码管静态显示系统的设计与实现.pdf

上传人:1781111**** 2024/5/11 文件大小:2.09 MB

下载得到文件列表

基于单片机的LED数码管静态显示系统的设计与实现.pdf

相关文档

文档介绍

文档介绍:该【基于单片机的LED数码管静态显示系统的设计与实现 】是由【1781111****】上传分享,文档一共【19】页,该文档可以免费在线阅读,需要了解更多关于【基于单片机的LED数码管静态显示系统的设计与实现 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。:..○1单片机最小应用系统的硬件设计技能训练;○2ASM语言或C51语言软件编程与调试技能训练;○3“下载及烧录(固化)程序”开发技能训练;○4数码管显示;○5Protel软件应用技能训练;○6作品性能指标分析与改进;○7文档资料编制。○1列出元器件清单;○2用Protel软件绘制电路原理图;○3绘制软件流程图、编写并调试程序、详细注释软件功能;○4对系统性能指标进行分析并提出改进方案;○5作品演示与讲解(硬件、软件、调试、改进、Protel等);○6按要求完成课程设计报告。1:..、RAM、ROM、定时/计数器和多功能I/O口等计算机所需要的基本功能部件的大规模集成电路,又称MCU,单片机结构上的设计,在硬件、指令系统及I/O处理能力方面突出芯片的控制功能,单片机系统全力满足测控对象的测控功能,兼顾数据处理能力。(CPU):是单片机的核心单元,通常由算术逻辑运算部件ALU和控制部件构成。(CentralProcessingUnit)ROM存放程序;(ROM:read-onlymemory)RAM存放数据;(RAM:essmemory)I/O为输入设备和输出设备。(Input/Output)单片机用片内总线(BUS)实现CPU、ROM、RAM、I/O各模块之间的信息传递。系统时钟:是单片机运行节拍的基准单元。系统时钟类似于PC微机中的主频。是反映单片机运行速度的重要指标。定时器/计数器(T/C):用于单片机内部精确定时或对外部事件(如输入的脉冲信号)进行计数,有的单片机内部有多个定时/计数器。串口输入/输出口:用于单片机和串行设备或其他单片机的通信。串行通信是单片机与其他设备进行信息交换最简单和廉价的方式。2:..单片机特点1具有较高的性能价格比。○2体积小,可靠性高。由单片机组成的应用系统结构简单,易对系统进行电磁屏蔽等抗干扰措施。另一方面,单片机不易受外界的干扰。所以单片机应用系统的可靠性比一般微机系统高得多。○3控制功能强。单片机采用面向控制的指令系统,实时控制功能特别强。CPU可以直接对I/0口进行输入、输出操作及逻辑运算,并且具有很强的位处理能力。○4使用方便、容易产品化。单片机的体积小、功能强。能满足许多小型对象的嵌入式应用要求。,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。其特点为:○1增强型8051单片机;○2工作电压:~;○3工作频率:0~40MHz;○4程序空间:8KFlashmemory;○5片上集成512字节RAM;○6具有EEPROM功能;○7具有ISP/IAP功能,无需专用编程器,可通过串行口下载程序。3:..,事实上单片机内部资源已经很丰富,一个内部带程序存储器的单片机就构成了一个最小系统,cpu总是通过地址总线、数据总线和控制总线来与外部交换信息的。数据总线传送指令码和数据信息,各外围芯片都要并接在它上面和cpu进行信息交流。由于数据总线是信息的公工通道,个外围芯片必须分时使用才不至于产生使用总线的冲突。由于Po分时传送地址/数据信息,在接口电路中,通常配置地址锁存器,有ALE信号锁存低8位地址Ao~A7,以分离地址和数据信息。P2口传送高8位地址A8~A15。PSEN为程序存储器的控制信号,是在取指令码时或执行MOVC指令时变为有效RD、WR为数据存储器和I/O口的读、写控制信号。是执行MOVX指令时变为有效。PR32K*8+5V123456789J1J2+5V+5V+5V0404131311P102P002U1STC89C52RCP113P013P10139P00P12P02P112P10PPPPC(AD0)P0038P01P134P034P11VC(AD1)P0155P123/V37P02P14P04P12A(AD2)P0266P134E36P03P15P05P145P13(AD3)P0335P04P167P067P14(AD4)P0488P156P15(AD5)P0534P05P179P079P167P16(AD6)P0633P06GND10GND10P178P17(AD7)P0732P07P1P0P3010P30/RXD(A8)P2728P27P3111P31/TXD(A9)P2627P26J4J5+5VP321226P25+5V+5VP3313P32/INT0(A10)P2525P24P301P271P33/INT1(A11)P2422P3414P34/T0(A12)P2324P23P313P263P3515P35/T1(A13)P2223P22P324P254S17P3616P36/WR(A14)P2122P21P335P245RSTP371721P20P34P23C4P37/RD(A15)P20P356P22610UF77ALE/,当按键少时可接成线性键盘,当按键较多时,这样的接法占用口线较多。将按键接成矩阵的形式,可以节省口线,例如两个接口可按8*8的形式接64个按键。每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口4:..CPU通信。每个按键的状态同样需变成数字量“0”和“1”,开关的一端通过(列)、而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:○1确定有无键按下;○2判哪一个键按下,键的功能是什么;○3还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地(称行扫描),另一个并行口输入按键状态(称回馈信号,键盘的列值),由行扫描值和回馈信号共同形成键编码而识别按键、通过软件查表,查出该键的功能。也可由硬件编码器完成键的编码。S13CS14DS15ES16FP37S98S109S11AS12BP36PR1+5VS54S65S76S871P352S1S21S32S4334P34567P338910K*8P32P31P30图3键盘接线图7B7D7EB7BBBDBED7DBDDDEE7EBEDEE表1键盘键编码表1为键盘所对应的编码,通过逐行逐列扫描其值给P3。5:..实验所用数码管LED数码管的g~a七个发光二极管因加正电压而发亮,因加零电压而不能发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码(段码),如显示“1”,字形码为06h。图4LED显示器动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出(字形选择),另一接口完成各数码管的轮流点亮(数位选择)。+5VQ1Q2Q3Q4Q5Q6Q7Q885508550855085508550855085508550R1R2R3R4R5R6R7R82K2K2K2K2K2K2K2K72726262525242423232222212120202PPPPPPPP212198621219864abcdefgdpabcdefgdpLED1LED211117421010153111**********R930P00P01R1030P02R1130P03R1230P04R1330P05R1430P06R1530P07R1630图5动态扫描数码管显示电路6:..下载电路PL2303USB和标准RS-232串行端口之间的转换,,因而可以达到远大于标准UART控制器的波特率。-,用户只要简单地把联在电脑主机或USB_HUB上,就可以实现与RS-232器件的通信。功能特点○;○2支持到RS-232接口的转换;○3支持自动握手模式;○4支持远程唤醒和电源管理;○5发送和接收拥有独立的256Bytes缓冲;○6支持内部ROM和外部EEPROM配置器件;○7内建USB收发器。03031313PPU5C2U-5VPL2303C7R20R19841K1KVDDVDD_23220VDD104104U-5VJP1+5VU-5V19RESET121TXD347GNDRXD556212C1GNDDTR78253104C826GND_DLLRTS6UARTPLL_TESTRI10UF9DSR24VDD_DLLDCD10+-5VS18+5VVBUSR2227D-216DM(D-)323POWERD+LD_MODE41522GNDDP(D+)TRI_MODE5R2327SHELL1C1C2C2CSSL9USB-FTOOPOWER7Y2822C912MC1022P22P图6下载电路7:..,因此需要在自己电脑上装一下软件及驱动,首先装的是keil软件,打开单片机文件夹,双击Setup进入安装界面,然后选择“InstallSupportforAdditionalMicrocontrollerArchitectures”进行安装,接着弹出一个“InstallShieldWizard”窗口,点击“EvalVersion”,弹出一“SerupuVision2”窗口,点击“Next”进入“LicenseAgreement”界面,选择“Yes”进入“RestrictionsofEvaluationVersions”界面,选择“Next”,接着进入“ChooseDestinationLocation”界面,选择好安装文件夹后点击“Next”进入“CustomerInformation”界面,填好信息后点“Next”进入“KeepConfiguration”界面,点“Next”自动安装,安装完成后弹出“MaintenanceComplete”界面,点“Finish”便完成了。接着便开始装下载驱动了,首先将单片机面板和电脑联通,打开计算机设备管理器,在“其他设备”里面有一个打感叹号的“Usb-SerialController”,右键选择“更新驱动程序”,选择“浏览计算机以查找驱动程序软件”,然后选择“浏览”,依次打开光盘软件包51系列芯片程序下载软件主板集成usb-232芯片PL2303驱动程序,双击“HL-2303”进行安装,安装完成后,再次进入设备管理器,会有一个“和LPT)”,双击会出现“ProlificUSB-to-4)”便说明下载驱动以安装完成。由于本次实验所用单片机面板是我们组买的整块面板,卖家提供的光盘里有相应的下载程序并不需要安装,“keiluVision2”,点击“项目”选择“新项目”,弹出“产生新项目”窗口,输入新建项目名,点击“保存”。然后弹出一个“为‘目标1’选择设备”窗口,点击“Almel”选卡,选择“AT89C52”,然后点“确定”,弹出“μVision3”窗口,点“否”。然后点左上角“文件”栏,选择“新建”,然后弹出一Text1文本编辑框,点击“保存”,弹出一“另存为”窗口,选择保存位置后,输入一文件名,(.c是用C语言编写,.asm是用汇编编写),接着点保存。然后双击“目标1”,右键“源代码组1”,点击“添加文件到组‘源代码组1’”选卡,弹出一“添加文件到组‘源代码组1’”窗口,,然后添加。接着右键“目标1”选择“为‘目标1’设置选项”选卡,在输出选卡里,将“产生HEX文件(X:HEX文件格HEX-80)”选中,然后确定。8:..开始转换,若程序无误则产生hex文件,若有语法问题则不能产生hex文件,需要进行检查和调试程序。程序烧录hex文件产生后便可以进行烧录了,首先打开下载程序“STC-ISP-V479”,将单片机面板与计算机相连,查看设备管理器,双击“和LPT)”选卡,看端口是多少,4,于是便在“STC-ISP”4端口,接着点击“OpenFile/打开文件”选卡,选择要烧录程序的hex文件,然后关闭单片机点击“Download/下载”,接着打开单片机,停留几秒钟便如下图所示,则说明下载成功。图7程序下载图9:..[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};unsignedduan_tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsignedled_buffer[]={0,1,2,3,4,5,6,7,8,9};intkey_code,key_press;//此时根据行和列的值,即为按键charcount=0;/***********************************************************数码管显示子程序***********************************************************/voiddisp(void){P2=0xff;//关断数码管的位P0=~duan_tab[led_buffer[count]];//为数码管的段赋值P2=wei_tab[count];//为数码管的位赋值count++;if(count>7)//当显示8个数后给count清零{count=0;}}/***********************************************************读键盘子程序***********************************************************/voidread_key(void){unsignedcharx;P3=0xf0;//将键盘的列赋值0x=P3|0x0f;//将键盘的行值付给xif(x!=0xff)//软件的键盘防抖动{10:..P3=0xf0;x=P3|0x0f;if(x!=0xff)//如果键盘的行有低电平,则有键按下{P3=x;//将对应的行赋值0key_code=P3;//此时根据行和列的值,即为按键代码key_press=1;//将按键标志位置1}}}/***********************************************************将数码管显示的数值放在缓存区中子程序***********************************************************/voidget_data(longdat){longx;x=dat;led_buffer[0]=x/10000000;x=x%10000000;led_buffer[1]=x/1000000;x=x%1000000;led_buffer[2]=x/100000;x=x%100000;led_buffer[3]=x/10000;x=x%10000;led_buffer[4]=x/1000;x=x%1000;led_buffer[5]=x/100;x=x%100;led_buffer[6]=x/10;x=x%10;led_buffer[7]=x;}11:..调用读键盘程序并更具键盘值来选择不同的数码管显示数字输入***********************************************************/voidkey_fenxi(void){while(1){read_key();//调用read_key()读键盘if(key_press==1)//若有键按下这执行{key_press=0;//给键盘按下标志数清零switch(key_code)//根据按下的值选择{case0xee:{get_data(92822002);}break;case0xed:{get_data(92822012);}break;case0xeb:{get_data(92822014);}break;case0xe7:{get_data(92822017);}break;case0xde:{get_data(92822027);}break;case0xdd:{get_data(92822018);}break;}disp();//调用disp()显示输入对应的值}disp();//若无按键按下则显示初始值}}/***********************************************************主函数***********************************************************/voidmain(void){get_data(20120104);key_fenxi();}12:..程序分析首先是主程序main,其实本次main函数相当简单,就两个调用语句,get_data(20120104)语句为赋初值语句,使一开单片机数码管就静态显示20120104,若无键按下便一直显示。另一条为调用key_fenxi()函数语句。而key_fenxi()函数其实可以称得上是主函数了,由于key_fenxi()整个函数都是由while(1)语句主导且没有跳出函数的语句,故而主函数一经调用key_fenxi()后便一直执行key_fenxi()。while(1)语句一开始通过调用read_key()函数进行读键盘,并通过if语句根据按键标志位key_press大小来选择执行。当有键按下时即key_press==1时首先对key_press清零,然后根据key_code值即按键值通过switch语句选择执行,当按键值为0xee时数码管显示92822002,当按键值为0xed时数码管显示92822012,当按键值为0xeb时数码管显示92822014,当按键值为0xe7时数码管显示92822017,当按键值为0xde时数码管显示92822027,当按键值为0xdd时数码管显示92822018。函数get_data是将要显示的数字存到led_buffer[]数组里面,首先将要显示的值赋值给x,由于x是长整型且为8位数,故而x/10000000结果为x千万位数,而x%10000000值为x的后7位,依次类推,通过get_data函数依次将待要显示的数按位存入数组led_buffer[]。函数read_key为读键盘函数,它通过逐行逐列扫描,根据对应P3的值来显示所按键的键码,再传给key_code,同时用key_press来作为按键标志位,当有键按下时,key_press被置位为1。函数disp()为数码管显示程序,首先给P2赋值0xff,由本次所用共阳极数码管及电路可知,此时给二极管清零,数码管没有显示。接着给依次P0赋所要显示的数值,而同时给P2赋值,使数码管对应的位显示所要显示的值。通过key_fenxi()函数循环调用来实现位的循环,由于单片机运行速度远快于人眼所能辨知的速度,故而虽然是依次逐个显示数码管,但人眼所见依然是静态一起显示。同时通过if语句来使count清零,从而实现循环显示。13:..程序流程图图8程序流程图14:..运行调试P2的值给A,通过右循环后再传给P2而P0的值是通过查表得来的,再通过跳转指令进行循环执行,可调试完成后,进行烧录后,发现八个数码管都显示相同的数字。我便用keil进行调试,可是调了好长时间都没有解决问题,或许是我延时程序不太会写吧,于是便想着走另一条路径—C语言。后来编写的C语言程序有点长,所以难免会出一些错误,比如一开始我没有get_data()函数,而是通过建6个表,将我们组6个人的学号对应的LED字形显示代码依次建6个边,然后在key_fenxi()函数里通过switch语句根据按键值选择相应的表格给led_buffer[]数组,在理论上应该是行的通的,可编译时老是出现“ProgramSize:data==0code=467”以及“目标未产生”,经过不断检查和请教同学才明白是表建多了改了后便可以编译了。图9软件调试截图15:..,烧录完成后那数码管出现乱码,数码管显示相当杂乱无章,并且按键也没多大变化,烧过两次后依然出现这种情况。于是我便打开keil软件,进行运行调试,如图9,通过调试,发现是延时的问题,我将延时函数给删了,还有更改一下其它语句。再次烧录的时便没有这种情况了。面板也是按照我的设计思路走的,于是这次设计基本上便完成了。16:..总结转眼间为期两周的单片机课程设计就要结束了,时间过得太快了。这次单片机课程设计我们组做的是“基于单片机的LED数码管静态显示系统的设计与实现”,说实在的刚拿到这个题目我是很不情愿做这个的,因为一开始我们组选的是二极管动态循环显示,而这程序我们买的单片机附带光盘里都有,所以我们一开始是想蒙混过关的,可后来老师给我们组重新分配了现在这个题目,当时给我打击着实不小。新课题就新课题吧,大不了多努力些,我通过查阅资料,看前人写的关于这方面类似的程序,以及自我推敲,反复尝试,不断更改,终于还是让我把这程序给弄出来了。虽然不是十全十美,但也算是小有创新。刚开始老师只叫我们做一个静态显示学号的程序,说实在的这实在是没多大难度(当然一开始我也有点怕),通过C语音编写只要十多条语句便可完成,我便觉得没多大意思。于是便想到将我们组六个人的学号用六个按键控制,按一个键数码管便显示对应人的学号。这样一来难度便加大了不少,我们组成员也更有积极性了。当然一开始也没有想那么多,只是一门心思照原来的思路写程序,可是弄了后才发现有很多都行不通。比方说一开始我用“<<”运算符来使P2右循环已达到数码管位循环的目的,可是调试运行、烧录后才发现行不通,“>>”运算符为右移运算符,不是循环右移,我这才知道C语言里面没有循环右移指令。还有我参照别人的程序也在读键盘子程序read_key()里加了延时程序,可烧录后出现了乱码和闪烁,而将延时删了后就没有这现象了,这说明程序长短可决定要不要延时程序。诸于此类问题还有很多。这次单片机课程设计虽然短暂,但我确实收获不小。通过这次可设,我对C语言编程更加熟练了,对Protel、office、CAD、keil、下载软件操作也比以前顺手了,还有我对单片机的理解也比以前深刻了,自己的逻辑思维能力也得到了磨练。同时也发现了自己很多不足,比如汇编编程就很不熟练,指令以往很多,还有自己的理论与实际结合能力还是很差,自己编程能力依旧很薄弱,这些都有待加强。这次可是可设也是我们毕业前难得的实践,这为我们今后找工作提供了一定的经验,也使我对未来这方面工作更加有信心了,在此要谢谢帮助过我的同学,以及老师对我的指导。17:..[1]:中山大学出版社,2009.[2]:电子工业出版社,2011.[3]:北京航空航天大学出版社,1997.[4]:电子工业出版社,1998.[5]李群芳,:清华大学出版社,200518:..19