⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 洗衣机.c

📁 自己做的AVR洗衣机模型程序
💻 C
字号:
#include <iom16v.h>
#include <macros.h>
#include <bit.h>
#include "24L01.h"
#include "driver.h"
#define start_t0	   TCCR0 = 0x04
#define stop_t0		   TCCR0=0x00
#define out_o_not	   if(flag_start==0)break
uchar *h1={"开始设置请按下:"};
uchar *h2={"“设置键”"}; 
uchar *h3={"直接洗衣请按下:"};
uchar *h4={"“启动洗衣键”"};
uchar *working1={"正在加水.."};
uchar *working2={"开始洗衣.."};
uchar *working3={"已循环圈数:"};
uchar *working4={"已重复次数:"};
uchar *stoping={"洗衣结束"};
uchar out_water_lv;
uchar set_water_lv
uchar speed=2;

//uchar fen[3];
//uchar miao[3];
uchar *pp;
uchar ii;
volatile uchar timer;
uchar Have_done;//圈数

void uart0_rx_isr(void);
void main()
{
while(1)//总循环
{
Display_init();//LCD初始化
Uart_Init();//串口初始化
Delay(20);
Char_Set_XY(0,0,h1);
Char_Set_XY(1,1,h2);
Char_Set_XY(0,2,h3);
Char_Set_XY(0,3,h4); 	
while(flag_start==0)
	{	
		key_scan();
		switch (nn)
		{
		case 1:set_watlev();break;
		case 2:set_health();break;
		case 3:set_cycle();break;
		case 4:set_replay();break;
		default:break;
		}
	}

Have_done=0;
while(flag_start==1)//洗衣大循环
{
cls;
Delay(2);
Char_Set_XY(0,2,working4);//已重复次数
W_1byte(0,1,0x30+Have_done);
if(replay==0)//重洗次数
		break;
out_o_not;//判断是否应该退出大循环

//加水并进行水位监控
Char_Set_XY(0,0,working1);//正在加水
Delay(1);
Char_Set_XY(0,1,"当前水位:");//当前水位:
    switch(wat_lv)
    {
    case 3:Char_Set_XY(5,1,"高");break;
    case 2:Char_Set_XY(5,1,"中");break;
    case 1:Char_Set_XY(5,1,"低");break;
    default:break;
    }
out_o_not;//判断是否应该退出大循环
		DDR_PC3=1;//配置PC3为进出水控制口
		Water_in(1);//进水函数,1为进水
		set_water_lv=1;//进水程序标志位

		while(set_water_lv)
		{
		out_o_not;//判断是否应该退出大循环
		PORTC|=BIT(wat_lv-1);//高阻态输入端口
		DDRC&=~BIT(wat_lv-1);//设置水位监控端口
		PORTC&=~BIT(wat_lv-1);//高阻态输入端口
		Delay(10);
		i=PINC;
			if((i&BIT(wat_lv-1))==0)//水浸没监控点
			{
					PORTC|=BIT(wat_lv-1);//高阻态输入端口
					DDRC&=~BIT(wat_lv-1);//设置水位监控端口
					PORTC&=~BIT(wat_lv-1);//高阻态输入端口
				Delay(1000);
				i=PINC;
				if((i&BIT(wat_lv-1))==0)//检查信号可靠性
				{
				Water_in(0);//进水函数,0为停止进水
				set_water_lv=0;
				}
			}
		}

out_o_not;//判断是否应该退出大循环
cls;//清屏
Delay(2);
Char_Set_XY(0,0,working2);//开始洗衣
timer0_init();//定时时钟初始化
Char_Set_XY(0,1,working3);//开始洗衣
start_t0;
SET_PWMA(speed);//设置洗衣强弱模式



for(BBBuffer=0;BBBuffer<cycle;BBBuffer++)//循环圈数
		{out_o_not;//判断是否应该退出大循环
		Set_XY(6,1);
		W_1byte(0,1,0x30+BBBuffer);//显示数字
			get_clean();//洗衣子程序
		}
out_o_not;//判断是否应该退出大循环



cls;
Delay(2);
Char_Set_XY(0,0,"正在排水。。");
stop_t0;
	while(1)
	{
		out_o_not;//判断是否应该退出大循环
		Water_out(1);
		out_water_lv=1;//进水程序标志位

		while(out_water_lv)
		{
		out_o_not;//判断是否应该退出大循环
		PORTC|=BIT(3);//高阻态输入端口
		DDRC&=~BIT(3);//设置水位监控端口
		PORTC&=~BIT(3);//高阻态输入端口
		Delay(10);
		i=PINC;
			if((i&BIT(3))==0)//水浸没监控点
			{
					PORTC|=BIT(3);//高阻态输入端口
					DDRC&=~BIT(3);//设置水位监控端口
					PORTC&=~BIT(3);//高阻态输入端口
				Delay(1000);
				i=PINC;
				if((i&BIT(3))==0)//检查信号可靠性
				{
				Water_out(0);//进水函数,0为停止进水
				out_water_lv=0;
				}
			}
		}
		break;
	}
start_t0;
out_o_not;//判断是否应该退出大循环
cls;
Delay(2);
Char_Set_XY(0,1,"衣服脱水中");
Char_Set_XY(0,2,"请等待...");
Char_Set_XY(0,3,"已循环:  次");
SET_PWMA(3);//设置速度
	for(BBBuffer=0;BBBuffer<=cycle;BBBuffer++)
	    {
		Set_XY(4,3);
		W_1byte(0,1,0x30+BBBuffer);//显示数字
		out_o_not;//判断是否应该退出大循环
	        get_dry();//甩干子程序
	    }
		 replay--;
		 Have_done++;
}
cls;
Delay(2);
start_t0;
Char_Set_XY(1,1,stoping);	//洗衣结束
for(BBBuffer=0;BBBuffer<5;BBBuffer++)
       {
	   bell(0);//结束蜂鸣器声
 	   wait_time(1);
	   while(count<endcount);
	   bell(1);
	   wait_time(1);
	   while(count<endcount);
       }

wait_time(15);
stop_t0;
Port_close();
}

}
		




