基于单片机的智能涂料搅拌器设计_第1页
基于单片机的智能涂料搅拌器设计_第2页
基于单片机的智能涂料搅拌器设计_第3页
基于单片机的智能涂料搅拌器设计_第4页
基于单片机的智能涂料搅拌器设计_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本科论文目录摘要 IAbstract II引言 31系统总体架构 61.1需求分析与方案设计 61.2系统架构 71.3系统器件选择 72系统硬件设计 92.1单片机外围电路设计 92.2LCD1602液晶显示电路设计 142.3电机外围电路设计 152.4供电电路设计 163系统软件流程设计 173.1系统总体流程 173.2LCD显示程序设计 183.3液位传感器的程序设计 193.4电机定时与转速控制程序设计 193.5按键控制程序设计 214系统调试 254.1焊接与调试 254.2程序烧录与调试 254.3系统调试 264.4遇到的问题及解决方法 27结论 28参考文献 29附录1原理图 31附录2源程序清单 32致谢 52本科论文摘要目前,在社会主义现代化建设中,涂料市场也在不断发展,因而对搅拌设备的需求也越来越高。为了通过新型的涂料搅拌器设计使得涂料生产的成本降低,减少大量的人力物力提高工作效率,本文进行了基于单片机的智能涂料搅料器设计。基于单片机的智能涂料搅料器设计可以通过外部按键进行控制,利用内部单片机对外部按键以及传感器进行响应,进而控制电机的转速、转向和转动时间。可以适应不同情况下的搅料需求,能够进行正反转,转速调整,定时搅拌等功能。本文首先分析了基于单片机的智能涂料搅料器设计的设计需求,完成了系统架构设计。在此基础上进行了单片机外围电路设计,液晶显示外部电路设计,电机外部电路设计,开关电路设计。在完成硬件电路设计的基础上,进行了软件流程设计,包括对LCD液晶显示控制程序,电机定时以及转速控制程序,按键控制程序。经过实验验证,结果表明基于单片机的智能涂料搅料器设计可以灵活调整工作模式,在启动、停止,正反转,定时设置等模式之间灵活调整。真正实现“一套设备,一机多用,一步到位”。关键词:单片机;LCD;控制程序

