单片机实训智能洗衣机

单片机实训智能洗衣机

第一部分 内容介绍

  • 此实训内容使用软件Proteus7.8和Keil4设计完成,设计使用的语言是C语言,使用的单片机型号是AT89C51单片机,可以实现洗衣机的定时洗涤、定时甩干、转速和洗涤时间的设置。

第二部分 实训代码

#include<reg51.h>
#include<stdio.h>
void delay(unsigned int t);
#define uchar unsigned char
#define uint unsigned int
sbit F1 = P0^0;
sbit F2 = P0^1;
sbit F3 = P0^2;
sbit F4 = P0^3;
sbit K1 = P3^0;//慢速
sbit K2 = P3^1;//快速
sbit K3 = P3^7;//甩干
sbit K4 = P3^3;//设定模式
sbit K5 = P3^4;//增加时间
sbit K6 = P3^5;//减少时间
sbit K7 = P3^6;//启动
sbit K8 = P3^2;//紧急停止
sbit lcdrs = P0^5;
sbit lcdrw = P0^6;
sbit lcden = P0^7;
sbit Sound = P1^7;
unsigned char code FFW[8]={0xfc,0xf9,0xf3,0xf6,0xfc,0xf9,0xf3,0xf6};//步进电机正转
unsigned char code FFZ[8]={0xf6,0xf3,0xf9,0xfc,0xf6,0xf3,0xf9,0xfc};//步进电机反转
unsigned int key,K,rate;//声明模式键,步进电机模式、速度
unsigned int rest,LedNumVal=1;//声明模式选择标志,Led显示时间并设定初值为1
//函数功能:控制步进电机采取正转还是反转模式
void motor_ffw()
{
    unsigned int i;
	for(i = 0;i<8;i++)
	{
	    if(K==1&&LedNumVal != 0)
	        P0 = FFW[i];
		if(K==2&&LedNumVal != 0)
			P0 = FFZ[i];
		delay(rate*10);//通过选择的速度控制步进电机转速
	}
}
//函数功能:延时函数
void delay(uint z)
{
    uint x,y;
	for(x=z;x>0;x--)
	{
	    for(y=100;y>0;y--)
		    ;
	}
}
//函数功能:获得模式按键的选择结果
void getkey()
{
    key = 1;
    rest = 0;
    do
    {
        P3 = 0xff;
	    if((K1 || K2 || K3 ||K4)!= 0)
	    {
	        delay(2);
		    if((K1||K2||K3||K4)!=0)
		    {
		        if(K1==0)
			        key=1;
			    if(K2==0)
			        key=2;
			    if(K3==0)
			        key=3;
			    if(K4==0)
			    {
			        rest=rest%2+1;
			    }
			}
	    }
    }while(rest==0);
}
//函数功能:设置洗衣或者甩干的时间
void timedesign()
{
    unsigned int j = 0;
	void time(void);
	do
	{
	    P3 = 0xff;
		if((K5&&K6&&K7)!= 1)
		{
		    delay(2);
			if((K5&&K6&&K7)!= 1)
			{
			    if(K5==0)
				    LedNumVal++;
				if(K6==0)
				    LedNumVal--;
				if(K7==0)
				    j=1;
				delay(150);
			}
		}
		if(LedNumVal>=6)
		{
		    LedNumVal=6;
		}
		if(LedNumVal==0)
		{
		    LedNumVal++;
		}
		time();
    }while(j==0);
}
//函数功能:写命令
void write_com(uchar com)
{
    lcdrs=0;
	lcdrw=0;
	lcden=0;
	P2=com;
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;
}
//函数功能:写数据
void write_date(uchar dat)
{
    lcdrs=1;
	lcdrw=0;
	lcden=0;
	P2 = dat;
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;
}
//函数功能:写字符串,将想显式地内容输出
void write_str(uchar *str)
{
    uchar idata i;
	for(i=0;str[i]!='\0';i++)
	    write_date(str[i]);
}
//函数功能:液晶显视屏初始化
void init(void)
{
    delay(75);
	write_com(0x38);//模式:8位总线,双行,5*7字体
	delay(25);
	write_com(0x38);
	delay(25);
	write_com(0x38);
	write_com(0x38);
	write_com(0x08);//屏幕关闭
	write_com(0x01);//清除DDRAM的所有单元,光标被移动到屏幕左上角
	write_com(0x06);//写入DDRAM后,地址指针加一
	write_com(0x0c);//打开显示屏,不显示光标,光标所在位置的字符不闪烁
}
//函数功能:将获得的时间在显示屏输出
void time(void)
{
    unsigned int i,time;
	unsigned char num[3];
	time = LedNumVal*10;
	sprintf(num,"%3d",time);
	write_com(0x80+0x40);
	for(i=0;i<3;i++)
	{
	    write_date(num[i]);
	}
	write_str("min");
}	
//函数功能:外部中断子函数,用于中断危险情况
void int0() interrupt 0
{
    LedNumVal=0;
	time();
}
//主函数
void main(void)
{
    unsigned int t;
	unsigned int n;
	int m;
	init();//初始化液晶显示屏
	EA=1;//开启总中断
	EX0=1;
	IT0 = 0;//开启外部中断
	while(1)
	{
	    write_com(0x80);
		write_str("enter key");
		time();
		getkey();
		if(key==1)
		{
		    rate=20;//步进电机速度
			write_com(0x80);
			write_str("deng ji:1");//模式1,轻柔模式
		}
		if(key==2)
		{
		    rate=15;//步进电机速度
			write_com(0x80);
			write_str("deng ji:2");//模式2,强洗模式
		}
		if(key==3)
		{
		    rate=10;//步进电机速度
			write_com(0x80);
			write_str("shuai gan...");//模式3,甩干模式
		}
		timedesign();//设置洗衣时间
		time();//显示设定的时间
		t = rate/5;//用于时间减少标志
		n=0;//控制时间减少次数
		do
		{
		    if(key==1 ||key==2)
			{
			    K=1;//开启步进电机正转模式
		    	motor_ffw();//步进电机正转
			    K=2; //开启步进电机反转模式
			    motor_ffw();//步进电机反转
			    n++;
			    if((t==4)&&(n%3)==0)
			    {
			        LedNumVal--;//时间标志数减少
				    time();//显示此时剩余时间
			    }
			    if((t==3)&&(n%4)==0)
			    {
			        LedNumVal--;
				    time();
			    }
			}
		    else//甩干功能
			{
			    K=1;
		    	motor_ffw();
				n++;
			    if(n%5==0)
			    {
			        LedNumVal--;
				    time();
			    }
			}
	     }while(LedNumVal!=0);//当时间标志数为0时结束,开始下一次循环
		 time();
		 for(m=0;m<20;m++)//蜂鸣器
		 {
		     Sound = 1;
		     delay(305);
		     Sound = 0;
			 delay(305);
		 }
    }
}

