找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9585|回复: 6
打印 上一主题 下一主题
收起左侧

全自动洗衣机控制器设计(含单片机源码)

  [复制链接]
跳转到指定楼层
楼主
ID:320387 发表于 2018-5-2 13:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

洗衣机是现代家庭中必不可少的一部分,它的出现方便了我们的生活,为我们节省了不少时间。随着经济的发展和人民生活水平的不断提高,其发展也是日新月异,全自动化的程序是现在洗衣机的基本要求。我们现在只要按一个键,我们就可以完成洗衣服的所有操作。洗衣机逐渐向微电脑智能化发展。传统的机械式、简单的电子式控制都难以满足现代洗衣机的发展要求。本系统的微控制器采用STC89C52单片机,系统主要由液晶显示模块,系统报警模块,电机控制模块,功能按键模块,指示灯模块。洗衣机开机默认标准模式,洗涤12分钟,漂洗6分钟,漂洗两次脱水,漂洗和洗涤,电机都正转四秒,停两秒,反转四秒,停两秒。系统通过按键来启停洗衣机,通过按键选择洗衣机标准,快速,脱水三种模式,通过按键模拟脱水翻盖功能等等。
本设计洗衣的过程控制主要包括,洗涤,漂洗,排水脱水三个过程。按照全自动洗衣机的控制系统的要求和特点,来进行确定单片机的输入输出分配关系,根据洗衣过程的需求,控制程序的设计主要包括主程序、内部定时中断服务程序、外部定时中断程序、洗衣,排水和脱水的设计,设计完毕并进行系统调试。

1.绪 论

1.1 课题研究背景及意义

1.2本文主要的研究内容

2系统方案总体设计

2.1 全自动洗衣机指标要求

2.2 系统方案选择

2.2.1 控制器选择

2.2.2 电机驱动器选择

2.3 系统总体设计

3 系统硬件电路设计

3.1 电机驱动电路设计

3.1.1 L298介绍

3.1.2 电机驱动电路设计

3.2 单片机控制单元设计

3.2.1单片机介绍

3.2.2 中断系统

3.2.3定时器

3.2.4控制系统电路设计

3.3. 显示电路设计

3.4 报警电路设计

3.5指示灯电路设计

3.6键盘电路设计

3.7电源电路设计

4.系统软件设计

4.1 软件开发环境介绍

4.2 C语言介绍

4.3 软件总体设计

4.3.1系统主程序设计

4.3.2系统中断程序设计

4.3.3 键盘扫描程序

4.3.4 电机驱动程序设计

5.系统仿真及结果分析

5.1 硬件实物

5.2系统仿真环境介绍

5.3 系统仿真结果分析

5.4仿真遇到的问题

结束语

参考文献

致 谢

附录

系统电路图

程序代码清单


1.绪

在本章中主要介绍了课题研究的背景和意义,以及洗衣机控制系统的使用现状,结合一些实际中的问题,阐述了洗衣机控制系统设计的必要性,最后介绍了一下本设计的的要求和内容,以及在文档的结构安排。

1.1 课题研究背景及意义

洗衣服从古到今都是一个必不可少的家务劳动,从电视上的剧集上也可以看到,古代妇女都把衣服拿到河边用棍子敲打,用手搓等等。但是随着时间的推移,科技的发展,出现了用机械洗衣代替手工洗衣的操作。早在1858年,一个叫汉密尔顿·史密斯的美国人在匹茨堡制成了世界上第一台洗衣机。这个洗衣机整体设计比较简单,它的主件是一只圆桶,桶内装有一根带有桨状叶子的直轴。轴是通过摇动和它相连的曲柄转动的。但这台洗衣机使用起来比较费力,而且对衣物的损害也比较大,所以并没被广泛使用,但是给人们用机器代替手工洗衣服的想法起到一个至关重要的启示。时至今天,洗衣机已经发展到一个非常先进水平。

我们这一代人也可以深刻地体会到洗衣机的发展。在90年代初期,普通大众还是用着半自动的洗衣机,就是那种洗和甩干分开两个滚筒,那种要我们把洗涤好的衣服再人手拿到另外一个滚筒去甩干。在今天看来是比较落后的洗衣机,但是在当时也是十分先进的。再到了90年代后期出现了全自动洗衣机,全自动洗衣机是一个重大的跨越。它的操作十分方便,我们只要把衣服放进去,再按开始,过一段时间就能洗好并自动甩干。现在的洗衣机就更先进了,有了更多的功能,例如自动烘干、自动熨好等等更实用的功能。

本洗衣机控制系统正是在这一个背景下产生的,设计一套完善的洗衣机控制系统对于劳动力有着重要意义,一个好的控制系统,不仅能在保证洗干净衣服的前提下,还能够更好的保护衣服,节约时间。


1.2本文主要的研究内容

本设计采用STC89S52单片机作为控制芯片,使用L298控制芯片作为电机驱动,使用蜂鸣器来作为报警系统,使用LCD1602作为显示,使用LED来作为标示洗衣状态。系统在软件里面通过多个定时器协同工作,完成洗衣的漂洗过程:正转4秒,停止2秒,反转4秒,停止2秒。并且在系统的运行过程中,通过启动/停止按键来启动和暂停洗衣机,通过模式切换开关来切换洗衣机在标准洗涤,快速洗涤,脱水三个模式切换;通过按键来模拟洗衣机在脱水过程中翻盖报警急停功能。

对于整个系统而言,系统上电确认后,系统同默认进入到标准模式,当按照标准洗涤的12分钟后,洗衣机进行排水脱水,然后进入到漂洗过6分钟,在此过程中,标准洗涤指示灯,排水脱水指示灯分别不断闪烁来表示正在进行的过程,完成以后的漂洗和脱水便可以完成整个标准洗衣过程。对于快速洗涤过程跟标准洗涤过程一样;对于脱水模式,洗衣机进入到高速旋转模式,当有翻盖模拟按键按下时候,洗衣机急停并且报警。

主要的设计任务有:第一步是把可行的方案列举出来,并选择最为合适的方案,再选择控制芯片和电机驱动的方案,确定大致的设计方向;第二步是设计单片机控制控制系统硬件,能够实现控制电机、显示当前工作状态、时间、报警等等的功能;第三步是软件设计,设计人机交互界面,电机驱动程序,报警程序设计,模式选择程序设计,中断程序设计等等;最后的步骤是系统调试仿真,调试系统的硬件和软件,并且进行仿真,看设计是否成功。


2系统方案总体设计
2.1 全自动洗衣机指标要求

全自动洗衣机的指标要求如下:

首先,标准洗涤12分钟再漂洗6分钟,漂洗两次就脱水3分钟。

其次,快速洗涤7分钟再漂洗3分钟,漂洗两次,脱水。

