找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3456|回复: 2
上一主题 下一主题
收起左侧

51单片机全自动洗衣机设计论文与程序源码

[复制链接]
跳转到指定楼层
楼主
ID:370338 发表于 2018-7-12 17:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
摘要
在本文中我们详细介绍如何使用单片机开发板模拟全自动洗衣机的工作流程,首先简单的了解一下全自动洗衣机的发展及工作原理,然后开始洗衣机的模拟设计。从单片机的工作原理入手,先分析全自动洗衣机的功能需求,然后一步步将其实现,例如多种洗衣模式、水位模式、报警功能等等。其中我们还详细了洗衣机必有的水位传感器以及电动机的驱动芯片它们的工作原理,在文章的最后总结了此次设计所遇到的一些问题。

目录

1绪论 2
11 全自动洗衣机的发展现状 2
12 全自动洗衣机设计功能介绍 3
2系统硬件设计 4
21 单片机控制电路及工作原理 4
22 洗衣机电机驱动电路及工作原理 4
23 水位检测电路及工作原理 7
24 显示电路及工作原理 9
25 键盘电路及工作原理 10
       26 报警控制电路及工作原理11
3系统软件的设计 12
       31 主程序设计说明与流程图………………12
       32 洗衣程序功能设计与流程图12
       33 键盘程序设计说明与流程图14
       34 显示器程序设计说明与流程图15
       35 报警功能设计与流程图………15
4系统调试 16
41硬件调试说明 16
42软件调试说明 16
5总结与体会 17
   6、程序代码18


1、绪论
1.1全自动洗衣机的发展现状
洗衣机,这个被誉为历史上100个最伟大的发明之一,如今已经度过了它的第158个年头。随着科技的迅猛发展和智能时代的来临,传统洗衣机大多已经徘徊在被淘汰的边缘,利用高科技和人工智能系统制造而成的洗衣机受到了越来越多人的追捧。
随着电动洗衣机的问世,人们对于洗衣机的要求越来越高,促成了洗衣机的新一轮变革。于是,搅拌式洗衣机应运而生。这种洗衣机主要在筒中心装上一个立轴,立轴下端装有搅拌翼,通过电动机带动立轴进行周期性的正反摆动使衣物和水流不断翻滚、相互摩擦来达到清洁衣物的目的。10年后,美国本德克斯航空公司成功研制了第一台前装式滚筒洗衣机,使得洗涤、漂洗、脱水在同一个滚筒内完成,标志着电动洗衣机朝着自动化方向迈出了一大步。1937年,第一台自动洗衣机问世。这种洗衣机靠一根水平的轴带动起整个缸,衣服在注满水的缸内不停地上下翻滚以达到净衣的目的。
随着工业化的加速,世界各国加快了研制洗衣机的步伐。英国制造出了一种喷流式洗衣机,依靠筒内一侧的运转波轮产生的强烈涡流使衣物和洗涤液在筒内不断翻滚来清洗衣物。在引进英国喷流式洗衣机的前提上,日本制造出了独具风格,一直流行至今的波轮式洗衣机。随后几十年里,双桶洗衣机、波轮式套桶全自动洗衣机等纷纷面世。
随着科技的日新月异和智能时代的到来,人们对于洗衣机的要求越来越高,洗衣机不仅仅是单纯解放人类双手的家用电器了。
未来的洗衣机将会朝着更人性化和智能化的方向发展,洗衣机及家电行业的消费升级将会不断迭代。
如今人们越来越注重低碳环保的健康生活,消费者在选购洗衣机时越来越注重其除菌、净化、耗电等方面的性能。
为了满足市场的变革需要和人们的需求,未来的洗衣机可能会在净化率、噪音度、耗电量等多方面进行变革,并且将会朝着越来越轻巧简便、智能多元的渠道发展。

