//滚筒洗衣机 //www.ouravr.com //版权声明:ourAVR网站获得了作者的授权在网上发布此资料。 //2007.04.04 //ICC-AVR application builder : // Target : M16 // Crystal: 8.0000Mhz #include #include #include //PA //NTC IN #define clk 0x02 //NC #define com7 0x08 #define com1 0x10 #define com6 0x20 #define com2 0x40 #define com3 0x80 #define clk_h SETBIT(PORTA,clk) #define clk_l CLRBIT(PORTA,clk) #define com7_h SETBIT(PORTA,com7) #define com7_l CLRBIT(PORTA,com7) #define com6_h SETBIT(PORTA,com6) #define com6_l CLRBIT(PORTA,com6) #define com1_h SETBIT(PORTA,com1) #define com1_l CLRBIT(PORTA,com1) #define com2_h SETBIT(PORTA,com2) #define com2_l CLRBIT(PORTA,com2) #define com3_h SETBIT(PORTA,com3) #define com3_l CLRBIT(PORTA,com3) //PB #define data 0x01 #define direct 0x02 #define wash_spin 0x04 #define heat 0x08 //DOOR IN #define door_in 0x10 //WATER2 #define water2 0x20 //WATER1 #define water1 0x40 #define bumpa 0x80 #define data_h SETBIT(PORTB,data) #define data_l CLRBIT(PORTB,data) #define direct_on SETBIT(PORTB,direct) #define direct_off CLRBIT(PORTB,direct) #define wash_on CLRBIT(PORTB,wash_spin) #define spin_on SETBIT(PORTB,wash_spin) #define heat_on SETBIT(PORTB,heat) #define heat_off CLRBIT(PORTB,heat) #define bumpa_on SETBIT(PORTB,bumpa) #define bumpa_off CLRBIT(PORTB,bumpa) //PD #define bumpb 0x01 #define bumpc 0x02 //ZERO IN #define zero_in 0x04 //SPEED IN #define speed_in 0x08 #define bumph 0x10 #define drain 0x20 #define door 0x40 #define motor 0x80 #define bumpb_on SETBIT(PORTD,bumpb) #define bumpb_off CLRBIT(PORTD,bumpb) #define bumpc_on SETBIT(PORTD,bumpc) #define bumpc_off CLRBIT(PORTD,bumpc) #define bumph_on SETBIT(PORTD,bumph) #define bumph_off CLRBIT(PORTD,bumph) #define drain_on SETBIT(PORTD,drain) #define drain_off CLRBIT(PORTD,drain) #define door_on SETBIT(PORTD,door) #define door_off CLRBIT(PORTD,door) #define motor_on SETBIT(PORTD,motor) #define motor_off CLRBIT(PORTD,motor) //PC #define buz 0x01 #define key_in 0x02 //S1/SPEED SET #define speed_set 0x04 //S2/MODE SET #define mode_set 0x08 //S4 //S3 #define com4 0x80 #define com5 0x40 #define buz_on SETBIT(PORTC,buz) #define buz_off CLRBIT(PORTC,buz) #define com4_h SETBIT(PORTC,com4) #define com4_l CLRBIT(PORTC,com4) #define com5_h SETBIT(PORTC,com5) #define com5_l CLRBIT(PORTC,com5) #define k_power 1 #define k_start 2 #define k_cycle 3 #define k_fab 4 #define k_temp 5 #define k_extrinse 6 #define k_delay 7 unsigned int temp_ad; unsigned int value,ad; unsigned char ad_count; unsigned char water_temp; unsigned char fact_water_temp; unsigned char water_temp1; unsigned char water_temp2; unsigned char t_1ms; unsigned char t_3ms; unsigned char t_10ms; unsigned char t_50ms; unsigned char t_100ms; unsigned int t_500ms; unsigned int t_1s; unsigned int t_1m; unsigned char t_1m_count; unsigned int time_t_1h_count; unsigned char time_data; unsigned char scan_count; unsigned char buz_count; unsigned char end_buz_count; unsigned char test_buz_count; unsigned char k_power_count;//key_count unsigned char k_start_count; unsigned char k_cycle_count; unsigned char k_fab_count; unsigned char k_temp_count; unsigned char k_extrinse_count; unsigned char k_delay_count; unsigned char set_count; unsigned char key_num; unsigned int addr; unsigned int addr1; unsigned int enter_water_count; //err_count unsigned char drain_count; unsigned char overflow_count; unsigned char door_lock_count; unsigned int rise_temp_count; unsigned char motor_count; unsigned char door_on_count; unsigned char door_off_count; unsigned char water1_on_count; unsigned char water1_off_count; unsigned char water2_on_count; unsigned char water2_off_count; unsigned char test_count; unsigned char test_time_count; unsigned char test_disp_count; unsigned char temp_disp_count; unsigned char delay_flash_count; unsigned char time_flash_count; unsigned char spin_count; //脱水计数 unsigned int low_spin_count; unsigned char main_wash_time; unsigned int speed_count; unsigned char wash_time_count; unsigned char wash_t; unsigned char flag_prewash;//过程标志 unsigned char flag_wash; unsigned char flag_rinse; unsigned char flag_extrinse; unsigned char flag_spin; unsigned char flag_time; unsigned char disp0,disp1,disp2,dig1,dig2,dig3,dig4;//dig为数字 unsigned int s1;//实际测得转速 unsigned int s2;//设定转速 unsigned char t2_count; unsigned char t1_count; unsigned int t;//定时器timer1定时常数 unsigned int t1;//可控硅延时开通起始时间,调速宽度t1/100us单位 //可控硅固定开通时间//单位100us待定 #define t2 9000 #define t0 1000 //时间步长250us #define t_step 20 //初始速度100us #define t 0xFFFF-t1-100 #define led_h_h_on SETBIT(disp1,0x40) #define led_h_h_off CLRBIT(disp1,0x40) //#define led_h_h_flash disp1^=0x40 #define led_h_c_on SETBIT(disp0,0x10) #define led_h_c_off CLRBIT(disp0,0x10) //#define led_h_c_flash disp0^=0x10 #define led_w_w_on SETBIT(disp0,0x04) #define led_w_w_off CLRBIT(disp0,0x04) //#define led_w_w_flash disp0^=0x04 #define led_c_c_on SETBIT(disp0,0x02) #define led_c_c_off CLRBIT(disp0,0x02) //#define led_c_c_flash disp0^=0x02 #define led_mianma_on SETBIT(disp1,0x10) #define led_mianma_off CLRBIT(disp1,0x10) //#define led_mianma_flash disp1^=0x10 #define led_huaxian_on SETBIT(disp1,0x08) #define led_huaxian_off CLRBIT(disp1,0x08) //#define led_huaxian_flash disp1^=0x08 #define led_sinong_on SETBIT(disp1,0x01) #define led_sinong_off CLRBIT(disp1,0x01) //#define led_sinong_flash disp1^=0x01 #define led_maoliao_on SETBIT(disp0,0x80) #define led_maoliao_off CLRBIT(disp0,0x80) //#define led_maoliao_flash disp0^=0x80 #define led_prewash_on SETBIT(disp1,0x20) #define led_prewash_off CLRBIT(disp1,0x20) #define led_prewash_flash disp1^=0x20 #define led_wash_on SETBIT(disp0,0x08) #define led_wash_off CLRBIT(disp0,0x08) #define led_wash_flash disp0^=0x08 #define led_rinse_on SETBIT(disp1,0x04) #define led_rinse_off CLRBIT(disp1,0x04) #define led_rinse_flash disp1^=0x04 #define led_spin_on SETBIT(disp0,0x01) #define led_spin_off CLRBIT(disp0,0x01) #define led_spin_flash disp0^=0x01 #define led_extrinse_on SETBIT(disp1,0x02) #define led_extrinse_off CLRBIT(disp1,0x02) #define led_extrinse_flash disp1^=0x02 #define led_delay_on SETBIT(disp0,0x20) #define led_delay_off CLRBIT(disp0,0x20) #define led_delay_flash disp0^=0x20 #define led_door_on SETBIT(disp0,0x40) #define led_door_off CLRBIT(disp0,0x40) #define led_door_flash disp0^=0x40 #define colon_on SETBIT(disp2,0x50) #define colon_off CLRBIT(disp2,0x50) #define colon_flash disp2^=0x50 #define c_on SETBIT(disp2,0x08) #define c_off CLRBIT(disp2,0x08) //#define c_flash disp2^=0x08 //74LS164QG-QA QH=0数码管共阳 const unsigned char data_7seg[]={0x5F,0x48,0x73,0x79,0x6C,0x3D,0x3F,0x58,0x7F,0x7D,0x37,0x22,0x17,0x08,0x00}; // 0,1,2,3,4,5,6,7,8,9,E,R,c,度,无显示, //----------------------------------------------------------------------------- // A/D table -10~110度 //----------------------------------------------------------------------------- //#pragma data:data const unsigned int adtable[]= { //0x3F1,0x3BD,0x3BA,0x3B7,0x3B0,0x3A8,0x3A2,0x39F,0x39D,0x398, 0x393,0x38F,0x387,0x385,0x382,0x380,0x378,0x371,0x366,0x360, 0x35E,0x355,0x34D,0x340,0x33E,0x338,0x330,0x327,0x31F,0x31C, 0x30F,0x307,0x305,0x303,0x300,0x2E6,0x2E0,0x2D5,0x2C7,0x2C0, 0x2BF,0x2B1,0x2A2,0x29B,0x290,0x27F,0x27B,0x278,0x267,0x260, 0x258,0x24C,0x23F,0x238,0x22F,0x21F,0x218,0x20E,0x203,0x1FC, 0x1F0,0x1E7,0x1E0,0x1D8,0x1C7,0x1C0,0x1BD,0x1B0,0x1A3,0x19E, 0x18F,0x187,0x182,0x180,0x170,0x167,0x160,0x158,0x14F,0x144, 0x13F,0x138,0x130,0x127,0x11F,0x11C,0x110,0x106,0x103,0xFF, 0xFC,0xF8,0xF0,0xE7,0xE3,0xE0,0xD8,0xCF,0xC9,0xC6, 0xC3,0xC0,0xB8,0xB5,0xB0,0xA7,0xA5,0xA2,0x9F,0x9C, 0x98,0x94,0x8F,0x8D,0x8A,0x7F,0x7C,0x7A,0x78,0x75, }; void buzing(void)//一次130-150ms { if( f3.bit.buzed==1)//按键 { buz_count++; buz_on; if(buz_count>=3) { buz_count=0; buz_off; f3.bit.buzed=0; } } } void end_buzing(void) { end_buz_count++; PORTC^=buz; if(end_buz_count>=12) { end_buz_count=0; buz_off; f2.bit.end_buz=1; } } void test_buzing(void) { if(f3.bit.test_buz==1) { buz_off; PORTC^=buz; test_buz_count++; if(test_buz_count>=3) { buz_off; test_buz_count=0; f3.bit.test_buz=0; } } } void err_buzing(void) { if((f10.byte!=0)||(f11.bit.motor_erred==1)) PORTC^=buz; } void disp_test(void) { if(test_count==0) {dig1=dig2=dig3=dig4=0;colon_flash;} if(test_count==2) {dig1=dig2=dig3=dig4=1;colon_flash;} if(test_count==4) {dig1=dig2=dig3=dig4=2;colon_flash;} if(test_count==6) {dig1=dig2=dig3=dig4=3;colon_flash;} if(test_count==8) {dig1=dig2=dig3=dig4=4;colon_flash;} if(test_count==10) {dig1=dig2=dig3=dig4=5;colon_flash;} } void disp_delay_time(void) { c_off; dig1=time_data/10; dig2=time_data%10; dig3=dig4=0x00; if(f2.bit.started==1) colon_flash; else colon_on; } void disp_time(void) { c_off; if(f2.bit.started==1) colon_flash; else colon_on; dig1=0; dig2=main_wash_time/60; dig3=(main_wash_time-dig2*60)/10; dig4=main_wash_time-dig2*60-dig3*10; } void disp_temp(void) { colon_off; c_on; dig1=0; dig2=water_temp/10; dig3=water_temp%10; dig4=12;//data_7seg[12];C } void disp_time_temp(void) { if(f8.bit.time_disp==0) { disp_time(); temp_disp_count++; if(temp_disp_count>8) { temp_disp_count=0; f8.bit.temp_disp=1; f8.bit.time_disp=1; } } else { if(f8.bit.temp_disp==1) { disp_temp(); temp_disp_count++; if(temp_disp_count>8) { temp_disp_count=0; f8.bit.temp_disp=0; f8.bit.time_disp=0; } } } } void disp_err(void) { if(f10.bit.enter_water_erred==1) {dig1=10;dig2=dig3=11;dig4=1;colon_off;c_off;} //显示ERR1 if(f10.bit.drain_erred==1) {dig1=10;dig2=dig3=11;dig4=2;colon_off;c_off;} //显示ERR2 if(f10.bit.overflow_erred==1) {dig1=10;dig2=dig3=11;dig4=3;colon_off;c_off;} if(f10.bit.door_lock_erred==1) {dig1=10;dig2=dig3=11;dig4=4;colon_off;c_off;} if(f10.bit.rise_temp_erred==1) {dig1=10;dig2=dig3=11;dig4=5;colon_off;c_off;} if(f10.bit.abnormality_temp_erred==1) {dig1=10;dig2=dig3=11;dig4=6;colon_off;c_off;} if(f10.bit.sensor_erred==1) {dig1=10;dig2=dig3=11;dig4=7;colon_off;c_off;} if(f11.bit.motor_erred==1) {dig1=10;dig2=dig3=11;dig4=8;colon_off;c_off;} } void disp_conv(void) //数码管显示处理 { if(f1.bit.tested==1) disp_test();//测试显示 else { if(f2.bit.powered==1) { if(f2.bit.started==1)//程序运行显示 { if((f10.byte!=0)||(f11.bit.motor_erred==1)) disp_err(); else { if(flag_time>=1) disp_delay_time();//定时显示 else disp_time(); //洗涤时间显示 } } else //程序暂停显示 { if(f3.bit.set==0) //暂停状态 { if(flag_time>0) { if(flag_time==1) disp_delay_time(); else //显示闪烁 { delay_flash_count++; if(delay_flash_count==1) {dig1=dig2=dig3=dig4=14;disp2=0;} else {delay_flash_count=0;disp_delay_time();} } } else { time_flash_count++; if(time_flash_count==1) {dig1=dig2=dig3=dig4=14;disp2=0;} else {time_flash_count=0;disp_time();} //洗涤时间显示闪烁 } } else //设定状态 { if(flag_time==!0) disp_delay_time(); else { if((f0.bit.k_fab_pushed==1)||(f0.bit.k_cycle_pushed==1)||(f0.bit.k_extrinse_pushed==1)) { f0.bit.k_temp_pushed=0; disp_time(); set_count++; if(set_count>=3) { set_count=0; f0.bit.k_fab_pushed=0; f0.bit.k_cycle_pushed=0; f0.bit.k_extrinse_pushed=0; } } else if(f0.bit.k_temp_pushed==1) { f0.bit.k_fab_pushed=0; f0.bit.k_cycle_pushed=0; f0.bit.k_extrinse_pushed=0; disp_temp(); set_count++; if(set_count>=3) { set_count=0; f0.bit.k_temp_pushed=0; } } else disp_time_temp(); } } } } } } void led_disp_test(void) { if(f11.bit.test_prog_end==0) { test_disp_count++; disp0&=0x40;disp1=0; if(test_disp_count==1) {led_delay_off;led_extrinse_on;} if(test_disp_count==2) {led_extrinse_off;led_h_h_on;} if(test_disp_count==3) {led_h_h_off;led_h_c_on;} if(test_disp_count==4) {led_h_c_off;led_w_w_on;} if(test_disp_count==5) {led_w_w_off;led_c_c_on;} if(test_disp_count==6) {led_c_c_off;led_prewash_on;} if(test_disp_count==7) {led_prewash_off;led_wash_on;} if(test_disp_count==8) {led_wash_off;led_rinse_on;} if(test_disp_count==9) {led_rinse_off;led_spin_on;} if(test_disp_count==10) {led_spin_off;led_mianma_on;} if(test_disp_count==11) {led_mianma_off;led_huaxian_on;} if(test_disp_count==12) {led_huaxian_off;led_sinong_on;} if(test_disp_count==13) {led_sinong_off;led_maoliao_on;} if(test_disp_count==14) {led_maoliao_off;led_delay_on;test_disp_count=0;} } if(f11.bit.test_prog_end==1) { if(f1.bit.doored==1) led_door_flash; else led_door_off; } else { if(test_count>=2) {if(f1.bit.doored==1) led_door_on;} } } void process_led_disp(void) { if(f1.bit.tested==1) led_disp_test();//测试显示 else { if(f2.bit.powered==1) { if(f9.bit.h_h_sel==1) led_h_h_on; else led_h_h_off; if(f9.bit.h_c_sel==1) led_h_c_on; else led_h_c_off; if(f9.bit.w_w_sel==1) led_w_w_on; else led_w_w_off; if(f9.bit.c_c_sel==1) led_c_c_on; else led_c_c_off; if(f9.bit.maoliao_sel==1) led_maoliao_on; else led_maoliao_off; if(f9.bit.sinong_sel==1) led_sinong_on; else led_sinong_off; if(f9.bit.huaxian_sel==1) led_huaxian_on; else led_huaxian_off; if(f9.bit.mianma_sel==1) led_mianma_on; else led_mianma_off; //显示洗衣状态和过程 if(flag_time==0) { if(flag_prewash==1) led_prewash_on; else if(flag_prewash==2) { if(f2.bit.started==1) led_prewash_flash; else led_prewash_on; } else led_prewash_off; // ------------------------------------- if(flag_wash==1) led_wash_on; else if(flag_wash==2) { if(f2.bit.started==1) led_wash_flash; else led_wash_on; } else led_wash_off; //--------------------------------------- if(flag_extrinse==1) led_extrinse_on; else if(flag_extrinse==2) { if(f2.bit.started==1) led_extrinse_flash; else led_extrinse_on; } else led_extrinse_off; // --------------------------------------- if(flag_rinse==1) led_rinse_on; else if(flag_rinse==2) { if(f2.bit.started==1) led_rinse_flash; else led_rinse_on; } else led_rinse_off; //-------------------------------- if(flag_spin==1) led_spin_on; else if(flag_spin==2) { if(f2.bit.started==1) led_spin_flash; else led_spin_on; } else led_spin_off; // -------------------------------- } else { if(flag_prewash==0) led_prewash_off; else led_prewash_on; if(flag_wash==0) led_wash_off; else led_wash_on; if(flag_extrinse==0) led_extrinse_off; else led_extrinse_on; if(flag_rinse==0) led_rinse_off; else led_rinse_on; if(flag_spin==0) led_spin_off; else led_spin_on; } if(flag_time==1) led_delay_on; else if(flag_time==2) { if(f2.bit.started==1) led_delay_flash; else led_delay_on; } else led_delay_off; if(f2.bit.started==1) { if(f3.bit.prog_end==1) { if(f1.bit.doored==1) led_door_flash; else led_door_off; } else { if(f1.bit.doored==1) led_door_on; else led_door_off; } } } } } void out_off(void) // { bumpa_off; bumpb_off; bumpc_off; bumph_off; drain_off; motor_off; wash_on; direct_off; heat_off; } void check_k_power(void) { if(f6.bit.key_power_push==0) { if(!CHKBIT(PINC,key_in)) f6.bit.key_power_push=1; } else { if(CHKBIT(PINC,key_in)) { key_num=k_power; f6.bit.key_power_push=0; f3.bit.buzed=1; f3.bit.set=1; } } } void check_k_start(void) { if((f2.bit.powered==1)||(f1.bit.tested==1)) { if(f6.bit.key_start_push==0) { if(!CHKBIT(PINC,key_in)) f6.bit.key_start_push=1; } else { if(CHKBIT(PINC,key_in)) { f6.bit.key_start_push=0; f0.bit.k_start_pushed=1; key_num=k_start;f3.bit.buzed=1; } } } if(!CHKBIT(PINC,key_in)) f2.bit.k_test3=1; else f2.bit.k_test3=0; } void check_k_cycle(void) { if((f2.bit.powered==1)&&(f2.bit.started==0)) { if(f6.bit.key_cycle_push==0) { if(!CHKBIT(PINC,key_in)) f6.bit.key_cycle_push=1; } else { if(CHKBIT(PINC,key_in)) { f6.bit.key_cycle_push=0; f0.bit.k_cycle_pushed=1; key_num=k_cycle;f3.bit.set=1;f3.bit.buzed=1; } } } } void check_k_fab(void) { if((f2.bit.powered==1)&&(f2.bit.started==0)) { if(f6.bit.key_fab_push==0) { if(!CHKBIT(PINC,key_in)) f6.bit.key_fab_push=1; } else { if(CHKBIT(PINC,key_in)) { f6.bit.key_fab_push=0; f0.bit.k_fab_pushed=1; key_num=k_fab;f3.bit.set=1;f3.bit.buzed=1; } } } } void check_k_temp(void) { if((f2.bit.powered==1)&&(f2.bit.started==0)) { if(f6.bit.key_temp_push==0) { if(!CHKBIT(PINC,key_in)) f6.bit.key_temp_push=1; } else { if(CHKBIT(PINC,key_in)) { f6.bit.key_temp_push=0; f0.bit.k_temp_pushed=1; key_num=k_temp;f3.bit.set=1;f3.bit.buzed=1; } } } } void check_k_extrinse(void) { if((f2.bit.powered==1)&&(f2.bit.started==0)) { if(f6.bit.key_extrinse_push==0) { if(!CHKBIT(PINC,key_in)) f6.bit.key_extrinse_push=1; } else { if(CHKBIT(PINC,key_in)) { f6.bit.key_extrinse_push=0; f0.bit.k_extrinse_pushed=1; key_num=k_extrinse;f3.bit.set=1;f3.bit.buzed=1; } } } else { if(!CHKBIT(PINC,key_in)) f2.bit.k_test2=1; else f2.bit.k_test2=0; } } void check_k_delay(void) { if((f2.bit.powered==1)&&(f2.bit.started==0)) { if(f6.bit.key_delay_push==0) { if(!CHKBIT(PINC,key_in)) f6.bit.key_delay_push=1; } else { if(CHKBIT(PINC,key_in)) { f6.bit.key_delay_push=0; f0.bit.k_delay_pushed=1; key_num=k_delay;f3.bit.set=1;f3.bit.buzed=1; } } } else { if(!CHKBIT(PINC,key_in)) f2.bit.k_test1=1; else f2.bit.k_test1=0; } } void process_key(void) { //----------------------------------------- if(key_num==k_power) { key_num=0; k_power_count++; if(k_power_count==1) { f2.bit.powered=1; //-------------------POWER ON默认程序:热洗冷漂,化纤,主洗+漂洗+脱水 f7.bit.wash_prog6=1; f9.bit.huaxian_sel=1; f9.bit.h_c_sel=1; flag_wash=flag_rinse=flag_spin=1; main_wash_time=86; water_temp=60; } else { k_start_count=0;//清START记数 k_power_count=0; f2.bit.powered=0; } } //----------------------------------------- if(f1.bit.tested==0) { if(key_num==k_start) { key_num=0; k_start_count++; if(k_start_count==1) f2.bit.started=1; else { k_start_count=0; f2.bit.started=0; } } } else //测试 { if(f11.bit.test_prog_end==0) { if(key_num==k_start) {key_num=0;test_count++;} } } if(key_num==k_fab) { key_num=0; f9.byte=0; k_cycle_count=0; f7.byte=f5.byte=0; flag_prewash=0; flag_wash=flag_rinse=flag_spin=1; k_fab_count++; if(k_fab_count==1) { f9.bit.mianma_sel=1; f9.bit.h_h_sel=1; water_temp=90; main_wash_time=106; } if(k_fab_count==2) { f9.bit.huaxian_sel=1; f9.bit.h_c_sel=1; water_temp=60; main_wash_time=86; } if(k_fab_count==3) { f9.bit.sinong_sel=1; f9.bit.h_c_sel=1; water_temp=60; main_wash_time=66; } if(k_fab_count==4) { f9.bit.maoliao_sel=1; f9.bit.w_w_sel=1; water_temp=45; main_wash_time=46; } if(k_fab_count>=5) { k_fab_count=1; f9.bit.mianma_sel=1; f9.bit.h_h_sel=1; water_temp=90; main_wash_time=86; } } ///----------------------------------------- if(f9.bit.mianma_sel==1) { if(key_num==k_cycle) { key_num=0; flag_extrinse=0; f7.byte=f5.byte=0; flag_prewash=flag_wash=flag_rinse=flag_spin=0; k_cycle_count++; if(k_cycle_count==1) { main_wash_time=120; f7.bit.wash_prog2=1; flag_prewash=flag_wash=flag_rinse=flag_spin=1; } else if(k_cycle_count==2) { main_wash_time=8; f7.bit.wash_prog3=1; flag_spin=1; } else if(k_cycle_count==3) { main_wash_time=21; f7.bit.wash_prog4=1; flag_rinse=flag_spin=1; } else if(k_cycle_count==4) { main_wash_time=98; f7.bit.wash_prog5=1; flag_wash=flag_rinse=1; } else if(k_cycle_count>4) { k_cycle_count=0; main_wash_time=106; f7.bit.wash_prog1=1; flag_wash=flag_rinse=flag_spin=1; } } else if(key_num==k_temp)//-------------------------------- { key_num=0; f9.bit.h_h_sel=f9.bit.h_c_sel=f9.bit.w_w_sel=f9.bit.c_c_sel=0; k_temp_count++; if(k_temp_count==1) {f9.bit.h_h_sel=1;water_temp=90;} if(k_temp_count==2) {f9.bit.h_c_sel=1;water_temp=60;} if(k_temp_count==3) {f9.bit.w_w_sel=1;water_temp=45;} if(k_temp_count==4) {f9.bit.c_c_sel=1;} if(k_temp_count>=5) {k_temp_count=1;f9.bit.h_h_sel=1;water_temp=90;} } } //--------------------------------------- else if(f9.bit.sinong_sel==1) { if(key_num==k_cycle) { key_num=0; flag_extrinse=0; f7.byte=f5.byte=0; flag_prewash=flag_wash=flag_rinse=flag_spin=0; k_cycle_count++; if(k_cycle_count==1) { main_wash_time=8; f7.bit.wash_prog3=1; flag_spin=1; } else if(k_cycle_count==2) { main_wash_time=21; f7.bit.wash_prog4=1; flag_rinse=flag_spin=1; } else if(k_cycle_count==3) { main_wash_time=58; f5.bit.wash_prog12=1; flag_wash=flag_rinse=1; } else if(k_cycle_count>3) { k_cycle_count=0; main_wash_time=66; f5.bit.wash_prog9=1; flag_wash=flag_rinse=flag_spin=1; } } else if(key_num==k_temp)//---------------------------- { key_num=0; f9.bit.h_h_sel=f9.bit.h_c_sel=f9.bit.w_w_sel=f9.bit.c_c_sel=0; k_temp_count++; if(k_temp_count==1) {f9.bit.h_c_sel=1;water_temp=60;} if(k_temp_count==2) {f9.bit.w_w_sel=1;water_temp=45;} if(k_temp_count==3) {f9.bit.c_c_sel=1;} if(k_temp_count>=4) {k_temp_count=1;f9.bit.h_c_sel=1;water_temp=60;} } } //--------------------------- else if(f9.bit.huaxian_sel==1) { if(key_num==k_cycle) { key_num=0; flag_extrinse=0; f7.byte=f5.byte=0; flag_prewash=flag_wash=flag_rinse=flag_spin=0; k_cycle_count++; if(k_cycle_count==1) { main_wash_time=100; f7.bit.wash_prog7=1; flag_prewash=flag_wash=flag_rinse=flag_spin=1; } else if(k_cycle_count==2) { main_wash_time=8; f5.bit.wash_prog10=1; flag_spin=1; } else if(k_cycle_count==3) { main_wash_time=21; f5.bit.wash_prog11=1; flag_rinse=flag_spin=1; } else if(k_cycle_count==4) { main_wash_time=78; f7.bit.wash_prog8=1; flag_wash=flag_rinse=1; } else if(k_cycle_count>4) { k_cycle_count=0; main_wash_time=86; f7.bit.wash_prog6=1; flag_wash=flag_rinse=flag_spin=1; } } else if(key_num==k_temp)//---------------------------- { key_num=0; k_temp_count++; f9.bit.h_c_sel=f9.bit.h_h_sel=f9.bit.w_w_sel=f9.bit.c_c_sel=0; if(k_temp_count==1) {f9.bit.h_c_sel=1;water_temp=60;} if(k_temp_count==2) {f9.bit.w_w_sel=1;water_temp=45;} if(k_temp_count==3) {f9.bit.c_c_sel=1;} if(k_temp_count>=4) {k_temp_count=1;f9.bit.h_c_sel=1;water_temp=60;} } } //--------------------------- else if(f9.bit.maoliao_sel==1) { if(key_num==k_cycle) { key_num=0; flag_extrinse=0; f7.byte=f5.byte=0; flag_prewash=flag_wash=flag_rinse=flag_spin=0; k_cycle_count++; if(k_cycle_count==1) { main_wash_time=8; f5.bit.wash_prog14=1; flag_spin=1; } else if(k_cycle_count==2) { main_wash_time=21; f5.bit.wash_prog15=1; flag_rinse=flag_spin=1; } else if(k_cycle_count==3) { main_wash_time=38; f5.bit.wash_prog16=1; flag_wash=flag_rinse=1; } else if(k_cycle_count>3) { k_cycle_count=0; main_wash_time=46; f5.bit.wash_prog13=1; flag_wash=flag_rinse=flag_spin=1; } } else if(key_num==k_temp)//---------------------------- { key_num=0; f9.bit.h_c_sel=f9.bit.h_h_sel=f9.bit.w_w_sel=f9.bit.c_c_sel=0; k_temp_count++; if(k_temp_count==1) {f9.bit.w_w_sel=1;water_temp=45;} if(k_temp_count==2) f9.bit.c_c_sel=1; if(k_temp_count>2) {k_temp_count=1;f9.bit.w_w_sel=1;water_temp=45;}// 是否选择没温度。 } } ///----------------------------------------- if(key_num==k_extrinse) { key_num=0; k_extrinse_count++; if(k_extrinse_count==1) { if((flag_spin>=1)&&(flag_prewash==0)&&(flag_wash==0)&&(flag_rinse==0)) flag_extrinse=0; else if(flag_rinse==2) {flag_rinse=1;flag_extrinse=1;;main_wash_time+=8;} else {flag_extrinse=1;main_wash_time+=8;} } else { k_extrinse_count=0; if(flag_extrinse==1) {flag_extrinse=0;main_wash_time-=8;} } } ///----------------------------------------- if(key_num==k_delay) { key_num=0; flag_time=1; time_data++; if(time_data>24) { time_data=0; flag_time=0; } } ///----------------------------------------- if(f2.bit.started==1) { f3.bit.set=0; if(flag_time>=1) flag_time=2; } } void check_water1(void) { if(!CHKBIT(PINB,water1)) { water1_off_count++; if(water1_off_count>=3) { f1.bit.water1ed=0; water1_off_count=0; } } else {water1_off_count=0; if(CHKBIT(PINB,water1)) { water1_on_count++; if(water1_on_count>=18) { f1.bit.water1ed=1; water1_on_count=0; } } else water1_on_count=0; } } void check_water2(void) { if(!CHKBIT(PINB,water2)) { water2_off_count++; if(water2_off_count>=3) { f1.bit.water2ed=0; water2_off_count=0; } } else {water2_off_count=0; if(CHKBIT(PINB,water2)) { water2_on_count++; if(water2_on_count>=18) { f1.bit.water2ed=1; water2_on_count=0; } } else water2_on_count=0; } } void check_door(void) { if(!CHKBIT(PINB,door_in)) { door_on_count++; if(door_on_count>=4) { f1.bit.doored=1; door_on_count=0; } } else door_on_count=0; if(CHKBIT(PINB,door_in)) { door_off_count++; if(door_off_count>=18) { f1.bit.doored=0; door_off_count=0; } } else door_off_count=0; } void check_switch(void) { check_water1(); check_water2(); check_door(); } void enter_water_err(void) //按START键取消 { if(f10.bit.enter_water_erred=0) { if((CHKBIT(PORTB,bumpa))||(CHKBIT(PORTD,bumpb))||(CHKBIT(PORTD,bumpc))||(CHKBIT(PORTD,bumph))) { enter_water_count++; if(enter_water_count>480) { enter_water_count=0; if(f1.bit.water1ed==0) f10.bit.enter_water_erred=1; } } } } void drain_err(void) { if(f10.bit.drain_erred==0) { if(CHKBIT(PIND,drain))//排水泵启动 { drain_count++; if(drain_count>240) { drain_count=0; if(f1.bit.water1ed==1) f10.bit.drain_erred=1; } } } } void overflow_err(void) { if(f10.bit.overflow_erred==0) { if(f1.bit.water2ed==1) { overflow_count++; if(overflow_count>2) { overflow_count=0; f10.bit.overflow_erred=1; } } } } void door_lock_err(void) { if( f10.bit.door_lock_erred==0) { if((f11.bit.test_prog_end==0)||(f3.bit.prog_end==0))//程序未结束 { door_lock_count++; if(door_lock_count>10) { door_lock_count=0; if(f1.bit.doored==1) f10.bit.door_lock_erred=0; else f10.bit.door_lock_erred=1; } } else f10.bit.door_lock_erred=0; } else { if(f1.bit.doored==1) f10.bit.door_lock_erred=0; } } void rise_temp_err(void) { if(f10.bit.rise_temp_erred==0) { water_temp1=fact_water_temp; rise_temp_count++; if(rise_temp_count>900) { rise_temp_count=0; water_temp2=fact_water_temp; if((water_temp2-water_temp1)<1) { if((f3.bit.prog_end==1)||(f11.bit.test_prog_end==1)) // 冷洗冷漂程序结束后报警 f10.bit.rise_temp_erred=1; } } } } void abnormality_temp_err(void) { if(f10.bit.abnormality_temp_erred==0) { if((fact_water_temp>90)&&(f9.bit.mianma_sel==1)) f10.bit.abnormality_temp_erred=1; if((fact_water_temp>60)&&(f9.bit.sinong_sel==1)) f10.bit.abnormality_temp_erred=1; if((fact_water_temp>60)&&(f9.bit.huaxian_sel==1)) f10.bit.abnormality_temp_erred=1; if((fact_water_temp>45)&&(f9.bit.maoliao_sel==1)) f10.bit.abnormality_temp_erred=1; } } void sensor_err(void) { if(f10.bit.sensor_erred==0) { if(temp_ad>0x03F0) //开路 f10.bit.sensor_erred=1; else if(temp_ad<0x30)//短路 { if((f3.bit.prog_end==1)||(f11.bit.test_prog_end==1)) f10.bit.sensor_erred=1; } } } void motor_err(void) { if(f4.bit.motor_run==1) { if(CHKBIT(PORTD,speed_in)) { motor_count++; if(motor_count>=10) { motor_count=0; f11.bit.motor_erred=1; } } } } void process_err(void) { bumpa_off; bumpb_off; bumpc_off; bumph_off; heat_off; direct_off; motor_off; door_off; if((f10.bit.abnormality_temp_erred==1)||(f10.bit.overflow_erred==1)) drain_on; else drain_off; } void check_err(void) { if((f2.bit.started==1)||(f1.bit.tested==1)) { enter_water_err(); drain_err(); overflow_err(); door_lock_err(); rise_temp_err(); abnormality_temp_err(); sensor_err(); motor_err(); } } void check_key_10m(void) { if((f2.bit.started==0)&&(f2.bit.powered==1)) { if(f1.bit.doored==0) { if(!f0.byte&0x3f) { t_1m_count++; if(t_1m_count>=10) { t_1m_count=0; f2.bit.powered=0; } } else {f0.byte=0;t_1m_count=0;} } } } void speed_select(void) { if(!CHKBIT(PINC,speed_set)) f1.bit.speed_selected=1; else f1.bit.speed_selected=0; } void heat_select(void) { if(!CHKBIT(PINC,mode_set)) f1.bit.heated=1; else f1.bit.heated=0; } void time_on(void) { if(flag_time>=1) { if(f2.bit.started==1) { // flag_time=2; time_t_1h_count++; if(time_t_1h_count>=60) { time_t_1h_count=0; time_data--; if(time_data==0) {time_data=0;flag_time=0;} } } } } void spin2(void) { spin_on; f4.bit.motor_run=1; low_spin_count++; if(low_spin_count<=6) f4.bit.s_55=1; else if(low_spin_count<=60) {f4.bit.s_55=0;f4.bit.s_93=1;} else if(low_spin_count<=120) {f4.bit.s_93=0;f4.bit.s_500=1;} else if(low_spin_count<=300) {f4.bit.s_500=0;f4.bit.s_800=1;} else {f4.bit.s_800=0;f4.bit.motor_run=0;low_spin_count=0;} } void spin1(void) { spin_on; f4.bit.motor_run=1; low_spin_count++; if(low_spin_count<=6) f4.bit.s_55=1; else if(low_spin_count<=60) {f4.bit.s_55=0;f4.bit.s_93=1;} else if(low_spin_count<=120) {f4.bit.s_93=0;f4.bit.s_500=1;} else {f4.bit.s_500=0;f4.bit.motor_run=0;low_spin_count=0;} } void wash_cycle2(void) //逆时针11秒 停止4秒,顺时针11秒 停止4秒 { wash_on; f4.bit.s_55=1; wash_time_count++; if(wash_time_count<=11) { direct_on; f4.bit.motor_run=1; } else if(wash_time_count<=15) f4.bit.motor_run=0; else if(wash_time_count<=26) { direct_off; f4.bit.motor_run=1; } else if(wash_time_count<=30) f4.bit.motor_run=0; else { wash_time_count=0; f4.bit.s_55=0; } } void wash_cycle1(void)//逆时针6秒 停止9秒,顺时针6秒 停止9秒 { wash_on; f4.bit.s_55=1; wash_time_count++; if(wash_time_count<=6) { direct_on; f4.bit.motor_run=1; } else if(wash_time_count<=15) f4.bit.motor_run=0; else if(wash_time_count<=21) { direct_off; f4.bit.motor_run=1; } else if(wash_time_count<=29) f4.bit.motor_run=0; else { wash_time_count=0; f4.bit.s_55=0; } } void test_step1(void) { test_time_count++; if(f1.bit.water1ed==0) bumpa_on; else { bumpa_off; wash_cycle2(); if(test_time_count>=60) { drain_on; if(test_time_count>=80) { test_time_count=0; f4.bit.motor_run=0; drain_off; f11.bit.step1_end=1; } } } } void test_step2(void) { test_time_count++; if(f1.bit.water1ed==0) bumpb_on; else { bumpb_off; wash_cycle2(); if(test_time_count>=60) { drain_on; if(test_time_count>=80) { test_time_count=0; f4.bit.motor_run=0; drain_off; f11.bit.step2_end=1; } } } } void test_step3(void) { test_time_count++; if(f1.bit.water1ed==0) bumpc_on; else { bumpc_off; wash_cycle2(); if(test_time_count>=60) { drain_on; if(test_time_count>=80) { test_time_count=0; f4.bit.motor_run=0; drain_off; f11.bit.step3_end=1; } } } } void test_step4(void) { test_time_count++; if(f1.bit.water1ed==0) bumph_on;//主水阀开? else { bumph_off; wash_cycle2(); if(test_time_count>=60) { drain_on; if(test_time_count>=80) { test_time_count=0; f4.bit.motor_run=0; drain_off; f11.bit.step4_end=1; } } } } void test_step5(void) { test_time_count++; drain_on; if(test_time_count<=180) { if(f1.bit.water1ed==0) spin2(); } else { test_time_count=0; f4.bit.motor_run=0; drain_off; f11.bit.step5_end=1; } } void prewash(void)//当选棉麻或丝绒 14分 { if(flag_prewash>=1) { flag_prewash=2; if(wash_t<2) { f8.bit.water_in=1; if(f1.bit.water1ed==1) wash_cycle2(); } else if(wash_t<12) wash_cycle2(); else if(wash_t<14) { wash_time_count=0; f4.bit.motor_run=0; drain_on; if(f1.bit.water1ed==0) { // wash_cycle_2(); spin1(); } } else { f4.bit.motor_run=0; low_spin_count=0; wash_t=0; flag_prewash=0; drain_off; } } } void washing(void)//丝绒 { if(flag_wash>=1) { flag_wash=2; if(wash_t<2) { f8.bit.water_in=1; if(f1.bit.water1ed==1) wash_cycle2(); } else if(wash_t<43) wash_cycle2(); else if(wash_t<45) { wash_time_count=0; f4.bit.motor_run=0; drain_on; if(f1.bit.water1ed==0) { // wash_cycle_2(); spin1(); } } else { f4.bit.motor_run=0; low_spin_count=0; wash_t=0; flag_wash=0; drain_off; } } } void strongwash(void)//棉麻 { if(flag_wash>=1) { flag_wash=2; if(wash_t<2) { f8.bit.water_in=1; if(f1.bit.water1ed==1) wash_cycle2(); } else if(wash_t<83) wash_cycle2(); else if(wash_t<85) { wash_time_count=0; f4.bit.motor_run=0; drain_on; if(f1.bit.water1ed==0) { // wash_cycle_2(); spin1(); } } else { f4.bit.motor_run=0; low_spin_count=0; wash_t=0; flag_wash=0; drain_off; } } } void softwash(void)//化纤 { if(flag_wash>=1) { flag_wash=2; if(wash_t<2) { f8.bit.water_in=1; if(f1.bit.water1ed==1) wash_cycle1(); } else if(wash_t<63) wash_cycle1(); else if(wash_t<65) { wash_time_count=0; f4.bit.motor_run=0; drain_on; if(f1.bit.water1ed==0) { // wash_cycle_2(); spin1(); } } else { f4.bit.motor_run=0; low_spin_count=0; wash_t=0; flag_wash=0; drain_off; } } } void quickwash(void)//毛料 { if(flag_wash>=1) { flag_wash=2; if(wash_t<2) { f8.bit.water_in=1; if(f1.bit.water1ed==1) wash_cycle2(); } else if(wash_t<23) wash_cycle2(); else if(wash_t<25) { wash_time_count=0; f4.bit.motor_run=0; drain_on; if(f1.bit.water1ed==0) { // wash_cycle_2(); spin1(); } } else { f4.bit.motor_run=0; low_spin_count=0; wash_t=0; flag_wash=0; drain_off; } } } void rinse(void)//一般飘洗,棉麻,丝绒,毛料 { if(flag_rinse>=1) { flag_rinse=2; if(wash_t<1) f8.bit.water_in=1; else if(wash_t<11) wash_cycle2(); else if(wash_t<13) { wash_time_count=0; f4.bit.motor_run=0; drain_on; if(f1.bit.water1ed==0) { // wash_cycle_2(); spin1(); } } else { f4.bit.motor_run=0; low_spin_count=0; wash_t=0; flag_rinse=0; drain_off; } } } void softrinse(void)//化纤 { if(flag_rinse>=1) { flag_rinse=2; if(wash_t<1) f8.bit.water_in=1; else if(wash_t<11) wash_cycle1(); else if(wash_t<13) { wash_time_count=0; f4.bit.motor_run=0; drain_on; if(f1.bit.water1ed==0) { // wash_cycle_2(); spin1(); } } else { f4.bit.motor_run=0; low_spin_count=0; wash_t=0; flag_rinse=0; drain_off; } } } void spin(void)//一般脱水,棉麻,丝绒 { if(flag_spin>=1) { flag_spin=2; if(wash_t<2) { drain_on; if(f1.bit.water1ed==0) spin2(); } else if(wash_t<=6) spin2(); else if(wash_t<=8) { f4.bit.motor_run=0; low_spin_count=0; wash_cycle2();//松化 } else { wash_time_count=0; f4.bit.motor_run=0; drain_off; wash_t=0; flag_spin=0; } } } void soft_lastspin(void)//化纤 { if(flag_spin>=1) { flag_spin=2; if(wash_t<=8) { f4.bit.motor_run=1; //f4.bit.s_55=1; } else { wash_time_count=0; f4.bit.motor_run=0; drain_off; wash_t=0; flag_spin=0; } } } /************************************ void soft_lastspin(void)//化纤 { if(flag_spin>=1) { flag_spin=2; if(wash_t<2) { drain_on; if(f1.bit.water1ed==0) spin1(); } else if(wash_t<=6) spin1(); else if(wash_t<=8) { f4.bit.motor_run=0; low_spin_count=0; wash_cycle1();//松化 } else { wash_time_count=0; f4.bit.motor_run=0; drain_off; wash_t=0; flag_spin=0; } } } ************************************/ void quickwash_lastspin(void)//毛料 { if(flag_spin>=1) { flag_spin=2; if(wash_t<2) { drain_on; if(f1.bit.water1ed==0) spin2(); } else if(wash_t<=6) spin2(); else if(wash_t<=8) { f4.bit.motor_run=0; low_spin_count=0; wash_cycle1();//松化 } else { wash_time_count=0; f4.bit.motor_run=0; drain_off; wash_t=0; flag_spin=0; } } } void extrinse(void) { if(flag_extrinse>=1) { flag_extrinse=2; if(wash_t<1) f8.bit.water_in=1; else if(wash_t<6) wash_cycle2(); else if(wash_t<8) { wash_time_count=0; f4.bit.motor_run=0; drain_on; if(f1.bit.water1ed==0) { // wash_cycle_2(); spin1(); } } else { f4.bit.motor_run=0; low_spin_count=0; wash_t=0; flag_extrinse=0; drain_off; } } } void wash_program1(void) { if(flag_wash>=1) strongwash(); if((flag_extrinse>=1)&&(flag_wash==0)) extrinse(); if((flag_wash==0)&&(flag_rinse>=1)&&(flag_extrinse==0)) rinse(); if((flag_spin>=1)&&(flag_rinse==0)) spin(); if(flag_spin==0) { f2.bit.started=0; f7.bit.wash_prog1=0; f3.bit.prog_end=1; } } void wash_program2(void) { if(flag_prewash>=1) prewash(); if((flag_wash>=1)&&(flag_prewash==0)) strongwash(); if((flag_extrinse>=1)&&(flag_wash==0)&&(flag_prewash==0)) extrinse(); if((flag_prewash==0)&&(flag_wash==0)&&(flag_extrinse==0)&&(flag_rinse>=1)) rinse(); if((flag_spin>=1)&&(flag_rinse==0)) spin(); if(flag_spin==0) { f2.bit.started=0; f7.bit.wash_prog7=0; f3.bit.prog_end=1; } } void wash_program3(void) { if(flag_spin>=1) spin(); else { f2.bit.started=0; f7.bit.wash_prog3=0; f3.bit.prog_end=1; } } void wash_program4(void) { if(flag_extrinse>=1) extrinse(); if((flag_rinse>=1)&&(flag_extrinse==0)) rinse(); if((flag_spin>=1)&&(flag_rinse==0)) spin(); if(flag_spin==0) { f2.bit.started=0; f7.bit.wash_prog4=0; f3.bit.prog_end=1; } } void wash_program5(void) { if(flag_wash>=1) strongwash(); if((flag_extrinse>=1)&&(flag_wash==0)) extrinse(); if((flag_wash==0)&&(flag_extrinse==0)&&(flag_rinse>=1)) rinse(); if(flag_rinse==0) { f2.bit.started=0; f7.bit.wash_prog5=0; f3.bit.prog_end=1; } } void wash_program6(void) { if(flag_wash>=1) softwash(); if((flag_extrinse>=1)&&(flag_wash==0)) extrinse(); if((flag_wash==0)&&(flag_extrinse==0)&&(flag_rinse>=1)) softrinse(); if((flag_spin>=1)&&(flag_rinse==0)) soft_lastspin(); if(flag_spin==0) { f2.bit.started=0; f7.bit.wash_prog6=0; f3.bit.prog_end=1; } } void wash_program7(void) { if(flag_prewash>=1) prewash(); if((flag_wash>=1)&&(flag_prewash==0)) softwash(); if((flag_extrinse>=1)&&(flag_wash==0)&&(flag_prewash==0)) extrinse(); if((flag_wash==0)&&(flag_prewash==0)&&(flag_extrinse==0)&&(flag_rinse>=1)) softrinse(); if((flag_spin>=1)&&(flag_rinse==0)) soft_lastspin(); if(flag_spin==0) { f2.bit.started=0; f7.bit.wash_prog7=0; f3.bit.prog_end=1; } } void wash_program10(void) { if(flag_spin>=1) soft_lastspin(); else if(flag_spin==0) { f2.bit.started=0; f5.bit.wash_prog10=0; f3.bit.prog_end=1; } } void wash_program11(void) { if(flag_extrinse>=1) extrinse(); if((flag_extrinse==0)&&(flag_rinse>=1)) softrinse(); if((flag_spin>=1)&&(flag_rinse==0)) soft_lastspin(); if(flag_spin==0) { f2.bit.started=0; f5.bit.wash_prog11=0; f3.bit.prog_end=1; } } void wash_program8(void) { if(flag_wash>=1) softwash(); if((flag_extrinse>=1)&&(flag_wash==0)) extrinse(); if((flag_wash==0)&&(flag_extrinse==0)&&(flag_rinse>=1)) softrinse(); if(flag_rinse==0) { f2.bit.started=0; f7.bit.wash_prog8=0; f3.bit.prog_end=1; } } void wash_program9(void) { if(flag_wash>=1) washing(); if((flag_extrinse>=1)&&(flag_wash==0)) extrinse(); if((flag_wash==0)&&(flag_extrinse==0)&&(flag_rinse>=1)) rinse(); if((flag_spin>=1)&&(flag_rinse==0)) spin(); if(flag_spin==0) { f2.bit.started=0; f5.bit.wash_prog9=0; f3.bit.prog_end=1; } } void wash_program12(void) { if(flag_wash>=1) washing(); if((flag_extrinse>=1)&&(flag_wash==0)) extrinse(); if((flag_wash==0)&&(flag_extrinse==0)&&(flag_rinse>=1)) rinse(); if(flag_rinse==0) { f2.bit.started=0; f5.bit.wash_prog12=0; f3.bit.prog_end=1; } } void wash_program13(void) { if(flag_wash>=1) quickwash(); if((flag_extrinse>=1)&&(flag_wash==0)) extrinse(); if((flag_wash==0)&&(flag_extrinse==0)&&(flag_rinse>=1)) rinse(); if((flag_spin>=1)&&(flag_rinse==0)) quickwash_lastspin(); if(flag_spin==0) { f2.bit.started=0; f5.bit.wash_prog13=0; f3.bit.prog_end=1; } } void wash_program14(void) { if(flag_spin>=1) quickwash_lastspin(); if(flag_spin==0) { f2.bit.started=0; f5.bit.wash_prog14=0; f3.bit.prog_end=1; } } void wash_program15(void) { if(flag_extrinse>=1) extrinse(); if((flag_rinse>=1)&&(flag_extrinse==0)) rinse(); if((flag_spin>=1)&&(flag_rinse==0)) quickwash_lastspin(); if(flag_spin==0) { f2.bit.started=0; f5.bit.wash_prog13=0; f3.bit.prog_end=1; } } void wash_program16(void) { if(flag_wash>=1) quickwash(); if((flag_extrinse>=1)&&(flag_wash==0)) extrinse(); if((flag_rinse>=1)&&(flag_wash==0)&&(flag_extrinse==0)) rinse(); if(flag_rinse==0) { f2.bit.started=0; f5.bit.wash_prog16=0; f3.bit.prog_end=1; } } void wash_time_control(void) { if((f2.bit.started==1)&&(flag_time==0)) { wash_t++; if(main_wash_time>0) main_wash_time--; else main_wash_time=0; // if(flag_prewash==0) {main_wash_time=(main_wash_time-prewash_time); prewash_time=0;} // if(flag_wash==0) {main_wash_time=(main_wash_time-wash_time);wash_time=0;} //if(flag_rinse==0) {main_wash_time=(main_wash_time-rinse_time);rinse_time=0;} //if(flag_spin==0) {main_wash_time=(main_wash_time-spin_time);spin_time=0;} } } void main_wash_prog(void) { if(f2.bit.started==1) { if(flag_time==0) { if((f10.byte==0)&&(f11.bit.motor_erred==0)) { if(f7.bit.wash_prog1==1) wash_program1(); else if(f7.bit.wash_prog2==1) wash_program2(); else if(f7.bit.wash_prog3==1) wash_program3(); else if(f7.bit.wash_prog4==1) wash_program4(); else if(f7.bit.wash_prog5==1) wash_program5(); else if(f7.bit.wash_prog6==1) wash_program6(); else if(f7.bit.wash_prog7==1) wash_program7(); else if(f7.bit.wash_prog8==1) wash_program8(); else if(f5.bit.wash_prog9==1) wash_program9(); else if(f5.bit.wash_prog10==1) wash_program10(); else if(f5.bit.wash_prog11==1) wash_program11(); else if(f5.bit.wash_prog12==1) wash_program12(); else if(f5.bit.wash_prog13==1) wash_program13(); else if(f5.bit.wash_prog14==1) wash_program14(); else if(f5.bit.wash_prog15==1) wash_program15(); else if(f5.bit.wash_prog16==1) wash_program16(); } else process_err(); } } else out_off(); } void erasure_eep(void) { unsigned char i; for(i=0;i<=250;i++) EEPROMwrite(addr+i, 0x00); } void process_power_off(void) { door_off; out_off(); disp0=disp1=disp2=0; dig1=dig2=dig3=dig4=14; f1.byte&=0xF0;//speed/modeselect/test // f3.byte&=0x08;//buz,set // f2.byte&=0xF0;//test1,test2,test3标志 f2.byte=f3.byte=f4.byte=f5.byte=f7.byte=0; f8.byte=f9.byte=f10.byte=f11.byte=0; flag_time=flag_prewash=flag_wash=flag_rinse=flag_spin=flag_extrinse=0; time_data=0; buz_off; //erasure_eep(); } void check_test(void) { if(f2.bit.powered==0) { if(f1.bit.tested==0) { if((f2.bit.k_test1==1)&&(f2.bit.k_test2==1)&&(f2.bit.k_test3==1)) { f2.bit.k_test1=f2.bit.k_test2=f2.bit.k_test3=0; f1.bit.tested=1; f3.bit.test_buz=1; } } else { if(( f2.bit.k_test1==1)&&( f2.bit.k_test2==1)&&( f2.bit.k_test3==1)) { f2.bit.k_test1=f2.bit.k_test2=f2.bit.k_test3=0; f1.bit.tested=0; } } } } void test_prog(void) { if(test_count==2) test_step1(); if((test_count==4)||(f11.bit.step1_end==1)) test_step2(); if((test_count==6)||(f11.bit.step2_end==1)) test_step3(); if((test_count==8)||(f11.bit.step3_end==1)) test_step4(); if((test_count==10)||(f11.bit.step4_end==1)) test_step5(); if((test_count==11)||(f11.bit.step5_end==1)) { f2.bit.k_test1=f2.bit.k_test2=f2.bit.k_test3=0; test_count=0; f11.bit.test_prog_end=1; } } void program_control(void) { if(f1.bit.tested==1) { door_on; if(f11.bit.test_prog_end==0) test_prog(); //测试 else { if(f1.bit.doored==0) { door_off; if(f2.bit.end_buz==0) end_buzing(); else f1.bit.tested=0; } } } else { if(f2.bit.powered==1) { door_on; if(f3.bit.prog_end==0) main_wash_prog();//洗衣程序 else { if(f1.bit.doored==0) { door_off; if(f2.bit.end_buz==0) end_buzing(); else f2.bit.powered=0; } } } else process_power_off(); // 关机 } } void process_water_in(void) { if(f8.bit.water_in==1) { if(flag_prewash==2) { if(f1.bit.water1ed==0) bumpa_on; else {bumpa_off;f8.bit.water_in=0;} } else if(flag_wash==2) { if(f1.bit.water1ed==0) bumpb_on; else {bumpb_off;f8.bit.water_in=0;} } else if(flag_rinse==2) { if(f1.bit.water1ed==0) bumpc_on; else {bumpc_off;f8.bit.water_in=0;} } } } void heat_control(void) { if(f1.bit.heated==1) { if(f9.bit.h_h_sel==1) { if(fact_water_temp<88) heat_on; else if(fact_water_temp>=90) heat_off; else { if(CHKBIT(PORTB,heat)) heat_on; else if(!CHKBIT(PORTB,heat)) heat_off; } } if(f9.bit.h_c_sel==1) { if(fact_water_temp<58) heat_on; else if(fact_water_temp>=60) heat_off; else { if(CHKBIT(PORTB,heat)) heat_on; else if(!CHKBIT(PORTB,heat)) heat_off; } } if(f9.bit.w_w_sel==1) { if(fact_water_temp<43) heat_on; else if(fact_water_temp>=45) heat_off; else { if(CHKBIT(PORTB,heat)) heat_on; else if(!CHKBIT(PORTB,heat)) heat_off; } } if(f9.bit.c_c_sel==1) heat_off; } } void speed_control(void) { if(f4.bit.motor_run==1) { if(f4.bit.s_55==1) s2=320; else if(f4.bit.s_93==1) s2=645; else if(f4.bit.s_500==1) s2=120; else if(f4.bit.s_800==1) s2=75; else s2=0; if(s1120) t1=(t1-t_step); else t1=120; } else if(s1>s2) //S1>S2转速偏低 { if(t1<=t2) t1=(t1+t_step); } t=(0xFFFF-t1/8); } else {s2=0;t=0XFFFF;t1=120;} } void check_zero(void) { if(f4.bit.motor_run==1) { if(f4.bit.zero_come==1) { if(t1_count==0) { CLI(); TCCR1B = 0x00; //stop TCNT1H = t>>8; TCNT1L = t; TCCR1B = 0x03; //start Timer SEI(); t1_count=1; } if(f8.bit.t1_come==1) { f8.bit.t1_come=0; if(t1_count==1)//设置第二次中断时间t { CLI(); TCCR1B = 0x00; //stop TCNT1H = 0xFF; //setup TCNT1L = 0x83; TCCR1B = 0x03; //start Timer SEI(); t1_count=2; motor_on; asm("nop"); } else { t1_count=0; motor_off; f4.bit.zero_come=0; TCCR1B = 0x00; //stop //f4.bit.motor_run=0; if(MCUCR==0x0A) MCUCR = 0x0B; else MCUCR = 0x0A; } } } } else { t1_count=0; f4.bit.zero_come=0; motor_off; } } //过零中断 #pragma interrupt_handler int0_isr:2 void int0_isr(void) { f4.bit.zero_come=1; } //电机反馈脉冲中断 #pragma interrupt_handler int1_isr:3 void int1_isr(void) { s1=speed_count; //读取速度单位100us speed_count=0; } #pragma interrupt_handler timer1_ovf_isr:9 void timer1_ovf_isr(void) { f8.bit.t1_come=1; } #pragma interrupt_handler timer2_ovf_isr:5 void timer2_ovf_isr(void) { TCNT2 = 0x9C; //reload counter value speed_count++; } #pragma interrupt_handler timer0_ovf_isr:10 void timer0_ovf_isr(void) { TCNT0 = 0x83; //reload counter value t_1ms=1; } //----------------------------------------------------------------------------- // initialization //----------------------------------------------------------------------------- void port_init(void) { PORTA = 0xFE; DDRA = 0xFE; PORTB = 0x00; DDRB = 0x8F; PORTC = 0xC0; //m103 output only DDRC = 0xC1; PORTD = 0x00; DDRD = 0xF3; } //Watchdog initialize // prescale: 2048K void watchdog_init(void) { WDR(); //this prevents a timout on enabling WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs } //TIMER0 initialize - prescale:64 // WGM: Normal // desired value: 1mSec // actual value: 1.000mSec (0.0%) void timer0_init(void) { TCCR0 = 0x00; //stop TCNT0 = 0x83; //set count OCR0 = 0x7D; //set compare TCCR0 = 0x03; //start timer } //TIMER1 initialize - prescale:8 // WGM: 0) Normal, TOP=0xFFFF // desired value: 120uSec // actual value: 119.000uSec (0.8%) void timer1_init(void) { TCCR1B = 0x00; //stop TCNT1H = 0xFF; //setup TCNT1L = 0x89; OCR1AH = 0x00; OCR1AL = 0x77; OCR1BH = 0x00; OCR1BL = 0x77; // OCR1CH = $OCR1CH$; // OCR1CL = $OCR1CL$; ICR1H = 0x00; ICR1L = 0x77; TCCR1A = 0x00; TCCR1B = 0x02; //start Timer } //TIMER2 initialize - prescale:8 // WGM: Normal // desired value: 100uSec // actual value: 100.000uSec (0.0%) void timer2_init(void) { TCCR2 = 0x00; //stop ASSR = 0x00; //set async mode TCNT2 = 0x9C; //setup OCR2 = 0x64; TCCR2 = 0x02; //start } //ADC initialize // Conversion time: 3uS void adc_init(void) { ADCSR = 0x00; //disable adc ADMUX = 0x00; //select adc input 0 ACSR = 0x80; ADCSR = 0xC1; } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); watchdog_init(); timer0_init(); timer1_init(); timer2_init(); adc_init(); MCUCR = 0x0A; GICR = 0xC0; TIMSK = 0x45; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } void init_disp(void) { disp0=disp1=disp2=0; dig1=dig2=dig3=dig4=14; } //----------------------------------------------------------------------------- // main //----------------------------------------------------------------------------- main() { init_devices(); heat_select(); speed_select(); init_disp(); init_tasktime(); f3.bit.buzed=1; while(1) { check_zero(); if(t_1ms==1) { t_1ms=0; check_switch();//door,water lever } if(t_3ms==0) { t_3ms=3; scan(); } if(t_50ms==0) { t_50ms=50; buzing(); ad_conv(); } if(t_100ms==0) { t_100ms=100; process_key(); speed_control(); } if(t_500ms==0) { t_500ms=500; test_buzing(); err_buzing(); disp_conv(); process_led_disp(); } if(t_1s==0) { t_1s=1000; process_water_in(); check_err(); check_test(); program_control();//test_prog,main_wash_prog heat_control(); WDR(); } if(t_1m==0) { t_1m=60000; time_on(); check_key_10m();//不按键>10min切断电源,进入待机状态,需重新按POWER键进入默认状态 wash_time_control(); } } }