最后:还可以实现启动和暂停按钮控制,第一次启动,标准洗涤;工作时按此按钮暂停,再按则恢复工作。洗涤、漂洗4秒正转,停2秒,反转4秒,停2秒,继续运行。为了安全,在脱水时,如果打开盖板(K3键模拟),脱水暂停。在洗涤时洗涤指示灯闪烁,漂洗时漂洗指示灯闪烁,脱水时脱水指示灯闪烁。

按键功能设想:K1键改变“标准、快速、排水”三种方式,执行相应程序,对应LED闪烁。默认标准模式。k2键改变控制洗衣机的“启动、暂停”功能。按下暂停,再按下恢复运行。K3键模拟打开盖板,在脱水时,如果打开盖板,脱水暂停。

根据设计所需要求,要完成一个比较完善的洗衣机控制器,必须要注意每一个细节,把系统调试到最为合适的工作状态。并且要有一定的可靠性,所以可靠性是在设计过程中应该优先考虑的一个因素,一个控制系统必须要能稳定、可靠地工作,才能投入到生产实践中去。如果系统的可靠性不能达到要求,那么系统出现故障的可能就会增大,有可能会造成很大的损失。


2.2 系统方案选择
2.2.1 控制器选择

本设计中拥有一个控制器,它主要控制驱动信号产生,以及信息的现实等功能,控制器拥有很多种,下面介绍一些控制器以及本设计采用的控制器。

方案一:选择STC89C52作为控制器。首先,STC89C52是51内核,是8位单片机,其指令是采用的被称为“CISC”的复杂指令集,共有111条指令,内部自然丰富,并且操作简单。[1]还有,它的供电电压是5V和其他的一些芯片具有相同的供电电压,其抗干扰能力强,端口容易操作,构建其最小控制系统简单。[2]

该方案的实用性和可靠性比较高,可以满足绝大多数控制,选择51单片机作为控制器,对于初学者可以很方便的构建一个最小控制系统,并且其的编程很简单,成本低,便于操作者实现控制目标。

方案二:选择MSP430作为控制器。MSP430是TI公司生产的一款低功耗控制芯片,其功耗低,供电电压3.3V,其可以工作在低功耗模式,可以减少系统的功耗,并且MSP430单片机是16位的单片机,采用了精简指令集(RISC)结构,只有简洁的27条指令,大量的指令则是模拟指令,众多的寄存器以及片内数据寄存器都可参加多种运算。[3]

该方案在低功耗和运算能力上具有很大的优势,然而其的可靠性不高,其抗干扰能力比较差,最重要的是其编写程序比较复杂,芯片成本比较高,编写程序复杂。

联系本设计的任务,对于控制器的要求不是很高,所以从设计成本以及可靠性和实施难度等方面考虑,本设计选择控制方案一作为控制方案选择。


2.2.2 电机驱动器选择

本设计要对洗衣机的电机进行控制,选择恰当的电机驱动方案有利于电机控制,在本设计中要求电机可以调速,电机可以改变方向,具体方案如下:

方案一:采用数字电位器加大电流稳压器构建调压电路,采用继电器构建电压方向改变电路。在本方案中,通过驱动数字电位器改变大电流稳压器的输出电压,从而实现电压调速,通过继电器切换电压方向来改变输出电压方向,从而改变电机转向,采用这一种办法来实现电机调速虽然方便智能,但是由于使用了大量价格昂贵的数字电位器等芯片,成本很高,并且调速范围不广。

方案二:采用专用电机调速控制器L298来进行电机控制。L298通过四个控制引脚来控制两个电机的运行速度以及运行电压方向,不过使用L298来对电机调速的时候,要运用PWM波形进行控制,这种控制方案不仅集成度高,便于控制,而且整个系统的成本相对较低。

联系本设计的任务,由于本设计还要求仿真,并且设计都对成本又要求,所以,在本设计选用方案二来对电机控制。


2.3 系统总体设计

    在本设计中,要求实现洗衣机的全自动控制,在整个控制系统中,要求对电机控制,报警控制,液晶显示以及键盘输入等功能,在本设计里面主要体现出对电机的智能控制,在软件里面实现,首先通过按键选择洗衣机的工作模式,选择完工作模式后,系统进入到相应的模式下运行,在运行的过程中也可以通过按键来启停电机,并且还可以用按键来模拟脱水翻盖报警功能。本设计的总体设计框图如下:

图2-1 全自动洗衣机控制系统框图

Fig.2-1 Block diagram of control system of automatic washing machine

  由图2-1可以知道,整个系统分为三大块:人机交互,状态显示,执行电路。在这个三个模块中,人机交互模块有液晶和键盘组成,在整个系统中,通过电机运行时间来判断当前电机运行状态,当洗衣机的洗涤时间到了后,系统自动运行到排水脱水状态,并且相应的指示灯闪烁,通过按键来设置洗衣机运行状态,并且在洗衣机运行过程中,通过启动/暂停按键来启动和暂停按洗衣机,当洗衣机洗衣结束的时候,电机停止,蜂鸣器报警。在脱水的时候,用按键来模拟翻盖,当有按键按下时,洗衣机停止脱水,并且报警,当再次按下的时候,系统进入到正常脱水模式。


3 系统硬件电路设计
3.1 电机驱动电路设计

3.1.1 L298介绍

平时我们在观察洗衣机工作时可以发现,在洗衣服的过程中,洗衣机的转动会先顺时针转一会,停一会,再逆时针转一会,通过这样的动作,就能够起到像手动揉衣服的作用。因为正转反转所以工作的电机转速不可过快,不然对电机的伤害会比较大。在脱水时,洗衣机只会需朝某一个方向快速旋转,利用离心力的方法把衣物甩干。 本设计系统的电机驱动采用的是电机驱动芯片L298,它的驱动电流达3A,可以满足系统工作的需求。而且L298的驱动方式比较简单, L298有两个电压输入,一个给电机的电压,一个是给芯片工作与控制逻辑的参考电压。L298相当于有四个驱动门,每个IN1,对应该一个OUT1,当IN1为高电平是,OUT1输出高电平,电压为VSS,也就是给这个芯片电机的供电电压,而且指的不是逻辑电压。[5]又见图2-1与L298的内部原理图3-1本设计每个两个驱动门做成一路控制电机的信号,这样可以使电机在四个象限运行,即正转,反转,停车,自由滑行。ENA与ENB的使能的控制,如果采用PWM对电机进行调速,可以在ENA与ENB中分别接入PWM信号,IN1与IN2,和IN3与IN4,分别可以控制电机的正反转与不转。为了方便一些接线的电机,本电路板设计输出的接线端子,输出端子分别为:OUT1,OUT2,OUT3,OUT4。同时为了方便接四线的步进电机,在接线端子上也设计了四位排针,输出信号与接线端子相同的顺序[7]。L298内部原理图如图3-1所示。

图3-1 L298内部原理图

Fig.3-1 L298 internal schematic diagram

