提示:记录2022年4月做的毕设
前言
基于51单片机的智能洗衣机,主控使用STC89C52。
一、任务书
1.1设计(研究)目标:
以STM32单片机为核心器件,设计一个精加车间环境检测系统,通过战舰板平台利用温度湿度,振动,PM2.5等传感器和空调,通风,空气净化等设备设计一个恒温,恒湿,抗振,高度净化的精加车间环境检测系统。利用平台的远程通信功能,实现集中检测的基本功能并保证一定的检测范围及对检测对象的合理布置,还能远程传到合适的终端。形成实时数据。
设计(研究)内容及具体要求:
1.2设计(研究)内容:
- 待机情况下液晶屏显示日期和时间,并能通过按键来设置洗衣的开始时间和结束时间,开始时间到,洗衣模式自动启动,结束时间到,自动停止洗涤;
- 1min后停止,蜂鸣器鸣叫三声,LED闪烁三次,洗涤倒计时时间显示在液晶显示器1602的第二行,可以通过若干个按键进行设置;
- 四种模式:深度洗衣、标准洗衣、快速洗衣、脱水,当洗涤正在进行时,步进电机转动,四种模式电机速度分别是洗涤正转,脱水反转,其中速度从快到慢的顺序依次为深度、标准、快速、脱水则以最快速度反转,同时液晶屏第一行显示洗涤模式(英文),第二行显示倒计时时间;
- 整个洗衣过程结束后,蜂鸣器发出三声报警,LED闪烁三次,同时液晶显示器第一行显示结束(英文END)
二、设计思路
控制系统主要由电源电路、按键设置模式电路、DS1302时钟芯片电路、1602液晶显示电路、工作状态显示电路、驱动步进电机电路、AT24C02存储芯片电路和声光报警电路构成。接通电源,单片机控制各模块相互协调,有条不紊的实现电机驱动、进水、排水、脱水等功能。
三、硬件
- STC89C51
- 步进电机
- 独立按键
- 蜂鸣器
- LCD1602
- 独立LED
- 继电器
四、代码以及框图等资料
/*******************************************************************************
* 使用的IO : 电机: P1.0/P1.1/P1.2/P1.3
LCD: P0.0-P0.7,P0.5、P0.6、P0.7
按键: P3.0、P3.1、P3.2、P3.3
继电器 P3.6、P3.7
* 注意 :由于P3.2口跟红外线共用,为了不让红外线影响,最好把红外线先取下来。
* Mode1-4分别是标准、经济、单洗、单脱
* 盖子显示0表示盖子没有盖上
* 水位显示0表示水位没达到
*******************************************************************************/
### 五、沟通交流
承接stm32单片机定做设计、嵌入式类设计定做。
咨询liaxi“2424644692”(扣扣)
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "intrins.h"
#include "lcd.h"
#include "stdio.h"
//步进电机
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
//蜂鸣器
sbit BEEP=P1^5;
//继电器
sbit Relay_in =P3^6;
sbit Relay_out=P3^7;
//按键
sbit GPIO_KEY1=P3^1;
sbit GPIO_KEY2=P3^0;
sbit GPIO_KEY3=P3^2;
sbit GPIO_KEY4=P3^3;
unsigned char code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //反转顺序
//按键相关
unsigned char KeyValue=0; //用来存放读取到的键值
unsigned char flag=0;
unsigned char *p=&flag;
//在lcd1602上显示的字符
unsigned char Disp1[32]="-----------------------------";
unsigned char cnt=0;
//蜂鸣器标志位
unsigned int beep_flag=0;
//定时器计时
unsigned long int time=0;
unsigned int second=0;
//unsigned int minute=0;
//电机状态,0表示停机
unsigned int State=0;
unsigned int MotorTurn=1;
unsigned int MotorFlag=1;
int i=0;
unsigned int dir=0;
//洗衣状态,1进水 2洗涤 3漂洗 4脱水 5排水
unsigned int Wash=0;
//水位显示,0表示没水
unsigned int Level=1;
//机盖,0表示没盖上
unsigned int Cover=1;
//进水出水状态
unsigned int Water_In=1;
unsigned int Water_Out=1;
//工作状态:标准1、经济2、单洗3、排水4
unsigned int Mode=1;
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数
*******************************************************************************/
void Delay1ms() //@12.000MHz
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
void Delayms(unsigned int n) //@12.000MHz
{
while(n--)Delay1ms();
}
/*******************************************************************************
* 函数名 : RelayInit()
* 函数功能 : 继电器初始化
*******************************************************************************/
void RelayInit(void)
{
Relay_in = 1;
Relay_out = 1;
}
/*******************************************************************************
* 函数名 : Motor1
* 函数功能 : 电机旋转函数,洗涤
*******************************************************************************/
void Motor()
{
switch(i)
{
case 0 : { K1=0;K2=0;K3=0;K4=1; break;}
case 1 : { K1=0;K2=0;K3=1;K4=1; break;}
case 2 : { K1=0;K2=0;K3=1;K4=0; break;}
case 3 : { K1=0;K2=1;K3=1;K4=0; break;}
case 4 : { K1=0;K2=1;K3=0;K4=0; break;}
case 5 : { K1=1;K2=1;K3=0;K4=0; break;}
case 6 : { K1=1;K2=0;K3=0;K4=0; break;}
case 7 : { K1=1;K2=0;K3=0;K4=1; break;}
}
if(MotorTurn)
{
i++;
if(i>7)i=0;
}
else
{
i--;
if(i<0)i=7;
}
}
/****************************************************************
* 函 数 名 : KeyDown
* 函数功能 : 行列扫描,检测有按键按下并读取键值
* 返 回 值 :无
* 传入参数 :*flag检测按键按下标志位
/*
27-22 key3 GPIO_KEY3
27-23 key4 GPIO_KEY4
26-22 key7 GPIO_KEY7
26-23 key8 GPIO_KEY8
*/
//****************************************************************/
void KeyDown(unsigned char *flag)
{
GPIO_KEY1=1;GPIO_KEY2=1;GPIO_KEY3=1;GPIO_KEY4=1;
Delayms(1);
if(GPIO_KEY1==0||GPIO_KEY2==0||GPIO_KEY3==0||GPIO_KEY4==0)
{
Delayms(5);
if(GPIO_KEY1==0) {*flag=1;KeyValue=1;}
else if(GPIO_KEY2==0){*flag=1;KeyValue=2;}
else if(GPIO_KEY3==0){*flag=1;KeyValue=3;}
else if(GPIO_KEY4==0){*flag=1;KeyValue=4;}
}
}
/****************************************************************
* 函 数 名 : TimerInit()
* 函数功能 : 定时器初始化
//****************************************************************/
void TimerInit(void)
{
TMOD=0x01;//定时器0工作方式1
TH0=0xf8;//(65536-10)/256;//赋初值定时
TL0=0x30;//(65536-10)%256;//0.01ms
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
}
/****************************************************************
* 函 数 名 : paishui()、jinshui()、 xidi()、 piaoxi()、tuoshui()
* 函数功能 : 排水
//****************************************************************/
void paishui(void)
{
Wash=2;
MotorFlag=0;
Relay_out=0; //排水开
Relay_in=1; //进水关
}
void jinshui(void)
{
Wash=1;
MotorFlag=0;
Relay_out=1; //排水关
Relay_in=0; //进水开
}
void xidi(void)
{
Wash=4;
MotorFlag=1;
Relay_out=1; //排水关
Relay_in=1; //进水关
}
void piaoxi(void)
{
Wash=5;
MotorFlag=1;
Relay_out=1; //排水关
Relay_in=1; //进水关
}
void tuoshui(void)
{
Wash=4;
MotorFlag=1;
Relay_out=0; //排水开
Relay_in=1; //进水关
}
/****************************************************************
* 函 数 名 :
* 函数功能 : 洗衣模式
* Mode1()标准模式
* Mode2()经济模式
* Mode3()单洗模式
* Mode4()排水模式
//****************************************************************/
/*
0-60
60-120
120
*/
void Mode1(void)
{
if(second<120)jinshui();
else if(second>=120&&second<240)
{
if(Level==1)
{
beep_flag=0;
xidi();
}
else if(Level==0) beep_flag=1;
}
else if(second>=240&&second<360)paishui();
else if(second>=360&&second<480)jinshui();
else if(second>=480&&second<600)
{
if(Level==1)
{
beep_flag=0;
piaoxi();
}
else if(Level==0)
{
beep_flag=1;
}
}
else if(second>=600&&second<720)paishui();
else if(second>=720&&second<840)jinshui();
else if(second>=840&&second<960)
{
if(Level==1)
{
beep_flag=0;
piaoxi();
}
else if(Level==0)
{
beep_flag=1;
}
}
else if(second>=960&&second<1080)paishui();
else if(second>=1080&&second<1200)jinshui();
else if(second>=1200&&second<1320)
{
if(Level==1)
{
beep_flag=0;
piaoxi();
}
else if(Level==0)
{
beep_flag=1;
}
}
else if(second>=1320&&second<1440)paishui();
else if(second>=1440&&second<1560)tuoshui();
else
{
MotorFlag=0;
time=0;
State=0;
}
}
void Mode2(void)
{
if(second<60)jinshui();
else if(second>=60&&second<120)
{
if(Level==1)
{
beep_flag=0;
xidi();
}
else if(Level==0) beep_flag=1;
}
else if(second>=120&&second<180)paishui();
else if(second>=180&&second<240)jinshui();
else if(second>=240&&second<300)
{
if(Level==1)
{
beep_flag=0;
piaoxi();
}
else if(Level==0) beep_flag=1;
}
else if(second>=300&&second<360)paishui();
else if(second>=360&&second<420)jinshui();
else if(second>=420&&second<480)
{
if(Level==1)
{
beep_flag=0;
piaoxi();
}
else if(Level==0) beep_flag=1;
}
else if(second>=480&&second<540)paishui();
else if(second>=540&&second<600)tuoshui();
else
{
MotorFlag=0;
time=0;
State=0;
}
}
void Mode3(void)
{
if(second<60)jinshui();
else if(second>=60&&second<120)
{
if(Level==1)
{
beep_flag=0;
xidi();
}
else if(Level==0) beep_flag=1;
}
else
{
MotorFlag=0;
time=0;
State=0;
}
}
void Mode4(void)
{
if(second<60)paishui();
else if(second>=60&&second<120)
{
if(Cover==1)
{
tuoshui();
}
else
{
MotorFlag=0;
Water_In=1;
Water_Out=1;
time=0;
State=0;
Mode=0;
}
}
else
{
MotorFlag=0;
State=0;
time=0;
}
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main(void)
{
LcdInit();
TimerInit();
RelayInit();
while(1)
{
//************************************************************//
//*********************按键部分***************************//
//************************************************************//
KeyDown(p); //按键判断函数
if(flag==1)
{
flag=0;
switch(KeyValue) //位选
{
case(1):{ State=!State; break;}
case(2):{ Mode++; break;}
case(3):{ Level=!Level; break;}
case(4):{ Cover=!Cover; break;}
}
}
//************************************************************//
//*********************工作状态*******************************//
//************************************************************//
if(Mode>4)Mode=1;
if(Mode==1&&State==1)
{
Mode1();
}
else if(Mode==2&&State==1)
{
Mode2();
}
else if(Mode==3&&State==1)
{
Mode3();
}
else if(Mode==4&&State==1)
{
Mode4();
}
//************************************************************//
//*********************这里是lcd1602显示*********************//
//************************************************************//
// 类似print,将Tem,speed打印到Disp中
// 电机运行状态
/*
洗衣模式(标准、经济、单洗、单脱)
水位
盖子
洗衣状态(进水、洗涤、漂洗、排水)
*/
//sprintf(Disp1, "S:%d M:%d L%d C%d W%d", State, Mode, Water_Level, Cover, Wash);
sprintf(Disp1, "T:%d M:%d L:%d C:%d ", second, Mode, Level, Cover);
for(cnt=0;cnt<16;cnt++)
{
LcdWriteData(Disp1[cnt]);
}
}
}