1.2全自动洗衣机设计功能介绍
全自动洗衣机就是将洗衣的全过程(泡浸-洗涤-漂洗-脱水)预先设定好N个程序,洗衣时选择其中一个程序,打开水龙头和启动洗衣机开关后洗衣的全过程就会自动完成,洗衣完成时由蜂鸣器发出响声。
全自动洗衣机的主要功能为:让人可以根据自身的需求通过几个简单的按键设定洗衣机洗衣服的水位、强度、以及洗衣模式,在设置完后按下启动按钮便开始自动洗衣服,为了解决不小心按错导致设置错误的情况应当还要有暂停以及重新设置各个参数的功能,开始后还应该有倒计时以显示距离洗衣完成的剩余时间,当然与所有的家用电器一样全自动洗衣机应当有一些安全警报。综合所需的要求本次设计全自动洗衣机的功能为:
按键一:设置洗衣模式----根据不同的洗衣要求设定三种不同洗衣模式。(标准-洗涤-脱水)
按键二:设置洗衣水位----根据不同的衣服数量设定不同水位。(高-中-低)
按键三:设置洗衣强度----根据不同的衣服污秽程度设定不同的强度。(强-中-弱)
按键四:开始\暂停----开始洗衣\必要时暂停洗衣,并可重新设置。
附加功能:洗衣倒计时、进水超时警报、排数超时警报、脱水开盖警报、脱水碰撞警报。

2、系统硬件设计
2.1单片机控制电路及工作原理
file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。单片机由运算器,控制器,存储器,输入输出设备构成,相当于一个微型的计算机(最小系统),和计算机相比,单片机只缺少了I/O设备。单片机是靠程序工作的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能。


2.2 洗衣机电机驱动电路及工作原理
file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg
ULN2003是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成,每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。
file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image005.png
这里步进电机的A端流入+5V ,如果输入的是高电平的话。两个三极管导通,于是步进电机的那一相就导通了。低电平,就断开了。这里如果电机突然停止产生很大的电流;这时由于COM端接了二极管则限制在+5.7V左右

file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image007.jpg  
ULN2003内部还集成了一个消线圈反电动势的二极管,可用来驱动继电器。它是双列16脚封装,NPN晶体管矩阵,最大驱动电压=50V,电流=500mA,输入电压=5V,适用于TTL COMS,由达林顿管组成驱动电路。 ULN是集成达林顿管IC,内部还集成了一个消线圈反电动势的二极管,它的输出端允许通过电流为200mA,饱和压降VCE 约1V左右,耐压BVCEO 约为36V。用户输出口的外接负载可根据以上参数估算。采用集电极开路输出,输出电流大,故可直接驱动继电器或固体继电器,也可直接驱动低压灯泡。通常单片机驱动ULN2003时,上拉2K的电阻较为合适,同时,COM引脚应该悬空或接电源。
ULN2003是一个非门电路,包含7个单元,单独每个单元驱动电流最大可达500mA,9脚可以悬空。
比如1脚输入,16脚输出,你的负载接在VCC与16脚之间,不用9脚。
file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg
引脚1:CPU脉冲输入端,端口对应一个信号输出端。
引脚2:CPU脉冲输入端。
引脚3:CPU脉冲输入端。
引脚4:CPU脉冲输入端。
引脚5:CPU脉冲输入端。
引脚6:CPU脉冲输入端。
引脚7:CPU脉冲输入端。
引脚8:接地。
引脚9:该脚是内部7个续流二极管负极的公共端,各二极管的正极分别接各达林顿管的集电极。用于感性负载时,该脚接负载电源正极,实现续流作用。如果该脚接地,实际上就是达林顿管的集电极对地接通。
引脚10:脉冲信号输出端,对应7脚信号输入端。参考电路接法
引脚11:脉冲信号输出端,对应6脚信号输入端。
引脚12:脉冲信号输出端,对应5脚信号输入端。
引脚13:脉冲信号输出端,对应4脚信号输入端。
引脚14:脉冲信号输出端,对应3脚信号输入端。
引脚15:脉冲信号输出端,对应2脚信号输入端。
引脚16:脉冲信号输出端,对应1脚信号输入端。
在本实验中我使用单片机P3^4引脚输出脉冲给lun2003芯片,在洗衣时与脱水时我们需要电动机以不同的转速旋转,为我们使用PWM调波原理控制电动机的转速,且为了电动机工作时不与其他程序冲突我们需要使用定时器用来延时,固定电动机驱动电压的周期然后改变0/1的占空比便可以改变电动机的转速,在周期内为1 的时间越大电动机的转速则越高,反之越低。