AbstractAtpresent,withthecontinuousdevelopmentofthepaintmarket,thedemandformixingequipmentishigherandhigher.Inordertoreducethecostofcoatingproduction,reducealargenumberofhumanandmaterialresourcesandimprovetheworkefficiencythroughthedesignofanewtypeofcoatingagitator,anautomaticmixingsystembasedonsinglechipmicrocomputerisdesignedinthispaper.Thedesignofintelligentpaintagitatorbasedonsinglechipmicrocomputercanbecontrolledbyexternalkeys.Theinternalsinglechipmicrocomputercanrespondtoexternalkeysandsensors,andthencontroltherotationspeed,steeringandrotationtimeofthemotor.Itcanadapttotheneedsofmixingmaterialsindifferentsituations,andcancarryoutpositiveandnegativerotation,speedadjustment,timingmixingandotherfunctions.Firstly,thispaperanalyzesthedesignrequirementsofintelligentpaintagitatorbasedonMCU,andcompletesthesystemarchitecturedesign.Onthisbasis,theperipheralcircuitdesignofMCU,theexternalcircuitdesignofLCD,theexternalcircuitdesignofmotorandtheswitchcircuitdesignarecarriedout.Onthebasisofhardwarecircuitdesign,thesoftwareflowisdesigned,includingLCDdisplaycontrolprogram,motortimingandspeedcontrolprogram,keycontrolprogram.Theexperimentalresultsshowthatthedesignofintelligentpaintagitatorbasedonsinglechipmicrocomputercanadjusttheworkingmodeflexibly,andadjustbetweenthestart,stop,forwardandreverse,timingsettingandothermodes.Trulyrealize"onesetofequipment,onemachinewithmultiplefunctions,onestepinplace".Keywords:MCU;LCD;Controlprogram引言目前,随着涂料市场的不断发展,对搅拌设备的需求也越来越高。为了使新型的涂料搅拌器设计能够降低涂料生产的成本,减少大量的人力物力提高工作效率,因此对涂料搅拌设备进行了大量的研究。建筑涂料是涂料工业重要的组成部分之一,建筑涂料种类繁多,主要包括室内涂料、外墙涂料、地坪涂料、防火涂料等多种功能性涂料。建筑涂料的种类的多少、质量的好坏对美化城乡居住建筑、改善城乡环境具有重要意义。智能涂料搅拌设备有着广阔的发展空间,不仅仅是市场推动其发展,而且新材料、新工艺的产生,必将对化工设备要求更高,研究基于单片机的智能涂料搅拌有着重要的意义。众所周知,在建筑材料生产过程中需要对一些配制好的涂料进行搅拌,这些配制好的涂料一般呈粘稠状液体,经过搅拌以后使各种成分混合均匀,涂料的性质才会达到最佳,才能用于下一道工序的使用,因此,搅拌的工序就显得尤为重要。国外搅拌器械的发展历史悠久,18世纪40年代,在德国、美国、俄罗斯等国家,出现了以蒸汽机为动力源的自落混合搅拌器,其混合室由多面体木质圆筒组成,直到1880年钢铁才开始代替木板,但形状仍然是多面体的[1]。1888年,法国申请了一项用于修建战前道路的混凝土搅拌机的专利。20世纪初,圆柱形混合搅拌器开始流行起来。形状的改善避免了涂料在搅拌筒内壁的凝固和沉积,提高了搅拌质量和效率。1908年,美国出现了第一台由内燃机驱动的搅拌器,随后电动机成为主要动力源[2]。从1913年到1950年,亚洲大陆的日本开始用搅拌机生产预混料。在此期间,各种有无叶片的自落式搅拌机的发明和应用仍然是主流。自落式搅拌机依靠搅拌筒将物料提升到一定高度的自落来完成搅拌。在操作过程中,随着搅拌筒的转动,物料被固定在搅拌筒内壁上的叶片提升到一定高度,然后靠自身重量下落。由于颗粒下落高度、时间、速度、下落点和滚动距离的不同,材料中的颗粒相互渗透、渗透和扩散,最终达到均匀混合。该搅拌方式结构简单,可靠性高,维护简单,功耗小,搅拌筒和搅拌叶片磨损轻,但搅拌强度低,生产效率低,搅拌质量差。根据搅拌筒的形状和出料方式,有筒式搅拌机、双锥反转出料搅拌机、双锥斜卸式搅拌机[3]和对开式搅拌机等,其中筒式简易搅拌机技术性能落后,1987年被建设部列为淘汰产品。随着各类涂料的广泛使用和施工规模的大型化、复杂化,对质量和产量的要求不断提高,有效地促进了搅拌设备性能和技术水平的提高和发展。来自世界各地的研究人员开始对涂料搅拌机的结构、传动方式、搅拌室内衬材料和调漆生产工艺进行改进和探索。20世纪40年代末,德国Elba公司发明了强制搅拌器[4],与自落式搅拌器不同,强制式搅拌器是利用旋转的叶片迫使物料按照预定的轨迹进行剪切、挤压、滚压和抛掷,使物料在剧烈的相对运动中均匀搅拌。与自落式搅拌机相比,强制式搅拌机混合效果强,混合质量好,混合效率高,但搅拌筒和搅拌叶片磨损大,功耗大。根据不同的结构特点,主要有立轴涡流式浆机、立轴行星式浆机、立轴对流式浆机、单横轴式浆机和双横轴式浆机[5]。目前国内常用的有两种搅拌工序,第一个是人工搅拌,这种方式会耗费大量的劳动力,而且人工搅拌力量有限,只能用于搅拌份量很小的涂料,在涂料用量很大的情况下,效率很低,无法实用。此外,在遇到一些黏度较大或颗粒较大的混合粉时,由于人工搅拌力量速度有限,涂料可能发生凝集,导致出现混炼不足、搅拌处理时间长,无法充分混合,工作效率非常低下。第二种是利用机器来进行,在过去相当长的一段时间里,涂料生产中的分散研磨设备主要由分散机、砂磨机和三辊磨床组成。这些传统设备具有各自不同的功能,实现了涂料生产的不同需求。然而,也有不同的局限性。如分散机:用于中高档涂料的生产,只能用于预分散,不能达到中高档涂料所要求的碎浆效果;砂磨机:可连续生产,但不适用于炭黑等难分散颜料的加工;浆体粘度高,加工难度大;清洗困难,残留物多,这是砂磨机的主要限制;三辊磨床[6]:适用于加工高粘度浆体和难分散颜料。但露天作业使作业环境恶劣,作业安全性差,散料损失大。结构复杂,调试困难,生产效率低。传统的涂料生产设备已经使用多年,但其局限性也很明显。然而,现有的混合搅拌器也存在许多缺点,其结构过于简单。只有一个旋转轴被添加到桶。桶里的油漆是通过轴的连续转动而搅拌的。运行过程中噪声较大,建成后均匀性不理想,容易出现分层和残渣问题。同时,会消耗大量的电能,造成浪费。本文设计了基于单片机的智能涂料搅料器设计,基于单片机的智能涂料搅料器设计可以通过外部按键进行控制,内部单片机对外部按键以及传感器进行响应,进而控制电机。可以适应不同情况下的搅料需求。所设计的基于单片机的智能涂料搅料器设计,主要需要实现以下一些功能,首先系统能够接收外部人为控制,实现电机的正转反转,使得涂料能够充分搅拌;第二点是电机能够以不同的速度进行搅拌,使用过程中可以实现灵活的加速与减速操作;第三点是如果搅拌时间较长,可以设置定时,同时通过液位传感器也可进行定时,实现无人值守,减轻工人压力,提高效率;第四点是以上这些操作、流程、转速等都可以实时显示,让使用者能够清楚目前的状态。1系统总体架构1.1需求分析与方案设计本次所设计的基于单片机的智能涂料搅料设计,主要需要实现以下一些功能,首先系统能够接收外部人为控制,实现电机的正转反转,使得涂料能够充分搅拌;第二点是电机能够以不同的速度进行搅拌,使用过程中可以实现灵活的加速与减速操作;第三点是如果搅拌时间较长,可以设置定时,同时通过液位传感器也可进行定时,实现无人值守,减轻工人压力,提高效率;第四点是以上这些操作、流程、转速等都可以实时显示,让使用者能够清楚目前的状态。为了实现上述功能,初步设定了两种方案,第一种是利用涂料气动搅拌装置,结合计时与供电设计实现搅拌系统的定时。优点是气动混合搅拌器可以无级调速。只要控制进排气门的开度,即控制压缩空气的流量,就可以调节电动机的输出功率和转速。气动混合器可以正向或反向旋转。只要用控制阀简单地改变气动马达的进排气方向,就可以实现气动马达输出轴的正反转,实现瞬时换向。气动混合搅拌器的工作环境不受振动、高温、电磁、辐射等的影响,适用于恶劣的工作环境,能在易燃、爆炸、高温、振动、潮湿、粉尘等不利条件下正常工作。气动混合搅拌器的配套气动马达具有过载保护功能,不会因过载而失灵。如果过载,气动马达的速度只会降低或停止。当过载消除后,电机可以立即恢复正常运行,而不会对零件造成任何损坏。可长时间满负荷连续运行,气动电机温升小,气动混合器起动转矩大,可直接带负荷起动。启动和停止都很快,不像电动搅拌机有时会烧坏影响使用。但气动搅拌装置容易产生涂料搅拌不彻底,容易产生死角,在完成工作后清洗困难等问题。同时在气动装置升降以及操作过程中需要两人配合完成,操作非常繁琐。第二种方案是利用单片机作为处理器,接收外部的按键控制来对电机工作模式进行调整,电动机可实现正转以及反转操作,同时也可以进行变速操作便于针对不同材质的涂料进行换挡工作[7]。在不同环境中电动机搅拌器也可正常稳定运行,适应能力强,对于粉尘,潮湿等不利条件下都可正常工作。利用LCD1602液晶对系统的操作、流程、转速等都可以实时显示。对于操作人员来说无疑是提供了极大的便利,不需要像以往那样凭借经验来判断系统的工作状态,大大增加了工作的安全性。通过液位传感器来设定搅拌时间,即使初次操控也可实现操作。该方案具有成本低,易于操控,在不同环境下系统工作情况均表现良好对于设计提出的要求也能很好的实现。对上述两种方案进行对比,首先是从系统复杂度上进行考虑,方案一中需要添加一些传感器,这必然会增加系统硬件的设计复杂度,对这些数据进行处理又会增加软件复杂度;其次我们从实现及使用上来讲,通过单片机控制电机来形成一套搅拌系统,要比通过气动马达更为可靠有更高的性价比,同时在后期保养时相对比较容易。因此选用单片机作为处理器来控制电机进行涂料搅拌器的设计。1.2系统架构如图1.1所示为基于单片机的智能涂料搅料器设计系统架构框图,系统以STC89C51单片机作为中央处理器。单片机接收外部晶振以及复位控制,为了实现不同情况下的电机工作,通过不同的按键开关来分别对应控制,单片机对按键进行检测,检测到对应的按键按下后,输出信号控制电机执行正转、反转、转速调整、定时等。同时液位传感器检测搅拌深度从而控制搅拌时间,上述过程统一通过LCD1602来进行实时显示。液位传感器LCD液位传感器LCD液晶显示开关按键电机单片机开关按键电机单片机晶振复位晶振复位图1.1基于单片机的智能涂料搅拌设计系统架构1.3系统器件选择结合上文的系统需求分析,为了接收外部对系统工作模式的控制与改变,在基于单片机的智能涂料搅料器设计中使用按键电路来实现,单片机实时进行检测外部输入命令,调整电机状态。整个系统的运行都依靠单片机来进行操控,不同的单片机类型功能也不一样,经过仔细考虑和结合实际情况,采用的是STC89C51单片机。因为此程序的代码不是十分的繁多,所以为了节约成本没有采用比较复杂成本比较昂贵的STM32或者是MSP430等单片机。而去采用STC89C51单片机。显示部分用LCD1602液晶来显示当前的信息,相比于数码管显示,LCD1602显示的字符量更多,弥补信息量比较少,显示内容有限的缺陷,它可以显示字母,数字还可以显示特殊的符号。选用谐振式液位传感器来探测搅拌涂料的深度,从而控制搅拌时间,该传感器同其他传感器相比性价比高,不需要传感器深入到涂料当中探测,更加安全。2系统硬件设计结合第一章的系统需求分析以及器件选型,我们首先需要结合对基于单片机的智能涂料搅料器设计中的各个模块的硬件电路完成设计。2.1单片机外围电路设计单片机对传感器和外设进行控制,对外部输入的数据和信号进行收集计算,并进行相应的操作。STC89C51单片机是基于单片机的智能涂料搅料器设计中的核心,围绕其需要展开很多电路实现系统中的相关功能,我们首先需要完成对单片机外围电路的设计。2.1.1STC89C51单片机介绍STC89C51有32个I/O口可以连接更多的外设和传感器,8k字节的FLASH存储器可以进行更多的计算缓存,512字节的RAM大大提高了反应速度。STC89C51单片机的烧录也非常简单,通过TX和RX口,采用对应的编译器就可以将程序烧录进去。图2.1STC89C51单片机封装引脚如图2.1所示为STC89C51单片机封装引脚,完成自动搅料系统电路设计之前首先需要对管脚进行了解。VCC:供电电压。GND:接地。P0、P1、P2、P3:I/O引脚,可以在本次设计中作为输入输出端口,用以向LCD液晶输入信息等。P3口特殊功能口,具体如下表所示:表2.1P3口的第二功能端口名称功能P3.0RXD(串行输入口)P3.1TXD(串行输出口)P3.2/INT0(外部中断0)P3.3/INT1(外部中断1)P3.4T0(记时器0外部输入)P3.5T1(记时器1外部输入)P3.6/WR(外部数据存储器写选通)P3.7/RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。PSEN:外部程序存储器的选通信号。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。2.1.2STC89C51单片机外围电路设计根据第一章对基于单片机的智能涂料搅料器设计需求分析,结合单片机所完成的具体工作以及单片机的管脚介绍,最终总结单片机外围电路需要进行几个方面的设计。(1)单片机供电部分:在设计过程中,为保证单片机正常运作,首先根据芯片数据手册中的管脚定义,完成对单片机的供电设计即对应管脚接电源和接地。单片机外部晶振:本次设计中,单片机使用外部的12MHZ晶振[9],本次设计18管脚是外部晶振的输入端,让19管脚接地。(2)控制LCD1602进行信息显示:芯片的32到39管脚即P0口是单片机的8个I/O口,本次自动搅料系统设计中,液晶需要显示的搅料系统转速、转向、定时时间等相关数据由这个8个端口送交给LCD液晶显示,由于单片机的P0口没有上拉电阻,是高阻状态,因此外接一个10k的排阻;同时依据液晶显示的数据手册,对液晶显示进行操作还需要涉及三个控制管脚,因此在单片机P2.5,P2.6和P2.7三个端口[10]给出三个控制信号。(3)对按钮开关进行响应,控制系统的工作:首先需要设计一个开关K1,用来控制整个搅料系统,对整个系统进行复位。由于单片机的复位端口RST高电平有效,我们将开关K1一端接高电平一端连接到单片机的复位端口RST,这样在开关按下的时候复位端口将会感知电平发生变化。复位电路如图2.2所示图2.2开关电路为了实现搅料系统“一套设备,一机多用,一步到位”的特点,需要实现电机开始与停止,正转与反转,加速与减速,计时等功能。图2.3按键控制电路为了实现外部对系统运作的控制,我们选择按钮开关来进行控制,为了简化后续程序设计复杂度,每个开关负责一个功能。按键控制电路如图2.3所示,我们设计了8个开关K2-K9,考虑到单片机的I/O口既可以做输出也可以作输入,为了对开关按键进行响应,将K2-K9分别通过一个排阻连接到单片机的P1.0至P1.7口,另一端供地,此时I/O口作为输入[11],这样在开关按下的时候,对应的单片机端口就为低电平,程序再对端口的电平进行判断及后续执行相应的处理操作,即可完成对开关的判别与响应。搅料系统中各个开关按键的功能分配如下K2:启动键,按下以后电机开始转动;K3:停止键,按下以后电机停止;K4:电机正转;K5:电机反转;K6:加速,按下以后电机加速;K7:减速,按下以后电机加速;K8:设置计时时间的分增加;K9:设置计时时间的秒增加。控制电机电路:在搅料系统中使用电机的端口中,EN端口是电机使能端口;CW/CCW端口接收外部输入的逆时针或顺时针方向转动的控制信号;PWM端口是接收外部输入的不同占空比的PWM波。在本次对搅料系统的设计中,为了操控所使用的直流电机正常工作,单片机的P3.4口与电机的EN口相连,用以控制电机是否运作;P3.5口与CW/CCW端口相连,用以控制电机的转向;P3.7口用以输出PWM波[12],用以调节电机的转速。(5)调试与显示电路:在完成搅料系统的电路设计以及完成后续程序设计之后,需要将程序完成烧录,进行功能的调试,因此需要设计一个调试口,调试口的收发分别接到单片机的P3.0(RXD)和P3.1(TXD),还有一端接地。调试口电路如图2.4所示图2.4调试电路为了直观体现搅料系统的工作状态,除了LCD液晶显示之外,设计了一个发光二极管LED显示,LED一端接电源VCC,一端接单片机的P3.2口,但二极管工作的时候电流不能太大,一般是5mA左右,在LED正常导通的时候[13],其两端的电压一般是1.7V,为了保护二极管,外接了一个2K电阻。指示灯电路如图2.5所示图2.5LED显示电路程序设计中,通过设置P3.0口的高低电平即可完成LED的导通,对系统的状态进行显示。(6)液位传感器电路:在涂料搅拌系统中,谐振式液位传感器通过四个接口实现与单片机之间的通信。VCC端口连接5V电压,为液位传感器提供电源,RXD端口与单片机P3.0端口连接用于信息的接受[14],TXD端口与单片机P3.1端口连接用于信息的发送。GND端口接地。如图2.6即为基于单片机的智能涂料搅料器设计中液位传感器的电路。图2.6液位传感器电路(7)读取内部存储器:依据芯片的数据手册,单片机的31管脚在接高电平时,单片机使用内部存储器。结合上一节介绍,系统中所使用的STC89C51单片机有内部ROM,因此在本次设计中,将该管脚一只接高电平。最终,如图2.7即为基于单片机的智能涂料搅料器设计中STC89C51单片机外部电路。图2.7STC89C51单片机外部电路设计2.2LCD1602液晶显示电路设计2.2.1LCD1602液晶显示器介绍本次设计采用LCD1602液晶显示器作为输出显示器,LCD1602液晶屏显示利用液晶的特性,通过改变电压达到控制区域显示,最终显示出想要的图形或者数字。如表2.2所示为LCD1602数据手册[15]给出的芯片接口定义,是我们在进行电路设计以及后续编程实现数据显示过程中的重要依据。表2.2LCD1602芯片接口定义编号符号引脚说明编号符号引脚说明1VSS电源地9D2Datai/o2VDD电源正极10D3Datai/o3VL液晶显示偏压信号11D4Datai/o4RS数据/命令选择端12D5Datai/o5R/W读/写选择端13D6Datai/o6E使能信号14D7Datai/o7D0Datai/o15BLA背光源正极8D1Datai/o16BLK背光源负极2.2.2LCD1602液晶外围电路设计本次设计LCD1602液晶显示屏上展示搅料系统的工作状态、转速、转向和定时时间,上面一行显示工作状态和转向,下面一行显示转速和定时时间。结合对整个搅料系统的工作设计,LCD1602液晶显示外围电路设计分为以下几个部分。(1)液晶供电部分:结合LCD1602液晶显示的数据手册,为了在基于单片机的智能涂料搅料器设计中使的液晶正常工作,需要完成供电设计。(2)与单片机之间的通信:依据数据手册,7到14号管脚是其数据口,在基于单片机的智能涂料搅料器设计中,液晶需要通过这个8个数据口从单片机接收信息再进行显示。(3)液晶显示的控制为了保证与单片机的通讯,还有三个控制管脚。依据数据手册,LCD1602液晶的6管脚为使能端口,在数据传输的时候,高电平有效,连接单片机的P2.5口;5管脚为读写选择端,将其连接到单片机的P2.6口,接受单片机给出的控制信号;4管脚为数据/命令选择端[16],连接单片机的P2.7口。(4)液晶显示的对比度调节依据数据手册,LCD1602液晶的3管脚是调节显示对比度的端口,考虑到工人群体对显示屏亮度比较敏感或者有不同喜好,在电路设计中,系统的使用者可对显示对比度的调节。最终,如图2.8即为基于单片机的智能涂料搅料器设计中LCD液晶外部电路。图2.8LCD1602液晶显示电路图2.3电机外围电路设计本次使用的电机有四个接口:VDD是电源正极,设计中接12V电源,GND是使能端口,接单片机的P3.4口,用以接收控制信号,控制电机工作与否;CW/CCW端口是控制电机正转或者是翻转的端口,当搅料系统的转向需要发生改变的时候,由单片机的P3.5口输出控制信号即可;3端口是PWM端口[17]接收外部输入的方波信号,转速就是由方波信号的占空比来决定,当搅料系统的电机转速需要调节时,由系统中的单片机输出不同占空比的PWM即可。图2.9电机外围电路设计2.4供电电路设计在基于单片机的智能涂料搅料器设计中,单片机和LCD正常工作的电压是5V,而电机正常工作需要12V电压,结合此需求,我们采用系统用12V供电,后续通过LM7805电源芯片使12V电压转化成5V的电压供给单片机及LCD。图2.10供电电路3系统软件流程设计结合第二章的系统需求分析,在完成了系统电路的设计以后,系统的主要功能还需要通过软件实现,需要进行相关软件流程设计,实现基于单片机的智能涂料搅料器设计预定的相关功能。软件流程设计采用模块化设计的方法,即在程序编写之前,首先结合基于单片机的智能涂料搅料器设计硬件电路以及系统需求对程序进行功能模块化,再编写各个模块的程序,使程序易于编写、调试和修改。程序设计过程中的软件开发环境选用Keil软件。3.1系统总体流程基于单片机的智能涂料搅料器设计系统程序架构如图3.1所示,当整个系统运行时,首先是各个部分的初始化,由于系统要实现对电机的控制,还需要完成包括单片机的中断设置等。初始化液晶显示初始状态初始化液晶显示初始状态传入液位信号按键检测开关按下N根据按键执行不同的操作液晶更新系统工作模式结束开始Y图3.1程序架构初始化完成以后,LCD1602液晶需要显示系统初始状态:停止运行,正向,转速5000。同时按键检测程序不断对开关的状态进行判断,液位传感器对液位进行检测设置定时时间[18],当开关按下后,根据之前的设定,不同开关执行相对应的程序,来对搅料系统的工作模式进行改变。在执行模式更改的同时,通过LCD1602液晶来实时显示目前所处的状态,便于使用者使用。3.2LCD显示程序设计在基于单片机的智能涂料搅料器设计中,为了便于使用者直观了解系统目前的工作状态,LCD1602液晶需要显示系统工作状态(开始、停止)、电机的转向(CW、CCW)、电机转速、电机定时时间等,并根据开关对系统的控制,实时对自动搅料系统这些信息进行更新[19]。按照设置,第一行显示系统工作状态(开始、停止)、电机的转向(CW、CCW),第二行显示电机转速、电机定时时间。如图3.2为LCD1602子程序流程图。LCD初始化子程序入口LCD清屏单片机向LCD写命令单片机向LCD写数据显示数据返回NY图3.2LCD1602子程序流程图根据LCD1602的数据手册,在使用LCD1602之前需要进行初始化,初始化需要完成2个工作,通过程序为LCD1602写入相关设置指令。如图3.3所示为LCD1602内部的RAM地址映射图:图3.3地址映射图如图3.4所示为LCD1602写操作时序:图3.4LCD1602写操作时序写入数据需要以下几个步骤:首先需要通过RS信号确定是写数据还是写命令[20],因为写数据是指显示什么内容,写命令是写入什么指令。第二步:R/W端口输入一个低电平;第三步:将数据从单片机的I/O口输送给液晶的数据端口;第四步:在E端口给一个持续高电平,即可完成写操作。3.3液位传感器的程序设计在基于单片机的智能涂料搅料器设计中,为了便于操作使系统更加智能化,谐振式液位传感器需要通过RXD与TXD端口与单片机进行信息的交换,单片机根据得到的液位信号设定搅拌时间。从而实现根据不同深度自动设置定时时间的功能。单片机串口初始化,然后接受传感器数据,按照显示要求取出8,9,10三位,分别送给显示屏,然后将这三位通过公式转换成常量,从而判断水深做出倒计时时间。水位的计算公式为:(RX_Buffer[8]-0x30)*100+(RX_Buffer[9]-0x30)*10+(RX_Buffer[10]-0x30)3.4电机定时与转速控制程序设计在基于单片机的智能涂料搅料器设计中,单片机需要控制电机持续转动的时间。持续转动的时间就由单片机内部的定时器设定,当计数记满以后产生一个中断,并产生相应的信号以控制电机的EN端口[21],控制电机停止或转动。本次基于单片机的智能涂料搅料器设计中,根据单片机外界11.0592MHz的晶振,通过计算可得单片机的一个机器周期为:同时单片机最多可计数65535个,因此中断溢出一次的时间约为65ms。而在实际使用系统的过程中,对电机的定时通常应是设定时间在分秒量级,比如1分10秒,为了程序设计中取整数倍比较方便,我们设定定时器计时时间为10ms。如此,中断一百次以后,就是时间过去了1秒。同时在程序设计中,判断中断为100次以后,则计数参数减1,即为电机还需要运行的时间少1秒。当计数参数为0,也就是计数时间减少为0的时候,通知单片机的P3.4口输出恒为低电平的信号,控制电机的EN端口,使电机停止转动。转速控制程序设计,在基于单片机的智能涂料搅料器设计中,为了对电机的转速进行调节,我们需要通过与电机PWM相连的P3.7端口输出不同占空比的PWM波形。占空比是高电平持续时间占一个周期的百分比,占空比越大,也就是P3.7口输出的高电平时间越长,电机转速越快。单片机输出PWM波的时候,通常有下列办法:第一个是利用软件延时,当设定的时间到,对输出的高低电平取反,。第二个是利用定时器对高低电平时间进行控制。第三个是PWM控制器。为了便于程序设计,基于单片机的智能涂料搅料器设计系统程序设计中,我们选用上述第二种方案,即单片机内部的定时器实现对高低电平的持续时间控制[22]。结合方案的介绍,我们可以首先需要确定一个恒定的周期(50ms),实现方法即可通过上文的计数器,我们为了保证步长足够小,设定中断时间为10微秒,本次设计中,中断次数用参数usCnt来表示,最大计数次数为5000次,即usCnt最大值为5000,达到5000以后置0。而后我们更改对计数的判决门限(用参数rCnt来表示)来设置不同长度的高电平。然后计算定时器的初值N:N=10/1.09≈10根据计算得到的初值,计算装入TH1和TH2的数TH1=(65536-10)/256=255.9TH2=(65536-10)%256=246最终装入的初值为255(0xFF)和246(0xF6)。单片机每产生中断一次,就对此时的中断计数值usCnt进行判断,若是大于5000则置0,同时对rCnt和usCnt来作比较,若rCnt的值大于usCnt的值,则控制P3.7口输出高电平[23],控制电机的PWM端口,否则P3.7口输出低电平,如此形成了一个PWM信号,送交给电机的PWM口,控制转速。当外部按键K6按下的时候,rCnt值加大,则高电平占整个周期(5000)的比例加大,电机转速会加快。3.5按键控制程序设计根据基于单片机的智能涂料搅料器设计,系统在开关按下的时候需要对其工作状态(启动、停止),工作模式(转速、计时时间)等进行灵活响应并调整[24],实现适应在不同情况下进行搅料。为了实现上述功能,进行按键控制程序设计,如图3.5为按键检测程序流程图。图3.5按键检测流程图(1)Key1:复位键由于开关按键连接到单片机的复位端口RST口,为了方便操作,我们首先对RST口进行声明,即将RST端口定义为Key,后续程序中不断的对Key值进行检测判断即可再执行相关的指令。根据电路设计,理论上在Key值为0时,表明开关被按下,但由于手动按下开关再释放的这个过程有一定的抖动现象,因此我们判断Key值为0以后加上一个去抖操作,通常加上一个10ms的延时即可,延时过后再次对Key值进行判断,如果Key值仍为0,即表明开关按下,单片机进行复位,整个程序重新执行。然后判断Key值是否恢复到1,如果为1表明按键被释放,再次回到程序入口,不断检测Key值是否为0,判断开关是否按下,如果Key为0则继续等待。(2)Key2:启动键由于开关按键连接到单片机的P1.0口,为了方便操作,我们首先对P1.0口进行声明,即将P1.0端口定义为Key2,后续程序中不断的对Key2值进行检测判断即可再执行相关的指令。Key2值为0以后加上一个去抖操作,通常加上一个10ms的延时即可,延时过后再次对Key2值进行判断,如果Key2值仍为0,即表明开关按下,通知单片机的P3.4口输出恒为高电平的信号,控制电机的EN端口,使电机开始以设置的转速转动。然后判断Key2值是否恢复到1,如果为1表明按键被释放,再次回到程序入口,不断检测Key值是否为0,判断开关是否按下,如果Key2为0则继续等待。(3)Key3:停止键由于开关按键连接到单片机的P1.1口,为了方便操作,我们首先对P1.1口进行声明,即将P1.1端口定义为Key3,后续程序中不断的对Key3值进行检测判断即可再执行相关的指令。Key3值为0以后加上一个去抖操作,通常加上一个10ms的延时即可,延时过后再次对Key3值进行判断,如果Key3值仍为0,即表明开关按下,通知单片机的P3.4口输出恒为低电平的信号,控制电机的EN端口,使电机停止转动。然后判断Key3值是否恢复到1,如果为1表明按键被释放,再次回到程序入口,不断检测Key3值是否为0,判断开关是否按下,如果Key3为0则继续等待。(4)Key4:正转键由于开关按键K4连接到单片机的P1.2口,为了方便操作,我们首先对P1.2口进行声明,即将P1.2端口定义为Key4,后续程序中不断的对Key3值进行检测判断即可再执行相关的指令。Key4值为0以后加上一个去抖操作,通常加上一个10ms的延时即可,延时过后再次对Key4值进行判断,如果Key4值仍为0,即表明开关按下,通知单片机的P3.5口输出恒为高电平的信号,控制电机的CW/CCW选择端口,使电机按照顺时针方向转动。然后判断Key4值是否恢复到1,如果为1表明按键被释放,再次回到程序入口,不断检测Key4值是否为0,判断开关是否按下,如果Key4为0则继续等待。(5)Key5:反转键由于开关按键K5连接到单片机的P1.3口,为了方便操作,我们首先对P1.3口进行声明,即将P1.3端口定义为Key5,后续程序中不断的对Key5值进行检测判断即可再执行相关的指令。Key5值为0以后加上一个去抖操作,通常加上一个10ms的延时即可,延时过后再次对Key5值进行判断,如果Key5值仍为0,即表明开关按下,通知单片机的P3.5口输出恒为低电平的信号,控制电机的CW/CCW选择端口,使电机按照逆时针方向转动。然后判断Key5值是否恢复到1,如果为1表明按键被释放,再次回到程序入口,不断检测Key5值是否为0,判断开关是否按下,如果Key5为0则继续等待。(6)Key6:加速键由于开关按键K6连接到单片机的P1.4口,为了方便操作,我们首先对P1.4口进行声明,即将P1.4端口定义为Key6,后续程序中不断的对Key6值进行检测判断即可再执行相关的指令。Key6值为0以后加上一个去抖操作,通常加上一个10ms的延时即可,延时过后再次对Key6值进行判断,如果Key6值仍为0,即表明开关按下,通知单片机的P3.7口给电机的PWM端口输出占空比更大的PWM信号,使电机转速加快。然后判断Key6值是否恢复到1,如果为1表明按键被释放,再次回到程序入口,不断检测Key6值是否为0,判断开关是否按下,如果Key6为0则继续等待。(7)Key7:减速键由于开关按键K7连接到单片机的P1.5口,为了方便操作,我们首先对P1.5口进行声明,即将P1.5端口定义为Key7,后续程序中不断的对Key7值进行检测判断即可再执行相关的指令。Key7值为0以后加上一个去抖操作,通常加上一个10ms的延时即可,延时过后再次对Key7值进行判断,如果Key7值仍为0,即表明开关按下,通知单片机的P3.7口给电机的PWM端口输出占空比更小的PWM信号,使电机转速降低。然后判断Key7值是否恢复到1,如果为1表明按键被释放,再次回到程序入口,不断检测Key7值是否为0,判断开关是否按下,如果Key7为0则继续等待。(8)Key8:计时分钟增加由于开关按键K8连接到单片机的P1.6口,为了方便操作,我们首先对P1.6口进行声明,即将P1.6端口定义为Key8,后续程序中不断的对Key8值进行检测判断即可再执行相关的指令。Key8值为0以后加上一个去抖操作,通常加上一个10ms的延时即可,延时过后再次对Key8值进行判断,如果Key8值仍为0,即表明开关按下,单片机内部的计数变量加60,即等于电机的计时加上一分钟。然后判断Key8值是否恢复到1,如果为1表明按键被释放,再次回到程序入口,不断检测Key8值是否为0,判断开关是否按下,如果Key8为0则继续等待。(9)Key9:计时秒钟增加由于开关按键K9连接到单片机的P1.7口,为了方便操作,我们首先对P1.7口进行声明,即将P1.7端口定义为Key9,后续程序中不断的对Key9值进行检测判断即可再执行相关的指令。Key9值为0以后加上一个去抖操作,通常加上一个10ms的延时即可,延时过后再次对Key9值进行判断,如果Key9值仍为0,即表明开关按下,单片机内部的计数变量加10,即等于电机的计时加上10秒钟。然后判断Key9值是否恢复到1,如果为1表明按键被释放,再次回到程序入口,不断检测Key9值是否为0,判断开关是否按下,如果Key9为0则继续等待。4系统调试4.1焊接与调试本次对基于单片机的智能涂料搅料器设计中使用的是AltiumDesigner软件完成电路板的绘制,在完成基于单片机的智能涂料搅料器设计的电路设计以后,生成PCB。当电路板原理图绘制完成后,确认各个模块功能没有错误[25],在确定原理图没有出现错误的情况下我们开始进行焊接,使用市场上比较常用的万能板进行焊接。最终得到的实物图如图4.1所示图4.1实物图4.2程序烧录与调试在整体系统上电调试前,大概观察下焊接的系统还存在问题,例如存在很显眼的断裂,正负极接反以及相连、虚焊、等问题,然后用万用表检测一下,电源正负极之间是否短路等严重的电源问题,最终保证系统焊接没有问题。在搭建调试平台后我们对软件程序进行调试,在程序调试通过后开始验证系统功能是否满足要求,如果功能没有实现或实现不完全,需要继续调试程序,反复进行,直到所有功能都实现为止。图4.2系统运行时实物图4.3系统调试当单片机焊接好之后,将STC89C51单片机和各个模块都插上去,给系统12V供电,此时为系统初始状态如图4.3所示。按下启动键以后,电源灯会常亮,屏幕的初始值:暂停状态,CW,5000转速,定时时间为0。按下运行按键系统开始以默认速度(5000)运行,按下暂停以后,电机停止转动。第三个按键是调节正转,初始设置就是正转,所以没有发生变化。第四个按键是翻转,按下以后屏幕显示CCW,再按下启动以后,可以看到电机逆时针方向转动。第五个和第六个分别是速度加和速度减按键,可以调整速度。第七个按键是设置定时时间,按下以后增加一分钟,第八个按键是每次增加10秒钟。设置好定时时间以后,系统就以设置的速度运行,如果按暂停,也可暂停。经过调试与验证,基于单片机的智能涂料搅料器设计已经实现了初始的应用需求,并有很强的可靠性与实用性。图4.3程序初始状态4.4遇到的问题及解决方法(1)由于按下按键就会产生机械抖动,当按下一次按键时可能会让系统读取到多次的按键按下的次数,从而导致无法设置。解决方法是进行软件消抖,延时时间要设置恰当。(2)焊接完成后,发现显示器的第一位无法显示,初步怀疑电阻有损坏,但是用万用表测量后发现器件正常,单片机输出正常,进一步对各个器件测量后发现是管脚虚焊,从而导致电路不通,重新焊接后显示正常。(3)上电打开电源开关,按动按键使系统运行,发现电机轴的转动不易察觉,因此在电机的轴上加上标志物,以便利于观察。(4)程序编写完成后进行编译连接,显示“0error0warning”后说明无语法错误[26],再次检查看是否有逻辑错误,检查无误后烧录进单片机内。结论本设计是对涂料搅拌系统进行新的突破性设计,其中动力模块的设计更加的便于控制。显示模块起到安全增加工作效率的作用,方便人们的使用。设计采用模块化方法设计,主要分为硬件设计和软件设计两个部分,其中包括四个模块,分别为:按键模块、动力模块、传感器模块、显示模块。软件设计部分主要是编写程序控制整个系统,并且单片机能够响应按键模块输入的指令信号,并对程序中的参数做出实时修改,进而控制电机的运行状态。在调查过程中,发现市场上的涂料搅拌器机几乎没有使用LCD显示屏的,传统的涂料搅拌器都是接通电源,传输机一直工作不能实现调速定时等控制,非常耗能并且还不安全,本设计中加入LCD1602来显示系统的运行状态,便于操作者来决定电动机的工作状态以及涂料的搅拌完成度,对比传统的搅拌器更加的省时省力。加入了谐振式液位传感器来控制搅拌的时间,使系统更加的便于操作。本文从系统总体架构、需求分析与方案设计、系统器件选择、系统架构、系统硬件设、单片机外围电路设计、STC89C51单片机介绍、STC89C51单片机外围电路设计、LCD1602液晶显示电路设计、LCD1602液晶显示器介绍、LCD1602液晶外围电路设计、电机外围电路设计、供电电路设计、系统软件流程设计、程序架构、LCD、示程序设计、电机定时与转速控制程序设计、按键控制程序设计、系统调试、焊接与调试、系统调试、

