为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

全自动洗衣机

2017-09-20 48页 doc 493KB 141阅读

用户头像

is_637320

暂无简介

举报
全自动洗衣机摘    要 随着数字技术的快速发展,数字技术被广泛应用于智能控制的领域中。单片机以体积小、功能全、价格低廉、开发方便的优势得到了许多电子系统设计者的青睐。它适合于实时控制,可构成工业控制器、智能仪表、智能接口、智能武器装置以及通用测控单元等。 本文以AT89S52单片机为核心设计了全自动洗衣机控制电路,本电路实现了对洗衣机整个洗衣过程的控制,包括程序选择、洗衣、脱水和结束报警四个阶段。控制系统主要由单片机控制系统和外部硬件电路两大模块组成。单片机主控系统负责控制洗衣机的工作过程,主要由AT89S52单片机、按键、蜂鸣器、LE...
全自动洗衣机
摘    要 随着数字技术的快速发展,数字技术被广泛应用于智能控制的领域中。单片机以体积小、功能全、价格低廉、开发方便的优势得到了许多电子系统者的青睐。它适合于实时控制,可构成工业控制器、智能仪表、智能接口、智能武器装置以及通用测控单元等。 本文以AT89S52单片机为核心设计了全自动洗衣机控制电路,本电路实现了对洗衣机整个洗衣过程的控制,包括程序选择、洗衣、脱水和结束报警四个阶段。控制系统主要由单片机控制系统和外部硬件电路两大模块组成。单片机主控系统负责控制洗衣机的工作过程,主要由AT89S52单片机、按键、蜂鸣器、LED指示灯组成;外部硬件电路有继电器、三极管、LED灯、L293D控制电路组成。 本系统的电路并不复杂,给AT89S52单片机载入软件程序后,能够实现全自动洗衣机的基本功能。虽然不能与电器市场上的洗衣机控制系统媲美,但也具有一定的实用性。 关键词: AT89S52; 继电器; 控制电路; LED; L293D Abstract   With the rapid development of digital technology, digital technology is widely used in the field of intelligent control. Microcontroller is small, full-featured, inexpensive, and convenient advantage has been the development of many electronic system designers of all ages. It is suitable for real-time control, may constitute industrial controllers, smart instrumentation, smart interfaces, smart weapons and other equipment, and general control unit. In this paper, AT89S52 microcontroller as the core design of the automatic washing machine control circuit, the circuit realizes the entire laundry washing process control, including procedures for selection, washing, dewatering and end alarm four stages. Control system is mainly controlled by the microcontroller systems and external hardware circuit consists of two modules. MCU master control system is responsible for controlling the washing machine working process, mainly by AT89S52 microcontroller, buttons, buzzer, LED indicator lights; external hardware circuit relays, transistors, LED lights, L293D control circuit. The system is not complicated circuit to AT89S52 microcontroller loaded software program, you can achieve the basic functions of automatic washing machines. Although it is not a washing machine and electrical control systems on the market comparable to, but also has a certain practicality. Keywords : AT89S52;  relay;  control circuit;  LED;  L293D                               目      录 摘    要    I Abstract    II 1 引言    1 1.1 课题背景    1 1.2 目的和意义    2 1.3 系统设计思想    2 2 设计    4 2.1 洗衣机程序功能    4 2.1.1 洗衣过程    4 2.2 按键设计    5 2.3 LED灯的设计    5 2.4 控制电路功能    5 2.5 本章小结    6 3 可行性分析    7 3.1 经济可行性    7 3.2 技术可行性    7 3.3 本章小结    7 4 硬件设计    8 4.1 控制系统的电路组成    8 4.2 单片机控制电路    9 4.2.1 单片机选型    9 4.2.2 单片机复位电路    10 4.2.3 单片机时钟电路    11 4.2.4 显示电路    12 4.2.4 蜂鸣器报警电路    13 4.2.5 按键电路    14 4.2.6 进水、排水电路    15 4.3 电机控制电路    16 4.3.1 L293D引脚功能    17 4.3.2 L293D内部驱动原理    18 4.4 本章小结    21 5 软件设计    22 5.1 软件程序设计    22 5.1.1 总体程序设计    22 5.1.2 洗衣主程序流程图    22 5.1.3 程序选择设计    23 5.1.4 标准洗衣程序设计    25 5.1.5 洗涤程序设计    25 5.1.6 漂洗程序设计    26 5.1.7 脱水程序设计    27 5.1.7 强洗、弱洗设计    28 5.2 本章小结    29 6 调试    30 6.1 硬件调试    30 6.1.1 电路设计与调试    30 6.1.3 硬件调试中的问题    30 6.1.4 硬件实物图    31 6.2 软件调试    31 6.2.1 Keil C51软件调试    31 6.2.2 软件调试中的问题    32 6.4 本章小结    33 结论    34 致谢    35 参考文献    36 附录1    37 附录2    38 1 引言 1.1 课题背景 1858年,汉密尔顿·史密斯制成了世界上第一台洗衣机。1874年,“手洗时代”受到了前所未有的挑战,美国人比尔·布莱克斯发明了世界上第一台人工搅动洗衣机。1911年美国人又研制了世界上第一台电动洗衣机。1920年美国的玛依塔格公司又把洗衣机的木制桶改为铝制桶体,第二年又把铝制桶体改为外层铸铝、内层为铜板的双层结构。1936年,他们又将搪瓷用于洗衣机桶体。与此同时,世界各地也相继出现了洗衣机。欧洲国家研究成功了喷流式洗衣机和滚筒式洗衣机。 1932年后,美国一家公司研制成功了第一台前装式滚筒全自动洗衣机,洗涤、漂洗和脱水都在同一个滚筒内自动完成,使洗衣机的发展跃上了一个新台阶。这种滚筒洗衣机,目前在欧洲、美洲等地得到了广泛的应用。 第二次世界大战结束后,洗衣机得到了迅速的发展,研制出具有独特风格的波轮式洗衣机。这种洗衣机由于其波轮安装在洗衣桶底,又称涡卷式洗衣机。 近几十年,在工业发达国家,全自动洗衣机制造技术又得到迅速发展,其年总产量及社会普及率均以达到相当高得水平。 全自动洗衣机的发展首先表现在洗涤方式发生巨大变化。原先大多侧重于水流的改变、动力的加大。现在,超音波、电解水、臭氧和蒸汽洗涤的运用,使洗衣机的去污能力从单纯依靠洗衣粉、洗涤剂的化学作用和强弱变化的水流机械作用,向更高层次的健康、环保洗涤方式转变,特别是电解水、超音波技术在洗衣机行业的运用几乎改变了洗衣机的历史——洗衣不用或少用洗衣粉、洗涤剂,减少化学品对皮肤的损害和对环境的污染。电解水、臭氧、蒸汽的杀菌除味及消毒功能倍受青睐,引发了洗衣机消费健康潮。 另一变化就是高度自动化、智能化、人性化。从半自动、全自动到现在流行的人工智能、模糊控制,只需按一下按钮一切搞定!同时,用户可以按照自己的洗衣习惯,自主选择时间和方式,自编和记忆程序让用户真正做到随心所欲。人性化还表现在使用的方便和舒适,如子母分洗洗衣机可以做到不同衣物分开洗;斜桶和顶开滚筒可以做到取放衣物方便不需深弯腰;蒸汽烘干功能使得晾晒更加方便,DD直驱电机在节能降噪方面效果更加突出,等等。 全自动洗衣机由于具有对衣物的磨损小、洗涤量大、节水等特点,越来越得到广大家庭的青睐。随着社会的进步和生活水平的提高,人们对全自动洗衣机的功能多样化、操作简单化也提出了更高的要求。为适应这种变化,全自动洗衣机的控制器已由机械式、混合式逐步过渡到全电子控制。 单片机又称微控制器,或称嵌入式控制器。而现在的智能家电无一例外是采用微控制器来实现的,所以家用电器是单片机应用最多的领域之一。它是家用电器实现智能化的心脏和大脑。 由于家用电器体积小,故要求其控制器体积更小以便能嵌入其结构之中。而家用电器品种多,功能差异也大,所以又要求其控制器有灵活的控制功能。单片机以微小的体积和编程的灵活性而产生多种控制功能,完全可以满足家用电器的需求 1.2 目的和意义 目前中国洗衣机市场正进入更新换代期,市场潜力巨大,人们对于洗衣机的要求也越来越高,目前的洗衣机主要有强弱洗涤功能、进排水系统故障自动诊断功能、暂停等七大功能,在许多方面还不能达到人们的需求。这就要求设计者们有更高的专业和技术水平,能够提出更多好的建议和新的课题,将人们的需要变成现实,设计出更节能、功能更全面、更人性化的全自动洗衣机。目前的洗衣机都没有实现全方面的兼容,大多洗衣的厂家都注重各自品牌的洗衣机的特长,突出一两个与别的洗衣机不同的个性化的功能,洗衣机的各项功能是由单片机控制实现的,单片机的体积小,控制功能灵活,因此,设计出基于单片机的全自动洗衣机控制电路系统具有很强的实用性。 1.3 系统设计思想 控制电路主要由单片机控制电路和电机控制电路二大模块构成。单片机控制电路负责控制洗衣机的工作过程,主要由AT89C51单片机、按键、水位控制开关、蜂鸣器、LED指示灯、进水电磁阀、排水电磁阀组成;电机控制电路实现电机驱动功能,主要由电动机,L293D组成。 本设计的关键在于单片机的控制系统以及电动机控制系统。 单片机控制系统的设计。本系统采用AT89S52单片机。根据不同的洗衣方案,设计相应的功能按键,并设有相应的指示灯与之对应。当按键按下,单片机输出相应信号通过LED等显示程序的执行情况。 进水阀、排水阀由分别有一个继电器模拟控制,并连接LED等显示进出水情况。 电动机控制系统的电路设计。电机的控制主要有L293D电机驱动电路和单片机内部定时来实现对电机正反转和转动周期的控制 2 方案设计     本设计主要由单片机控制电路、电机控制电路两大模块构成。单片机控制电路负责控制洗衣机的工作过程,主要由AT89S52单片机、按键、水位控制、蜂鸣器、LED指示灯、进水继电器、排水继电器组成;电机控制电路实现电机驱动功能,主要由直流电动机、L293D驱动控制电路组成。 总方案原理框图如图2-1所示 直流电机                     图2-1 系统总方案原理框图 2.1 洗衣机程序功能 洗衣机有标准、经济、单独、排水四种选择模式,同时能选择强洗和弱洗,每种洗涤方式都包括进水、洗涤、排水、进水、漂洗、排水、脱水几个过程。强弱洗的不同在于电机的转速的不同,强洗是电机转动周期长,弱洗电机转动周期短。标准洗模式有进水、洗涤、排水、进水、漂洗、进水、漂洗、排水、脱水、报警几个过程组成。经济洗模式只进行一次漂洗过程。单独模式由进水、洗涤组成;排水模式由排水、脱水组成。脱水过程结束后会进行蜂鸣报警,提示洗涤结束。 2.1.1 洗衣过程 (1)洗涤过程 当进水完毕,则先开始洗涤过程。洗涤过程有强弱洗的区别,主要是电机转速不同。洗涤过程中电机交替正转和反转。 (2)漂洗过程 所谓漂洗,则是将洗涤剂放出后,进行的洗衣过程,与正常的洗涤类似,只不过洗涤时间短一些。漂洗在洗涤排水并进水后进行。 (3)脱水过程 当洗涤过程或者漂洗过程后的排水结束,都要进行甩干过程。甩干过程中,电机高速旋转一段时间。 (4)进水、排水过程 当洗衣机需要进水或者排水时,相应的继电器LED等亮,当水位达到要求时,通过自锁开关控制单片机模拟水位传感,进行下一个步骤。 2.2 按键设计 本设计中洗衣机面板上有4个按键和2个自锁开关。按键分别由一个单片机复位按键;一个程序选择按键;一个运行暂停按键;一个强弱选择按键组成。程序选择按键功能是在标准、经济、单独、排水四种洗涤模式中选择,默认模式是标准。运行暂停按键控制程序的运行和暂停。强弱选择按键选择洗涤模式强洗和弱洗,默认模式是强洗。自锁开关1个是水位模拟开关;1个是洗衣机盖开关模拟开关。 2.3 LED灯的设计 本设计中共用到了12个LED灯显示。分别由标准、经济、单独、排水模式选择显示灯;强洗、弱洗模式选择灯;洗涤、漂洗、脱水状态显示灯;进水、排水显示灯;电路电源显示灯组成。 2.4 控制电路功能 基于单片机洗衣机通过控制电路设定洗衣程序在洗涤脱水桶内自动完成注水、洗涤、漂洗、排水和脱水全过程。程序默认开始启动时是标准模式强洗,进水阀门开启,进水LED灯亮,用开关模拟水位控制,按下高水位表示水位达到要求,进水阀门关,电机启动开始进入洗涤过程。洗涤过程正反转交替,洗涤时间到后排水阀门开启,排水LED灯亮,按下低水位开关,表水水位达到要求后 排水阀门关,进水阀门开,水位到达后电机转动进入漂洗过程,漂洗时间到达后进行进水、排水和第二次漂洗。两次漂洗结束后排水阀门开,同时洗衣机盖开关,洗衣机盖打开则电机停止转动,运行中断,洗衣机盖关则水位低后进行脱水过程,脱水时间结束后,电机停止转动,蜂鸣器蜂鸣报警提醒用户洗衣过程结束。 2.5 本章小结 本章主要阐述洗衣机洗衣程序的设计、单片机控制系统与电动机控制系统的方案设计。洗衣程序的设计主要讲述了4种洗衣方案的流程以及差别;单片机控制系统主要介绍了各按键,LED指示灯的功能,以及控制电路实现的主要功能和过程。通过本章,使整个设计的思路变的清晰,有章可循。 3 可行性分析 3.1 经济可行性 本设计主要有单片机控制电路、电机控制电路组成。 在单片机控制电路中,本设计主要有AT89S52芯片、电阻、蜂鸣器、按键、三极管、LED指示灯和继电器组成,这些元件的价格都非常便宜,而且简单实用。 在电机控制电路中,主要由L293D芯片控制电路组成。整个模块都是常用电子元件,所用花费低,经济适用。 3.2 技术可行性 在单片机控制电路中,主要以AT89S52为核心,用不同的I/O端口的输入或输出,实现相应的功能。     在电机的控制电路中,原理与H桥式电机驱动电路控制原理类似,直接通过有内部封装H桥驱动电路的L293D芯片实现电机的控制功能。     整个电路的软件设计更是重中之重,要实现功能,必须要有执行程序。在单片机的控制电路中,主要是控制不同功能I/O端口的输入或输出,定时器控制电动机的转动时间。最重要的就是让单片机输出L293D芯片所需的驱动信号。这些都是可以通过程序来实现的。 总之,这些功能都可以通过单片机来控制实现。技术上完全可行。 3.3 本章小结 通过本章,基本上确定了该设计在经济上和技术上的可行性。整个设计完全可以自行设计完成,而且价格也可以接受。通过本章,明确了所需要的元件,以及整个设计的可行性。 4 硬件设计 4.1 控制系统的电路组成 该电路主要组成部件是由AT89S52单片机、指示灯、L293D、电动机、蜂鸣器、继电器、LED显示灯、及4只按键组成。其组成如图4-1所示。L293D有2个控制端与单片机连接,分别连接单片机P2.2和P2.3口,通过两端口输入不同高低电平控制电机正反转。P2.4和P2.5分别与排水和进水继电器相连,通过单片机输出电平控制继电器开关,单片机输出低电平时继电器内线圈通电,开关吸合,LED灯亮显示进水、排水状态。P2.1口连接蜂鸣器电路,P2.1口输出高电平时蜂鸣器发声报警。P1口分别接个洗衣状态显示LED灯,单片机口电平为低电平时,LED灯亮,显示当前洗衣状态。本设计单片机选用12M晶振。                                           图4-1 控制系统电路组成图 4.2 单片机控制电路 4.2.1 单片机选型 AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。               图4-2 AT89S52引脚图 VCC : 电源        GND: 地 P0 口:P0 口是一个 8 位漏极开路的双向 I/O 口。作为输出口,每位能驱动 8 个 TTL 逻辑电平。对 P0 端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0 口也被作为低 8 位地址/数据复用。在这种模式下,P0 具有内部上拉电阻。在 flash 编程时,P0 口也用来接收指令字节;在程序校验时,输出指令字节。程序校时,需要外部上拉电阻。 P1 口:P1 口是一个具有内部上拉电阻的 8 位双向 I/O 口,p1 输出缓冲器能驱动 4 个TTL 逻辑电平。对 P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0 和 P1.2 分别作定时器/计数器 2 的外部计数输入(P1.0/T2)和时器/计数器 2的触发输入(P1.1/T2EX)。 P2 口:P2 口是一个具有内部上拉电阻的 8 位双向 I/O 口,P2 输出缓冲器能驱动 4 个TTL 逻辑电平。对 P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)在访问外部程序存储器或用 16 位地址读取外部数据存储器(例如执行 MOVX @DPTR)时,P2 口送出高八位地址 P3 口:P3 口是一个具有内部上拉电阻的 8 位双向 I/O 口,p2 输出缓冲器能驱动 4 个TTL 逻辑电平。对 P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3 口亦作为 AT89S52 特殊功能(第二功能)使用。 RST: 复位输入。晶振工作时,RST 脚持续 2 个机器周期高电平将使单片机复位。看门狗计时完成后,RST 脚输出 96 个晶振周期的高电平。特殊寄存器 AUXR(地址 8EH)上的 DISRTO 位可以使此功能无效。DISRTO 默认状态下,复位高电平有效。 ALE/PROG:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低 8 位地址的输出脉冲。在 flash 编程时,此引脚(PROG)也用作编程输入脉冲。在一般情况下,ALE 以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE 脉冲将会跳过。 PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当 AT89S52 从外部程序存储器执行外部代码时,PSEN 在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN 将不被激活。 EA/VPP:访问外部程序存储器控制信号。为使能从 0000H 到 FFFFH 的外部程序存储器读取指令,EA 必须接 GND。为了执行内部程序指令,EA 应该接 VCC。在 flash 编程期间,EA 也接收 12 伏 VPP 电压。 XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。 XTAL2:振荡器反相放大器的输出端。 4.2.2 单片机复位电路 复位电路的作用是复位。在单片机接上电源以后,或电源出现过低电压时,将单片机存储器复位,使其各项参数处于初始位置,即处于开机时的标准程序状态,以消除由于某种原因的程序紊乱。 单片机的复位电路有上电复位和手动复位两种形式,RST端的高电平直接由上电瞬间产生高电平则为上电复位;若通过按钮产生高电平复位信号则称为手动复位。 上电复位是利用电容充电来实现复位,其工作原理是:上电瞬间RST端的电位与VCC相同,随着电容C3充电电流的减小,+5V的电压立即加到了RST端,该高电平使得单片机复位。 手动复位是利用开关K来实现复位,此时电源Vcc经两电阻分压,在RST端产生一个高电平,使得单片机复位。当RST由高变低后复位结束,CPU从初始状态开始工作。     单片机的复位都是靠外部电路实现的,在本次设计中复位电路具有上电复位和手动复位两种复位方式,如图4-3                     图4-3 单片机复位电路 4.2.3 单片机时钟电路 时钟电路由晶振元件与单片机内部电路组成,产生的振荡频率为单片机提供时钟信号,供单片机信号定时和计时。 在AT89S52单片机内部有一个高增益反相放大器,其输入端引脚为XTAL1,其输出端为XTAL2。只要在两引脚之间跨接晶体振荡器和微调电容C1、C2,就可以构成一个稳定的自激振荡器。本设计采用图4-4 所示电路。 一般地,电容C1和C2取30pf左右;晶体振荡器,简称晶振,频率范围是1.2~12MHz。晶振频率越高,系统的时钟频率也就越高,单片机的运行速度也就越快。在通常情况下,使用振荡频率为6MHz或12MHz的晶振。本设计采用的是频率为12M的晶振.                   图4-4 时钟电路 4.2.4 显示电路 显示模块由LED灯组成,7个发光二极管分别与单片机P1.0至P1.7连接,显示洗衣状态标准、经济、单独、排水、强洗、弱洗、洗涤、漂洗。四种洗涤方式和强洗、弱洗模式当前工作则二极管亮,洗涤、漂洗过程,当前工作则二极管闪烁。连接电路如图4-5所示               图4-5 LED灯连接电路 4.2.4 蜂鸣器报警电路 蜂鸣器报警电路在洗衣过程结束后会进行报警,提示用户洗衣结束。报警指示电路由PNP三极管8550驱动蜂鸣器来实现,单片机IO口控制三极管的基极,当单片机的IO口输出为低电平时,三极管导通,蜂鸣器的正极与电源接通,蜂鸣器通电发出报警声,当单片机IO口输出高电平时,三极管截止,蜂鸣器停止报警。报警指示电路如图4-6所示                                 图4-6 蜂鸣器电路 4.2.5 按键电路 按键设计主要有3个选择按键,分别与P3.0至P3.2连接,P3.0控制按键是程序选择按键,在洗衣机程序运行前按键切换标准、经济、单独、排水四种程序;P3.1控制按键是强弱洗选择按键,在程序运行前切换强洗、弱洗模式;P3.2控制按键是运行暂停按键,控制程序的运行和暂停,同时可以解除蜂鸣器的报警。同时设置2个自锁开关,分别模拟水位高低和洗衣机盖开关,由P3.6和P3.7控制,水位按键按下时表示水位低,按上时表示水位高,和进水排水电路一起模拟洗衣机水位和进水排水过程。按键连接电路如图4-7所示                         图4-7 按键电路 4.2.6 进水、排水电路 排水阀受P2.4控制,进水阀受P2.5控制,当P2.4为“0”时,排水阀继电器内线圈得电,开关吸合,排水显示LED灯亮。当P2.5为“0”时,进水阀继电器内线圈得电,开关吸合,进水显示LED灯亮。电路连接如图4-8所示。                           图4-8 进水、排水电路 4.3 电机控制电路 本设计采用直流电动机,利用L293D芯片控制电机的启动停止和正传反转,当IN1、IN2输入分别为1、0时,电机正转,反之电机反转,IN1、IN2接单片机I/O口,使能端ENA置1,接电源。电机控制电路连接如图4-9所示                   图4-9 电机控制电路 4.3.1 L293D引脚功能 L293D芯片有16个引脚,最多可同时驱动2个电机L293D采用16引脚DIP封装,其内部集成了双极型H-桥电路,所有的开量都做成n型。这种双极型脉冲调宽方式具有很多优点,如电流连续;电机可四角限运行;电机停止时有微振电流,起到“动力润滑”作用,消除正反向时的静摩擦死区:低速平稳性好等。L293D通过内部逻辑生成使能信号。H-桥电路的输入量可以用来设置马达转动方向,使能信号可以用于脉宽调整(PWM)。另外,L293D将2个H-桥电路集成到1片芯片上,这就意味着用1片芯片可以同时控制2个电机。每1个电机需要3个控制信号EN12、IN1、IN2,其中EN12是使能信号,IN1、IN2为电机转动方向控制信号,IN1、IN2分别为1,0时,电机正转,反之,电机反转。选用一路PWM连接EN12引脚,通过调整PWM的占空比可以调整电机的转速。可选择一路I/O口,经反向器74HC14分别接IN1和IN2引脚,控制电机的正反转。L293D引脚图如图4-10所示         图4-10 L293D引脚图 4.3.2 L293D内部驱动原理 L293D内部集成H桥电机驱动电路。图4-11中所示为一个典型的直流电机控制电路。电路得名于“H桥式驱动电路”是因为它的形状酷似字母H。4个三极管组成H的4条垂直腿,而电机就是H中的横杠(注意:图4-11及随后的两个图都只是示意图,而不是完整的电路图,其中三极管的驱动电路没有画出来)。如图所示,H桥式电机驱动电路包括4个三极管和一个电机。要使电机运转,必须导通对角线上的一对三极管。根据不同三极管对的导通情况,电流可能会从左至右或从右至左流过电机,从而控制电机的转向。                   图4-11  H桥式电机驱动电路 要使电机运转,必须使对角线上的一对三极管导通。例如,如图4-12所示,当Q1管和Q4管导通时,电流就从电源正极经Q1从左至右穿过电机,然后再经Q4回到电源负极。按图中电流箭头所示,该流向的电流将驱动电机顺时针转动。当三极管Q1和Q4导通时,电流将从左至右流过电机,从而驱动电机按特定方向转动(电机周围的箭头指示为顺时针方向)。               图4-12  H桥电路驱动电机顺时针转动 图4-13所示为另一对三极管Q2和Q3导通的情况,电流将从右至左流过电机。当三极管Q2和Q3导通时,电流将从右至左流过电机,从而驱动电机沿另一方向转动(电机周围的箭头表示为逆时针方向)。                 图4-13  H桥电路驱动电机 逆时针转动 使能控制和方向逻辑 :驱动电机时,保证H桥上两个同侧的三极管不会同时导通非常重要。如果三极管Q1和Q2同时导通,那么电流就会从正极穿过两个三极管直接回到负极。此时,电路中除了三极管外没有其他任何负载,因此电路上的电流就可能达到最大值(该电流仅受电源性能限制),甚至烧坏三极管。 基于上述原因,在实际驱动电路中通常要用硬件电路方便地控制三极管的关。图4-14所示就是基于这种考虑的改进电路,它在基本H桥电路的基础上增加了4个与门和2个非门。4个与门同一个“使能”导通信号相接,这样,用这一个信号就能控制整个电路的开关。而2个非门通过提供一种方向输人,可以保证任何时候在H桥的同侧腿上都只有一个三极管能导通。(与本节前面的示意图一样,图4-14所示也不是一个完整的电路图,特别是图中与门和三极管直接连接是不能正常工作的。)         图4-14  具有使能控制和方向逻辑的H桥电路  采用以上,电机的运转就只需要用三个信号控制:两个方向信号和一个使能信号。如果DIR-L信号为0,DIR-R信号为1,并且使能信号是1,那么三极管Q1和Q4导通,电流从左至右流经电机(如图4-15所示);如果DIR-L信号变为1,而DIR-R信号变为0,那么Q2和Q3将导通,电流则反向流过电机。               图4-15  使能信号与方向信号的使用 4.4 本章小结 本章主要介绍了硬件电路的设计,主要包括单片机控制单元、直流电机电机控制单元。单片机控制单元主要包括AT89S52单片机的详细介绍,蜂鸣器的驱动电路介绍以及单片机与电动机控制电路相接的电路介绍。电机控制电路主要详细的介绍了通过利用L293D芯片实现的电机控制电路,其原理是H桥式电机驱动。通过本章的介绍,清晰了硬件电路的整体设计。 5 软件设计 5.1 软件程序设计 5.1.1 总体程序设计 本设计中程序要实现洗衣机的多种洗衣方式,洗衣方式选择有标准、经济、单独、排水四种模式;强度选择有强洗、弱洗、洗衣过程有洗涤、漂洗、脱水三个过程。在洗衣过程中四中洗衣模式的功能分别是: (1) 标准:进水-洗涤-排水-进水-漂洗-排水-进水-漂洗-排水-脱水。 (2) 经济:进水-洗涤-排水-进水-漂洗-排水-脱水。 (3) 单独:进水-洗涤。 (4) 排水:排水-脱水。 强洗和弱洗的区别在于电机的正反转周期不同。 5.1.2 洗衣主程序流程图 根据硬件设计要求控制主程序流程图如图5-1所示。洗衣机通电之后单片机上电首先进行程序的初始化包括定时器0、外部中断0、外部中断1的初始化以及各参数初值的设定。默认洗衣强度为“标准洗”漂洗次数2次。然后扫描按键的状态确定洗衣过程。当发现启动键按下洗衣机从待命状态进入工作状态。完成进水、洗涤、脱水、漂洗的循环过程。当洗衣结束时控制蜂鸣器发声。                           图5-1 洗衣主程序流程图 5.1.3 程序选择设计   根据硬件按键设计,在程序运行前先使用按键选择洗衣方式和强洗、弱洗模式,程序选择流程图如图5-2所示                   图5-2 洗衣程序选择流程图     5.1.4 标准洗衣程序设计 标准洗衣是默认的洗衣方式,其流程图如图5-3所示                     图5-3 标准洗衣流程图 5.1.5 洗涤程序设计 洗涤是洗衣过程中的主要步骤。当进水结束后进入洗衣状态,洗衣开始,电动机正转-停止-反转一直循环,当洗衣时间等于零时,洗衣结束且进入漂洗。程序流程图如图5-4所示:               图5-4 洗涤程序流程图 5.1.6 漂洗程序设计 漂洗是一个比较固定的洗衣方式,与洗涤过程操作相同,只是时间短一些。漂洗次数为二次。漂洗程序流程图如图5-5所示:                     图5-5 漂洗程序流程图 5.1.7 脱水程序设计 脱水前先打开排水阀排水。然后启动电动机脱水并保持排水阀开启,然后停止脱水,并且蜂鸣器报警提醒用户洗衣完成。程序流程图如图5-6所示                       图5-6 脱水程序流程图 5.1.7 强洗、弱洗设计   功能设计中的强洗和弱洗模式区别在于电机正反转的周期不同,周期设定子程序如下: void T0_time() interrupt 1 {     TH0=(65536-50000)/256;     TL0=(65536-50000)%256;     num3++;     if(num3==20)     {         num3=0;         if(flag1==1)         ledxidi=~ledxidi;         if(flag1==2)         ledpiaoxi=~ledpiaoxi;         if(flag1==3)         ledtuoshui=~ledtuoshui;         num4++;         num5++;         num6++; if(num5==5)            //强洗周期         {             num5=0;             flag4++;             if(flag4==2)             flag4=0;         }         if(num6==3)            //弱洗周期         {             num6=0;             flag5++;             if(flag5==2)             flag5=0; 5.2 本章小结 本章主要介绍了整个设计的程序流程图以及强洗、弱洗的设置。程序流程图是设计编程的总体思想,方便系统的了解程序的框架结构。通过本章的阐述,可对整个设计的软件部分一个具体的了解。 6 调试 6.1 硬件调试 6.1.1 电路设计与调试 本设计使用Altium Designer进行电路设计。Altium Designer 是原Protel软件开发商Altium公司推出的一体化的电子产品开发系统,主要运行在Windows XP操作系统。这套软件通过把原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出等技术的完美融合,为设计者提供了全新的设计解决方案,使设计者可以轻松进行设计,熟练使用这一软件必将使电路设计的质量和效率大大提高。 Altium Designer 除了全面继承包括Protel 99SE、Protel DXP在内的先前一系列版本的功能和优点外,还增加了许多改进和很多高端功能。该平台拓宽了板级设计的传统界面,全面集成了FPGA设计功能和SOPC设计实现功能,从而允许工程设计人员能将系统设计中的FPGA与PCB设计及嵌入式设计集成在一起。 由于Altium Designer 在继承先前Protel软件功能的基础上,综合了FPGA设计和嵌入式系统软件设计功能,Altium Designer 对计算机的系统需求比先前的版本要高一些。 6.1.3 硬件调试中的问题 硬件电路板分模块焊接,每一个模块焊接好了以后,先初步检查是否焊错,有没有漏焊、虚焊,元件有没有接错、接反。这样依次焊接、检测每一个模块。最后整个电路板完成以后,将编好的完整程序用软件写进单片机电路板进行整体调试,调试检测完整的电路板,看是否能全部实现功能。 在本次设计中硬件出现的重要问题是,焊接结束后各个LED灯不能随程序正常亮,电机转动也不能随程序要求进行。经过仔细的检查后发现时有部分线路虚焊,还有部分线路焊接时间太长把连接导线焊坏了。经检查后重新调试电机转动还是不正确,后来发现是在单片机写入程序时操作错误,单片机热度过高。重新换了个单片机,请同学帮忙写入程序,再次调试后,电路能按设计要求运行。 本次设计选用的是洞洞万用板焊接的电路,由于不够熟练和烙铁老化严重,在焊接的第一次是许多虚焊,并且焊坏了部分元件,导致电路不能正常工作,经过检查调整后解决了这些问题。 在焊接的过程中,自己也常常马虎,将引脚焊错位置的情况时有发生,经过这次实践,我觉得自己的动手能力提高了许多。 6.1.4 硬件实物图 焊接调试完成后实物如图6-1所示                         图6-1 硬件实物图 6.2 软件调试 6.2.1 Keil C51软件调试 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。 Keil C51开发系统基本知识Keil C51开发系统基本知识:1.系统概述   Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。下面详细介绍Keil C51开发系统各部分功能和使用。2.Keil C51单片机软件开发系统的整体结构,C51工具包的整体结构。其中uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及C51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。 使用独立的Keil仿真器时,注意事项:1.仿真器标配11.0592MHz的晶振,但用户可以在仿真器上的晶振插孔中换插其他频率的晶振。2.仿真器上的复位按钮只复位仿真芯片,不复位目标系统。3.仿真芯片的31脚(/EA)已接至高电平,所以仿真时只能使用片内ROM,不能使用片外ROM;但仿真器外引插针中的31脚并不与仿真芯片的31脚相连,故该仿真器仍可插入到扩展有外部ROM(其CPU的/EA引脚接至低电平)的目标系统中使用。 6.2.2 软件调试中的问题 软件调试与所选用的软件结构和程序设计技术有关。如果采用模块化程序开发技术,则逐个模块调好以后,再进行系统程序总调试。调试子程序时,一定要求符合现场环境,即入口条件和出口状态。调试的手段可采用单步运行方式和断点运行方式,通过检查用户系统CPU的现场、RAM的内容和I/O口的状态,检测程序执行结果是否符合设计要求。通过检测,可以发现程序中的死循环错误、机器码错误及转换地址错误,同时也可以发现用户系统中的硬件故障、软件算法及硬件设计错误。在调试过程中逐步调整用户系统的软件和硬件。 各程序模块调试好后,可以把相关的功能模块联合起来起进行整体综合调试。存储这个阶段若发生错误,可以考虑各子程序存储运行时是否存破坏现场,缓冲区数据是否发生变化,标志位的建立和清除是否影响其它标志位的变化,堆栈区的深度是否不够,输入设备的状态是否正常等。 单步和断点调试后,还应进行连续调试,因为单片机的运行是在严格的时序下进行的,单步运行成功并不代表连续运行成功。待全部调试完成后,应反复运行多次。 6.4 本章小结 本章主要介绍了软、硬件调试过程中,应用到的工具及调试环境。详细的了各软件的功能和使用技巧。还讲述了在调试过程中主要遇到的问题及解决方法。对软、硬件调试的整个过程,进行了一个系统的概述。通过本章,我回顾了自己在设计中犯下的许多错误,丰富了自己的实际经验。对解决问题的方法不断的总结,对自己的将来的工作一定会有很大的帮助和提高。 结论 本课题设计的基于单片机的全自动洗衣机电路,充分应用了单片机在测控领域的应用技术。既有硬件设计又有软件编程,实现洗衣机的真正全自动控制,一个按钮就能完成洗衣的全过程。本设计系统的特点有:   (1)本系统硬件采用单片机AT89S52进行控制,采用直流电机,应用L293D控制芯片,都是考虑到既经济又实用的原因。   (2)本设计通过单片机控制系统,控制洗衣机洗涤过程的全部操作,并通过L293D控制电路对直流电机较好的控制,这是本次设计的重点之处。可以说在目前洗衣机的控制技术上,本设计有控制精度高,电机驱动电路简单,效率高等特点。   (3)本设计的整个洗衣过程,用户只需手动操作一个按钮,其他过程都是由洗衣机自动检测并执行,真正实现了全自动控制。   (4)本设计还考虑到半自动适当的情况,用户可以根据自己的需求自由选择洗衣机的工作方式,这一点是通过按键来实现的。   (5)由于实际条件的限制,本设计水位控制系统不能做出实际系统,水位控制系统用自锁开关进行模拟,是本设计的遗憾之处。 通过本次毕业设计,我深深的体会到了平时知识积累的重要性。只有有了足够的知识积累,在遇到问题时,才能在最短的时间内作出判断并解决。例如,由于C语言编程经验较少,在整个编程过程中,遇到了许多困难,定时器的应用以及编程语句的正确性都出现了许多错误。经过自己不断的修改与调试,最后终于完成了。在硬件电路板的焊制过程中,也暴露了许多问题,也都是由于经验不足造成的。 经过这次设计,我系统的复习了四年来所学的方方面面的知识,巩固了理论基础。在软、硬件系统的设计与实现的过程中,丰富了自己的实践经验,对自己以后的工作肯定会有很大的帮助。通过撰写论文,我对各芯片的工作原理有了更深入的了解,,学习到了许多课本以外的知识,最重要的是锻炼了自学的能力。 总之,通过本次毕业设计,我感受到了许多,学到了许多。 致谢 经过两个多月的忙碌和工作,本次毕业论文设计已经接近尾声,作为一个本科生的毕业论文,由于经验的匮乏,难免有许多考虑不周全的地方,如果没有导师的督促指导,以及热心的同学们的支持,想要完成这个设计是难以想象的。     感谢我的导师,王素玲老师在我毕业设计的各个阶段,给我提出了许多的宝贵建议,在我整个毕业设计的基础知识指导与设计思想方面,给了我很大的帮助。没有她的支持与帮助,我无法顺利完成毕业设计。在论文写作过程中,也是得到了王老师耐心的指导,她一字一句的帮我们检查论文。她严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我。从课题的选择到项目的最终完成,王老师都始终给予我细心的指导和不懈的支持。除了敬佩王老师的专业水平外,她的治学严谨和科学研究的精神也是我永远学习的榜样,并将积极影响我今后的学习和工作。在此谨向王老师致以诚挚的谢意和崇高的敬意。     感谢各位热心的同学在我的硬件设计及程序测试阶段对我的帮助。 感谢我所使用的参考文献的编写及翻译者,他们的研究与探索,使我的毕业设计能够顺利地完成。 参考文献 [1] 余发山等.单片机原理及应用技术[M].徐州:中国矿业大学版社,2008 [2] 艾永乐等.数字电子技术基础[M].北京:中国电力出版社.2008 [3] 艾永乐等.模拟电子技术基础[M].北京:中国电力出版社,2008 [4] 邱关源.电路第5版[M].北京:高等教育出版社, 2006 [5] 许合利、贾宗璞.C语言程序设计[M]. 徐州:中国矿业大学版社,2007 [6] 周美娟等. 单片机技术及系统设计[M]. 北京:清华大学出版社,2007 [7] 侯放.洗衣机原理与检修[M]. 北京:高等教育出版社 2000 [8] 高洪志.MCS-51单片机原理及应用技术教程[M]. 北京:人民邮电出版社 2009 [9] 梅晓榕.自动控制元件及线路[M]. 北京:科学出版社 2007 [10] 魏伟,胡玮,王永清.51单片机C语言开发与应用技术案例详细[M]. 北京:化学工业出版社 2010 [11] 彭为.单片机典型系统设计实例精讲[M].北京:电子工业出版社,2006 [12] 孙运生等.现代洗衣机维修电路图集[M].北京:机械工业出版社,2002.1 [13]朱经利,蒋玉亮.海尔家用洗衣机原理与维修[M].北京:人民邮电出版社,1999.2 [14]沈红卫.基于单片机的智能系统设计与实现[M].北京:电子工业出版社,2005.1 [15] 周坚.《单片机C语言轻松入门》[M] . 北京: 北京航空航天大学出版社,2007 [16] 杨金岩等.《8051单片机数据传输接口扩展技术与应用实例》[M].北京:人民邮电出版社,2005. [17] 谢维成.单片机原理与应用及C51程序设计[M].北京: 清华大学出版社,2006 附录1 电路原理图 附录2 程序代码 #include #define uchar unsigned char #define uint unsigned int uchar num=0;  //程序选择标示位 uchar num1=0;  //强弱选择标示位 uchar num2=0,num3=0,num4=0,num5=0,num6=0,flag=0,flag1=0,flag2=1,flag3=0,flag4=0,flag5=0; sbit ledbiaozhun=P1^0;    //标准 sbit ledjingji=P1^1;    //经济 sbit leddandu=P1^2;        //单独指示灯 sbit ledpaishui=P1^3;    //排水指示灯 sbit ledqiangxi=P1^4;      //强洗指示灯 sbit ledruoxi=P1^5;        //弱洗指示灯 sbit ledxidi=P1^6;        //洗涤指示灯 sbit ledpiaoxi=P1^7;    //漂洗指示灯 sbit ledtuoshui=P2^0;  //脱水指示灯 sbit sshuiwei=P3^6;      //水位模拟开关  “低” 水排尽  “高”  水加满 sbit sgai=P3^7;          //洗衣机水盖模拟开关 sbit paishui=P2^4;      //排水继电器控制端口 sbit jinshui=P2^5;      //进水继电器控制端口 sbit beep=P2^1;          //蜂鸣器 sbit U2=P2^2;          //电机正反转控制端口 sbit U3=P2^3; sbit k1=P3^0;          //程序选择 sbit k2=P3^1;          //强弱选择 sbit k3=P3^2;          //运行/暂停 /***************延时子程序********************/    void delayms(uint xms) {     uint i,j;     for(i=xms;i>0;i--)         for(j=110;j>0;j--); } /**********************蜂鸣器报警子程序***************/ void BEEP() {     beep=0;     delayms(200);     beep=1; } /************************按键控制子程序********************/ void key() {     if(k1==0)                //程序选择     {         delayms(10);         if(k1==0)         {             BEEP();             num++;             if(num==4)             num=0;             while(!k1);         }     }         if(k2==0)                //强弱选择     {         delayms(10);         if(k2==0)         {             BEEP();             num1++;             if(num1==2)             num1=0;             while(!k2);         }     } } void qiang()              //强 {     if(flag4==0)     {            U2=0;         U3=1;     }     if(flag4==1)     {         U2=1;         U3=0;     }    } void ruo()            //弱 {     if(flag5==0)     {            U2=0;         U3=1;     }     if(flag5==1)     {         U2=1;         U3=0;     } } void qbiaozhun()            //强标准 {     /*******洗涤********/         ledbiaozhun=0;         ledqiangxi=0;         ledtuoshui=0;         ledpiaoxi=0;         ledxidi=0;         jinshui=0;    //打开进水继电器         while(sshuiwei);          //等待水加满         jinshui=1;    //水加满后关闭进水继电器         flag1=1;                TR0=1;            while(flag==0)         {                 if(flag==0&&num2==1)             {                    TR0=1;                 flag1=1;                 qiang();             }             if(flag==0&&num2==2)             {                 TR0=0;                 U2=1;                 U3=1;             }         };         //漂洗         U2=1;         U3=1;                            TR0=0;         flag1=0;         paishui=0;              //打开排水继电器         ledbiaozhun=0;         ledtuoshui=0;         ledpiaoxi=0;         ledxidi=1;         while(!sshuiwei);        //    等待水排尽         delayms(3000);         paishui=1;            //水排尽后等待3s 关闭排水继电器         jinshui=0;          //再打开加水继电器         while(sshuiwei);  //等待水加满         jinshui=1;          //水加满后关闭加水继电器         flag1=2;         TR0=1;         num3=0;         num4=0;         while(flag==1)         {             if(flag==1&&num2==1)             {                    TR0=1;                 flag1=2;                 qiang();             }             if(flag==1&&num2==2)             {                 TR0=0;                 U2=1;                 U3=1;             }         };         //第二次漂洗         U2=1;         U3=1;         TR0=0;              flag1=0;         paishui=0;    //打开排水继电器         ledbiaozhun=0;         ledtuoshui=0;         ledpiaoxi=0;         while(!sshuiwei);    //等待水排尽         delayms(3000);         paishui=1;          //水排后等待3s  关闭排水继电器         jinshui=0;          //打开进水继电器         while(sshuiwei);  //等待水加满         jinshui=1;          //水加满后关闭加水继电器         flag1=2;            //进行第二次漂洗         TR0=1;         num3=0;         num4=0;                 while(flag==2)         {             if(flag==2&&num2==1)             {                    TR0=1;                 flag1=2;                 qiang();             }             if(flag==2&&num2==2)             {                 TR0=0;                 U2=1;                 U3=1;             }         }         //脱水         U2=1;         U3=1;         TR0=0;         flag1=0;         paishui=0;    //打开排水继电器         ledbiaozhun=0;         ledtuoshui=0;         ledpiaoxi=1;         while(sgai||!sshuiwei);      //等待洗衣机盖是否关闭和水是否排尽         delayms(3000);         flag1=3;        //满足条件后等待3s后开始脱水         TR0=1;         num3=0;         num4=0;         while(flag==3)         {             if(flag==3&&num2==1)             {                 TR0=1;                 U2=0;                 U3=1;                 flag1=3;             }             if(flag==3&&num2==2)             {                 TR0=0;                 U2=1;                 U3=1;             }         };                 U2=1;         U3=1;         ledtuoshui=1;    // 脱水结束后 关闭指示灯         paishui=1;    //关闭排水继电器         flag1=0;         flag3=1;         while(flag2)            //报警         {                beep=0;             delayms(100);             beep=1;             delayms(100);         };         beep=1;         while(1); } void qjingji()            //强经济 {     /*******洗涤********/         ledjingji=0;         ledqiangxi=0;         ledtuoshui=0;         ledpiaoxi=0;         ledxidi=0;         jinshui=0;         while(sshuiwei);         jinshui=1;         flag1=1;         TR0=1;         while(flag==0)         {                 if(flag==0&&num2==1)             {                    TR0=1;                 flag1=1;                 qiang();             }             if(flag==0&&num2==2)             {                 TR0=0;                 U2=1;                 U3=1;             }         };                 //漂洗                            TR0=0;         U2=1;         U3=1;         flag1=0;         paishui=0;         ledjingji=0;         ledtuoshui=0;         ledpiaoxi=0;         ledxidi=1;         while(!sshuiwei);         delayms(3000);         paishui=1;         jinshui=0;         while(sshuiwei);         jinshui=1;         flag1=2;         TR0=1;         num3=0;         num4=0;         while(flag==1)         {             if(flag==1&&num2==1)             {                    TR0=1;                 flag1=2;                 qiang();             }             if(flag==1&&num2==2)             {                 TR0=0;                 U2=1;                 U3=1;             }         };         //脱水         TR0=0;         U2=1;         U3=1;         flag1=0;         paishui=0;         ledjingji=0;         ledtuoshui=0;         ledpiaoxi=1;         while(sgai||!sshuiwei);         delayms(3000);         flag1=3;         TR0=1;         num3=0;         num4=0;         while(flag==2)         {             if(flag==2&&num2==1)             {                 TR0=1;                 U2=0;                 U3=1;                 flag1=3;             }             if(flag==2&&num2==2)             {                 TR0=0;                 U2=1;                 U3=1;             }         };         ledtuoshui=1;         U2=1;         U3=1;         flag1=0;         flag3=1;         while(flag2)            //报警         {                beep=0;             delayms(100);             beep=1;             delayms(100);         };         beep=1;         while(1); } void qdandu()              //强单独 {     ledqiangxi=0;     ledxidi=0;     leddandu=0;     jinshui=0;     while(sshuiwei);     jinshui=1;     flag1=1;     TR0=1;     while(flag==0)     {         if(flag==0&&num2==1)             {                    TR0=1;                 flag1=1;                 qiang();             }             if(flag==0&&num2==2)             {                 TR0=0;                 U2=1;                 U3=1;             }     };     flag1=0;     U2=1;     U3=1;     while(1); } void rbiaozhun()            //弱标准 {     /*******洗涤********/         ledbiaozhun=0;         ledruoxi=0;         ledtuoshui=0;         ledpiaoxi=0;         ledxidi=0;         jinshui=0;         while(sshuiwei);         jinshui=1;         flag1=1;                TR0=1;            while(flag==0)         {                 if(flag==0&&num2==1)             {                    TR0=1;                 flag1=1;                 ruo();             }             if(flag==0&&num2==2)             {                 TR0=0;                 U2=1;                 U3=1;             }         };         //漂洗         U2=1;         U3=1;                            TR0=0;         flag1=0;         paishui=0;         ledbiaozhun=0;         ledtuoshui=0;         ledpiaoxi=0;         ledxidi=1;         while(!sshuiwei);         delayms(3000);         paishui=1;         jinshui=0;         while(sshuiwei);         jinshui=1;         flag1=2;         TR0=1;         num3=0;         num4=0;         while(flag==1)         {             if(flag==1&&num2==1)             {                    TR0=1;                 flag1=2;                 ruo();             }             if(flag==1&&num2==2)             {                 TR0=0;                 U2=1;                 U3=1;             }         };         //漂洗         U2=1;         U3=1;         TR0=0;         flag1=0;         paishui=0;         ledbiaozhun=0;         ledtuoshui=0;         ledpiaoxi=0;         while(!sshuiwei);         delayms(3000);         paishui=1;         jinshui=0;         while(sshuiwei);         jinshui=1;         flag1=2;         TR0=1;         num3=0;         num4=0;                 while(flag==2)         {             if(flag==2&&num2==1)             {                    TR0=1;                 flag1=2;                 ruo();             }             if(flag==2&&num2==2)             {                 TR0=0;                 U2=1;                 U3=1;             }         }         //脱水         U2=1;         U3=1;         TR0=0;         flag1=0;         paishui=0;         ledbiaozhun=0;         ledtuoshui=0;         ledpiaoxi=1;         while(sgai||!sshuiwei);         delayms(3000);         flag1=3;         TR0=1;         num3=0;         num4=0;         while(flag==3)         {             if(flag==3&&num2==1)             {                 TR0=1;                 U2=0;                 U3=1;                 flag1=3;             }             if(flag==3&&num2==2)             {                 TR0=0;                 U2=1;                 U3=1;             }         };         ledtuoshui=1;         U2=1;         U3=1;         flag1=0;         flag3=1;         while(flag2)            //报警         {                beep=0;             delayms(100);             beep=1;             delayms(100);         };         beep=1;         while(1); } void rjingji()            //弱经济 {     /*******洗涤********/         ledjingji=0;         ledruoxi=0;         ledtuoshui=0;         ledpiaoxi=0;         ledxidi=0;         jinshui=0;         while(sshuiwei);         jinshui=1;         flag1=1;         TR0=1;         while(flag==0)         {                 if(flag==0&&num2==1)             {                    TR0=1;                 flag1=1;                 ruo();             }             if(flag==0&&num2==2)             {                 TR0=0;                 U2=1;                 U3=1;             }         };                 //漂洗                            TR0=0;         U2=1;         U3=1;         flag1=0;         paishui=0;         ledjingji=0;         ledtuoshui=0;         ledpiaoxi=0;         ledxidi=1;         while(!sshuiwei);         delayms(3000);         paishui=1;         jinshui=0;         while(sshuiwei);         jinshui=1;         flag1=2;         TR0=1;         num3=0;         num4=0;         while(flag==1)         {             if(flag==1&&num2==1)             {                    TR0=1;                 flag1=2;                 ruo();             }             if(flag==1&&num2==2)             {                 TR0=0;                 U2=1;                 U3=1;             }         };         //脱水         TR0=0;         U2=1;         U3=1;         flag1=0;         paishui=0;         ledjingji=0;         ledtuoshui=0;         ledpiaoxi=1;         while(sgai||!sshuiwei);         delayms(3000);         flag1=3;         TR0=1;         num3=0;         num4=0;         while(flag==2)         {             if(flag==2&&num2==1)             {                 TR0=1;                 U2=0;                 U3=1;                 flag1=3;             }             if(flag==2&&num2==2)             {                 TR0=0;                 U2=1;                 U3=1;             }         };         ledtuoshui=1;         U2=1;         U3=1;         flag1=0;         flag3=1;         while(flag2)            //报警         {                beep=0;             delayms(100);             beep=1;             delayms(100);         };         beep=1;         while(1); } void rdandu()              //弱单独 {     ledruoxi=0;     ledxidi=0;     leddandu=0;     jinshui=0;     while(sshuiwei);     jinshui=1;     flag1=1;     TR0=1;     while(flag==0)     {         if(flag==0&&num2==1)             {                    TR0=1;                 flag1=1;                 ruo();             }             if(flag==0&&num2==2)             {                 TR0=0;                 U2=1;                 U3=1;             }     };     flag1=0;     U2=1;     U3=1;     while(1); } void dpaishui()                //排水/脱水 {     ledpaishui=0;     ledtuoshui=0;     paishui=0;     while(!sshuiwei||sgai);     delayms(3000);     flag1=3;     TR0=1;     num3=0;     num4=0;     while(flag==0)     {         if(flag==0&&num2==1)             {                    TR0=1;                 flag1=3;                 U2=0;                 U3=1;             }             if(flag==0&&num2==2)             {                 TR0=0;                 U2=1;                 U3=1;             }     };     U2=1;     U3=1;     flag1=0;     ledtuoshui=1;     paishui=0;     while(1); }              void main() {     uchar a=0,b=0,c=0;     TMOD=0x01;     TH0=(65536-50000)/256;     TL0=(65536-50000)%256;     EA=1;     ET0=1;     TR0=0;     EX0=1;     IT0=1;     U2=1;     U3=1;     beep=1;     while(1)     {         key();         if(num1==0&&num==0)                //强洗  标准         {             ledruoxi=1;             ledpaishui=1;             ledqiangxi=0;             ledbiaozhun=0;             paishui=1;             jinshui=1;             if(num2==1)             {             qbiaozhun();             }             if(num2>1)             {                 beep=0;             }         }         if(num1==0&&num==1)          //强洗  经济         {             ledruoxi=1;             ledbiaozhun=1;             ledqiangxi=0;             ledjingji=0;             paishui=1;             jinshui=1;             if(num2==1)             {                 qjingji();             }         }         if(num1==0&&num==2)            //强洗 单独         {             ledruoxi=1;             ledjingji=1;             ledqiangxi=0;             leddandu=0;             paishui=1;             jinshui=1;             if(num2==1)             {                 qdandu();             }         }         if(num1==0&&num==3)            //强洗 排水         {             ledruoxi=1;             leddandu=1;             ledqiangxi=0;             ledpaishui=0;             paishui=1;             jinshui=1;             if(num2==1)             {                 dpaishui();             }         }         if(num1==1&&num==0)          //弱洗 标准         {             ledqiangxi=1;             ledpaishui=1;             ledruoxi=0;             ledbiaozhun=0;             paishui=1;             jinshui=1;             if(num2==1)             {                 rbiaozhun();             }         }         if(num1==1&&num==1)          //弱洗 经济         {             ledqiangxi=1;             ledbiaozhun=1;             ledruoxi=0;             ledjingji=0;             paishui=1;             jinshui=1;             if(num2==1)             {                 rjingji();             }         }         if(num1==1&&num==2)            //弱洗 单独         {             ledqiangxi=1;             ledjingji=1;             ledruoxi=0;             leddandu=0;             paishui=1;             jinshui=1;             if(num2==1)             {                 rdandu();             }         }         if(num1==1&&num==3)            //弱洗 排水         {             ledqiangxi=1;             leddandu=1;             ledruoxi=0;             ledpaishui=0;             paishui=1;             jinshui=1;             if(num2==1)             {                 dpaishui();             }         }     } } void T0_time() interrupt 1 {     TH0=(65536-50000)/256;     TL0=(65536-50000)%256;     num3++;     if(num3==20)     {         num3=0;         if(flag1==1)         ledxidi=~ledxidi;         if(flag1==2)         ledpiaoxi=~ledpiaoxi;         if(flag1==3)         ledtuoshui=~ledtuoshui;         num4++;         num5++;         num6++;         if(num4==15)        //洗涤定时         {             num4=0;             flag++;         }         if(num5==5)            //强洗周期         {             num5=0;             flag4++;             if(flag4==2)             flag4=0;         }         if(num6==3)            //弱洗周期         {             num6=0;             flag5++;             if(flag5==2)             flag5=0;         }     } } void timer() interrupt 0      //外部中断0 {     num2++;              // 开始/暂停     if(num2==3)     num2=1;     if(flag3==1)     flag2=0;        //如果满足洗涤结束条件关闭报警 }
/
本文档为【全自动洗衣机】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索