2.3 水位检测电路及工作原理
file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image009.png
 水位开关又叫做水位压力开关、水位传感器、水位控制器,它是利用洗衣桶内水位高低潮产生的压力来控制触点开关的通断,结构如图下所示。水位开关用塑料软管与盛水桶下侧的储气室口相连接。当向盛水桶内注水时,随着水位的升高,储气室的空气被压缩,并由塑料软管将压力传至水位开关。随着气压逐渐升高,水位压力开关内的膜片变形并推动动触点与常闭触点分离,常闭触点与公共触点迅速断开,常开触点与公共触点闭合,从而将水位已达到设定值的信号送至程控器或将连接进水阀电磁线圈的电路断开,停止进水。当洗衣机排水时,随着盛水桶水位的下降,储气室及塑料软管内的压力逐渐减小,当气体压力小于弹簧的弹性恢复力时,常开触点与公共触点迅速断开,常闭触点与公共触点闭合,恢复到待检测状态。
全自动洗衣机的水位高低检测是根据与洗衣桶内侧相连的水压气管里的空气压力大小来判断。水位越高,水压就越大,从而导致传感器里的电感线圈的电感量就越大,再根据电感与电容的并联谐振频率公式:f=1/2π√LC得出谐振频率就越小,反之则反。然后将产生的谐振频率经过单片机的处理来判定水位的高低(频率越大,则水位越低;反之则反)。
  file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image010.png
基本市面上大部分的水位传感器内部都是由1个密封气室、1根弹簧、1个电感量可调的电感线圈(阻值22Ω)、2个22nF涤纶电容和1个后盖组成,具体构件见下图所示:
  file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg
2.4 显示电路及工作原理
file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpgfile:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg
数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP)这个小数点可以更精确的表示数码管想要显示的内容;按能显示多少个(8)可分为1位、2位、3位、4位、5位、6位、7位等数码管。
按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。
显示部分主要由led数码管显示和led灯显示组成,led灯用于当做指示灯不同的灯亮则表示不同的水位或是不同的强度、模式等等。此外还需要两个led灯用于表示洗衣机进水口与排水口的情况,而数码管则用于显示洗衣的是剩余时间。

2.5 键盘电路及工作原理  
file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image017.png

在本设计中使用到了四个按键,如上图所示每个按键的一端接地另一端则分别接单片机的P3_0----P3_3引脚。
某一按键未被按下的时候其所对应的单片机引脚是高电平的,当按键按下时会使其所对应的引脚置为低电平。
在程序中便可通过按键对应的引脚的电平情况判断按键是否被按下。

2.6报警控制电路及工作原理

file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image018.png
有源蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器在电路中用字母"H"或"HA"(旧标准用"FM"、"LB"、"JD"等)表示。
压电式蜂鸣器 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。
多谐振荡器由晶体管或集成电路构成。当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。
压电蜂鸣片由锆钛酸铅或铌镁酸铅压电陶瓷材料制成。在陶瓷片的两面镀上银电极,经极化和老化处理后,再与黄铜片或不锈钢片粘在一起。
.电磁式蜂鸣器 电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。
接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互缠绕