3.1.2 电机驱动电路设计
本设计系统的电机驱动采用的是L298电机驱动芯片,因为用L298电机芯片在编写程序是只要两个指令就能够满足电机的正转、反转、停止等等的功能。编写比较简单,操作也更为容易。而如图3-2就是L298的管脚图。

图3-2  L298管脚图

Fig.3-2 L298 Pin diagram

     L298有两路电源分别为逻辑电源和动力电源,它的电路原理图如图3-3所示。它图中5V为逻辑电源,16V为动力电源。ENA与ENB直接接入5V逻辑电源也就是说两个电机时刻都工作在使能状态,控制电机的运行状态只有通过IN1与IN2,IN3与IN4两个接口。由于我们使用的电机是线圈式的,在从运行状态突然转换到停止状态和从顺时针状态突然转换到逆时针状态时会形成很大的反向电流,在电路中加入二极管的作用就是在产生反向电流的时候进行泄流,保护芯片的安全。各输入端串如二极管同样是起保护作用。[16]

图3-3  L298驱动原理图

Fig.3-3 Schematic of L298 driver



3.2 单片机控制单元设计3.2.1单片机介绍

    在微型计算机中,单片机微型计算机具有很重要的地位,并且得到广泛的应用。也就是我们常说的单片机。单片机在电子行业起着十分重要的作用。单片机也是我们学习的重点,可想而知,单片机在今天的电子计算机行业是多么的重要。又因为单片机被广泛应用在控制系统中,所以也常常称其为微控制器。单片机也被叫做微型电脑。一般情况,单片机就是集成电路芯片,不过其内部包含有计算机的功能部分:加法器,存储器以及与外设连接的I/O设备。因此,单片机加上基本工作电路以及对应的外设电路便可以构造我们想要的控制系统。

    STC89C52是拥有51内核单片机的典型产品,在单片机内部包含了中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线。如图3-4所示就是STC89C52单片机。中央处理器(CPU)是整个单片机的核心部件,是拥有8微数据处理能的处理器,能够处理8位组成的代码和数据,CPU起到一个大脑的作用,负责指挥和调度系统的各个单元协调工作。芯片内部有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。片上共有4组8位I/O口(P0、P1、P2或P3),用于对外部数据的传输。具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择。

图3-4 STC89C52管脚分布

Fig.3-4 STC89c52Pin diagram


而STC89C52各个引脚的作用与介绍:

  • VCC是供电电压;
  • GND是接地;
  • P0口是一个双向I/O口,每个引脚均可以吸收8TLL电流,当P1口的引脚在第一次被置为高电平的时候表示为高阻输入。P0能够可以与外部存储器相连接,并且充当高8位地址或者数据。使用FLASH编程的时候,它作为程序烧写口,也就是通过P1口可以把程序写进单片机中。
  • P2口是一个双向I/O口,并且内部漏极上拉,P2口 可以作为缓冲器接受,可以输出P0口一半的电流,当P2口被写1的时候,该管教被上拉到高电平,表示当前为输入状态。当作为输入时,其电平被外设拉低,将电流输出。这是由于内部被上拉的缘故。
  • P3口是一个双向I/O口,并且内部漏极上拉,P2口 可以作为缓冲器接受,可以输出P0口一半的电流,当P3口被写1的时候,该管教被上拉到高电平,表示当前为输入状态。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 P3口也可作为下载端口等一些特殊口。

总体来说,STC89C52是一款功能强大的单片机,它为许多控制系统提供了灵活,成本更低的解决方案。本次设计之所以采用STC89C51单片机主要是想应用STC89C52的外部中断和定时器中断等片上自带的外部资源,从而使设计更容易。


3.2.2 中断系统

中断是处理器处理外部突发事件的一个重要技术。它能使处理器在运行过程中对外部事件发出的中断请求及时地进行处理,处理完成后又立即返回断点,继续进行处理器原来的工作。触发中断的事件和原因可以被称为中断源。根据中断的的不同来源,可以把中断的种类分为软硬件中断,而硬件的中断又可以分为由外部事件和内部事件触发的中断两类。

外部中断一般是指由外部事件触发的,如:键盘,定时器,ADC等。外部中断是可以屏蔽的中断,也就是说,利用中断控制器可以屏蔽这些外部设备的中断请求。中断是各个设计系统中不可缺少的一个功能。

3.2.3定时器

在本设计中采用的是51定时器,通过在学校的学习和查阅相关的资料,可以知道51定时器操作较为简单。其工作原理为:单片机包含两个定时器,这两个定时器也叫计数器,它们都可以进行编程控制,它们工作在四种工作方式,通过写控制字和相关寄存器可以选择器工作在不同的工作方式。

具体的要求是:定时器0的控制寄存器TL0(低8位)和 TH0(高8位)构成,定时器1的控制寄存器TL1(低8位)和TH1(高8位)构成。通过改变相关寄存器的值可以使他们工作在不同的方式,TCON则用于定时器的启停,同时还兼顾溢出标志等功能。程序开始时需对这些寄存器进行初始化,然后才能控制这些寄存器。


3.2.4控制系统电路设计

    如图3-5所示为系统控制电路系统电路原理图。是通过C45,S1,R22组成而成的复位电路,由相关的资料可以知道51单片机为高电平复位,单片机上电时,电容C45和R22组成的RC电路中电容缓慢充电,使RST端保持一个几个微秒的高电平,使单片机上电复位,当电容C45充满电后RST脚电平通过下拉电阻将电平拉低为零,单片机开始进入运行状态,复位完成。当单片机在运行的过中,通过按下按键S1也可以形成一个高电平状态,单片机手动复位。

图3-5复位电路

Fig.3-5 Reset circuit

电路中为了计时方便计算,本设计的晶振选用12MHz无源外部晶振。配合两个起振电容C2,C3。形成晶体谐振电路为单片机提供一个12MHz的稳定的时钟源。为了方便起振,起振电容选用22pF。电路图如图3-6所示

图3-6 晶振电路

Fig.3-6 Crystal oscillator circuit

  单片机的原理图如图3-6所示,在本设计中使用51单片机,采用图3-4、图3-5、图3-6所示电路图与图3-7构成最小系统,。

     

图3-7 STC89C52单片机最小系统

Fig.3-7 STC89C52 Single chip microcomputer

3.3. 显示电路设计

在本设计中使用LCD1602来作为显示器,LCD1602能够同时显示16x02即32个字符,也就是2行16列。如图3-8所示。LCD1602采用的是5V供电,在一些基础的设计和实验室操作中都有比较多的应用。


图3-8 LCD1602液晶

Fig.3-8 LCD1602 Liquid crystal


在PROPEUS软件上的LCD1602电路图设计如图3-9所示:

图3-9 LCD1602电路设计

Fig.3-9 LCD1602 circuit design

3.4 报警电路设计

