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

📄 icc(atmega16).c

📁 滚筒洗衣机AVR(ATmega16芯片) c源代码
💻 C
📖 第 1 页 / 共 4 页
字号:

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 + -