报警电路如上图所示单片机的P2_3引脚接有一个蜂鸣器,当给单片机的P2_3引脚输出低电平是蜂鸣器便会响。
如此只要在程序中判断是否符合报警的条件,若是符合便让蜂鸣器响起。
3、系统软件的设计 3.1 主程序设计说明与流程图
file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg
本次设计的全自动洗衣机其主程序如上图所示,首先将要使用的单片机定时器0配置好,然后开始水位、洗衣模式的选择,按下s2则改变洗衣模式此处通过不同的led灯亮以 区分不同的模式,同理按下s3则改变水位,不同的led灯亮表示不同水位,按下s5则开始执行对应的洗衣程序。
3.2 洗衣程序功能设计与流程图
file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image022.jpg
当按下开始键后便开始执行洗衣程序,在其中会先判断洗衣的模式,标准洗模式、洗涤模式、脱水模式分别对应不同的洗衣过程。
标准洗模式:
首先开始倒计时80秒,然后开始进水10秒让led7亮代表进水阀开启,在此过程中会判断是否达到对应的水位,此处会使用水位键k4代替水位传感器的测量结果,若水位键被按下则表示已经加入足够的水量并关闭进水阀即使led7灭,若在此过程水位键未被按下则触发进水超时警报,当解决进水超时警报或者进水未超时则继续执行下一程序,开始洗衣服10秒,此过程电动机会停2秒然后低速转两秒循环至10秒过去,然后执行排水程序,即以led8灯表示排水阀开启,此过程同理需要水位键代替水位传感器的测量结果以判断是否发生排水超时,若水位键被按下则报警,处理完成后开始脱水,此过程为排水阀开启且电动机高速旋转10秒,若此过程中洗衣盖子被打开或是发生激烈碰撞则报警,以P3^6以及P3^7接地分别模拟脱水开盖以及脱水碰撞。警报处理好后或是未发生警报的话则循环一次上面的程序然后时间到了,倒计时显示为0,蜂鸣器响3秒以提示洗衣完成。
洗涤模式:
首先开始倒计时40秒,然后开始进水10秒让led7亮代表进水阀开启,在此过程中会判断是否达到对应的水位,此处会使用水位键k4代替水位传感器的测量结果,若水位键被按下则表示已经加入足够的水量并关闭进水阀即使led7灭,若在此过程水位键未被按下则触发进水超时警报,当解决进水超时警报或者进水未超时则继续执行下一程序,开始洗衣服10秒,此过程电动机会停2秒然后低速转两秒循环至10秒过去,然后执行排水程序,即以led8灯表示排水阀开启,此过程同理需要水位键代替水位传感器的测量结果以判断是否发生排水超时,若水位键被按下则报警,处理完成后开始脱水,此过程为排水阀开启且电动机高速旋转10秒,若此过程中洗衣盖子被打开或是发生激烈碰撞则报警,以P3^6以及P3^7接地分别模拟脱水开盖以及脱水碰撞。处理好警报后继续执行程序直至10秒过去,即完成了洗涤模式的洗衣,此时倒计时显示会为0,蜂鸣器响3秒以提示洗衣完成。
脱水模式:
此模式下倒计时会显示20的倒计时,首先进行10秒的排水,同上述过程一样有排水超时警报,排水10秒后开始脱水,10秒内排水阀开且电动机高速旋转,其中会检测是否发生脱水开盖以及脱水碰撞。脱水完成后蜂鸣器响3秒以提示洗衣完成。
3.3 键盘程序设计说明与流程图
file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg
本全自动洗衣机设计用到三个按键分别是s2洗衣模式选择键、s3水位选择键、s5开始与暂停键。
S2被按下则洗衣模式在标准洗—洗涤—脱水三种模式间循环切换,led1,led2,led3分别代表标准洗—洗涤—脱水三种模式。
S3被按下则水位在高—中—低三种模式间循环切换,led4,led5,led6分别代表在高—中—低三种模式。
S5则开始执行洗衣程序,期间s2、s3无法使用,当s5再次被按下是退出洗衣程序,启用s2、s3按键。

3.4 显示器程序设计说明与流程图
file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg
显示程序主要根据选择好是水位、洗衣模式亮不同的led灯,以及倒计不同的时间。
标准洗模式则led1亮且显示80秒倒计时。
洗涤模式则led2亮且显示40秒倒计时。
脱水模式则led3亮且显示20秒倒计时。
高水位则led4亮,中水位则led5亮,低水位则led6亮。进水时led7亮,排水时led8亮。
3.5 报警功能设计与流程图
file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image028.jpg
在执行洗衣程序是会有四种报警情况,当符合其中的请开始便会报警。,进水超时时退出洗衣程序在数码管上显示g1,排水超时时退出洗衣程序在数码管上显示g2,脱水开盖时退出洗衣程序在数码管上显示g3,脱水碰撞时退出洗衣程序在数码管上显示g4,排除警报后继续执行洗衣程序。
4、系统调试
4.1硬件调试说明
在硬件方面我们使用单片机开发板模拟洗衣机的工作状态。
刚上电时是默认选择为标准洗模式、水位为高显示为led1及led4亮,此时按下k2键则切换洗衣模式改变led1、led2、led3的亮灭情况。Led1亮则为标准洗模式、led2亮则为洗涤模式、led3亮则为脱水模式。按下k3键则切换水位选择改变led4、led5、led6、的亮灭情况。led4亮则选择为高水位、led5亮则选择为中水位、led6亮则选择为低水位。
按下k5键后开始洗衣,此时k2、k3键不可用。
执行标准洗模式时在数码管上会显示一分二十秒的倒计时总共80秒,并且开始下表的洗衣步骤:
  
进水
  
排水
脱水
进水
排水
脱水
10
10
10
10
10
10
10
10
洗涤模式时在数码管上会显示倒计时总共40秒,并且开始下表的洗衣步骤:
  
进水
  
排水
脱水
10
10
10
10
脱水模式时在数码管上显示倒计时20秒,并且开始下表的洗衣步骤:
  
排水
  
