本文主要是介绍基于单片机的智能涂料搅拌器设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目 录
摘 要 I
Abstract II
引 言 3
1 系统总体架构 6
1.1 需求分析与方案设计 6
1.2 系统架构 7
1.3 系统器件选择 7
2 系统硬件设计 9
2.1 单片机外围电路设计 9
2.2 LCD1602液晶显示电路设计 14
2.3 电机外围电路设计 15
2.4 供电电路设计 16
3 系统软件流程设计 17
3.1 系统总体流程 17
3.2 LCD显示程序设计 18
3.3 液位传感器的程序设计 19
3.4 电机定时与转速控制程序设计 19
3.5 按键控制程序设计 21
4 系统调试 25
4.1 焊接与调试 25
4.2 程序烧录与调试 25
4.3 系统调试 26
4.4 遇到的问题及解决方法 27
结 论 28
参考文献 29
附录1 原理图 31
附录2 源程序清单 32
致 谢 52
摘 要
目前,在社会主义现代化建设中,涂料市场也在不断发展,因而对搅拌设备的需求也越来越高。为了通过新型的涂料搅拌器设计使得涂料生产的成本降低,减少大量的人力物力提高工作效率,本文进行了基于单片机的智能涂料搅料器设计。
基于单片机的智能涂料搅料器设计可以通过外部按键进行控制,利用内部单片机对外部按键以及传感器进行响应,进而控制电机的转速、转向和转动时间。可以适应不同情况下的搅料需求,能够进行正反转,转速调整,定时搅拌等功能。本文首先分析了基于单片机的智能涂料搅料器设计的设计需求,完成了系统架构设计。在此基础上进行了单片机外围电路设计,液晶显示外部电路设计,电机外部电路设计,开关电路设计。在完成硬件电路设计的基础上,进行了软件流程设计,包括对LCD液晶显示控制程序,电机定时以及转速控制程序,按键控制程序。
经过实验验证,结果表明基于单片机的智能涂料搅料器设计可以灵活调整工作模式,在启动、停止,正反转,定时设置等模式之间灵活调整。真正实现“一套设备,一机多用,一步到位”。
关键词: 单片机;LCD;控制程序
Abstract
At present, with the continuous development of the paint market, the demand for mixing equipment is higher and higher. In order to reduce the cost of coating production, reduce a large number of human and material resources and improve the work efficiency through the design of a new type of coating agitator, an automatic mixing system based on single chip microcomputer is designed in this paper.
The design of intelligent paint agitator based on single chip microcomputer can be controlled by external keys. The internal single chip microcomputer can respond to external keys and sensors, and then control the rotation speed, steering and rotation time of the motor. It can adapt to the needs of mixing materials in different situations, and can carry out positive and negative rotation, speed adjustment, timing mixing and other functions. Firstly, this paper analyzes the design requirements of intelligent paint agitator based on MCU, and completes the system architecture design. On this basis, the peripheral circuit design of MCU, the external circuit design of LCD, the external circuit design of motor and the switch circuit design are carried out. On the basis of hardware circuit design, the software flow is designed, including LCD display control program, motor timing and speed control program, key control program.
The experimental results show that the design of intelligent paint agitator based on single chip microcomputer can adjust the working mode flexibly, and adjust between the start, stop, forward and reverse, timing setting and other modes. Truly realize “one set of equipment, one machine with multiple functions, one step in place”.
Keywords: MCU; LCD; Control program
引 言
目前,随着涂料市场的不断发展,对搅拌设备的需求也越来越高。为了使新型的涂料搅拌器设计能够降低涂料生产的成本,减少大量的人力物力提高工作效率,因此对涂料搅拌设备进行了大量的研究。建筑涂料是涂料工业重要的组成部分之一,建筑涂料种类繁多,主要包括室内涂料、外墙涂料、地坪涂料、防火涂料等多种功能性涂料。建筑涂料的种类的多少、质量的好坏对美化城乡居住建筑、改善城乡环境具有重要意义。
智能涂料搅拌设备有着广阔的发展空间,不仅仅是市场推动其发展,而且新材料、新工艺的产生,必将对化工设备要求更高,研究基于单片机的智能涂料搅拌有着重要的意义。
众所周知,在建筑材料生产过程中需要对一些配制好的涂料进行搅拌,这些配制好的涂料一般呈粘稠状液体,经过搅拌以后使各种成分混合均匀,涂料的性质才会达到最佳,才能用于下一道工序的使用,因此,搅拌的工序就显得尤为重要。
国外搅拌器械的发展历史悠久,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来进行实时显示。
图1.1 基于单片机的智能涂料搅拌设计系统架构
1.3 系统器件选择
结合上文的系统需求分析,为了接收外部对系统工作模式的控制与改变,在基于单片机的智能涂料搅料器设计中使用按键电路来实现,单片机实时进行检测外部输入命令,调整电机状态。
整个系统的运行都依靠单片机来进行操控,不同的单片机类型功能也不一样,经过仔细考虑和结合实际情况,采用的是STC89C51单片机。因为此程序的代码不是十分的繁多,所以为了节约成本没有采用比较复杂成本比较昂贵的STM32或者是MSP430等单片机。而去采用STC89C51单片机。
显示部分用LCD1602液晶来显示当前的信息,相比于数码管显示, LCD1602显示的字符量更多,弥补信息量比较少,显示内容有限的缺陷,它可以显示字母,数字还可以显示特殊的符号。
选用谐振式液位传感器来探测搅拌涂料的深度,从而控制搅拌时间,该传感器同其他传感器相比性价比高,不需要传感器深入到涂料当中探测,更加安全。
2 系统硬件设计
结合第一章的系统需求分析以及器件选型,我们首先需要结合对基于单片机的智能涂料搅料器设计中的各个模块的硬件电路完成设计。
2.1 单片机外围电路设计
单片机对传感器和外设进行控制,对外部输入的数据和信号进行收集计算,并进行相应的操作。STC89C51单片机是基于单片机的智能涂料搅料器设计中的核心,围绕其需要展开很多电路实现系统中的相关功能,我们首先需要完成对单片机外围电路的设计。
2.1.1 STC89C51单片机介绍
STC89C51有32个I/O口可以连接更多的外设和传感器,8k字节的FLASH存储器可以进行更多的计算缓存,512字节的RAM大大提高了反应速度。STC89C51单片机的烧录也非常简单,通过TX和RX口,采用对应的编译器就可以将程序烧录进去。
图2.1 STC89C51单片机封装引脚
如图2.1所示为STC89C51单片机封装引脚,完成自动搅料系统电路设计之前首先需要对管脚进行了解。
VCC:供电电压。
GND:接地。
P0、P1、P2、P3:I/O引脚,可以在本次设计中作为输入输出端口,用以向LCD液晶输入信息等。
P3口特殊功能口,具体如下表所示:
表2.1 P3口的第二功能
端口名称 功能
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(记时器0外部输入)
P3.5 T1(记时器1外部输入)
P3.6 /WR(外部数据存储器写选通)
P3.7 /RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:复位输入。
PSEN:外部程序存储器的选通信号。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
2.1.2 STC89C51单片机外围电路设计
根据第一章对基于单片机的智能涂料搅料器设计需求分析,结合单片机所完成的具体工作以及单片机的管脚介绍,最终总结单片机外围电路需要进行几个方面的设计。
(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:设置计时时间的秒增加。
(4)控制电机电路:
在搅料系统中使用电机的端口中,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.5 LED显示电路
程序设计中,通过设置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.7 STC89C51单片机外部电路设计
2.2 LCD1602液晶显示电路设计
2.2.1 LCD1602液晶显示器介绍
本次设计采用LCD1602液晶显示器作为输出显示器,LCD1602液晶屏显示利用液晶的特性,通过改变电压达到控制区域显示,最终显示出想要的图形或者数字。
如表2.2所示为LCD1602数据手册[15]给出的芯片接口定义,是我们在进行电路设计以及后续编程实现数据显示过程中的重要依据。
表2.2 LCD1602芯片接口定义
编号 符号 引脚说明 编号 符号 引脚说明
1 VSS 电源地 9 D2 Data i/o
2 VDD 电源正极 10 D3 Data i/o
3 VL 液晶显示偏压信号 11 D4 Data i/o
4 RS 数据/命令选择端 12 D5 Data i/o
5 R/W 读/写选择端 13 D6 Data i/o
6 E 使能信号 14 D7 Data i/o
7 D0 Data i/o 15 BLA 背光源正极
8 D1 Data i/o 16 BLK 背光源负极
2.2.2 LCD1602液晶外围电路设计
本次设计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.8 LCD1602液晶显示电路图
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所示,当整个系统运行时,首先是各个部分的初始化,由于系统要实现对电机的控制,还需要完成包括单片机的中断设置等。
图3.1 程序架构
初始化完成以后,LCD1602液晶需要显示系统初始状态:停止运行,正向,转速5000。同时按键检测程序不断对开关的状态进行判断,液位传感器对液位进行检测设置定时时间[18],当开关按下后,根据之前的设定,不同开关执行相对应的程序,来对搅料系统的工作模式进行改变。在执行模式更改的同时,通过LCD1602液晶来实时显示目前所处的状态,便于使用者使用。
3.2 LCD显示程序设计
在基于单片机的智能涂料搅料器设计中,为了便于使用者直观了解系统目前的工作状态,LCD1602液晶需要显示系统工作状态(开始、停止)、电机的转向(CW、CCW)、电机转速、电机定时时间等,并根据开关对系统的控制,实时对自动搅料系统这些信息进行更新[19]。按照设置,第一行显示系统工作状态(开始、停止)、电机的转向(CW、CCW),第二行显示电机转速、电机定时时间。如图3.2为LCD1602子程序流程图。
图3.2 LCD1602子程序流程图
根据LCD1602的数据手册,在使用LCD1602之前需要进行初始化,初始化需要完成2个工作,通过程序为LCD1602写入相关设置指令。
如图3.3所示为LCD1602内部的RAM地址映射图:
图3.3地址映射图
如图3.4所示为LCD1602写操作时序:
图3.4 LCD1602写操作时序
写入数据需要以下几个步骤:首先需要通过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.9
TH2= (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 焊接与调试
本次对基于单片机的智能涂料搅料器设计中使用的是Altium Designer软件完成电路板的绘制,在完成基于单片机的智能涂料搅料器设计的电路设计以后,生成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)程序编写完成后进行编译连接,显示“0 error 0 warning ”后说明无语法错误[26],再次检查看是否有逻辑错误,检查无误后烧录进单片机内。
结 论
本设计是对涂料搅拌系统进行新的突破性设计,其中动力模块的设计更加的便于控制。显示模块起到安全增加工作效率的作用,方便人们的使用。设计采用模块化方法设计,主要分为硬件设计和软件设计两个部分,其中包括四个模块,分别为:按键模块、动力模块、传感器模块、显示模块。软件设计部分主要是编写程序控制整个系统,并且单片机能够响应按键模块输入的指令信号,并对程序中的参数做出实时修改,进而控制电机的运行状态。在调查过程中,发现市场上的涂料搅拌器机几乎没有使用LCD显示屏的,传统的涂料搅拌器都是接通电源,传输机一直工作不能实现调速定时等控制,非常耗能并且还不安全,本设计中加入LCD1602来显示系统的运行状态,便于操作者来决定电动机的工作状态以及涂料的搅拌完成度,对比传统的搅拌器更加的省时省力。加入了谐振式液位传感器来控制搅拌的时间,使系统更加的便于操作。本文从系统总体架构、需求分析与方案设计、系统器件选择、系统架构、系统硬件设、单片机外围电路设计、STC89C51单片机介绍、STC89C51单片机外围电路设计、LCD1602液晶显示电路设计、LCD1602液晶显示器介绍、LCD1602液晶外围电路设计、电机外围电路设计、供电电路设计、系统软件流程设计、程序架构、LCD、示程序设计、电机定时与转速控制程序设计、按键控制程序设计、系统调试、焊接与调试、系统调试、 程序烧录与调试、遇到的问题及解决问题方法方面去阐述分析单片机智能涂料搅拌搅拌设计系统。
本次所设计的基于单片机的智能涂料搅料器设计,主要需要实现以下一些功能,首先系统能够接收外部人为控制,实现电机的正转反转,使得涂料能够充分搅拌;第二点是电机能够以不同的速度进行搅拌,使用过程中可以实现灵活的加速与减速操作;第三点是如果搅拌时间较长,可以设置定时,同时通过液位传感器也可进行定时,实现无人值守,减轻工人压力,提高效率;第四点是以上这些操作、流程、转速等都可以实时显示,让使用者能够清楚目前的状态。在完成了系统电路的设计以后,系统的主要功能还需要通过软件实现,需要进行相关软件流程设计,实现基于单片机的智能涂料搅料器设计预定的相关功能,基于单片机的智能涂料搅拌器设计中使用的是Altium Designer软件完成电路板的绘制。
参考文献
[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”
sbit LED1 = P3^2;
sbit K2=P1^0;
sbit K3=P1^1;
sbit K4=P1^2;
sbit K5=P1^3;
sbit K6=P1^4;
sbit K7=P1^5;
sbit K8=P1^6;
sbit K9=P1^7;
sbit g_Den=P3^4; //用于启动
sbit g_Drf=P3^5; //用于正反转
sbit g_Pwm=P3^7; //pwm输出
#define MOTOR_STOP 0
#define MOTOR_RUNNING 1
#define DIR_CW 1
#define DIR_CCW 2
#define RATE_MAX 5000
#define RATE_RATE 500
u16 g_usRateCnt = RATE_MAX;
u8 g_ucCw = DIR_CW;
u8 g_ucRunning = MOTOR_STOP;
u16 g_ulClock = 0;
unsigned char uart_wr=0; //写指针
unsigned char uart_rd; //读指针
char g_ascBak[16] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
unsigned char RX_Buffer[20]={‘0’}; //接收缓冲
unsigned char aucTmpBuf[20]={‘0’}; //接收缓冲
bit display_flag = 0;
bit t0_triger_motor_flag = 0;
bit t0_show_timer_ex_flag = 0;
bit t1_pwm = 0;
bit k2_flag = 0;
#define KEY_DELAY 200
/*0616/
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define FOSC 11059200L //System frequency
#define BAUD 9600 //UART baudrate
bit busy;
static int arrayto_num(void)
{
int arr_num = 0;
arr_num =(RX_Buffer[8]-0x30)*100 + (RX_Buffer[9]-0x30)*10+(RX_Buffer[10]-0x30);
return arr_num;
}
/----------------------------
UART interrupt service routine 616
----------------------------/
void Uart_Isr() interrupt 4
{
if (RI)
{ RI = 0; //Clear receive interrupt flagRX_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; //Clear transmit interrupt flagbusy = 0; //Clear transmit busy flag
}
}
// 显示电机状态 运行 (RUNNING) 或 停止 (STOPED)
static void _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);
}
//显示倒计时
static void _show_timer_ex()
{
u16 usTime = 0;
u8 y = 0;
u16 usMin = 0;
u16 usSec = 0;
usTime = g_ulClock;
usMin = usTime/60;
usSec = usTime%60;
if(usMin < 10)y = 1;
else if(usMin < 100)y = 2;
else if(usMin < 1000)y = 3;
elsey = 4;
LCDprintStr(10,0,g_ascBak,6);
LCDprintNum(10,0,usMin,y);
LCDprintStr(10+y,0,":",1);
LCDprintNum(11+y,0,usSec,2);
}
// 显示电机转速
static void _show_motor_rate()
{
LCDprintStr(0,1,g_ascBak,4);
LCDprintNum(0,1,g_usRateCnt,4);
}
//显示电机旋转方向正转(CW) 或反转(CCW)
static void _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);
}
// 显示水位深度毫米
static void water_deep(void)
{
if( 1== display_flag){ LCDprintStr(10,1,&RX_Buffer[8],3);LCDprintStr(13,1,"mm",2);display_flag = 0;}
}
void wdeep_time(void)
{
int a_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;
}
}
void triger_motor(u8 stat)
{
if(stat != MOTOR_RUNNING && stat != MOTOR_STOP)
{
return ;
}
g_ucRunning = stat;
_show_motor_stat();
if(MOTOR_RUNNING == stat)g_Den = 0; // 开启
elseg_Den = 1; // 停止
}
void triger_cw(u8 stat)
{
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()
{
static u8 ucCnt = 0;
if(g_ucRunning)return;if(0 == K8)
{if(ucCnt < KEY_DELAY)ucCnt++;}
else if(1 == K8 && KEY_DELAY == ucCnt)
{if(g_ulClock <= 65475)g_ulClock += 60;elseg_ulClock = 65535;_show_timer_ex();ucCnt = 0;
}
}
void _scan_k9()
{
static u8 ucCnt = 0;
if(g_ucRunning)return;if(0 == K9)
{if(ucCnt < KEY_DELAY)ucCnt++;
}
else if(1 == K9 && KEY_DELAY == ucCnt)
{if(g_ulClock <= 65525)g_ulClock += 10;elseg_ulClock = 65535;_show_timer_ex();ucCnt = 0;
}
}
void _scan_k6()
{
static u8 ucCnt = 0;
if(0 == K6)
{if(ucCnt < KEY_DELAY)ucCnt++;
}
else if(1 == K6 && KEY_DELAY == ucCnt)
{if(g_usRateCnt + RATE_RATE <= RATE_MAX)g_usRateCnt += RATE_RATE;elseg_usRateCnt = RATE_MAX;_show_motor_rate();ucCnt = 0;
}
}
void _scan_k7()
{
static u8 ucCnt = 0;
if(0 == K7)
{if(ucCnt < KEY_DELAY)ucCnt++;
}
else if(1 == K7 && KEY_DELAY == ucCnt)
{if(g_usRateCnt <= RATE_RATE)g_usRateCnt = 0;elseg_usRateCnt -= RATE_RATE;_show_motor_rate();ucCnt = 0;
}
}
void _scan_k2()
{
static u8 ucCnt = 0;
if(0 == K2)
{if(ucCnt < KEY_DELAY)ucCnt++;
}
else if(1 == K2 && KEY_DELAY == ucCnt)
{k2_flag = 1;triger_motor(MOTOR_RUNNING); //触发电机启动ucCnt = 0;
}
}
void _scan_k3()
{
static u8 ucCnt = 0;
if(0 == K3)
{if(ucCnt < KEY_DELAY)ucCnt++;
}
else if(1 == K3 && KEY_DELAY == ucCnt)
{triger_motor(MOTOR_STOP); // 触发电机停止ucCnt = 0;
}
}
void _scan_k4()
{
static u8 ucCnt = 0;
if(0 == K4)
{if(ucCnt < KEY_DELAY)ucCnt++;
}
else if(1 == K4 && KEY_DELAY == ucCnt)
{triger_cw(DIR_CW); // 触发正转ucCnt = 0;
}
}
void _scan_k5()
{
static u8 ucCnt = 0;
if(0 == K5)
{if(ucCnt < KEY_DELAY)ucCnt++;
}
else if(1 == K5 && KEY_DELAY == ucCnt)
{triger_cw(DIR_CCW); // 触发反转ucCnt = 0;
}
}
void keyscan() //键盘扫描函数
{
_scan_k2();
_scan_k3();
_scan_k4();
_scan_k5();
_scan_k6();
_scan_k7();
_scan_k8();
_scan_k9();
}
void int1() interrupt 1 //定时器0显示倒计时
{
static u8 ucCnt = 0;
static u16 led_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;
}
}
static void pwm_out() // TM1控制pwm输出
{
static u16 usCnt = 0;
usCnt++;if(usCnt >= RATE_MAX)usCnt=0;if(g_usRateCnt > usCnt)
{g_Pwm=1;
}
else
{g_Pwm=0;
}
}
#define V_RATE 0xa4
void int3() interrupt 3 //产生PWM
{
TH1=0xff; // 65526/256
TL1=V_RATE; // 65526%256 定时10us
t1_pwm = 1 ;
}
// 初始化系统时钟
static void _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; //Timer2 start run 0616
TL2 = RCAP2L = (65536-(FOSC/32/BAUD)); //Set auto-reload vaule
TH2 = RCAP2H = (65536-(FOSC/32/BAUD)) >> 8;
TR2 = 1; //定时器2开始计时SCON = 0x50;
ES = 1;ET0=1; //定时器0开中断 intr 1
ET1=1; //定时器1开中断 intr 3EA=1; //开起系统中断
}
/*
系统初始化
*/
void init()
{
LCDinit(); //初始化LCD1602
triger_motor(MOTOR_STOP); //默认关闭电机
triger_cw(DIR_CW); //默认电机正转
_show_motor_rate();
_show_timer_ex();
_init_tm(); //初始化定时
}
void main()
{
u16 i = 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”
#define LCD1602_DB P0
sbit LCD1602_RS = P2^5;
sbit LCD1602_RW = P2^6;
sbit LCD1602_E = P2^7;
/* 等待液晶准备好*/
void LCDwaitReady() {
uint8_t state;
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-待写入命令值*/
void LCDwriteCmd(uint8_t cmd) {
LCDwaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_E = 1;
LCD1602_E = 0;
}
/* 向LCD1602液晶写入一个字节数据,dat-待写入数据值 */
void LCDwriteDat(uint8_t dat) {
LCDwaitReady();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_E = 1;
LCD1602_E = 0;
}
/设置显示RAM起始地址,亦即光标位置,(col,row)-对应屏幕上的字符坐标/
void LCDsetCursor(uint8_t col, uint8_t row) {
uint8_t addr;
if (row == 0) //由输入的屏幕坐标计算显示RAM的地址addr = col; //第一行字符地址从0x00起始
elseaddr = 0x40 + col; //第二行字符地址从0x40起始
LCDwriteCmd(addr | 0x80); //设置RAM地址
}
/在液晶上显示字符串,(col,row)-对应屏幕上的起始坐标,srt-字符串指针/
void LCDprintStr(uint8_t col, uint8_t row, uint8_t * str, uint8_t len) {
uint8_t i = 0;
LCDsetCursor(col, row); //设置起始位置
for(i = 0; i < len; i++) {LCDwriteDat(*str++);
}
}
void LCDprintNum(uint8_t col, uint8_t row, uint16_t num, uint8_t len) {
LCDsetCursor(col, row); //设置起始位置
if(len>=5)
LCDwriteDat(0x30+num/10000%10); //万位
if(len>=4)
LCDwriteDat(0x30+num/1000%10); //千位
if(len>=3)
LCDwriteDat(0x30+num/100%10); //百位
if(len>=2)
LCDwriteDat(0x30+num/10%10); //十位
if(len>=1)
LCDwriteDat(0x30+num%10); //个位
}
/* 初始化1602液晶 /
void LCDinit() {
LCDwriteCmd(0x38); //162显示,5*7点阵,8位数据接口
LCDwriteCmd(0x0C); //显示器开,光标关闭
LCDwriteCmd(0x06); //文字不动,地址自动+1
LCDwriteCmd(0x01); //清屏
}
致 谢
本次毕业设计的内容是基于单片机的智能涂料搅料器设计,从选题到构思到最后的实现,期间遇到了很多问题,在老师们的指导下,一点点去查资料,去不断地尝试实验,期间学到了很多知识,难题逐个击破。不仅在专业知识上的学习更加深入,也学会了很多做人的道理和做事的方法。老师的理论知识和严谨的态度让我深受启发,在此要对谢莹老师致以衷心的感谢!
在几个月的毕业设计制作过程中,得到了谢莹老师和冯雅丽老师的辛勤指导,在老师们的耐心指导下,顺利的完成了本次毕业设计,在此由衷的向两位老师表示敬意,也同样非常感谢在毕业设计过程中给我提供帮助的同学和朋友,感谢我的父母和亲人对我的陪伴支持。
这篇关于基于单片机的智能涂料搅拌器设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!