基于stm32f103的简易洗衣机控制系统设计

一、实验要求:


基于stm32f103zet6编写程序,设计一个简易洗衣机控制系统,可以通过键盘设定洗衣时间和洗衣次数,可以显示洗涤、漂洗等时间,可以进行强洗和弱洗选择,可以进行水位检测模拟,并且洗完可以报警。

二、设计思路:

首先针对第一个要求通过键盘设定洗衣时间和洗衣次数,我使用了游戏手柄来控制,而我将洗衣时间分为洗涤时间和漂洗时间,分别设定,二者的分和秒均可自由调节,而按下相应按键时洗衣次数也会增加。

对于第二个要求显示洗涤、漂洗等时间,我在第一个要求中已经实现了洗涤时间和漂洗时间的分别设定,在按下开启按键后,开始洗涤,洗涤时间开始倒计时,当洗涤结束后红灯亮进行提示,然后开始漂洗,漂洗时间开始倒计时,

对于强洗和弱洗的模式选择,我依然通过游戏手柄上的按键来控制,首先我设置默认为强洗模式,按下按键次数为奇数时变更为弱洗模式,按下按键次数为偶数时不变,仍为强洗模式。

对于水位检测模拟,我设定10为临界状态,当水位超过10时,绿灯亮起,当按下触摸按键时,绿灯可以短暂熄灭,而水位值的设定我依然通过按键,初始值为零,依次加一。

在上述要求之外,我还设计了实时时间显示,通过RTC来显示年月日、时分秒、以及星期,同时由于usmart的功能,通过向串口调试助手发送相应参数值,可以校正当前时间,或者变更为其他时间。此外,我还设计了实时采集当前温度,并在LCD屏上显示。

三、主要代码:


该代码以正点原子战舰开发板v3提供的例程为根本遵循,故只给出main.c,main.c中代码如下:

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"	
#include "usmart.h"	 
#include "rtc.h" 
#include "joypad.h" 
#include "tpad.h"
#include "beep.h"
#include "tsensor.h"

 int main(void)
 {	 
 	u8 t=0;	
	u8 key,keyy;
	u8 cs=0;
	u8 sw=0;
	u8 x=0;
	u8 k;
	u8 dt1=0,dt2=0;u8 pt1=0,pt2=0;
	u16 temp1;u16 adcx;
	 
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 	//串口初始化为115200
 	LED_Init();			     //LED端口初始化
	LCD_Init();	
    KEY_Init();	 
	usmart_dev.init(SystemCoreClock/1000000);	//初始化USMART	
	RTC_Init();	  			//RTC初始化
	JOYPAD_Init();
	TPAD_Init(6);
	BEEP_Init();
	T_Adc_Init();
	 
	POINT_COLOR=RED;//设置字体为红色 
	LCD_ShowString(30,50,200,16,16,"washing  machine ");	
	LCD_ShowString(30,70,200,16,16,"Washing Time:         :");	 //洗涤时间
	LCD_ShowString(30,90,200,16,16,"Rinsing time:         :");   //漂洗时间
	LCD_ShowString(30,110,200,16,16,"Laundry frequency:");	     //洗衣次数
	LCD_ShowString(30,130,200,16,16,"Laundry mode:");            //洗衣模式
	LCD_ShowString(30,150,200,16,16,"water level:");             //洗衣模式
	LCD_ShowString(30,170,200,16,16,"current time");             //当前时间
	POINT_COLOR=BLUE;//设置字体为蓝色
	LCD_ShowString(30,190,200,16,16,"    -  -  ");	   
	LCD_ShowString(30,210,200,16,16,"   :   :   ");		    
	while(1)
	{	
		if(t!=calendar.sec)
		{
			t=calendar.sec;
			LCD_ShowNum(30,190,calendar.w_year,4,16);									  
			LCD_ShowNum(70,190,calendar.w_month,2,16);									  
			LCD_ShowNum(100,190,calendar.w_date,2,16);	 
			switch(calendar.week)
			{
				case 0:
					LCD_ShowString(30,230,200,16,16,"Sunday   ");
					break;
				case 1:
					LCD_ShowString(30,230,200,16,16,"Monday   ");
					break;
				case 2:
					LCD_ShowString(30,230,200,16,16,"Tuesday  ");
					break;
				case 3:
					LCD_ShowString(30,230,200,16,16,"Wednesday");
					break;
				case 4:
					LCD_ShowString(30,230,200,16,16,"Thursday ");
					break;
				case 5:
					LCD_ShowString(30,230,200,16,16,"Friday   ");
					break;
				case 6:
					LCD_ShowString(30,230,200,16,16,"Saturday ");
					break;  
			}
			LCD_ShowNum(30,210,calendar.hour,2,16);									  
			LCD_ShowNum(60,210,calendar.min,2,16);									  
			LCD_ShowNum(90,210,calendar.sec,2,16);
		}	
		delay_ms(10);	

		key=KEY_Scan(1);
		if(key)
		{	 				  
			switch(key)
			{
				case KEY0_PRES:;break;			   
				case KEY1_PRES:;break;	    
				case KEY2_PRES:break;	    
				case WKUP_PRES:k=0;break;		 				 
			}
			
		}
		else delay_ms(100);
		
		if(k==0)
		{
			printf("开始洗衣\r\n");
			if(dt1>0)  
			{
				dt2--;
			    if(dt2==0)  
				{	
				  dt2=59;dt1--;
				}
			}
			if(dt1==0) 
			{
				dt2--;
			    if(dt2==0) 
				{
					k=1;			        
				}
			}
		}
		if(k==1)
		{
			if(pt1>0)
			        {
				     pt2--;
			         if(pt2==0)  
				    {	
				     pt2=59;pt1--;
				    }
			        }
			        if(pt1==0) 
				    pt2--;
				    if(pt2==0)
				    {
						BEEP=1;
						k=2;
					}
		}
		if(k==2)
		{
			printf("洗衣完毕\r\n"); 
		}
		
								
		keyy=JOYPAD_Read();	
		if(keyy)
		{	 
				  
			switch(keyy)
			{	    
				case 16:dt1=dt1+1;break;	  //UP	  
				case 32:dt2=dt2+1;break;	  //DOWN   
				case 64:pt1=pt1+1;break;	  //LEFT    
				case 128:pt2=pt2+1;break;     //RIGHT		    
				case 4:x=x+1;break;		      //SELECT   
				case 8:cs=cs+1;break;	      //START	  
				case 2:sw=sw+1;break;	      //A		   					
				case 1:;break;	 	          //B
			}
			
		}
		else delay_ms(700);	 
		
		if(sw>10) LED1=0;
		if(TPAD_Scan(0))	
		{
		  LED1=!LED1;		
		} 
		
		if(x%2==0)	LCD_ShowString(130,130,200,16,16,"Forcedwashing");		    
		else        LCD_ShowString(130,130,200,16,16,"Weakwashing");
		
		temp1=Get_Temprate();	//得到温度值 
        LCD_ShowString(30,250,200,16,16,"TEMPERATE: 00.00C");	
        adcx=temp1/100;		
		LCD_ShowxNum(30+11*8,250,adcx,2,16,0);		//显示整数部分
		LCD_ShowxNum(30+14*8,250,temp1%100,2,16, 0X80);	//显示小数部分
		
		LCD_ShowNum(200,110,cs,2,16);									  
		LCD_ShowNum(200,150,sw,2,16);	
		LCD_ShowNum(180,70,dt1,2,16);
		LCD_ShowNum(210,70,dt2,2,16);
		LCD_ShowNum(180,90,pt1,2,16);	
		LCD_ShowNum(210,90,pt2,2,16);
	}
 }

四、实验结果:

该图为洗衣机初始状态,从上至下依次为洗涤时间,漂洗时间,洗衣次数,洗衣模式(默认为强洗),水位,当前时间,当前温度

 

该图为对洗涤时间和漂洗时间的设定,洗涤时间设定为1分2秒,漂洗时间设定为3分3秒

 

该图为洗衣模式的切换,由强洗切换为弱洗

 

该图为洗衣次数的调节,当前显示为8件 

该图为洗涤时间倒计时

 

该图为漂洗时间倒计时(先洗涤再漂洗)

 

该图为水位调节,当前为13,我设定大于10时报警,绿灯亮

 

按下触摸按键后,灯灭

 

该图所示时间可以进行调节 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值