脱水
10
10
进水时led7亮,反之灭。排水时led8亮,反之灭。且进水需要按下k4水位键停止进水以表示水位到了,否则报警蜂鸣器响,数码管显示g1且退出洗衣程序。
在退水期间将P3^6、P3^7接地则分别触发脱水开盖、脱水碰撞报警,蜂鸣器响,数码管分别显示g3、g4且退出洗衣程序直至报警处理好。
4.2软件调试说明
本实验代码由C语言所编写其中除主函数外还包含有定时器初始化函数、定时器中断函数、驱动函数、显示函数、报警函数、按键处理等多个函数。
不同的函数完成不同的工作。

5、总结与体会

在本次全自动洗衣机系统设计和制作过程中主要是倒计时的显示比较难处理以,在显示倒计时时还要执行洗衣程序要避免其相互冲突是一难点,此外为了解决报警情况的相互冲突也花飞不少的时间。
通过本次实验我认识了新的传感器—水位传感器,使用水位传感器便可准确测量出当前的水量是一个很方便的传感器,其结构也不复杂。在编写程序过程中我开始反省改善自己一些坏习惯逐渐养成良好编写习惯。
在设计过程中我的语言表达能力以及动手能力得到了一定的锻炼,相信在本实验完成的同时我的语言表达能力以及动手能力也得到了提升!

