?? 洗衣機._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 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()
{
uchar set_water_lv=1;//進水標志位
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 + -