第三部分 硬件仿真电路

仿真图

  • 原件列表
    原件列表

第四部分 设计过程

1、安装软件

  • 安装路径必须是全英文路径包括电脑的用户名,也不能是中文。否则无法正常安装使用。
  • 安装Proteus7.8,我已经将软件打包按需下载即可,破解和安装方法都包含在其中。
    Proteus安装文件
  • 安装Keil4,我也将Keil4软件打包按需下载即可。
  • 需要注意的是,Keil4安装后需要输入用户名和密码,随心填就好,已经破解好了。

2、仿真图绘制

  • 按照第三部分在Proteus中画出来,连接出来后,开启仿真查看是否漏掉端口没有连接,这点很重要。
  • 布局

3、编写代码

  • 首先在Project中选择新建项目。
    在这里插入图片描述
  • 最好将所有实训文件命名为同一个名字并放在相同名字的文件夹下,例如
    在这里插入图片描述
  • 选择Atmel公司的89C51单片机,然后选择OK
  • 在这里插入图片描述
    在这里插入图片描述
  • 然后选择 是
    在这里插入图片描述
  • 然后将左侧工作组展开,并新建一个空白文档
    在这里插入图片描述
  • 然后将此文件保存,并命名为.C为扩展名的文件,名字与项目名相同

在这里插入图片描述

  • 将保存好的文件添加到资源组里,在Source Group 1上右键即可选择
    在这里插入图片描述
  • 选择与项目名称相同的C语言文件,并选择Add
    在这里插入图片描述
  • 添加成功后,即可将代码复制到其中
    在这里插入图片描述
  • 依次选择编译和创建
    在这里插入图片描述
  • 观察编译和创建的结果,创建可能会产生警告,但是不影响运行,但是错误会影响运行
    在这里插入图片描述
    在这里插入图片描述
  • 最后生成hex文件
    在这里插入图片描述
  • 选择output选项卡,勾选Creat HEX File,最后选择OK
    在这里插入图片描述
  • 查看项目文件夹下是否有hex为扩展名的文件,如果没有可以多做几次生成hex文件操作即可解决
    在这里插入图片描述

4、装载hex文件

  • 双击仿真图上的单片机即可打开装载hex文件的窗口,选择文件夹后,选择hex文件的所在位置,如果都在同一文件夹下的话可以很快找到
    在这里插入图片描述
    在这里插入图片描述
  • 装载完成后进行仿真
    在这里插入图片描述
  • 仿真启动后的样子
    在这里插入图片描述

第五部分 使用方法

  • 首先选择洗衣模式,有轻柔洗、强力洗、甩干三种模式,然后按下模式选择(起到确定选择的作用),然后设置时间最少十分钟,可增加,也可减少,最后按下启动按键,即可启动洗衣机等到时间结束,蜂鸣器会发出报警声,危险中断可以在任意时间紧急停止洗衣机运行,但是下一次启动需要将仿真终止然后重新开启,洗衣机才能再次正常使用。
    在这里插入图片描述

第六部分 软件链接

链接:https://pan.baidu.com/s/1ad0LEtuvFAzZseQG-iKAgg
提取码:8096

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸭舌和鸭心我都要

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值