程序烧录与调试、遇到的问题及解决问题方法方面去阐述分析单片机智能涂料搅拌搅拌设计系统。本次所设计的基于单片机的智能涂料搅料器设计,主要需要实现以下一些功能,首先系统能够接收外部人为控制,实现电机的正转反转,使得涂料能够充分搅拌;第二点是电机能够以不同的速度进行搅拌,使用过程中可以实现灵活的加速与减速操作;第三点是如果搅拌时间较长,可以设置定时,同时通过液位传感器也可进行定时,实现无人值守,减轻工人压力,提高效率;第四点是以上这些操作、流程、转速等都可以实时显示,让使用者能够清楚目前的状态。在完成了系统电路的设计以后,系统的主要功能还需要通过软件实现,需要进行相关软件流程设计,实现基于单片机的智能涂料搅料器设计预定的相关功能,基于单片机的智能涂料搅拌器设计中使用的是AltiumDesigner软件完成电路板的绘制。参考文献[1]沈红卫.基于单片机的智能系统设计与实现[M].北京:电子工业出版社,2005:30-35[2]罗睿智,卢恩耀,彭金尧,周雨轩,徐瑞.浅析单片机的原理及其在各领域的应用[J].计算机产品与流通,2019(08)[3]朱昆泉,许林发.建材机械工业手册[M].武汉:武汉工业大学出版社,2000.7[4]李全利.单片机原理及应用技术[J].北京:高等教育出版社,2009[5]胡学海.单片机原理及应用系统设计[M].北京:电子工业出版社,2007:66-156[6]黄克亚.高等院校嵌入式系统课程单片机选型比较[J].电子世界,2020(01)[7]张绪光,刘在娥.电路与模拟电子技术[M].北京:北京大学出版社,2010[8]李广弟.单片机基础[M].北京:北京航空航天大学出版社,2001:56-64[9]冯忠绪,王卫中.搅拌机合理转速的研究[J].中国公路学报(自然科学版),2006(4):9-18[10]谢维成.单片机原理与应用及C51程序设计[M].北京:清华大学出版社,2009[11]刘中琦,曾维鑫,张帆.型煤搅拌机搅拌机构计算机辅助设计[J].煤矿机械,2000,21(6):7-8[12]刘建清.轻松玩转51单片机C语言[M].北京:航空航天大学出版社,2011[13]谷秀容.单片机原理与应用[M].北京:北京交通大学出版社,2009:152-233[14]郭天祥.51单片机C语言教程[M].北京:电子工业出版社,2009[15]李朝青.单片机学习指导[M].北京航空航天大学出版社,2002.1[16]许林发主编.建筑材料机械设计[J].武汉:武汉工业大学出版社,1990[17]褚瑞卿主编.建材通用机械与设备[J].武汉:武汉理工大学出版社,1996[18]胡家秀主编.机械零件设计实用手册[M].北京:机械工业出版社,1999.10[19]李益民主编.机械制造工艺设计手册[M].北京:机械工业出版社,1995.10[20]甘永立.几何量公差与检测[M].上海:上海科学技术出版社,2001.4[21]黄智伟.印刷电路板设计技术与实践[M].北京:电子工业出版社,2013[22]张俊谟.单片机中级教程[M].北京:北京航天航空大学出版社,2006[23]徐晓光.数字逻辑与数字电路[M].北京:机械工业出版社,2008[24]张德宁,程曼,张梦,索雪松.基于Proteus的《单片机原理与应用》实验实践[J].科学技术创新,2017(19):107-108[25]何立民.单片机应用系统设计[J].北京:航天航空大学出版社,2008[26]黄河,郭纪林.单片机原理及应用[M].大连:大连理工大学出版社,2009附录1原理图附录2源程序清单主程序:#include"reg52.h"#include"lcd1602.h"sbitLED1=P3^2;sbitK2=P1^0;sbitK3=P1^1;sbitK4=P1^2;sbitK5=P1^3;sbitK6=P1^4;sbitK7=P1^5;sbitK8=P1^6;sbitK9=P1^7;sbitg_Den=P3^4; //用于启动sbitg_Drf=P3^5; //用于正反转sbitg_Pwm=P3^7; //pwm输出#defineMOTOR_STOP 0#defineMOTOR_RUNNING 1#defineDIR_CW 1#defineDIR_CCW 2#defineRATE_MAX5000#defineRATE_RATE500u16g_usRateCnt=RATE_MAX;u8g_ucCw=DIR_CW;u8g_ucRunning=MOTOR_STOP;u16g_ulClock=0;unsignedchar uart_wr=0; //写指针unsignedchar uart_rd; //读指针charg_ascBak[16]={0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};unsignedchar RX_Buffer[20]={'0'}; //接收缓冲unsignedchar aucTmpBuf[20]={'0'}; //接收缓冲bitdisplay_flag=0;bitt0_triger_motor_flag=0;bitt0_show_timer_ex_flag=0;bitt1_pwm=0;bitk2_flag=0;#defineKEY_DELAY200/*******************0616******************/typedefunsignedcharBYTE;typedefunsignedintWORD;#defineFOSC11059200L//Systemfrequency#defineBAUD9600//UARTbaudratebitbusy;staticintarrayto_num(void){ intarr_num=0; arr_num=(RX_Buffer[8]-0x30)*100+(RX_Buffer[9]-0x30)*10+(RX_Buffer[10]-0x30); returnarr_num;} /*UARTinterruptserviceroutine616*/voidUart_Isr()interrupt4{if(RI){ RI=0;//ClearreceiveinterruptflagRX_Buffer[uart_wr]=SBUF; SBUF=RX_Buffer[uart_wr]; if(++uart_wr>=13) { display_flag=1; uart_wr=0; } while(!TI); //等待发送数据完成 TI=0; //清除发送完成标志位 }if(TI){TI=0;//Cleartransmitinterruptflagbusy=0;//Cleartransmitbusyflag}}//显示电机状态运行(RUNNING)或停止(STOPED)staticvoid_show_motor_stat(){ LCDprintStr(0,0,g_ascBak,8); if(MOTOR_STOP==g_ucRunning) LCDprintStr(0,0,"stopped",7); if(MOTOR_RUNNING==g_ucRunning) LCDprintStr(0,0,"running",7);}//显示倒计时staticvoid_show_timer_ex(){ u16usTime=0; u8y=0; u16usMin=0; u16usSec=0; usTime=g_ulClock; usMin=usTime/60; usSec=usTime%60; if(usMin<10) y=1; elseif(usMin<100) y=2; elseif(usMin<1000) y=3; else y=4; LCDprintStr(10,0,g_ascBak,6); LCDprintNum(10,0,usMin,y); LCDprintStr(10+y,0,":",1); LCDprintNum(11+y,0,usSec,2);}//显示电机转速staticvoid_show_motor_rate(){ LCDprintStr(0,1,g_ascBak,4); LCDprintNum(0,1,g_usRateCnt,4);}//显示电机旋转方向正转(CW)或反转(CCW)staticvoid_show_motor_direction(){ LCDprintStr(6,1,g_ascBak,3); if(DIR_CW==g_ucCw) LCDprintStr(6,1,"cw",2); if(DIR_CCW==g_ucCw) LCDprintStr(6,1,"ccw",3);}//显示水位深度毫米staticvoidwater_deep(void){ if(1==display_flag) { LCDprintStr(10,1,&RX_Buffer[8],3); LCDprintStr(13,1,"mm",2); display_flag=0; }}voidwdeep_time(void){ inta_num=0; if(k2_flag==1)return; a_num=arrayto_num(); if(a_num<300) { g_ulClock=30; } if((a_num>=300)&&(a_num<600)) { g_ulClock=60; } if(a_num>600) { g_ulClock=90; } }voidtriger_motor(u8stat){ if(stat!=MOTOR_RUNNING&&stat!=MOTOR_STOP) { return; } g_ucRunning=stat; _show_motor_stat(); if(MOTOR_RUNNING==stat) g_Den=0;//开启 else g_Den=1;//停止}voidtriger_cw(u8stat){ if(stat!=DIR_CW&&stat!=DIR_CCW) { return; } g_ucCw=stat; _show_motor_direction(); if(DIR_CW==stat) g_Drf=1;//正转 else g_Drf=0;//反转}void_scan_k8(){ staticu8ucCnt=0; if(g_ucRunning) return; if(0==K8) { if(ucCnt<KEY_DELAY) ucCnt++; } elseif(1==K8&&KEY_DELAY==ucCnt) { if(g_ulClock<=65475) g_ulClock+=60; else g_ulClock=65535; _show_timer_ex(); ucCnt=0; }}void_scan_k9(){ staticu8ucCnt=0; if(g_ucRunning) return; if(0==K9) { if(ucCnt<KEY_DELAY) ucCnt++; } elseif(1==K9&&KEY_DELAY==ucCnt) { if(g_ulClock<=65525) g_ulClock+=10; else g_ulClock=65535; _show_timer_ex(); ucCnt=0; }}void_scan_k6(){ staticu8ucCnt=0; if(0==K6) { if(ucCnt<KEY_DELAY) ucCnt++; } elseif(1==K6&&KEY_DELAY==ucCnt) { if(g_usRateCnt+RATE_RATE<=RATE_MAX) g_usRateCnt+=RATE_RATE; else g_usRateCnt=RATE_MAX; _show_motor_rate(); ucCnt=0; }}void_scan_k7(){ staticu8ucCnt=0; if(0==K7) { if(ucCnt<KEY_DELAY) ucCnt++; } elseif(1==K7&&KEY_DELAY==ucCnt) { if(g_usRateCnt<=RATE_RATE) g_usRateCnt=0; else g_usRateCnt-=RATE_RATE; _show_motor_rate(); ucCnt=0; }}void_scan_k2(){ staticu8ucCnt=0; if(0==K2) { if(ucCnt<KEY_DELAY) ucCnt++; } elseif(1==K2&&KEY_DELAY==ucCnt) { k2_flag=1; triger_motor(MOTOR_RUNNING);//触发电机启动 ucCnt=0; }}void_scan_k3(){ staticu8ucCnt=0; if(0==K3) { if(ucCnt<KEY_DELAY) ucCnt++; } elseif(1==K3&&KEY_DELAY==ucCnt) { triger_motor(MOTOR_STOP);//触发电机停止 ucCnt=0; }}void_scan_k4(){ staticu8ucCnt=0; if(0==K4) { if(ucCnt<KEY_DELAY) ucCnt++; } elseif(1==K4&&KEY_DELAY==ucCnt) { triger_cw(DIR_CW);//触发正转 ucCnt=0; }}void_scan_k5(){ staticu8ucCnt=0; if(0==K5) { if(ucCnt<KEY_DELAY) ucCnt++; } elseif(1==K5&&KEY_DELAY==ucCnt) { triger_cw(DIR_CCW);//触发反转 ucCnt=0; }}voidkeyscan()//键盘扫描函数{ _scan_k2(); _scan_k3(); _scan_k4(); _scan_k5(); _scan_k6(); _scan_k7(); _scan_k8(); _scan_k9();}voidint1()interrupt1 //定时器0显示倒计时{ staticu8ucCnt=0; staticu16led_flag=0; TH0=0xdc; TL0=0x00;//定时10ms ucCnt++; led_flag++; if(led_flag>=100) { LED1=~LED1; led_flag=0; } if(!(ucCnt%100)) { if(g_ulClock&&g_ucRunning) { g_ulClock--; if(!g_ulClock) { t0_triger_motor_flag=1; g_Den=1; } } t0_show_timer_ex_flag=1; }}staticvoidpwm_out()//TM1控制pwm输出{ staticu16usCnt=0; usCnt++; if(usCnt>=RATE_MAX) usCnt=0; if(g_usRateCnt>usCnt) { g_Pwm=1; } else { g_Pwm=0; }}#defineV_RATE0xa4voidint3()interrupt3 //产生PWM{ TH1=0xff; //65526/256 TL1=V_RATE; //65526%256定时10us t1_pwm=1;}//初始化系统时钟staticvoid_init_tm(){ //TMOD=0; TMOD=0x01; //定时器0工作在方式1 TH0=0xdc; //56320/256 TL0=0x00; //56320%256每10ms溢出一次,也就是产生一次中断 TR0=1; TMOD|=0x10; //定时器1工作在方式1 TH1=0xff; //65526/256 TL1=V_RATE; //65526%256定时10us TR1=1; T2CON=0x34;//Timer2startrun0616 TL2=RCAP2L=(65536-(FOSC/32/BAUD));//Setauto-reloadvauleTH2=RCAP2H=(65536-(FOSC/32/BAUD))>>8; TR2=1; //定时器2开始计时 SCON=0x50; ES=1; ET0=1; //定时器0开中断intr1 ET1=1; //定时器1开中断intr3 EA=1; //开起系统中断}/* 系统初始化*/voidinit(){ LCDinit(); //初始化LCD1602 triger_motor(MOTOR_STOP);//默认关闭电机 triger_cw(DIR_CW); //默认电机正转 _show_motor_rate(); _show_timer_ex(); _init_tm(); //初始化定时 }voidmain(){ u16i=0;init(); while(1) { if(t0_triger_motor_flag==1) { triger_motor(MOTOR_STOP); t0_triger_motor_flag=0; } if(t0_show_timer_ex_flag==1) { _show_timer_ex(); t0_show_timer_ex_flag=0; } wdeep_time(); if(1==t1_pwm) { pwm_out(); t1_pwm=0; } keyscan(); //键盘扫描程序 water_deep(); }}屏幕初始化代码:#include<reg52.h>#include"lcd1602.h"#defineLCD1602_DBP0sbitLCD1602_RS=P2^5;sbitLCD1602_RW=P2^6;sbitLCD1602_E=P2^7;/*等待液晶准备好*/voidLCDwaitReady(){uint8_tstate;LCD1602_DB=0xFF;LCD1602_RS=0;LCD1602_RW=1;do{LCD1602_E=1;state=LCD1602_DB;//读取状态字LCD1602_E=0;}while(state&0x80);//bit7等于1表示液晶正忙,重复测试直到其等于0为止}/*向LCD1602液晶写入一字节命令,cmd-待写入命令值*/voidLCDwriteCmd(uint8_tcmd){LCDwaitReady();LCD1602_RS=0;LCD1602_RW=0;LCD1602_DB=cmd;LCD1602_E=1;LCD1602_E=0;}/*向LCD1602液晶写入一个字节数据,dat-待写入数据值*/voidLCDwriteDat(uint8_tdat){LCDwaitReady();LCD1602_RS=1;LCD1602_RW=0;LCD1602_DB=dat;LCD1602_E=1;LCD1602_E=0;}/*设置显示RAM起始地址,亦即光标位置,(col,row)-对应屏幕上的字符坐标*/voidLCDsetCursor(uint8_tcol,uint8_trow){uint8_taddr;if(row==0)//由输入的屏幕坐标计算显示RAM的地址addr=col; //第一行字符地址从0x00起始elseaddr=0x40+col; //第二行字符地址从0x40起始LCDwriteCmd(addr|

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论