在本设计中,显然没有要求有报警电路,但是平时我们的洗衣机出于安全考虑都会加入报警电路,我们平时也应该有留意到当洗衣机完成洗衣的时候,洗衣机会提示洗衣完成,当脱水时翻开盖的时候,洗衣机也会报警警示用户小心,所以为了更加完善本设计的系统,使设计更有实用性。在设计中加入了蜂鸣报警器。具体的设计如图3-10所示,此电路中的蜂鸣器是有源蜂鸣器,在本设计中由于仿真的时候没有三极管可以达到蜂鸣器的驱动要求,所以在仿真处理的时候,直接使用单片机的引脚来驱动蜂鸣器,而在实际的电路中,并需通过一个三极管的电流放大作用才能驱动蜂鸣器,所以在实际电路中,为了减小单片机的负担,所以,采用PNP的三极管来驱动蜂鸣器。

图3-10 报警电路

Fig.3-10 The alarm circuit

如图3-10所示,蜂鸣器选用5V的,驱动蜂鸣器需要大约100mA的电流,也就是说驱动蜂鸣器的三极管的集电极电流为Ic=100mA。三极管选用直流放大系数为100的9014,根据Ic=βIb,可计算得三极管基极电流Ib=1mA,而Vbe=0.7V,又由于光耦中的光电三极管的集电极、发射极饱和压降Vces=0.3V,所以基极的限流电阻上的压降为(5-Vces-Vbe)=4V,4V/0.001A=4KΩ,由于没有标称值为4KΩ的电阻,所以选择4.7KΩ的。电路中的发光二极管用来表示当前设备处于运行状态。而电路中的电阻均用来限流,保护后级的三极管和发光二极管的正常工作。


3.5指示灯电路设计

本设计要求在不同的工作状态的时候要有不同的指示灯,所以在设计指示灯电路中,通过用三个LED发光二极管来表示系统当前的运行状态:分别为:脱水,漂洗,洗涤三个状态,根据当前电机运行的时长,不停的切换当前的电机运行状态,LED也不断的更替闪烁,其原理图3-11所示。

图3-11 洗衣机运行状态指示灯

Fig.3-11 Washing machine operation status indication lamp


3.6键盘电路设计

在这一个设计中使用的键盘电路是14键盘电路,键盘在电路中实现的功能是:模式选择、启动暂停、模拟洗衣机翻盖、确定按键等。在本设计中采用上拉电路的方式构建键盘电路,如图3-11示,采用的是1K电阻上拉,使按键按下时输出低电平,按键弹起时输出高电平,从而实现按键对应的功能。

图3-11键盘电路设计

Fig 3-11 keyboard circuit design

3.7电源电路设计
本设计中系统供电电源为5V,由于单片机都属对电源的纹波要求较高,并且LCD、蜂鸣器等等部件使用的都是5V供电,所以系统供电采用线性电源。系统电源电路如图3-12所示。

图3-12系统电源电路

Fig.3-12 The system power supply circuit

如图3-12示,所接电源为220V交流电。通过工频变压器将电压降压到9V后,整流滤波为直流电,然后再经过5V的三端稳压器将电压稳定为5V的直流电压输出为信号调理电路,单片机电路等整个系统供电。电路图的原理如下,220V交流电经过线性变压器T1变压后转换成一个峰值比较小的交流信号,通过整流桥后,交流小信号变换成一个脉动的直流信号,经过后级的电容C14和C11的滤波,信号变换成一个脉动很小的直流信号,通过5V的稳压器构成的稳压电路后,输出5V的直流电压,后级接两个电容用于稳压以及减少输出电压的的脉动。建立起这个一个系统供电电源后,便可以向运放、单片机、液晶、键盘等等供应电源,使他们能够正常的工作。
1



4.系统软件设计4.1 软件开发环境介绍

在这一次的设计中,在软件部分使用uVision4软件进行程序的编写,uVision4使用起来比较简单,操作也相对较为方便,比起老式的c语言编程软件更有效率。该软件集成了业内最领先的技术。Keil software的8051开发工具提供以下程序,可以用它们来编译C程序代码,汇编源程序,连接和重定位目标文件和库文件,创建HEX文件以及调试目标程序。

4.2 C语言介绍

在这个系统设计中,利用的是c语言编写程序。c语言在电子工程,计算机工程等等方面是至关重要的。C语言是人与计算机之间进行交互的、面向过程的一门高级设计语言。它的层次清晰,便于初学者组织程序,易于调试和维护,语言简洁,使用方便灵活。c语言还可以直接访问内存地址,能进行位操作等等的特点。由于c语言可以对硬件进行编程操作,因此,它既有高级语言的功能,同时也有低级语言的优势。不仅可用于系统软件的开发,同时也适用于应用软件的开发。所以本次设计采用的是c语言编程。


4.3 软件总体设计

本设计的软件设计主要包括主程序,液晶显示,键盘扫描,中断程序,电机控制程序等五个模块的程序。其中主程序主要完成的是开机界面的显示,以及各个模块的初始化,并且中断程序的初始化。

在KEIL工程中编程时,为了让程序的可读性变强,我们一般讲各个模块化程序都建立一个C文件来写相关的驱动子程序,然后给每一个子程序的C文件配备一个H文件,用来生命C文件里面所定义的驱动函数,并且两个文件的名字要一样。当要将某一个C文件的函数调用到别的C文件中的时候,那么就要在要调用其他C文件里的C文件的里面加上调用对应C文件的H文件,用来声明,例如#include <*.h>。


4.3.1系统主程序设计

系统的主程序主要的任务是要完成各个模块的初始化,对于本设计的模块包括有液晶显示程序的初始化、延时程序的初始化、键盘扫描程序的初始化、电机启动程序的初始化等等。并且定义各种变量。起到本设计的程序基础的作用。可以实现标准模式、快速模式、脱水模式、并有启动暂停功能、翻盖模拟功能等等。可以调用各个子程序。主程序的具体实现的功能可以看到附录中的程序代码。要其程序流程图如图4-1所示。

图4-1 主程序流程图

Fig.4-1 The main program flow chart


    主程序中的具体程序实现的几个主要的功能:

这一段程序是定义显示器的初始值,具体如下:如果模式选择完毕,再按确定按键,程序就会跳到对应的模式的程序运行。delay_10ms(10); 再定义LCD显示,LCD_write_com(0X0C);  LCD_clear(); key_flag=key_scan();                LCD_write_str(4,0,"00:  :  ");             if(c==0)LCD_write_str(1,1,"Standard mode");                if(c==5)LCD_write_str(3,1,"fast mode");  if(c==10)LCD_write_str(1,1,"Dehydrate mode");             while(1) }。 如图4-2所示,为LCD液晶显示的初始化操作。

图4-2 LCD初始化流程框图

Fig 4-2 LCD initialization flow chart

下面这一段分别表示的是启动暂停功能,在运行时只要按下了暂停按键,电机就会暂停运行。