单片机源程序如下:
  1. /*********************************************************************************
  2. 【编写时间】: 2016年11月18日
  3. 【功能】: 模拟洗衣机功能;


  4. **********************************************************************************/
  5. #include<reg52.h>
  6. #include<intrins.h>
  7. #define uchar unsigned char
  8. #define uint unsigned int
  9. sbit sda=P2^0;
  10. sbit scl=P2^1;
  11. sbit s2=P3^0;
  12. sbit s3=P3^1;
  13. sbit s4=P3^2;
  14. sbit s5=P3^3;
  15. sbit moto=P3^4;
  16. sbit warn3=P3^6;
  17. sbit warn4=P3^7;
  18. sbit led1=P1^0;
  19. sbit led2=P1^1;
  20. sbit led3=P1^2;
  21. sbit led4=P1^3;
  22. sbit led5=P1^4;
  23. sbit led6=P1^5;
  24. sbit led7=P1^6;
  25. sbit led8=P1^7;
  26. sbit beep = P2^3;          //蜂鸣器

  27. sbit dula=P2^6;                //段选信号的锁存器控制
  28. sbit wela=P2^7;                //位选信号的锁存器控制

  29. uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  30.                                                 //数码管各位的码表
  31. uchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  32.                         0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  33.                                                 //0-f的码表
  34. uchar mode=1,waterl=1,water_warn=0,starts=0,drivec=0;
  35. uint count1=0,count2=0,count3=0,count4=0,count5=0,count6=0;
  36. uint time4=0,time5=0,time6=0,time7=0;
  37. uint warn=0;
  38. int gives=1;

  39. /*
  40. void delay()  //5us
  41. {;;}
  42. */
  43. void delay1(uint z)//1ms
  44. {
  45.         uint x,y;
  46.         for(x=z;x>0;x--)
  47.                 for(y=120;y>0;y--);        
  48. }


  49. //
  50. void timer_init(){
  51.         TMOD=0x01;                 //模式设置,00000001,可见采用的是定时器0,工作与模式1(M1=0,M0=1)。
  52.         TR0=1;                         //打开定时器
  53.         TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
  54.         TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
  55.         ET0=1;                         //开定时器0中断
  56.         EA=1;                         //开总中断

  57. }

  58. void keys(){
  59.         if(!s2){delay1(500); mode++; gives=1; if(mode==4) mode=1;}
  60.         if(!s3){delay1(500); waterl++; gives=1; if(waterl==4) waterl=1;}

  61. }
  62. void key4(){
  63.         if(s4==0){
  64.         while(!s4);
  65.         warn=0;
  66.         starts++;
  67.         water_warn=1;
  68. //        delay1(500); water_warn++; gives=1; if(water_warn==4) water_warn=1;
  69.         }
  70. }

  71. void key5(){
  72.         if(s5==0){while(!s5); starts++; if(starts==2) starts=0;}
  73. }

  74. void show_warn(){

  75.         beep=0;
  76.         key4();
  77.     if(warn==1){         //进水超时警报
  78.         P0=wei[0];           
  79.         wela=1;
  80.         wela=0;

  81.         P0=0x6f;         
  82.         dula=1;
  83.         dula=0;
  84.         delay1(2);         //时间间隔短,这是关键(所谓的同时显示,只是间隔较短而已,利用人眼的余辉效应,觉得每个数码管都一直在亮)。
  85.         
  86.         P0=wei[1];           
  87.         wela=1;
  88.         wela=0;

  89.         P0=0x06;         
  90.         dula=1;
  91.         dula=0;
  92.         delay1(2);         //时间间隔短,这是关键(所谓的同时显示,只是间隔较短而已,利用人眼的余辉效应,觉得每个数码管都一直在亮)。
  93.         }
  94.     if(warn==2){          //排水超时警报
  95.         P0=wei[0];           
  96.         wela=1;
  97.         wela=0;

  98.         P0=0x6f;         
  99.         dula=1;
  100.         dula=0;
  101.         delay1(2);         //时间间隔短,这是关键(所谓的同时显示,只是间隔较短而已,利用人眼的余辉效应,觉得每个数码管都一直在亮)。
  102.         
  103.         P0=wei[1];           
  104.         wela=1;
  105.         wela=0;

  106.         P0=0x5b;         
  107.         dula=1;
  108.         dula=0;
  109.         delay1(2);         //时间间隔短,这是关键(所谓的同时显示,只是间隔较短而已,利用人眼的余辉效应,觉得每个数码管都一直在亮)。
  110.         }
  111.     if(warn==3){        //脱水开盖警报
  112.         P0=wei[0];           
  113.         wela=1;
  114.         wela=0;

  115.         P0=0x6f;         
  116.         dula=1;
  117.         dula=0;
  118.         delay1(2);         //时间间隔短,这是关键(所谓的同时显示,只是间隔较短而已,利用人眼的余辉效应,觉得每个数码管都一直在亮)。
  119.         
  120.         P0=wei[1];           
  121.         wela=1;
  122.         wela=0;

  123.         P0=0x4f;         
  124.         dula=1;
  125.         dula=0;
  126.         delay1(2);         //时间间隔短,这是关键(所谓的同时显示,只是间隔较短而已,利用人眼的余辉效应,觉得每个数码管都一直在亮)。
  127.         }
  128.     if(warn==4){           //脱水碰撞警报
  129.         P0=wei[0];           
  130.         wela=1;
  131.         wela=0;

  132.         P0=0x6f;         
  133.         dula=1;
  134.         dula=0;
  135.         delay1(2);         //时间间隔短,这是关键(所谓的同时显示,只是间隔较短而已,利用人眼的余辉效应,觉得每个数码管都一直在亮)。
  136.         
  137.         P0=wei[1];           
  138.         wela=1;
  139.         wela=0;

  140.         P0=0x66;         
  141.         dula=1;
  142.         dula=0;
  143.         delay1(2);         //时间间隔短,这是关键(所谓的同时显示,只是间隔较短而已,利用人眼的余辉效应,觉得每个数码管都一直在亮)。
  144.         }


  145. }
  146. void show(){
  147.         if(mode==1) {led3=1; led2=1; led1=0;}
  148.         else if(mode==2) {led3=1; led1=1; led2=0;}
  149.         else {led1=1; led2=1; led3=0;}

  150.         if(waterl==1) {led6=1; led5=1; led4=0;}
  151.         else if(waterl==2) {led6=1; led4=1; led5=0;}
  152.         else  {led4=1; led5=1; led6=0;}
  153. /*
  154.         if(strength==1){
  155.         P0=wei[0];           
  156.         wela=1;
  157.         wela=0;

  158.         P0=0x01;         
  159.         dula=1;
  160.         dula=0;
  161.         delay1(2);         //时间间隔短,这是关键(所谓的同时显示,只是间隔较短而已,利用人眼的余辉效应,觉得每个数码管都一直在亮)。
  162.         }
  163.         else if(strength==2){
  164.         P0=wei[0];           
  165.         wela=1;
  166.         wela=0;

  167.         P0=0x40;         
  168.         dula=1;
  169.         dula=0;
  170.         delay1(2);         //时间间隔短,这是关键(所谓的同时显示,只是间隔较短而已,利用人眼的余辉效应,觉得每个数码管都一直在亮)。
  171.         }
  172.         else {
  173.         P0=wei[0];           
  174.         wela=1;
  175.         wela=0;

  176.         P0=0x08;         
  177.         dula=1;
  178.         dula=0;
  179.         delay1(2);         //时间间隔短,这是关键(所谓的同时显示,只是间隔较短而已,利用人眼的余辉效应,觉得每个数码管都一直在亮)。}
  180.            }
  181.            */
  182. }
  183. void dianji()
  184. {
  185.   if(count5<=1) moto=1;
  186.   if(count5>1) moto=0;               


  187. }
  188. void dry()
  189. {
  190.         if(count6==2) moto=1;
  191.         if(count6==9) moto=0;
  192. }
  193. void drive(){
  194.         int a;
  195.   
  196.         for(a=4;a<8;a++){
  197. /*        if(strength==1){
  198.         P0=wei[0];           
  199.         wela=1;
  200.         wela=0;

  201.         P0=0x01;         
  202.         dula=1;
  203.         dula=0;
  204.         delay1(2);         //时间间隔短,这是关键(所谓的同时显示,只是间隔较短而已,利用人眼的余辉效应,觉得每个数码管都一直在亮)。
  205.         }
  206.         else if(strength==2){
  207.         P0=wei[0];           
  208.         wela=1;
  209.         wela=0;

  210.         P0=0x40;         
  211.         dula=1;
  212.         dula=0;
  213.         delay1(2);         //时间间隔短,这是关键(所谓的同时显示,只是间隔较短而已,利用人眼的余辉效应,觉得每个数码管都一直在亮)。
  214.         }
  215.         else {
  216.         P0=wei[0];           
  217.         wela=1;
  218.         wela=0;

  219.         P0=0x08;         
  220.         dula=1;
  221.         dula=0;
  222.         delay1(2);         //时间间隔短,这是关键(所谓的同时显示,只是间隔较短而已,利用人眼的余辉效应,觉得每个数码管都一直在亮)。}
  223.            }        */
  224.                   
  225.         P0=wei[a];           
  226.         wela=1;
  227.         wela=0;
  228.         if(a==4){
  229.         P0=duan[time4];         
  230.         dula=1;
  231.         dula=0;
  232.         delay1(5);        }
  233.         if(a==5){
  234.         P0=duan[time5]|0x80;         
  235.         dula=1;
  236.         dula=0;
  237.         delay1(5);        }
  238.         if(a==6){
  239.         P0=duan[time6];         
  240.         dula=1;
  241.         dula=0;
  242.         delay1(5);        }
  243.         if(a==7){
  244.         P0=duan[time7];         
  245.         dula=1;
  246.         dula=0;
  247.         delay1(5);        }

  248.         }                                   

  249.         if(time4==0&&time5==0&&time6==0&&time7==0){P1=0xff; moto=0; beep=0; delay1(2000); beep=1;while(1);}


  250.         if(time5==0&&time6==0&&time7==0){
  251.         time5=10;
  252.         time4--;
  253.         }
  254.         if(time6==0&&time7==0) {
  255.         time6=6;
  256.         time5--;
  257.         }
  258.         




  259.                  //脱水
  260.         if(mode==3){
  261.           led8=0;
  262.           key4();
  263.           if(count2>10&&count2<=20){
  264.           if(water_warn==1){warn=2; starts=0;}         //排水超时警报
  265.           led7=1;
  266.           led8=0;
  267.           dry();
  268.           if(warn3==0) {warn=3;        starts=0;}        ///脱水开盖警报
  269.           if(warn4==0) {warn=4; starts=0;}        //脱水碰撞警报        
  270.           }
  271.       if(count2>=20){ P1=0xff; moto=0; beep=0; delay1(3000);beep=1; while(1); }


  272.         }
  273.    //洗
  274.         if(mode==2){

  275.         if(count2<=10){
  276.         if(water_warn==0){led7=0;}
  277.         if(water_warn==1){led7=1;}        
  278.         key4();                  }
  279.         if(count2>10&&count2<=20){
  280.         if(water_warn==0){warn=1; starts=0;}  //进水超时警报
  281.         led7=1;
  282.          if(count4<=2) {
  283.          dianji();
  284.          }
  285.          else moto=0;
  286.         }
  287.         if(count2>20&&count2<=30){ water_warn=0; led7=1; led8=0;  moto=0;        }
  288.         if(count2>30&&count2<=40) {
  289.         //if(water_warn==1){warn=2; starts=0; } //排水超时警报
  290.         led7=1; led8=0;
  291.         dry();
  292.     if(warn3==0) {warn=3;        starts=0;}          //脱水开盖警报
  293.         if(warn4==0) {warn=4;   starts=0;}          //脱水碰撞警报
  294.         }
  295.         if(count2>40){P1=0xff; moto=0; beep=0; delay1(3000);beep=1; while(1);}        

  296.         }
  297.    //标准         

  298.          if(mode==1){
  299.          key5();

  300.          if(count2<=10) {led8=1;
  301.           if(water_warn==0){led7=0;        }
  302.           if(water_warn==1){led7=1;}
  303.            key4();   }
  304.         if(count2>10&&count2<=20){
  305.         if(water_warn==0){warn=1; starts=0; }  //进水超时警报
  306.         led7=1;
  307.          if(count4<=2) {
  308.      dianji();
  309.          }
  310.          else moto=0;
  311.         }
  312.         if(count2>20&&count2<=30){water_warn=0; led8=0; moto=0;          }
  313.         if(count2>30&&count2<=40) {
  314. //        if(water_warn==1){warn=2; starts=0;} //排水超时警报
  315.         led7=1;
  316.         led8=0;
  317.         dry();
  318.         if(warn3==0) {warn=3;        starts=0;}         //脱水开盖警报
  319.         if(warn4==0) {warn=4;   starts=0;}          //脱水碰撞警报
  320.          }
  321.         if(count2>40&&count2<=50) {led8=1;  
  322.         if(water_warn==0){led7=0;}
  323.         if(water_warn==1){led7=1;}
  324.         moto=0;
  325.          key4();

  326.           }
  327.         if(count2>50&&count2<=60){
  328.         if(water_warn==0) {warn=1; starts=0;} //进水超时警报
  329.         led7=1;
  330.            if(count4<=2) {
  331.           dianji();
  332.          }
  333.          else moto=0;
  334.         }
  335.         if(count3>=1&&count2<=10) {led7=1; delay1(1); led8=0; moto=0; }
  336.         if(count3>=1&&count2>10&&count2<=20){
  337. //        if(water_warn==1){warn=2; starts=0;} //排水超时警报
  338.         led7=1; led8=0;
  339.         dry();
  340.         if(warn3==0) {warn=3;        starts=0;}         //脱水开盖警报
  341.         if(warn4==0) {warn=4;   starts=0;}          //脱水碰撞警报

  342.          }
  343.         if(count3>=1&&count2>20)   {P1=0xff; moto=0; beep=0; delay1(3000);beep=1; while(1);}
  344.          
  345.          }                     



  346.          key5();


  347.                         
  348.         if(count1==20){
  349.         count1=0;
  350.         count2++;
  351.         count4++;
  352.         if(count4>=5) count4=1;
  353.         if(time7==0)  time7=10;        
  354.         if(count2==60){count2=0; count3++;}
  355.         time7--;
  356.         if(time7==9) time6--;
  357.          }

  358. }
  359. void give(){
  360.         if(gives!=0){
  361.         if(mode==1)        {time4=0; time5=1; time6=2; time7=0; drivec=1;}
  362.         if(mode==2) {time4=0; time5=0; time6=4; time7=0; drivec=1;}
  363.         if(mode==3)        {time4=0; time5=0; time6=2; time7=0; drivec=1;}          }
  364. }

  365. void main()
  366. {
  367.         uchar i=0;
  368.         warn3=1;
  369.         warn4=1;
  370.         timer_init();
  371.         while(1)
  372.         {
  373.         keys();
  374.         show();
  375.         key5();
  376.         give();
  377.         while(warn!=0){
  378.         
  379.         if(mode==3&&count2>10&&count2<=20){
  380.         if(warn3==1&&warn4==1){beep=1; warn=0; starts++;}
  381.         }
  382.         if(mode==2&&count2>30&&count2<=40) {
  383.          if(warn3==1&&warn4==1){beep=1; warn=0; starts++;}
  384.         }
  385.         if(mode==1&&count2>30&&count2<=40){
  386.           if(warn3==1&&warn4==1){beep=1; warn=0; starts++;}
  387. ……………………

  388. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
洗衣机.zip (39.44 KB, 下载次数: 142)


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

使用道具 举报

沙发
ID:434596 发表于 2018-12-17 21:44 | 只看该作者
实验图能不能发一下   
回复

使用道具 举报

板凳
ID:438739 发表于 2018-12-23 22:59 | 只看该作者
上边的图片能不能发一下
回复

使用道具 举报

地板
ID:457393 发表于 2019-5-7 01:34
论文在你的基础上修改查重能过吗

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

本版积分规则

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

Powered by 单片机教程网

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