• 881.00 KB
  • 2022-04-22 13:45:55 发布

小车电子产品显示系统毕业论文.doc

  • 39页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'小车电子产品显示系统毕业论文1绪论目前,科学技术处于不断的发展当中,电子产品日益更新,已经成为我们生活中必不可少的一部分,不论是日常生活还是工业应用等等,都已经与电子技术紧密的联系在一起。从瓦特发明蒸汽机开始,世界技术已经进入到了一个新的时期,伴随着第一台计算机的出世,科学技术就有了一个飞跃,伴随着科学技术的提高,而显示技术也应用广泛起来,从而提高了人民的生活水平。而今,随着信息社会的发展,在工业应用方面,显示系统也已经广泛的应用于各个领域。诸如温度检测的显示系统、智能仪表的显示系统等服务于社会的各行各业。在主控硬件开发方面,ARM微控制器已被广泛应用。ARM(AdvancedRISCMachines)微处理器是Acorn计算机有限公司面向低预算市场设计的第一款RISC微处理器,更早称作AcornRISCMachine。ARM处理器本身是32位设计,但也配备16位指令集。一般来讲,比等价32位代码节省达35%,却能保留32位系统的所有优势,具有很高的性价比。ARM处理器是一种性能高、成本低的微处理器,具有很高的实用性,ARM的Jazelle技术使Java加速得到比基于软件的Java虚拟机(JVM)高得多的性能,和同等的非Java加速核相比功耗降低80%。同时ARM处理器的CPU功能上增加DSP指令集提供增强的16位和32位算术运算能力,提高了性能和灵活性。而且ARM还提供两个前沿特性来辅助带深嵌入处理器的高集成SoC器件的调试,它们是嵌入式ICE-RT逻辑和嵌入式跟踪宏核(ETMS)系列。由于一系列的优点使得ARM微处理器具有很高的市场占有率,使得ARM处理器得以被广泛的应用于生活和科研中[1]。在软件开发方面,IAR软件是一款主流的开发集成环境软件,其中IAR为所有ARM开发者带来很大的益处,IARSystems为所有使用ARMMCU的开发者提供了业界最领先的集成开发环境:IAREmbeddedWorkbenchforARM;它支持很多知名公司的微处理器。它带有高度优化的C/C++编译器和先进的C-SPY调试器。此外,JTAG硬件调试工具IARJ-Link也帮助成千上万的开发者解决了在使用ARMMCU进行开发过程中的许多问题,使得用户能够在IAREmbeddedWorkbenchforARM软件中进行全面的开发和调试。全球很多著名的公司都在使用IARSYSTEMS提供的开发工具,用以开发最前沿的科技产品,从手机应用系统到航天航空、消费电子及工业制造等等[2]。目前的显示系统,在各个领域都有广泛的应用,尤其是在一些公共场合,像室外液晶显示,机场航班动态信息显示,39 证券交易、金融信息显示港口、车站旅客引导信息显示,体育场馆信息显示道路交通信息显示,调度指挥中心信息显示,电力调度、车辆动态跟踪、车辆调度管理,邮政、电信、商场购物中心等服务领域的业务宣传及信息显示,这些足以证明,显示系统在我们当今的生活中变得越来越重要。图1整体框图2系统设计ARM控制器(LM3S811)外部数据数据接收数据处理中断处理内部数据数据处理数据传输12864显示器2.1整体设计本设计是以德州仪器半导体技术有限公司LM3S811为主控芯片,12864LCD为显示模块及其他外围电路共同工作,实现对欢迎词及外部数据的实时显示。首先,控制器从传感器采集到各参数的数据,数据经过初步处理,在液晶上分为4行同步显示出来。由于主控芯片可以工作在中断方式,如果有串行中断到来,控制器会利用中断与主控制芯片进行通信,把数据传送到显示器,实现了数据的实时显示。2.2显示模块选择1602液晶显示器采用5×7点阵,可以显示2行,每行16个字。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”[3]。12864LCD显示器(LCD)具有功耗低、体积小、重量轻、超薄等,其它显示器无法比拟的优点,近年来被广泛用于单片机控制和微控制器控制的智能仪器、仪表和低功耗电子产品中。LCD主要分为段位式LCD、字符式LCD和点阵式LCD三种,其中段位式LCD和字符式LCD只能用于字符和数字的简单的显示,而39 不能满足图形曲线和汉字显示的要求,在很多方面有很大的弊端;而点阵式LCD不仅可以显示字符、数字,还可以显示各种图形、曲线和汉字,像12864TH点阵式液晶显示模块就可以显示汉字、图片,还可以显示自定义字符,是1602所不具有的功能[4]。由于本设计需要显示汉字、图形等,用1602显示模块及其他简易的显示器已经不能满足本设计的需求,因此本文选用了12864(128×64)LCD显示器,它是128(列)64(行)点阵的LCD显示模块。在该系统中,通过LM3S811微控制器输入输出接口,利用C语言编程控制输入输出端口的高低电平,根据时序,以实现对LCD的控制,使得所需显示的数据以及功能得以在LCD显示模块上显示。3硬件设计3.1元件的创建由于在Protel[5]画图时库中没有找到LM3S811和12864的元件,因此在画原理图的过程中,自己创建了元件如图2:图2LM3S811原理图图2为LM3S811元件,在创建的过程中,把管脚标识放在外面,影响原理图的连接及效果,如果要把管脚标识放在里面,需要对管脚的属性进行调整,39 在protel里面的操作为:点击Place选择Pins,双击放置的管脚,根据管脚需要的标识改动name,管教的标号number,再根据上下左右需要选择Orientatic(如左边管脚选择180°,右边0°,上下分别为90°和270°),最终得到了LM3S811元件如图。希望能给以后的元件制作带来一些借鉴。图3则是12864元件图,共有20个引脚,经历了LM3S811的创建,此12864就方便了很多,其引脚功能后面有描述。图312864原理图3.2主控芯片LM3S811LM3S811有48个引脚,其大部分引脚具有复用功能,如LM3S811用作JTAG的五个管脚,同时也可以作为GPIO使用,这是LM3S811的一个缺点,但同时也是它的一个优点,由于JTAG被用来下载(烧写)程序使用,再用作GPIO可能会使得芯片锁死,这是它的缺点;但同时,它有防锁死的措施,如果使用者细心加上防锁死程序,或者在不需要使用太多GPIO的情况下,可以尽量不用这五个管脚,如果需要,那么在加上防锁死程序后,就有五个GPIO管脚可以复用,这是它的一大优点。在LM3S811中,有很多功能模块,比如串口,可以应用在调试过程中,一个USB虚拟串口和一个实际串口,通过串口调试器的调试,在电脑上可以看到输入输出的结果,同时对照硬件的工作情况,可以更直观得到运行结果。在本设计中,定时器是必不可少的一部分,因为在小车的运动中,需要显示其运动总时间。LM3S811支持多种定时模式,主要有以下三种,32-位定时器模式、16-位定时器模式、16-位输入捕获模式。LM3S811的功能模块很多,其中主要有JTAG、UART(串口)、PWM(脉冲宽度调制)、Timer(定时器)、ADC(模数转换)等等,在LM3S811的DATASHEET39 里面有详细解释。本设计主要使用GPIO端口为主,通过模拟同步串行时序来对显示模块进行控制。3.2.1LM3S811申请在设计的过程中,通过LM3S811的熟悉,同时也了解了其生产厂家Ti公司的情况,该公司提供给大学生免费的LM3S811芯片,登录www.ti.com,进行信息注册,得到公司的认可后,进行登录,再对样片进行选择,通过审核,公司就会发货给我们。公司发货给我的通知单:图4LM3S811申请图3.2.2GPIO(通用输入输出端口)LM3S811[6]中有五个GPIO端口,分别为PORTA、PORTB、PORTC、PORTD及PORTE。其中各个端口所拥有的引脚数不相同,PE口具有两个引脚,在不作通用输入输出用时,此两个引脚作为脉冲编码调制使用,而PA口有六个管脚,在不作为GPIO使用时,它是作为SSI和UART两个功能模块使用的。在LM3S811芯片的引脚中,很多都具有复用功能,这也是的芯片的可用性有了很大的提高。在作为通用输入输出端口时,其中的PB7及PC0—PC3一般不要使用,因为此五个引脚通常是用于JTAG的,它是用作烧写程序的,一旦被使用,可能芯片在执行命令时会出现无法估计的错误,导致把芯片锁死,无法再次使用。3.3显示模块12864LCD本设计使用的是TH12864显示模块,如图3所示。TH12864液晶显示模块是128×64点阵的汉字图形型液晶显示模块,可显示中文汉字及字符,且内含图形库,可显示自定义字符,内置国标GB2312码简体中文字库(16×16点阵)、128个字符(8×1639 点阵)及64×256点阵显示RAM(GDRAM)。与外部CPU接口采用并行或串行两种控制方式。其中TH12864的供电电源有3.3V和5V的,在本设计中使用的是3.3V。其引脚说明如下[7]:在本小车显示系统的设计中共使用了6条12864管脚与LM3S811进行连接,其12864表112864引脚说明引脚名称方向说明1VSS-GND(0V)2VDD-SupplyVoltageForLogic(+3.3V)3V0-SupplyVoltageForLCD4RS(CS)0H:DataL:InstructionCode5R/W(SID)0H:ReadL:Write6E(SCLK)0EnableSignal7-14DB0-DB7|数据0-数据715PSB0H:ParallelModeL:SerialMode16NC-空脚17/RST0Resetsignal低电平有效18NC-空脚19LEDA-背光电源正极(LED+3.3V)20LEDK-背光电源负极(LED-0V)的引脚为1、2、4、5、6、15,其中1、2两条分别是接地和电源(3.3V);4引脚在串行状态下为12864的芯片选择端,控制12864到底是使用还是禁止,高电平有效,并行状态下为12864的数据、命令选择端,高电平为数据端,低电平为命令端;5引脚在串行状态下12864的数据传送端,并行状态下为读写控制端,高电平读,低电平写;6引脚串行状态下为12864的同步时钟引脚,并行状态下为信号使能端;15引脚为设置12864为并行还是串行模式,高电平为并行,低电平为串行,在本设计中使用串行模式,低电平有效。3.4供电部分39 图5电源原理图图5是TLV1117供电电源的原理图,由于常用稳压电源为5V,而LM3S811主控芯片与12864显示模块所需的供电电压为3.3V,所以需要供电电源对电压进行转换,以匹配两者所需的不同电压值。通过TLV1117给芯片供电,使得电路得以正常运行。3.5其他外设LED:图6是发光二极管与主控芯片的连接,发光二极管作为LM3S811的一个外围设备,在设计调试的过程中起着很重要的作用,在给LM3S811的36引脚(PWM5)高电平的时候,发光二极管导通,开始发光,在36引脚为低电平时截止,二极管熄灭。发光二极管在调试程序的时候起着很重要的作用,在没有完成显示系统的连接时,可以根据LED的闪光来调试程序。需要注意的是:需要将JP3的跳线接上,保证硬件电路的接通,很多人容易忽略这一点。图6LED原理图图7按键原理图按键:图7按键与LM3S811的连接,在LM3S811中,按键是必不可少的一部分,按键可以作为防锁死和普通的按键使用。由于LM3S811的JTAG管脚可以与GPIO复用,所以可能导致JTAG的五个管脚被作为GPIO使用,致使程序跑死后,下一次无法继续使用该芯片,所以有了防锁死程序,在这种情况下,锁死了以后需要进行解锁,就可以按下按键,使得JTAG处于等待中,进而可以继续使用。另外,此按键在作为JTAG使用完后,可以作为普通按键使用,比如在时间程序中,按下键以后开始计时,再次按键,则停止计时。此按键与LM3S811连接时,在按键无效时,43(PB5)引脚39 为高电平时,按键处于断开状态;在按键有效时,43引脚为低电平时,按键导通。3.6芯片连接本设计使用德州仪器有限公司的LM3S811控制芯片作为控制器,该控制器有功能很齐全的调试解决方案,内部有串行线JTAG调试端口(SWJ-DP)、Flash修补和断点(FPB)单元,用于实现断点操作、数据观察点和触发(DWT)单元,用于执行观察点、触发源和系统性能分析、仪表跟踪宏单元(ITM)用于支持printf型调试、跟踪端口接口单元(TPIU)用作跟踪端口分析仪的桥接[8]。TH12864液晶显示器与外部CPU接口有两种控制方式,本设计采用的是串行方式,因此利用控制器的GPIOB端口作为与TH12864连接的接口,用PB2与12864的4(12864的串行片选端)引脚进行连接,对显示模块是否工作进行选择;PB4与12864的5(串行数据传输端)引脚进行连接;PB6控制时钟,与12864的6引脚进行连接,控制12864传输每个字符为多少个脉冲;12864的第15引脚为选择串行或者是并行工作方式,与主控芯片LM3S811的地线进行连接,使其置为低电平,为串行工作方式。另外,主控芯片可以从外部传感器获得数据,通过LM3S811的控制读取,处理,传送,最终可以同内部数据一样得以在显示模块上显示出来。LM3S811与TH12864的接线如图8所示。图8LM3S811与12864连接图39 LM3S81112864PB2PB4PB6RS/CSR/W/SIDE/SCLK外部数据PD2、图9芯片连接框图与此同时,12864显示模块的3、18、19、20引脚也在显示系统中起着很重要的作用,其中19、20引脚分别为12864模块的背光电源正负极,19引脚连接到LM3S811的电源,20引脚接地,使得显示模块得以亮起来。图9为芯片连接框图。4软件设计4.1IAR软件IAR是全球领先的嵌入式系统开发工具和服务供应商。IARSystems成立于1983年,到目前为止,已经有27年的历史,它所提供的产品和服务涉及到嵌入式系统的设计、开发和测试的每一个阶段,包括带有C/C++的编译器和调试器的集成开发环境、实时操作系统、硬件仿真器等。IARSystems公司总部在北欧的瑞典,在美国、日本、巴西、中国等国家设有分公司,他最著名的、被广泛应用的产品是C编译器-IAREmbeddedWorkbench,它支持很多知名公司的微处理器。全球很多著名的公司都在使用IARSYSTEMS提供的开发工具,用以开发最前沿的科技产品,从手机应用系统到航天航空、消费电子及工业制造等等。2003年6月,IARSystems传入中国,在中国成立办事处;2007年5月,成立了爱亚软件技术咨询(上海)有限公司,加强了对中国办事处及部分东亚国家的产品销售和技术支持,至此,国内开始正式引用该软件[9]。 4.1.1IAR的下载(1)登陆IAR公司的网站:http://www.iar.com.cn。(2)点击“下载”,出现下载版本选择界面如图11所示,由于IAREWARM试用版有:3039 天功能无限制版本、32K代码限制版本,32K代码限制版的优点是在使用时间上无限制。点击ARM一栏32K限制版,出现软件下载确认页面点击左下角的“continue”,出现注册信息页面,输入注册信息。注意需在“Chipmanufacture”中选择“Texsasinstruments”图10EWARM下载版本选择(3)填完全部选项后,点击“SubmitRegistion”,会出现注册成功的页面如图11:图11注册成功页面提示(4)稍过一会,可收到IAR系统发出的确认邮件,点击页面中的链接,在弹出的页面中,获得IAR提供的试用版序列号和密钥,如图12,点击页面中的“Downloadfrom”中的链接便可下载安装程序。39 图12EWARM提供的序列号及密钥4.1.2IAR安装(1)下载完IAR开发软件,找到安装文件,双击安装程序“EWARM-KS-WEB-5501”,启动安装。(2)在安装页面中,点击InstallIAREmbeddedworkbench,开始安装。在安装过程中,需要输入试用版序列号和密钥在下载过程中得到,输入完成后,点击Next继续安装。(3)安装完成后,点击Finish,结束安装。4.1.3IAR文件的创建、使用(1)先创建一个工程文件目录,用来存放工作区文件、工程文件及源文件[10]。以时间显示为例,存放于D:qclshijian目录下。(2)启动IAREWARM(3)创建“shijian”项目打开IAREWARM,在工作区内新建项目:1)点击“project”,选择“Creatnewproject”。2)默认选择ARM和Emptyproject,创建一个基于ARM得空项目。3)保存项目,设置其名称为shijian.ewp。(4)创建文件组项目创建完成后,在项目中添加三个文件组lib、src、startup,用于存放不同类型的源文件。1)右击项目名称,点击“add”,选择“addgroup”,在弹出的addgroup对话框中输入文件组的名称,如图13:39 图13添加文件组名称1)向文件组中添加文件,右击文件组名,单击“add”,选择“addfiles”,添加所需文件,比如lib文件组中的driverlib.a,是任何一个项目中必不可少的,路径为:C:stellarisWaredriverlibewarmExe。如图14:图14添加文件driverlib.a另一个必不可少的文件为startup_ewarm.c,需添加在startup文件组下,其路径为C:stellarisWareboardsek-lm3s9b92hello。此文件需复制到新项目的文件夹下,再添加到startup文件组2)在本例中,直接向源程序添加“shijian.c”及其它程序,添加完成后,如图15所示:39 图15项目主页面(5)项目属性设置在完成前两步之后,对项目进行设置,右击“shijian-Debug”,弹出如图16窗口:图16项目属性设置窗口1)通用选项设置点击GeneralOptions选项,在Target选项下,点击Device,在右侧选择TexasInsruments、LM3S811。2)C/C++编译器设置点击Preprocessor选项卡,添加Include文件目录,如图17所示:添加C:stellarisWaredriverlib、C:stellarisWareinc等。图17C/C++Compiler设置39 3)OutputConverter设置在Output选项卡中,勾中Generaladditionaloutput,在outputformat里选择binary,再勾中overridedefault。这样在编译时会自动生成二进制文件shijian.bin,方便下载。4)Linker选项设置勾中overridedefault,在选择添加D:qclshijianLM3S811.icf。在List选项中选择generatelinkermapfile,生成MAP文件。5)Debugger选项设置在setup里面的driver选项选择LMFTDI;在download下勾中verifydownload和useflashload。6)LMIFTDI设置在Interface下选择JTAG,在JTAG里选择100KHz。(6)编译、下载若代码经过调试、编译没有问题,可以下载仿真,编译调试界面如图18:图18编译调试4.2控制显示在显示系统中,我们通过主控芯片LM3S811对12864显示模块进行控制,通过12864显示模块对主控芯片的命令进行读取,得到需要显示的数据或者指令,对所需显示的数据进行显示。12864液晶显示模块的每一个字符分为三个字节进行传送,其串行传送过程如图19:39 图19串行时序图串行数据传送分三个字节完成:第一个字节:串口控制—格式为11111ABCA为数据传送方向控制:H表示数据从LCD到MCU,L表示数据从MCU到LCDB为数据类型选择:H表示数据时显示数据,L表示数据是控制指令C固定为0第二个字节:8位数据的低4位—格式为DDDD0000第三个字节:8位数据的高4位—DDDD0000在本设计中使用了如上的串行传送方式,每一个数据分三个字节进行传送,其中第一个字节的前五位与最后一位为固定的1或0,第六位控制数据的传送方向,第七位对传送的数据类型进行选择;第二个字节开始对具体数据进行传送,首先传送的是数据的高四位,经过第二个字节的传送,就完成了对数据的高四位的传送,第三个字节就对数据的第四位进行了传送,至此,一个完整的数据得以传送成功。以下是对几个基本的在设计中用到的具体指令集的介绍[11]:(1)清除显示CODE:RWRSDB7DB6DB5DB4DB3DB2DB1DB0LLLLLLLLLH功能:清楚显示屏幕,把DDRAM位址计数器调整为“00H”(2)显示状态开/关CODE39 RWRSDB7DB6DB5DB4DB3DB2DB1DB0LLLLLLHDCB功能:D=1:整体显示ONC=1:游标ONB=1:游标位置ON(3)功能设定CODERWRSDB7DB6DB5DB4DB3DB2DB1DB0LLLLHDLX0REXX功能:DL=1(必须设为1)RE=1:扩充指令集动作RE=0:基本指令集动作(4)位址归位CODERWRSDB7DB6DB5DB4DB3DB2DB1DB0LLLLLLLLHX功能:把DDRAM位址计数器调整为“00H”,游标回原点,该功能不影响显示DDRAM(5)反白选择CODERWRSDB7DB6DB5DB4DB3DB2DB1DB0LLLLLLLHR1R0功能:选择4行中任意一行作反白显示,并可以决定反白的与否。其中R1R0为00是表示第一行反白与否,01表示第二行的反白与否,依此类推。下面是一段字符传送程序,即一个字符是如何分为三个字节传送的:voidSend(uchartype,uchartransdata){ucharfirstbyte=0xf8;//synchronizingbitstringuchartemp;uchari,j=3;if(type){firstbyte|=0x02;}GPIOPinWrite(cy_PORT,cyCS,0xFF);GPIOPinWrite(cy_PORT,cyCLK,0x00);while(j>0)39 {if(j==3)temp=firstbyte;//Synchronizingbitstringelseif(j==2)temp=transdata&0xf0;//1stbyte=HigherDataelsetemp=(transdata<<4)&0xf0;//2stbyte=LowerDatafor(i=8;i>0;i--){if(temp&0x80)GPIOPinWrite(cy_PORT,cySID,0xFF);else{GPIOPinWrite(cy_PORT,cySID,0x00);}GPIOPinWrite(cy_PORT,cyCLK,0xFF);temp<<=1;GPIOPinWrite(cy_PORT,cyCLK,0x00);}if(j==3)SysCtlDelay(600*(TheSysClock/3000000));//延时约600uselseSysCtlDelay(200*(TheSysClock/3000000));//延时约200usj--;}GPIOPinWrite(cy_PORT,cySID,0x00);GPIOPinWrite(cy_PORT,cyCS,0x00);}4.2.1汉字显示在12864显示模块中,带有中文字库,可以显示汉字,下面的程序就是汉字显示的主程序,它显示的是8行汉字,由于12864显示模块为128*64,即可以显示四行汉字,每行可以显示八个汉字,所以通过循环显示,每次显示四行,完成八行汉字的显示。39 voidmain(void){jtagWait();//防止JTAG失效,重要!clockInit();//时钟初始化:晶振,6MHz//初始化指针数组ptr[0]=h0;ptr[1]=h1;ptr[2]=h2;ptr[3]=h3;ptr[4]=h4;ptr[5]=h5;ptr[6]=h6;Ini_Lcd();//初始化液晶unsignedchartmp;for(;;){tcnt++;if(tcnt==0x02){Disp_HZ(0x80,ptr[d1],8);Disp_HZ(0x90,ptr[d2],8);Disp_HZ(0x88,ptr[d3],8);Disp_HZ(0x98,ptr[d4],8);tmp=d4;d4++;if(d4==7){d4=0;}d1=d2;d2=d3;39 d3=tmp;tcnt=0;}SysCtlDelay(1000*(TheSysClock/3000));//延时约1000ms}}4.2.2图片显示12864显示模块可以显示图片,由于在显示图片的过程中,需要根据图片的内容来控制128*64个点的每个点的高低电平,从而达到显示图片的效果,在这里我非常感谢晓奇提供的液晶显示字模提取系统,给予了我很大的方便,在实现显示延大校徽的时候,通过图形编辑器对图片进行处理处理,先用魔棒对图片部分进行选择,再根据需要调整图片的饱和度、色度以及黑白、锐化等,最终使用晓奇提供的液晶显示字模提取工具对图片进行字模提取,在图片编辑和提取的过程中,需要注意的是图片的大小必须是128*64的,在提取的界面中,参数书设定为128*64,才可以得到正确的显示内容,否则会出现显示器显示出来为乱码的情况,如图20是字模提取的显示结果:图20提取的图片4.2.3按键中断控制时间显示在小车显示系统的设计中,根据需要,对时间的显示是必不可少的一部分内容,其中要对总时间显示。在时间显示中,需要用到的功能主要为定时器,在定时的过程中,把秒转换成我们平时所见的时分秒的形式,由于是小车时间显示,所以需要在小车启动的时候,开始计时,在小车停止的时候,停止计时。所以就需要设置按键,在按下键时,开始计时,再次按键时,停止计时,在三次按键时,由于对变量eiTi进行清零处理,因此从零开始再计时。从而达到可以计出每次小车运行的总时间。39 如下是按键计时的流程图和部分源程序:t=1启动动GPIO中断处理停止t=0if(t==0)t=1;if(t==1)t=0;按键计时图21按键计时voidGPIO_Port_B_ISR(void){unsignedcharucVal;unsignedlongulStatus;ulStatus=GPIOPinIntStatus(KEY_PORT,true);//读取中断状态GPIOPinIntClear(KEY_PORT,ulStatus);//清除中断状态,重要if(ulStatus&KEY_PIN)//如果KEY的中断状态有效{SysCtlDelay(10*(TheSysClock/3000));//延时约10ms,消除按键抖动while(GPIOPinRead(KEY_PORT,KEY_PIN)==0x00);SysCtlDelay(10*(TheSysClock/3000));//延时约10ms,消除松键抖动if(t==0){t=1;TimerLoadSet(TIMER0_BASE,TIMER_A,60000);//定时1s39 TimerEnable(TIMER0_BASE,TIMER_A);//使能Timer计数GPIOPinWrite(LED_PORT,LED_PIN,0xFF);//点亮LED,定时开始eiTi=0;//三次按键后时间清零}elseif(t==1)t=0;}}进入程序for定时1S按键中断处理eiTi++否是eiTi换算为时分秒的形式显示按键停止图22时间显示流程39 在启动程序之后,对GPIO、定时器、中断进行一系列的设置,再通过for循环显示出小车运行的总时间,再通过处理使得时间以x时x分x秒的形式显示出来。进入for循环之后,第一次按键之后,设置定时器定时为1秒,即每隔一秒进入中断一次,变量eiTi将增加1,LED将翻转一次,计时器开始计时。流程图见图22://计算并显示eiHo=eiTi/3600;n=eiTi%3600;eiMi=n/60;eiSe=n%60;Disp_HZ(0x88,cstr,8);sprintf(cbuf,"时间:%dS,%d",eiTi,i);sprintf(cstr,"时钟%2d时%2d分%2d秒",eiHo,eiMi,eiSe);{Disp_HZ(0x98,cbuf,8);i++;}voidTimer0A_ISR(void){unsignedcharucVal;unsignedlongulStatus;ulStatus=TimerIntStatus(TIMER0_BASE,true);//获取当前中断状态TimerIntClear(TIMER0_BASE,ulStatus);//清除全部中断状态if(ulStatus&TIMER_TIMA_TIMEOUT)//如果是超时中断{ucVal=GPIOPinRead(LED_PORT,LED_PIN);//反转LEDGPIOPinWrite(LED_PORT,LED_PIN,~ucVal);}++eiTi;}4.2.4“小车状态”动态显示在实现显示的过程中,我做了“小车状态”的动态显示,由于一个汉字要占两个字节,因此在编写程序的过程中,需要一次移位两个字节,如果只移一位,显示出的结果是乱码。下面是实现动态显示的过程:首先把第一个汉字的两个字节赋给两个临时变量,然后把第二个汉字的两个字节按高低字节放入第一个汉字原占的单元中,第三个汉字放入第二个汉字的单元中,依此类推,直到最后一个放入倒数第二个汉字的单元中,39 再把第一个汉字的两个临时变量中的内容放入最后一个汉字原来占的单元中,至此完成了第一个循环,如此一直下去,则可完成汉字的动态(循环往左)显示。if(i%10==0){psl=strlen(cstr1);ctemp=cstr1[0];ctemp1=cstr1[1];for(j=0;j:rn");//请输入一个命令,按回车执行uartPuts("ton=LEDturnsonrn");//输入on点亮LEDuartPuts("toff=LEDturnsoffrn");//输入off熄灭LEDfor(;;){uartPuts("cmd>");size=uartGets(s,sizeof(s));//从UART接收命令字符串if(size>0){if(!strcmp(s,"on"))//如果输入on{GPIOPinWrite(LED_PORT,LED_PIN,0xff);//点亮LED}elseif(!strcmp(s,"off"))//如果输入off{GPIOPinWrite(LED_PORT,LED_PIN,1<<2);//熄灭LED}else{uartPuts("Errorcommandrn");//错误命令39 }uartPuts("OKrn");}}}附录2:图26LM3S811最小系统板原理图布局附录3:详细程序详细程序如下:#include"systemInit.h"#include#include"cryfucns.h"#include"uartGetPut.h"#include#include#include"xiaohui.h"constunsignedcharh0[]={"延安大学"};constunsignedcharh1[]={"物理电子信息学院"};39 constunsignedcharh2[]={"电子信息工程07级"};constunsignedcharh3[]={"1070207014036"};constunsignedcharh4[]={"秦昌丽"};constunsignedcharh5[]={"小车显示系统"};constunsignedchar*ptr[4];charcbuf[40];charcstr[40];charcstr1[40];charder[40];charctemp,ctemp1;chardtemp,dtemp1;floatfv;floatfa;unsignedchard1=0,d2=1,d3=2,d4=3;unsignedchartcnt=0;externinteiTi=0;externinteiHo=0,eiSe=0,eiMi=0;intpsl,dsl,it;intj,dj,di,ip=3;intt=0;intik;//定义LED#defineLED_PERIPHSYSCTL_PERIPH_GPIOE#defineLED_PORTGPIO_PORTE_BASE#defineLED_PINGPIO_PIN_1//定义KEY#defineKEY_PERIPHSYSCTL_PERIPH_GPIOB#defineKEY_PORTGPIO_PORTB_BASE#defineKEY_PINGPIO_PIN_539 //主函数(程序入口)intmain(void){jtagWait();//防止JTAG失效,重要!clockInit();//时钟初始化:晶振,6MHzSysCtlPeriEnable(LED_PERIPH);//使能LED所在的GPIO端口GPIOPinTypeOut(LED_PORT,LED_PIN);//设置LED所在的管脚为输出GPIOPinWrite(LED_PORT,LED_PIN,0x00);//熄灭LEDSysCtlPeriEnable(KEY_PERIPH);//使能KEY所在的GPIO端口GPIOPinTypeIn(KEY_PORT,KEY_PIN);//设置KEY所在管脚为输入GPIOIntTypeSet(KEY_PORT,KEY_PIN,GPIO_LOW_LEVEL);//设置KEY管脚的中断类型IntPrioritySet(INT_GPIOB,2<<5);GPIOPinIntEnable(KEY_PORT,KEY_PIN);//使能KEY所在管脚中断IntEnable(INT_GPIOB);//使能GPIOB端口中断SysCtlPeriEnable(SYSCTL_PERIPH_TIMER0);//使能Timer模块TimerConfigure(TIMER0_BASE,TIMER_CFG_16_BIT_PAIR|TIMER_CFG_A_PERIODIC);TimerPrescaleSet(TIMER0_BASE,TIMER_A,99);//预先进行100分频TimerIntEnable(TIMER0_BASE,TIMER_TIMA_TIMEOUT);//使能Timer超时中断IntPrioritySet(INT_TIMER0A,1<<5);IntEnable(INT_TIMER0A);//使能Timer中断IntMasterEnable();//使能处理器中断Ini_Lcd();//初始化液晶Clear_GDRAM();Draw_PM(xiaohui);//显示延大校徽SysCtlDelay(1500*(TheSysClock/3000));Clear_GDRAM()39 {strcpy(cstr1,"");strcpy(der,"欢迎各位老师");strcpy(cstr,"检查我的毕业设计");strcpy(cbuf,"");Disp_HZ(0x80,cstr1,8);Disp_HZ(0x90,der,8);Disp_HZ(0x88,cstr,8);Disp_HZ(0x98,cbuf,8);SysCtlDelay(1000*(TheSysClock/3000));Clear_GDRAM();}ptr[0]=h0;ptr[1]=h1;ptr[2]=h2;ptr[3]=h3;ptr[4]=h4;ptr[5]=h5;unsignedchartmp;intk;for(k=0;k<10;k++){tcnt++;if(tcnt==0x02){Disp_HZ(0x80,ptr[d1],8);Disp_HZ(0x90,ptr[d2],8);Disp_HZ(0x88,ptr[d3],8);Disp_HZ(0x98,ptr[d4],8);tmp=d4;d4++;39 d1=d2;d2=d3;d3=tmp;tcnt=0;k++;}SysCtlDelay(800*(TheSysClock/3000));//延时约1000ms}Clear_GDRAM();inti=0;intn;strcpy(cstr1,"小车状态");//strcpy(der,"按键启动小车");//Disp_HZ(0x90,der,8);for(;;){if(t==1){if((it%200)==0){strcpy(der,"<---前进----");ip=0;}elseif((it%200)==100){strcpy(der,"----后退--->");ip=1;}}fa++;it++;//按键后开始递加if(t==0)39 {TimerDisable(TIMER0_BASE,TIMER_A);//使能Timer计数strcpy(der,"按键启动小车");it=199;ip=2;//der赋值标志位}if(di%10==0){if(ip==0){dsl=strlen(der);dtemp=der[0];dtemp1=der[1];for(dj=0;dj2;){39 der[dj-1]=der[dj-3];der[dj-2]=der[dj-4];dj=dj-2;}if(dj=2){der[dj-1]=dtemp;der[dj-2]=dtemp1;}}}//计算并显示小时eiHo=eiTi/3600;n=eiTi%3600;//计算并显示分钟、秒eiMi=n/60;eiSe=n%60;fv=fa/100.0;sprintf(cbuf,"速:%4.2fcm/s",fv);sprintf(cstr,"时:%2d时%2d分%2d秒",eiHo,eiMi,eiSe);Disp_HZ(0x88,cstr,8);{Disp_HZ(0x90,der,8);Disp_HZ(0x98,cbuf,8);i++;di++;}if(i%10==0){psl=strlen(cstr1);39 ctemp=cstr1[0];ctemp1=cstr1[1];for(j=0;j