{key_flag=key_scan();  if(key_flag==UP){delay_ms(20); while(key_flag!=UP) key_flag = key_scan();temp1=~temp1;temp=!temp;buzzer_flag=temp;if(temp1==1){if(key_flag==DOWN) {delay_ms(20); while(key_flag!=DOWN) key_flag =key_scan(); buzzer_flag=!buzzer_flag; temp=0;} }

              这个表示的是在脱水时,如果翻盖电机就暂停运行的程序,如图4-3翻盖模拟流程图所示,if(buzzer_flag==1){{motor_stop();buzzer=!buzzer;delay_10ms(10);}}if(temp1==1){if(temp2==0)motor_stop();}}


图4-3 翻盖模拟流程框图

Fig 4-3 analogue flow diagram

              下面的表示的是选择了对应模式的对应的程序,分别有标准洗涤、快速洗涤、脱水等。当按键选择了case 0标准洗涤就会执行这一段程序,并且设计在洗涤,漂洗,脱水下对应的led等会闪烁,还有设计了时间的间隔,就是每个过程用的时间等等。case5与case10同理就是当按键选择了快速模式与脱水模式的运行。

  如图4-4所示,当c值为0、5、10的时候分别表示的是在标准模式下的工作,在快速模式下的工作,在脱水模式系的工作等。

图4-4 洗衣机模式框图

Fig 4-4 washing machine model diagram

    每一个模式下都有不同的工作时间与对应的led等的显示,用当c=0的标准模式下的程序为例子,标准洗涤12分钟再漂洗6分钟,漂洗两次就脱水3分钟。程序如下switch (c){case 0: {                                                                                          

                                                                                          if(time_minite<12) {temp2=0;TR0=1;led3=0;led1=!led1; delay_10ms(10);}

                                                                                           if((time_minite>=12)&&(time_minite<15)) {temp1=1;temp2=1;if(buzzer_flag==0)motor_full();led1=0;led3=!led3;delay_10ms(10);}

                                                                                                                if((time_minite==15)&&(time_second<8)) {temp1=0;temp2=0;}

                                                                                                     if((time_minite>=15)&&(time_minite<21)) {led3=0;led1=0;led2=!led2; delay_10ms(10);}

                                                                                                                if((time_minite>=21)&&(time_minite<24)) {temp1=1;temp2=1;if(buzzer_flag==0)motor_full();led2=0;led3=!led3;delay_10ms(10);}

                                                                                                                if((time_minite==24)&&(time_second<8)) {temp1=0;temp2=0;}

                                                                                                                if((time_minite>=24)&&(time_minite<30)) {led3=0;led1=0;led2=!led2; delay_10ms(10);}

                                                                                                                if((time_minite>=30)&&(time_minite<33)) {temp1=1;temp2=1;if(buzzer_flag==0)motor_full();led2=0;led3=!led3;delay_10ms(10);}

                                                                                                     if((time_minite>=33)) {TR0=0;motor_stop();buzzer=!buzzer;delay_10ms(10);}  break; }

4.3.2系统中断程序设计

系统要实时的产生占空比可调的PWM,并且做出判断做出动作,为了满足实时性和可靠性,增加程序的可读性,在程序中使用定时器中断来来产生PWM,并且使用另外一个定时器来进行计时,按键判断等操作。

为了方便运算,本设计中定时器工作于方式1,采用16位定时的方式。计数最大值为65535。定时器初值计算方法为:由于选用的16位定时法。当系统开启中断的时候,计数器每次溢出的时候,系统进入到中断,别且做出相应的操作,系统每隔50ms进入一次中断,进行倒计时,并且进行按键扫描,PWM产生,则计数器的设置如下:

TH0 = (65536-100)/256

TL0 = (65536-100)%256

TH1 = (65536-50000)/256

TL1 = (65536-50000)%256

每当系统运行到要进行下一个运行时系统开启中断,系统进入到系统中断中,并且对系统进行相应的操作。中断程序的流程图如图4-5,4-6所示。

图4-5中断服务0子程序流程图

Fig 4-5 0 Interrupt service subroutine flow chart

图4-6 中断服务1子程序流程图

Fig 4-6 1 Interrupt service subroutine flow chart

4.3.3 键盘扫描程序

对于键盘来说,分为编码键盘和非编码键盘,单片机一般使用的事编码键盘,对于系统来说键盘的扫描程序一般分为以下几步:扫描,延时消抖,赋予功能,检测松开四个步骤。他的驱动程序流程图如图4-7所示。

本系统采用的是4×1的键盘,具体的按键流程如下图所示。

图4-7 键盘扫描程序流程图

Fig 4-7 keyboard scanning program flow chart

由图4-7可知在扫描按键程序是的流程,具体的程序如下:开始定义键盘扫描程序unsigned char key_scan(void),按键扫描函数,返回扫描的键值。{ unsigned char key_value = 0;   P2 = 0X1F;  key_value = (P2&0X0f);  key_value = key_value^0X0f; 如果有按键按下,求异或    if(key_value  {  delay_10ms(10); 延时去抖 key_value = (P2&0X0f);    延时之后再求异或  key_value = key_value^0X0f;  if(key_value)  { return  key_value;  返回键值} }else   return              0;}  通过这一段程序就能够实现对键盘的扫描。


4.3.4 电机驱动程序设计

电机驱动程序是用专用驱动芯片L298来驱动,当给出控制L298的驱动信号不一样的时候,电机正转或者反转,当给定控制L298的驱动信号同时为零的时候点击停止。同时外加电机使能引脚,当使能引脚为0的时候,电机停止运行。控制策略如公式(1)所示。控制组合方式如表4-1所示。   

                                                              (1)

表4-1 电机运行状态与控制信号关系表

Tab 4-1 motor running state and control signal relationship table

P2^3

P2^4

电机运行状态

0

0

停止

1

0

正转

0

1

反转

1

1

勿用


因为本个设计使用的是L298作为启动芯片,使用电机只要用两个信号就可以开始电机的正转、反转、停止、电机全速转动等等各个不同的运行。对于电机的占空比pwm都是有不同的数据设计的,因为对应于不同的电机运行模式,下面就对电机的程序代码分别实现的功能描述一下,motor_forward  (void) if(c==0)  PWM_VALUE=70;  else PWM_VALUE=90;  motor1=0;表示的是电机在正转的是时候的转速;通过void motor_back (void)  { if(c==0) PWM_VALUE=30; else PWM_VALUE=10;  motor1=1; } 表示的是电机在反转的时候的转速;通过void motor_stop(void){  PWM_VALUE=0;  motor0=0;  motor1=0; }让电机停止运行、通过void motor_full(void) {  PWM_VALUE=100;  motor1=0;  }让电机全速运行。这样就能够满足在本次设计中对电机运行的各个要求。

如图4-8所示,当电机在标准模式、快速模式时,通过对变量b的控制,就可以实现电机正转4s,停2s,反转4s的功能要求。

图4-8电机运行程序框图

                     Figure 4-8 motor running program diagram

1



5.系统仿真及结果分析5.1 硬件实物

在经过前面的软件设计和硬件设计后,就可以用protel软件绘制原理图和PCB ,再根据画好的pcb图焊接电路板,如图5-1所示实物图就是本设计的实物图。在实物图中包含单片机最小系统,人机交互电路,电机驱动电路,状态显示电路。

图5-1 实物图

Fig 5-1 Material object


5.2系统仿真环境介绍

本设计的仿真软件用的是PROTEUS,从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。因为在校期间,同Proteus的学习比较全面,而且软件操作起来也比较简单,所以在设计时就采用了这一个软件作为本系统的仿真软件。


5.3 系统仿真结果分析

通过完整的硬件设计和软件设计后,可以通过Proteus软件来连接仿真全自动洗衣机控制系统,具体的连接线路可见附录中的全自动洗衣机控制系统原理图。在整个系统中都能够通过液晶显示当前运行状态,和通过键盘来设置当前运行的状态,如图5-2,5-3,5-4,5-5,5-6所示。

      

图5-2 开始界面                              图5-3 模式选择界面

Fig 5-2 interface                         Fig 5-3 mode selection interface

      

图5-4 标准模式界面                         图5-5 快速模式界面

     Fig 5-4 standard interface                       Fig 5-5 fast interface

图5-6 脱水模式界面

        Fig 5-6 dehdydrate interface

通过仿真可以得出,当通过图5-1到图5-6所示的设定方法设置洗衣机工作在不同的运行状态,并且系统的工作状态也受到时间的设定,当时间满足要求后,洗衣机自动进入到下一个状态来运行。就是说分别在标准模式、快速模式、脱水模式下都能够按要求完成。



5.4仿真遇到的问题

在整个系统的仿真过程中遇到了各种问题,但是经过自己的努力,利用各种方法也克服了这些困难。

首先,在仿真的时候,出现驱动LCD1602的问题,由于在PROTUSE里面是理想模型,而理想模型对于时间特别敏感,在实物上调试好的程序,在仿真里面,LCD1602总是闪烁,显示不稳定,最后通过协调实物上控制时间和仿真里面的控制时间,最后实物和仿真都可以比较好的显示。

其次:在使用PROTUSE仿真软件的时候,在构建基于L298的电机驱动电路的时候,在给这一款专用电机驱动芯片配置地的时候是直接将地的符号拉倒对应的引脚,没有通过导线连接,从而在正确的功能下,电机不能够运行。通过我一天的努力,从排查程序错误到怀疑L298使用方法错误等过程,终于在重新构建仿真电路的时候发现了这一问题,从而顺利解决了问题,自己也学习到了找问题,解决问题的方法。

最后:在整体仿真的时候,由于中断时间时50mS一次,但是我放在中断里面的程序运行时间远远大于中断时间,所以程序运行的不正常,但有的时候也运行正常,通过自己查阅相关的资料,当我进入中断的时候我屏蔽了中断,从而保证整个中断程序的执行,并且将部分程序拿到中断程序以外执行,从而顺利解决了这一问题。

总之,在整个仿真的过程中,我遇到了各种各样的问题,但是通过自己的努力,我克服了各种问题和困难,顺利完成了系统的仿真。


1




结束语

这一次设计使我收获了很多,特别是之前没有接触到太多硬件方面的知识,然而在这一次设计中通过查询一些资料和寻求老师,同学的帮助,使我初步的了解了这次设计的一些知识,也使我认识到了自己的不足。在大学期间都比较偏重理论的学习,而没有太多注重实践操作,所以在设计的过程中总是会遇到各种问题。但是最终在自己的努力下,还是顺利的完成了这一次的设计。

通过这一次设计,我觉得我能够把理论知识与实践相结合。设计都是一个人一个项目,通过自己的独立思考和分析,解决设计中的各种难题,很好的锻炼了自己独立解决问题和分析问题的能力。在做设计的时候,都是几个人一组,遇到问题都是大家一起解决的,或者是自己仅仅只是做了自己会的那一部分,这样使自己的知识体系很不完整,不能够全面地解决问题。而这一次的设计,从方案的选择,元器件的选择到驱动程序的设计,原理图的绘制都是自己独立完成的,感觉对自己的设计的整个过程有很深的了解。

虽然这一次的设计是完成了,但是通过自己的分析,深刻的认识到,全自动洗衣机的设计还可以实现更多的功能,例如我在设计中加入了蜂鸣报警器,为这一个系统提供了提醒的功能。还可以有其他方面的改进,又例如在电机驱动上,可以改用其它的电机控制器件来控制电机,使其可以实现电机调速等等的功能。虽然本次设计中基本完成了任务,但是如果用在实际应用中,还是有一定的问题的,在下一步的设计中,可以针对这些问题进行修改,使系统更加智能化。使其可以更接近生活上要求的智能洗衣机的功能。

总而言之:设计在很大程度上提高了我的分析和解决问题的能力,为我以后的就业打下了十分坚实的基础。







经过近半年的学习和一直以来的努力,设计即将进入尾声。在本次设计中我有因为失败而感到沮丧过,有因为成功而喜悦过,但是我还是十分享受这一次设计。在这次设计中我得到了老师、同学、家人等等的支持与帮助。我首先要衷心感谢我的指导老师,老师在本次设计中作为我的指导老师,她渊博的学识、严谨细致的治学作风,实事求是的处世态度深深地影响着我,并将使我终生受益。在我整个设计过程中,老师为我提供了设计思路,传授我设计相关的专业知识。正是老师的悉心指导和热心教诲才使我能顺利完成此次设计。这些都在本次设计中为我带来了很大的帮助。

在本次设计的过程中,还得到同学们的帮助。他们一直都帮我答疑解难。为我提供丰富的学习资料,给我的设计提供了很多参考和宝贵的意见。正是有了他们的无私帮助我才能一步步的克服设计中遇到的种种技术难题。

另外感谢我的父母,你们一直都默默的在我身后支持我,对我关怀备至。正是你们的关心和支持让我顺利完成学业。感谢全体同学。在这即将毕业的日子,与你们相处的每一天都是那样的珍惜。

最后感谢和评阅的各位老师。感谢你们对我的设计进行评审,感谢你们对我大学学习的检测。让我更好地完成大学的学习生活。


附录系统电路图

程序代码清单
  1. #include <REG52.H>
  2. #include "lm1602.h"
  3. #include "delay.h"
  4. #include <key_scan.h>
  5. #include <intrins.h>
  6. #include <math.h>
  7. #include "motor.h"               //这一部分是调用各部分的程序,例如lm1602是液晶程序,delay是延时程序,key-scan是键盘程序等等。

  8. sbit buzzer=P2^4;
  9. sbit led1=P1^0;
  10. sbit led2=P1^1;
  11. sbit led3=P1^2;            //这部分是定义外设,对应的就是三个led灯
  12. unsigned char buzzer_flag=0;  (这里是蜂鸣器标志位)
  13. unsigned char PWM_count=0;  
  14. extern unsigned char PWM_VALUE;( PWM是占空比,而且是从电机的子程序引用过来的)
  15. unsigned char value=0;
  16. unsigned char a=0,b=0,c=0;
  17. unsigned char time_count=0;
  18. unsigned char time_second=0;time_minite=0;
  19. unsigned char key_flag=0;
  20. unsigned char temp1=0,temp2=0;   //这部分是定义变量

  21. 程序设计两个定时器,下面的是定时器一的程序
  22. void InitialTime1 (void)
  23. {
  24.   TMOD |= 0x11;//16计数器
  25.   TH1=(65535-100)/256;
  26.   TL1=(65535-100)%256;  
  27.               TH0=(65535-50000)/256;
  28.   TL0=(65535-50000)%256;
  29.             
  30. }
  31. void InitialIt (void)
  32. {              
  33.                 ET1=1;
  34.                 TR1=1;
  35.                             ET0=1;
  36. //                             TR0=1;
  37.                 EA=1;
  38. }     //定时器的初始化及其定义


  39. 下面的是主程序
  40. main()
  41. {
  42.               InitialTime1();
  43.               InitialIt();
  44.   LCD_init();     //主程序初始化
  45.               motor_stop();
  46.               led1=0;
  47.               led2=0;
  48.               led3=0;
  49.               LCD_write_str(4,0,"welcome");
  50.               LCD_clear();
  51.               LCD_write_str(0,0,"Ok->Set System");
  52.               LCD_write_str(0,1,"Back->Run System");
  53.               while(1)
  54.               {
  55.                             key_flag=key_scan();
  56.                             if(key_flag==OK)
  57.                             {  
  58.      while(key_flag==OK)key_flag=key_scan();
  59.                                                         LCD_clear();
  60.                                                         LCD_write_str(4,0,"00:  :  ");
  61.                                                         LCD_write_str(0,1,"1sta 2fas 3def");            
  62.                                                         delay_10ms(10);
  63.                                                         Cursor_GotoXY(0,1);
  64.                                                         delay_10ms(10);
  65.                                                         LCD_write_com(0X0F);
  66.                                              key_flag=key_scan();     这一部分是LCD显示器的显示,就是各种模式的选择
  67.                                          
  68.                                           while(key_flag!=OK)
  69.                                           {                           
  70.         key_flag=key_scan();
  71.                                                         if(key_flag==BACK) {while(key_flag!=BACK) key_flag = key_scan();c=c+5;if(c>10)c=0;}  //定义按键1,就是设计实物中最左边的按键,通过这一个按键可以选择不同的模式,分别有标准洗涤、快速洗涤、脱水模式等。
  72.                                                         delay_10ms(10);
  73.                                                         Cursor_GotoXY(c,1);            
  74.                                           }  //如果模式选择完毕,再按确定按键,程序就会跳到对应的模式的程序运行
  75.                                                         delay_10ms(10);
  76.                                                         LCD_write_com(0X0C);
  77.                                           LCD_clear();
  78.                                           key_flag=key_scan();            
  79.                                           LCD_write_str(4,0,"00:  :  ");            
  80.                                           if(c==0)LCD_write_str(1,1,"Standard mode");            
  81.                                           if(c==5)LCD_write_str(3,1,"fast mode");
  82.                                           if(c==10)LCD_write_str(1,1,"Dehydrate mode");                                         
  83.                                          
  84.                                           while(1)
  85.                                           {            
  86. 下面这一段分别表示的是启动暂停同翻盖模拟的功能,在运行时只要按下了暂停按键,电机就会暂停运行。而在脱水模式下,模拟翻盖脱水就会暂停等等。            
  87.         key_flag=key_scan();
  88.               if(key_flag==UP){delay_ms(20);while(key_flag!=UP) key_flag = key_scan();temp1=~temp1;temp=!temp;buzzer_flag=temp;}
  89.               if(temp1==1){              if(key_flag==DOWN) {delay_ms(20);while(key_flag!=DOWN) key_flag = key_scan();buzzer_flag=!buzzer_flag;temp=0;} }                                                                     
  90.                                                         下面的表示的是选择了对应模式的对应的程序,分别有标准洗涤、快速洗涤、脱水等。
  91. switch (c)
  92.                                                         {
  93.                                                                       case 0: {                                                                                          
  94.                                                                                            if(time_minite<12) {temp2=0;TR0=1;led3=0;led1=!led1; delay_10ms(10);}
  95.                                                                                            if((time_minite>=12)&&(time_minite<15)) {temp1=1;temp2=1;if(buzzer_flag==0)motor_full();led1=0;led3=!led3;delay_10ms(10);}
  96.                                                                                                                 if((time_minite==15)&&(time_second<8)) {temp1=0;temp2=0;}
  97.                                                                                                      if((time_minite>=15)&&(time_minite<21)) {led3=0;led1=0;led2=!led2; delay_10ms(10);}
  98.                                                                                                                 if((time_minite>=21)&&(time_minite<24)) {temp1=1;temp2=1;if(buzzer_flag==0)motor_full();led2=0;led3=!led3;delay_10ms(10);}
  99.                                                                                                                 if((time_minite==24)&&(time_second<8)) {temp1=0;temp2=0;}
  100.                                                                                                                 if((time_minite>=24)&&(time_minite<30)) {led3=0;led1=0;led2=!led2; delay_10ms(10);}
  101.                                                                                                                 if((time_minite>=30)&&(time_minite<33)) {temp1=1;temp2=1;if(buzzer_flag==0)motor_full();led2=0;led3=!led3;delay_10ms(10);}
  102.                                                                                                      if((time_minite>=33)) {TR0=0;motor_stop();buzzer=!buzzer;delay_10ms(10);}
  103.                                                                                                                                             break;
  104.                                                                               }              //case 0 是当按键选择了标准洗涤就会执行这一段程序,并且设计在洗涤,漂洗,脱水下对应的led等会闪烁,还有设计了时间的间隔,就是每个过程用的时间等等。
  105.                                                                      
  106.          case 5: {
  107.                    if(time_minite<7) {temp2=0;TR0=1;led3=0;led1=!led1; delay_10ms(10);}
  108.                                                                                       if((time_minite>=7)&&(time_minite<10)) {temp1=1;temp2=1;if((buzzer_flag==0)&&(temp==0))motor_full();led1=0;led3=!led3;delay_10ms(10);}
  109.                                                                                       if((time_minite==10)&&(time_second<8)) {temp1=0;temp2=0;}
  110.                                                                                       if((time_minite>=10)&&(time_minite<13)) {led3=0;led1=0;led2=!led2; delay_10ms(10);}
  111.                                                                                     if((time_minite>=13)&&(time_minite<16)) {temp1=1;temp2=1;if((buzzer_flag==0)&&(temp==0))motor_full();led2=0;led3=!led3;delay_10ms(10);}
  112.                                                                                     if((time_minite==16)&&(time_second<8)) {temp1=0;temp2=0;}
  113.                                                                                     if((time_minite>=16)&&(time_minite<19)) {led3=0;led1=0;led2=!led2; delay_10ms(10);}
  114.                                                                                     if((time_minite>=19)&&(time_minite<22)) {temp1=1;temp2=1;if((buzzer_flag==0)&&(temp==0))motor_full();led2=0;led3=!led3;delay_10ms(10);}
  115.                                                                                     if(time_minite>=22) {TR0=0;motor_stop();buzzer=!buzzer;delay_10ms(10);}
  116.                                                                                                                                             break;                                                                     
  117.                     break;
  118.                                                                              }    //当选择了快速模式,程序就会执行这一部分的程序

  119.          case 10: {
  120.                                                                               temp1=1;
  121.                                                                               if(time_minite<3)
  122.                                                                                                                               {
  123.                                                                                                                               led3=!led3;  //对应的led灯闪烁
  124.                                                                                             delay_10ms(10);
  125.                                                                                                                                             TR0=1; //这个是定时器
  126.                                                                                        temp1=1;
  127.                                                                                                                                             temp2=1;
  128.                                                                                                                                             if((buzzer_flag==0)&&(temp==0))
  129.                                                                                    motor_full();
  130.                                                                                                                                             else motor_stop();
  131.                                                                                                                                           
  132.                                                                                                                               }
  133.                                                                                                                               else {motor_stop();TR0=0;}
  134.                    break;
  135.                                                                              }                            //这一段是脱水模式的程序                                                                                   
  136.         }                                                      
  137.       if(buzzer_flag==1) {{motor_stop();buzzer=!buzzer;delay_10ms(10);}}
  138.                                           if(temp1==1){if(temp2==0)motor_stop();}
  139.                                           }
  140.      }
  141.    }
  142.             
  143.   }
  144. void time0() interrupt 1   //定时器0
  145. {
  146.               TH0=(65535-50000)/256;
  147.   TL0=(65535-50000)%256; //这里表示的是50毫秒进行中断
  148.     a++;
  149.               if(a==20)
  150.               {
  151.                             a=0;
  152.                             if(temp1==0)  //这里temp1为0是表示的是在标准模式下和快速模式下的功能
  153.                             {
  154.                                           b++;
  155.                                           if(b<4)motor_forward();      
  156.                                           if(b==4) motor_stop();
  157.                                           if(b==6) motor_back();
  158.                                           if(b==10) motor_stop();
  159.                                           if(b==12)  b=0; }   //这一部分表示的是在标准模式和在快速模式下的洗涤、漂洗时,电机正转4s,停2s,再反转4s的一个程序
  160.                             else{if(temp2==0)motor_stop();}  //如果temp1不满足上面的要求就会执行这段程序,程序就会判断temp2是否为0,如果是的就表示按了stop按键,模拟的就是在脱水模式下洗衣机翻盖的操作,电机就会停止。
  161.                               time_count++;
  162.                             if(time_count==60)
  163.                             {            
  164.                                             time_count=0;
  165.                                                         time_second=0;
  166.                                                         time_minite++;
  167.                                                         LCD_clear();
  168.                                           LCD_write_str(4,0,"00:  :  ");            
  169.                                                         if(c==0)LCD_write_str(1,1,"Standard mode");            
  170.                                                         if(c==5)LCD_write_str(3,1,"fast mode");
  171.                                                         if(c==10)LCD_write_str(1,1,"Dehydrate mode");            
  172.      }
  173.                             else time_second=time_count;
  174.    }   //这一段是时间的计数和对应的显示
  175.               key_flag=key_scan();
  176.               if(key_flag==UP) temp1=!temp1;
  177.               if(temp1==1){              if(key_flag==DOWN) {buzzer_flag=!buzzer_flag;} }
  178.                                                         DIS_UINT(7,0,time_minite);
  179.                                             DIS_UINT(10,0,time_second);            
  180.             
  181. }

  182. void time1() interrupt 3    //定时器1
  183. {
  184.     TH1=(65535-100)/256;
  185.     TL1=(65535-100)%256;   //这里指的是占空比,定时每100微秒就执行中断
  186.     PWM_count++;
  187.     if(PWM_count==100) PWM_count=0;   //pwm的占空比为1k
  188.                  if(PWM_count>PWM_VALUE) motor0=0;  //可以把pwm的占空比分为0到100的占空比
  189.                   else motor0=1;

  190. //               key_flag=key_scan();
  191. //               if(key_flag==UP) temp1=!temp1;  //表示的是启动停止的标志位。当按键按下,就会暂停运行,再按就会继续运行。
  192. //               if(temp1==1){              if(key_flag==DOWN) {buzzer_flag=1;} }
  193.             
  194. }


  195. 电机的程序
  196. 因为使用的是l298启动,所以电机只要用两个信号就可以控制电机的正反转
  197. #include "motor.h"
  198. #include "delay.h"
  199. extern unsigned char c;
  200. unsigned char PWM_VALUE=0;

  201. void motor_forward(void)
  202. {
  203.               if(c==0)
  204.               PWM_VALUE=70;
  205.               else
  206.               PWM_VALUE=90;
  207.               motor1=0;
  208. }     //这里表示的是正转

  209. void motor_back(void)
  210. {
  211.               if(c==0)
  212.               PWM_VALUE=30;
  213.               else
  214.               PWM_VALUE=10;
  215.               motor1=1;
  216. }    //这里表示的是反转
  217. 正转反转的占空比都有设定。

  218. void motor_stop(void)
  219. {
  220.               PWM_VALUE=0;
  221. ……………………

  222. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

以上的Word格式文档51黑下载地址:
word文档.docx (968.97 KB, 下载次数: 239)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:595237 发表于 2020-3-4 11:37 | 只看该作者
一个致命的错误?
洗衣机难道不用进水控制吗?
回复

使用道具 举报

板凳
ID:595237 发表于 2020-3-4 11:38 | 只看该作者
洗衣机难道不用进水控制吗?是不是致命的错误?
回复

使用道具 举报

地板
ID:729509 发表于 2020-4-15 09:47 | 只看该作者
感觉很详细
回复

使用道具 举报

5#
ID:355096 发表于 2020-4-15 21:22 | 只看该作者
juncedz 发表于 2020-3-4 11:38
洗衣机难道不用进水控制吗?是不是致命的错误?

应该是手动控制进水吧
回复

使用道具 举报

6#
ID:729509 发表于 2020-4-20 16:22 | 只看该作者
很棒的设计
回复

使用道具 举报

7#
ID:737195 发表于 2020-4-27 16:52 | 只看该作者
谁能根据楼主提供的word来画一个仿真图学习一下吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表