#pragma interrupt_handler timer0_ovf:10
void timer0_ovf(void)
{
SREG = 0x80;   //开中断 
TCNT0 = 0x06; //重装计数值

tt++;
if(tt==125)
  {
  tt=0;
  count++;
  timer--;
  }
}

#pragma interrupt_handler zhongduan:2  //外部中断0向量入口
void zhongduan()
{
 	sta=SPI_Read(STATUS); // read register STATUS's value读状态寄存器(读中断状态)
	SPI_RW_Reg(WRITE_REG+STATUS,sta);// clear RX_DR or TX_DS or MAX_RT interrupt flag
	//清除中断状态位
  	if(sta&RX_DR)    // if receive data ready (RX_DR) interrupt如果收到接收结束中断
 		 {
  			SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
			//读24L01接收缓冲器数据
			handle_receive(rx_buf);
  		 }
 	if(sta&MAX_RT)//同一数据确认溢出中断
		 {
 			SPI_RW_Reg(FLUSH_TX,0x00);//清楚FIFO寄存器
		 }
 	if(sta&TX_DS)//如果收到传送结束终端
 		{
   			;
 		}
  	RX_Mode();
}

#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
void uart0_rx_isr(void)
{   UCSRB&=~BIT(RXCIE);
 	ii=UDR;
	switch (ii)
		{
	
		case start://pp=flag_start;
			Getchar();flag_start=Getchar()-0x30;BBBuffer=1;break;

		case wat:
			Getchar();wat_lv=Getchar()-0x30;BBBuffer=1;break;
		
		case heal:
			Getchar();health=Getchar()-0x30;BBBuffer=1;break;
	
		case cyc:
			Getchar();cycle=Getchar()-0x30;BBBuffer=1;break;
	
		case rep:
			Getchar(),replay=Getchar()-0x30;BBBuffer=1;break;
	
		default:break;
		}
	UCSRB|=BIT(RXCIE);

}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -