📄 icc(atmega16).c
字号:
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(s1<s2) //S1<S2转速偏高
{
if(t1>120) 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();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -