自动避障小车课程设计.docx
过由/本次厚单片机系统成绩评定表设计课题:自动避障小车学院名称:电气工程学院专业班级:自动1105学生姓名:学号:指导教师:设计地点:31-630设计时间:指导教师意见:成绩:签名:年月曰m由7本次,孽单片机系统课程设计课程设计名称:自动避障小车专业班级:自动11班学生姓名:学号:指导教师:课程设计地点:31-630课程设计时间:单片机系统课程设计任务书1概述441.1研究背景学生姓名专业班级学号题目自动避障小车课题性质产品设计课题来源自拟指导教师主要内容(参数)利用增强版51MCU设计一个自动避障小车,实现以下功能:1、自主判别障碍,自动避开障碍;2、识别出多障碍区和空旷区;3、能在空旷区快速行进,在多障碍区适当速度行进。任务要求(进度)第1天:熟悉课程设计任务及要求,查阅技术资料,确定设计方案。第2-5天:按照确定的方案设计电路。画出总体电路图,而且选好各个元件的参数、数量类型。然后由原理图生成PCB,用热转印法腐蚀这个电路板。第6-7天:构建硬件系统,并且测试确认都可以正常工作。之后完成机械部分和硬件部分的搭建。第8T1天:编写程序,设计软件,并且开始撰写课程设计报告。第12-13天:整体调试,逐步完善。第14天:完成课程设计报告。主要参考资料【1】张迎新.单片微型计算机原理、应用及接口技术(第2版)M.北京:国防工业出版社,20042单片机程序设计实例清华大学出版社【3】单片机应用设计200例【4】单片机程序设计及应用李华军,电子工业出版社审查意见系(教研室)主任签字:年月日1.2设计思想及基本功能52总体方案设计52. 1方案论证43. 2系统框图52Qrp-i*-W-4-C3硬件电路设计73. 1电源电路83. 2晶振电路93. 3复位电路93. 4键盘电路93. 5显示电路103. 6超声波测距电路114. 7舵机电路124.8 电机驱动电路124.9 电机转速测量电路143. 10设计PCB和腐蚀电路板154系统软件设计173.1 分模块程序设计184. 2主程序设计205系统调试206总结21参考文献:22附录A硬件电路图24附录B源程序251概述1.1 研究背景科技的发展趋势之一就是让几乎所有的东西具有一定的智能。这样的智能一方面可以避免人的复杂性带来的错误,另一方面,作为人的能力的延伸,快速、便捷地适应环境。本文研究的超声波自动避障小车,就是让小车具有一定的智能,可以作为有人驾驶车辆的一部分,帮助司机及早发现司机还未觉察的危险。另外,可以应用在无人控制系统里,代替人类完成信息接收、处理和判断。那么这样它还有更广阔的应用和发展空间。这个月我国嫦娥三号载着玉兔号月球车踏上了月球,已经开始探索活动。玉兔号月球车可以自动寻找有价值的目标,自动避开障碍物,自动寻找最优路径等等,这些功能在原理上都差不多,只是所用仪器以及控制算法的不同。1. 2设计思想及基本功能小车设计的基本思路是:不断扫描前方180°左右的水平面内的物体,根据反馈的距离和方位信息确定前方的地形是开阔还是多障碍。然后根据这些信息通过路径最优算法选择前进方向。小车的基本功能是识别空旷区和多障区;自动避开障碍物;能够在空旷区快速行驶。2总体方案设计1.1 方案论证首先是测距方案:方案一:激光测距优点:测速快,适应范围广,精确;不过相对于自动避障小车系统,有点大材小用。激光测距是点对点的测距,一般进行远距离测距比较精确。如是近距离激光测距,必须要涉及到微小时间测量,51MeU无法胜任。因此激光测距方案否定。方案二:超声波测距优点:结构简单,成本低,便于与MCU联机工作。测量范围从5CM到几百米的距离内精度在毫米级。尽管它测量的是点到面的距离,但是定向性满足本小车系统的要求。而且,数据处理简单。可以考虑。方案三:雷达测距不太现实,受到本人技术水平限制,无法驾驭雷达测距系统,此外,雷达应用于较大范围的测量和监控,如果用于本小车,同样涉及到微小时间测量,以及雷达数据处理,51MCU难以胜任。否定!方案四:红外线测距优点:技术难度低,数据处理简单,但是测量开关信号比较好,测量连续信号不够准确。测量的精度有点低。因此不是一种较好的测距方法。综合各因素,选用超声波测距。其次是微控制器的选择:可选的微控制器有:51系列的STC89C52RC>STC12C5A60S2;Tl公司的MSP430G2553;飞思卡尔的MC9S12XS128MAL;意法的STM32F407-Discover;(这些玩儿过一点,而且最小系统板手边都有)根据本系统的需求,需要两路同频率(50hz)的PwM控制两个舵机、一路PWM频率约几千赫兹控制电机、三个个定时器做脉冲捕捉、至少两个外部中断输入、一个并行6800总线接口。除了51系列的两款,其他一片足以胜任。而且对于意法的F407显得大材小用。飞思卡尔的S12比较合适;Tl的G2553的引脚有点少(20个),外围电路设计的会复杂一点,成本也会高一点。60S2用两片比较合适;用89C52比较麻烦,两片也不够。根据个人能力,以及时间和进度方面考虑选用60S2,60S2呢,它的资源有:完全兼容51的两个定时器TO、TI和两个外部中断;两路拥有独立波特率的串行口;一个PCA定时器,可产生两路同频的PWM;八个10位精度的AD转换通道;一个硬件SPl接口。2. 2系统框图系统框图如图2.2所示图2.2系统框图2.3总体方案设计两片60S2一个做主机,一个做从机,通过串行口通信,传递数据。主机用到的功能有:(1)、定时器TI和外部中断INTl,作用是:测脉宽,用到的IO是P3'3;P20作为超声波测距模块的触发功能引脚;(2)、定时器TO和PCA产生两路同频率的PWM,作用是:TO的溢出率作为PCA的计数脉冲产生50HZ的PwM控制两路舵机。使用TO作为PCA的时钟源,可以通过改变TO的溢出率改变输出的频率。用到的IO是Pr3和P4;(3)、外部中断INTO接一个按键。(4)、串口一使用独立波特率发生器,与从机通P3P和P3T;(5)、并行数据接口:PO口作为6800并行总线的数据总线P2/、P2-6和P2"作为控制总线,分别为:EN(总使能)、RW(读写控制)、CD(命令数据控制);地址总线CS接地,一直处于选通状态。从机用到的功能:(1)、串行口一使用独立波特率发生器P30和P3与主机通讯;(2)、PCA产生一路PWM,P2共同控制电机速度。(3)、定时器TO和Tl作为编码器脉冲计数和测脉宽使用,测量电机的转速。3硬件电路设计首先是单片机的最小系统如图3.1、3.2所示S3OSW-PBIuFStCCrlS(CCr2M XTALINC2XL-Icrystal4 XTALOUTR T10T R1 1121314ECHO15KEYl16KEY217XTA LIN 18M XTALou节Pl .0ADC0CLKOUT2VCCPl .1 /ADClPO .0Pl .2ADC2ECTRXD2P0.1Pl 3/ADC3/CCP0/TXD2PO .2Pl .4ADC4CCP1SSPO .3Pl .5/ADC5/MOSIPO .4Pl .6ADC6MISOPO .5Pl .7ADC7SCLKPO .6R ST/P4 .7PO .7P3 .0/R XDEX.LVDP4.6RST2P3.l /TXDALE/P4.5P3 .2/INTONA/P4 .4P3 .3/INTIP2 .7P3 .4,0CLKOUT0P2 .6P3 .5"I/CLKOUTIP2 .5P3 .6P2 .4P3 .7P2 .3XTAL.0P2 .2XTAL. 1P2.IGNDP2 .0Ul38 Dl37 D236 D335 D434 D533 D632 D731302928 EN27 R-W26 C/D25242322 TRIG21 buzz+5 4T 39 DO图3.1单片机的最小系统图3.2单片机的最小系统然后是各个模块电路:2.1 电源电路本系统由7.5V可充电电池供电,由开关电源LM2596转换成5V电压给单片机和测距模块供电。出于对系统的稳定性、可靠性和成本的考虑,选用了开关电源模块作为转换电路。电源部分电路如图3.3图3.4电源模块实物3. 2晶振电路虽然60S2内部有RC振荡电路作为时钟电路的输入源,但是外部连接一个无源晶振电路,可以使单片机的时钟频率更稳定,因而工作更可靠。电路参数:四个电容均为22PF,作为石英晶振频率的微调。石英晶振的频率为12MHZ。3.1 复位电路复位电路是单片机必不可少的基本电路,在调试阶段,可以按下复位按键,使复位引脚保持两个机器周期的低电平,就可以使单片机内部所有电路初始化。电路参数:电容IUF只要保证电容的时间常数大于两个机器周期即可。电阻值为IK欧。3.2 键盘电路键盘电路如图3.5所示IZZlCZJ图3.5键盘电路可以利用外部中断法或查询法检测按键是否按下。这里都采用外部中断的方法检测。3. 5显示电路显示电路如图3.6所示图3.6显示电路采用1603液晶屏显示数字和字符。1603与1602的硬件接口完全一样。不同之处在于1603的RAM区的内容可以全部同时显示在屏幕上,没有屏幕内容的位移切换。可以显示四行。状态指示灯如图3.7所示图3.7状态指示灯这几个LED灯是作为状态指示用的,方便调试。3.6 超声波测距电路超声波测距模块如图3.8所示图3.8超声波测距模块这是超声波模块的接口电路。这个超声波的工作原理是:(1)采用IO触发测距,给至少IOus的高电平信号;(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;(3)有信号返回,通过IO输出一高电平,高电平持续的时间就是(4)超声波从发射到返回的时间.测试距离=(高电平时间*声速(340MS)2;超声波模块测距工作时序图:触发信号(由单片机产生一个宽度大于IOUS的高脉冲,触发模块工作一次):_l模块内部发出的信号(循环发出8个40KHZ的脉冲):输出回响信号(回响信号的高电平持续时间正比于检测的距离):3.7 舵机电路舵机电路如图3.9所示图3.9舵机电路舵机驱动电路。舵机接口是信号线、电源正、地。信号线一般可以直接接到单片机的IO上,但是接多了就不行了,电流太大。这里用了一级三极管驱动。通常用的这种舵机,控制信号是一个周期为20ms占空比在2.5%-12.5%之间的PWM信号,分别对应舵机的控制角为0°-180°之间。舵机本身有反馈调节,因此,单片机给出一个占空比,舵机就到某一个角度。3. 8电机驱动电路电机驱动电路如图3.10所示10:图3.10电机驱动模块电机的控制采用的是L298N全桥驱动电路。驱动电路如图3.11所示图3.11驱动电路电机正反转原理:电流流向:PWM:I假设此时电机正转fI-该时刻电机反转-fI3.9 电机转速测量电路电机转速测量电路如图3.12所示图3.12电机转速测量电路编码器输出信号:AB两相输出矩形正交脉冲,电路输出为NPN集电极开路输出型,此种输出类型可以和带内部上拉电阻的单片机。接线方式:黄=A相,蓝=B相,红=VCC正电源,黑=VO地。编码器输出信号图如图3.13所示AJoth_n_1IIBJTLJTLrrLJ_Ll3.10 设计PCB和腐蚀电路板这是原始的PCB图和单面的腐蚀电路板,红色的TOPLAYER层作为跳线。PCB如图3. 14所示Eo2013216图3.15打印PCB负片图图3.16腐蚀效果图4系统软件设计主程序的流程图如图4.1所示。(结束)图4.1主程序流程图主程序流程说明:电路主要分为以下几个部分,分别是电源部分、显示部分、按键部分、步进电机控制部分、超声波检测模块、舵机模块、单片机主控器件部分,各部分具有不同的子程序。系统初始化流程如图4.2所示:关闭总中断11603显示初始化串口初始化外部中断初始化超声波测距模块初始化舵机PWM初始化开系统总中断图4.2系统初始化流程图4. 4.1分模块程序设计5. 1.l键盘程序小车系统需要的按键不多,有两个,采用中断法。在系统中的作用是启动小车。4.1.2舵机驱动程序和电机驱动程序控制原理部分在叙述硬件时已介绍。这里说说具体怎么实现。产生50HZ的PWM控制舵机:时钟频率Fosc=I1059200HZ,定时器TO的溢出率FtO作为PCA定时器的时钟输入。60S2工作在51模式下。设TO的初值为X,自动重装模-完整版学习资料分享一-式,TO、PCA均无中断。计算方法为:X*(12Fosc)*256=0.02s可以得出X=72,TH0=0xB7o再计算占空比:PCA的中心计数器每(72*12Fosc)秒记一个数,记256个数(即一个八位计数器)溢出再从零开始。比较寄存器的取值是:256*0.025和256*0.125之间,对应的转角在0到180度。在实际情况下,舵机不够精密,最大旋转角没有180度,而且比较寄存器只能比较写入整数。实际的取值为729,控制方向的舵机取值为1721(分级明显,转向不够舒畅啊)。4. 电机的频率没有严格的要求,因此,选用简单的处理:对时钟进行256*12分频,是3.6KHZ。5. 1.3超声波测距程序超声波测距实现原理就是测量高电平脉冲持续的时间。用到了51定时器启停由外部控制的功能。GATE=I,TRn=I,定时器由外部中断引脚电平控制,上升沿之后开始计数,下降沿之后停止计数。同时打开相应的外部中断,在下降沿到来后进入外部中断服务程序,记录停止计数时的数值。这里应当注意一个问题是:如果测量的距离较远,定时器可能就溢出了,对这个不处理,结果将是错误的。因此同时开启定时器中断,在溢出时,记下溢出的次数。距离的计算方法是:距离二(Number*(12Fosc)+N*65536*(12Fosc)/2voidIntl_Routine(void)interrupt2(T=(TH1*256+TL1);THl=O;TLl=O;juli=(float)Tl_Count)*11141.12+0.1844618*(float)T);1.CDWriteNumber(0,2,juli,5);TlCount=O;T1_F=1;4. 2主程序设计主程序里主要是避障程序。我的思路是,把区域三部分:近距离20CM以内,适中区域(20CM-150CM),远距离(15OCM以外)。得到22组数据后首先是根据区域分类,然后记各区域的角度大小,当远距离的角度范围最大时,判断为空旷区,其他是多障碍区。然后根据角度大小排序,当适中区最大时,走的方向为适中区集中的方向。当最大区域为近距离或远距离时,走远距离区,具体方向为最远点方向。速度总是由最近的障碍物距离计算得出。5系统调试首先是分模块调试。把各个模块的功能分开实现。然后是部分的组合到一起使用,如超声波测距和1603显示、两路舵机同时控制。在软件调试的时候,出现了RAM区不够用。原因出在避障算法上。定义的数组多,而且长。用户128RAM不够用。可以有两个解决办法:一是改进代码,使用指针;二是扩展RAM区。考虑到代码优化不是一天两天就弄好的,而且我的C语言编程水平实在浅薄,指针依然是用不好,一用就报错。那只好扩展RAM。查查60S2的数据手册,它取消了外部扩展RAM和ROM的功能,但是内部增加了IKB的RAM,用法是在定义变量时,加前缀“XDATA”,告诉编译器把后面的变量定义在扩展RAM区。此外我还了解到“DATA”、“PDATA"、“IDATA”都是51系统编译器允许的关键字,具体的解释是:dATa:固定指前面OXo(三)x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。idATa:固定指前面OXo(三)Xff的256个RAM,其中前128和dATa的128完全相同,只是因为访问的方式不同.idATa是用类似C中的指针方式访问的。汇编中的语句为:moxACC,Rx.(不重要的补充:c中idATa做指针式的访问效果很好)xdATa:外部扩展RAM,一般指外部OXoOO(三)Xffff空间,用DPTR访问。pdATa:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movxACC,RX读写。硬件方面的调试主要在模块调试方面。因为基本上都用的现有的模块电路,自己设计的电路基本没有(自己还差的很远唉!),没有什么难的。小车主板:图5.1小车主板整车图片:图5.2整车鸟瞰图6总结两周的单片机课程设计很快就结束了,但是在进军单片机领域,这仅仅是个开始。学习单片机最重要的是实践。要投入必要的成本。一块开发板必不可少,还有一大堆配套的硬件软件。作为有志于今后继续在单片机方面发展的我,学会使用51单片机,远远不够,世界上51系列占的市场份额并不多。流行的单片机,其功能远远好于51,因此,学习51单片机重点在于利用它简单易学的特点掌握单片机的各种通用性的东西,深刻理解和掌握它的工作原理和使用方式,这样可以快捷的掌握其他单片机的使用。把单片机作为改变生活的万能工具。学习单片机,离不开编程,离不开软件。C语言作为一种高级语言,与硬件联系紧密。因此在单片机领域,基本都用的是C语言。灵活运用C语言,对单片机学习带来极大的便利。今后还得继续深入学习C语言。还有一点,非常重要,把软件工程的思想融入到单片机的编程中。比如分层和封装思想。这个课程设计中所有的程序,并不是都在这两周写的,有一些以前玩过类似的模块,当然有可靠地例程,在这里,修改一下硬件接口,修改一下工作方式,就可以用了。由此看出,单片机学习是可以积累的。除了掌握大量的知识,还有个人的单片机例程、软件、电路设计库,这样会越来越容易。参考文献:1单片微型计算机原理、应用及接口技术(第2版)张迎新.M.北京:国防工业出版社,20042夏路易石宗义.Protel99se电路原理图与电路板设计教程.北京:北京希望电子出版社,20043单片微型计算机原理、应用及接口技术(第2版)张迎新.3.北京:国防工业出版社,20044宏晶STCI2单片机技术手册附录A硬件电路图募翦二甘lf三2,科叁3mpll%-PJ索聚S:鼠籍(修<哥穹孚彩二舞琴gl国图A.1整车鸟瞰图附录B源程序工程文件结构:1)rojectTargetQ回日dTarget1QSourceGroup1目因main.cQREG52.HQDE11NE.HClDELAY.HH-E)DERNE.H:Q13.HIQCOM.HkQEXTERNIRQ.HIQCAPTURE.HI£|STEEftHIG)IRQHQ1603.H1603.c一固固图图国El:S-回-回scom.cexternIRQ.ccapture.csteer.c图B.1整车鸟瞰图STCI2C5A60S2增加的特殊功能寄存器与地址的映射:#ifndef_REG52_Hdefine_REG52_H_*BYTERegisters*/sfrAUXR=0x8E*stcl2c5a60s2*/sfrWAKE.CLK0=0x8F;/*stcl2c5a60s2*/sfrPlMl=0x91*stcl2c5a60s2*/sfrPlMO=0x92*stcl2c5a60s2*/sfrPOMl=0x93;*stc12c5a60s2*/sfrPOMO=0x94*stcl2c5a60s2*/sfrP2M1=0x95*stcl2c5a60s2*/sfrP2M0=0x96;*stc12c5a60s2*/sfrCLK_DIV=0x97;/*stcl2c5a60s2*/ClockDivdersfrS2C0N=0x9A*stcl2c5a60s2*/sfrS2BUF=0x9B;*stc12c5a60s2*/sfrBRT=0x9C*stcl2c5a60s2*/sfrBUS_SPEED=OxAl*stcl2c5a60s2*/sfrAUXRl=0xA2;*stc12c5a60s2*/sfrIE2=0xAF*stcl2c5a60s2*/sfrP3M1=0xBl*stcl2c5a60s2*/sfrP3M0=0xB2;*stc12c5a60s2*/sfrP4M1=0xB3*stcl2c5a60s2*/sfrP4M0=0xB4*stcl2c5a60s2*/sfrIP2=0xB5;*stc12c5a60s2*/sfrIP2H=0xB6;*stc12c5a60s2*/sfrIPH=0xB7;*stcl2c5a60s2*InterruptPriorityHighsfrP4SW=OxBB;/*stc12c5a60s2*/P4I/OSwitchsfrADC_CONTR=OxBC;*stc12c5a60s2*/sfrADJRES=OXBD*stcl2c5a60s2*/sfrADC_RESL=OxBE;*stc12c5a60s2*/A/DResultLowsfrP4OxCO;*stc12c5a60s2*P4I/OsfrWDTCONTR-OxC1;*stc12c5a60s2*/Watch-Dog-TimerCotrolRegistersfrIAP_DATA=0xC2;*stc12c5a60s2*/TSP/IAPFlashDataRegistersfrIAP_ADDRH=0xC3;/*stcl2c5a60s2*/ISP/IAPFlashAddressHighsfrIAP_ADDRL=0xC4;*stc12c5a60s2*ISPIAPFlashAddressLowsfrIAP-CMD=0xC5;*stc12c5a60s2*ISPIAPFlashCommandRegistersfrIAP_TRIG=0xC6;/*stcl2c5a60s2*/ISP/IAPFlashCommandTriggersfrIAP_C0NTR=0xC7;/*stcl2c5a60s2*/ISP/IAPControlRegistersfrP50xC8;*stc12c5a60s2*P5I/OsfrP5M1=0xC9*stcl2c5a60s2*/sfrP5M0=OxCAj*stcl2c5a60s2*/sfrTL2=OxCC;/*8052*/sfrSPSTAT=0xCD;/*stcl2c5a60s2*/SPIControlRegistersfrSPCTL=0xCE;/*stcl2c5a60s2*/SPIStatusRegistersfrSPDAT=OxCF;*stc12c5a60s2*SPIDataRegistersfrCCON=0xD8;/*stcl2c5a60s2*/PCAsfrCMOD=0xD9*stcl2c5a60s2*PCsfrCCAPMO=OxDA;*stc12c5a60s2*PCAsfrCCAPMl=0xDB;/*stcl2c5a60s2*/PCAsfrCL=0xE9*stcl2c5a60s2*/sfrCCAPOL=OxEAj*stc12c5a60s2*/sfrCCAPlL=OxEB;*stc12c5a60s2*/sfrPCPWM0=0xF2;*stcl2c5a60s2*PCAPWMsfrPAC_PWMl=0xF3;*stcl2c5a60s2*PCAPWMsfrCH0xF9*stcl2c5a60s2*/sfrCCAPOH=0xFA*stcl2c5a60s2*/sfrCCAPlH=0xFB*stcl2c5a60s2*/*BITRegisters*/*CCON*/sbitCF=CCoN7sbilCR=CCOM6;sbitCCFl=CCOMl;sbitCCFO=CeoMO;#endif1.CD1603显示程序文件:#include”reg52.h”#include*dcfinc.h"#include"delay.h"#include”1603.h”bitLCDCheckBusy(void)(u8result;EN=O;DataPort=OxFF;D_C=O;R_W=1;delay_ms(l);EN=I;result=(DataPort&0x80);EN=O;returnresult;)voidLCDWrite_Comm(u8comm)(whiIe(LCDCheckBusy();EN=O;D_C=O;R_W=O;EN=I;delay_ms(l);DataPort=Comm;EN=O;)voidLCDWrite_Data(u8dat)(while(LCD_Check_Busy();EN=O;D_C=1;RJV=O;EN=I;delay_ms(l);DataPort=dat;EN=O;)voidLCD_Write_Char(u8x,u8y,u8Data)(switch(y)(case1:LCDWrite_Comm(0x80+x);break;case2:LCDJVrite_Comm(OxCO+x);break;-完整版学习资料分享一-case3:LCDWrite_Comm(0x90+x);break;case4:LCDWrite_Comm(0xD0+x);break;)1.CDWriteData(Data);voidLCD_Write_String(u8x,u8y,u8*s)(switch(y)(case1:LCDWrite_Comm(0x80+x);break;case2:LCDJVrite_Comm(OxCO+x);break;case3:LCDWriteComm(0x90+x);break;case4:LCDWrite_Comm(0xD0+x);break;)while(*s)(1.CD_Write_Data(*s);s+;)voidLCDWrite_Number(u8x,u8y,u32number,u8Nbit)(u8dat,ten,hun,thu,tenthu,hunthu;hunthu=48+(number/100000);tenthu=48+(number%10000010000);thu=48+(number%l0000/1000);hun=48+(number%1000/100);ten=48+(number%10010);dat=48+(number%l0);switch(y)(case1:LCD_Write_Comm(0x80+x);break;case2:LCDWriteConun(0xC0+x);break;case3:LCDWrite_Comm(0x90+x);break;case4:LCDJVrite_Comm(OxDO÷x);break;-完整版学习资料分享一-=WORD完整版可编辑-专业资料分享=)switch(Nbit)(case6:LCD_Write_Data(hunthu);1.CDWriteData(tenthu);1.CDWriteData(thu);1.CD_Write_Data(hun);1.CDWriteData(ten);1.CDWriteData(dat);break;case5:LCDWriteData(tenthu);1.CD_Write_Data(thu);1.CDWriteData(Hun);1.CDWriteData(ten);1.CD_Write_Data(dat);break;case4:LCD_Write_Data(thu);1.CDWriteData(Hun);LCDWriteData(ten);LCD_Write_Data(dat);break;case3:LCD_Write_Data(hun);LCDWriteData(ten);LCDWriteData(dat);break;case2:LCDWriteData(ten);1.CD_Write_Data(dat);break;case1:LCD_Write_Data(dat);)break;)voidLCDCIear(void)(1.CD_Write_Comm(OxOl);delay_ms(1);voidLCD_Tr)it(void)LCDWrite_Comm(OxOl);delay_ms(l);1.CDWriteComm(0x02);delay_ms(l);1.CD_Write_Comm(0x38);delay_ms(1);1.CDWriteConini(OxOC);delay_ms(l);1.CDWriteComm(0x06);delay_ms(l);1.CD_Write_Comm(0x80);delay_ms(1);1.CD_Write_Data(OxFF);delay_ms(l);1.CD_Write_Data(OxFF);delayms(1);1.CD_Write_Comm(0x8E);delay_ms(1);1.CDWriteJata(OxFF);delay_ms(l);1.CD_Write_Data(OxFF);delayms(1);)#ifndef_1603_H_define_1603Hsbitbuzz=P23;sbitD_C=PO;sbitRW=P1;sbitEN=P2"5;ttdefineDataPortPObitLCD_CheckBusy(void);voidLCD_Write_Comm(u8comm);voidLCDWrite_Data(u8dat);voidLCDWrite_Char(u8x,u8y,u8Data);voidLCD_Write_String(u8x,u8y,u8*s);voidLCDWrite_Number(u8x,u8y,u32number,u8Nbit);voidLCD_C1ear(void);voidLCD-Init(void);串行口程序文件:#endif#include”reg52.h”includez,define.h"#include"delay.h"u8receive;ul6n;u8flagR;u8StopF;voidCOMInit(ul6bps)(u8s;EA=O;if(bps>=19200)(PCONI=0x80;s=l;)else(PC0三=0x7F;s=0;)SC0N=0x50;TM0D=0x20;TH1=256-(28800*(s+l)bps;TL1=256-(28800*(s+l)bps;REN=I;ES=I;EA=I;TRl=I;voidserial()interrupt4(if(TI!=O)(TI=O;fIagR=I;)else(if(RT!=O)(receive=SBUF;Pl=receive;if(receive=0xFF)(StopF=I;)else(if(receive=0x5A)-完整版学习资料分享一-StopF=O;)RT=O;)#ifndef_COMJLWefine_COMJLvoidCOMTnit(ul6bps);#endif自定义变量类型文件:#ifndef_DEFINE_H_#define_DEFINE_H_#defineu8unsignedchar