📄 洗衣机.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 + -