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

📄 gsmexa_1.c

📁 AVR MCU application to control valves and pumps
💻 C
📖 第 1 页 / 共 3 页
字号:
		case 8: rf_bit(((valve.address>>3))&0x01);break;
		case 9: rf_bit(((valve.address>>2))&0x01);break;
		case 10: rf_bit(((valve.address>>1))&0x01);break;
		case 11: rf_bit((valve.address)&0x01);break;
		default: rf_error();
	}
	if (rf_counter1==448)
	{
		rf_type=3;
	}
}

//Set bits to control valves or pumps
void rf_action(void)
{
	switch (((rf_counter1-448)>>4))
	{
		case 0: rf_bit(((valve.action>>3)&0x01));break;
		case 1: rf_bit(((valve.action>>2)&0x01));break;
		case 2: rf_bit(((valve.action>>1)&0x01));break;
		case 3: rf_bit(valve.action & 0x01);break;
		default: rf_error();	
	}
	if (rf_counter1==512)
	{
		rf_counter1=0;
		rf_type=1;
		rf_time+=1;
	}
}
//Start to send out pulses to rf_recerver
void rf_open(unsigned char a)
{
	check_valve(a);
	if (valve_statusnow)
	{
		rf_flag=1;
		goto nonedone;
	}
	valve.address=program[program_num].valve[0][a];
	if ((program[program_num].valve[0][a] & 0x01)==1)
	{
		valve.action=VALVE_OPEN1;
	}
	else
	{
		valve.action=VALVE_OPEN2;
	}
	switch (rf_type)
	{
		case 1: rf_syn();break;
		case 2: rf_address();break;
		case 3: rf_action();break;
		default: rf_error();
	}
	TIMSK=0x80;
	TCCR1B=0x00;
	TCNT1H=0xff;
	TCNT1L=0x4c;
	TCCR1B=0x02;//Prescale select 8 and start timer1 interrupter
	nonedone: asm("nop");
}
void rf_close(unsigned char a)
{
	check_valve(a);
	if (!valve_statusnow)
	{
		rf_flag=1;
		goto nonedone;
	}
	valve.address=program[program_num].valve[0][a];
	if ((program[program_num].valve[0][a] & 0x01)==1)
	{
		valve.action=VALVE_CLOSE1;
	}
	else
	{
		valve.action=VALVE_CLOSE2;
	}
	switch (rf_type)
	{
		case 1: rf_syn();break;
		case 2: rf_address();break;
		case 3: rf_action();break;
		default: rf_error();
	}
	TIMSK=0x80;
	TCCR1B=0x00;
	TCNT1H=0xff;
	TCNT1L=0x4c;
	TCCR1B=0x02;//Prescale select 8 and start timer1 interrupter
	nonedone: asm("nop");
}

//Timer1 interrupt for pulse of 90us and send out bit to rf receiver
#pragma interrupt_handler timer1_ovf_isr:10
void time_ovf_isr(void)
{
	TCNT1H=0xff;
	TCNT1L=0x4c;
	if (bit_status)
	{
		PORTD |= 0x20;//RF_OUT=bit_status
	}
	else
	{
		PORTD &= 0xdf;////RF_OUT=bit_status
	}
	switch (rf_type)
	{
		case 1: rf_syn();break;
		case 2: rf_address();break;
		case 3: rf_action();break;
		default: rf_error();
	}
	if (rf_time==130)//6 second for operation of a valve
	{
		rf_time=0;
		TCCR1B=0x00;//Stop the timer1 for next rf operation
		rf_flag=1;
	}
}
void read_time(void)
{
	unsigned char a;
	a=read_DS1302(WDS1302_YEAR);
	time_now.year=((a>>4) & 0x0f)*10+(a & 0x0f);//change BCD code to common code
	a=read_DS1302(WDS1302_MONTH);
	time_now.month=((a>>4) & 0x01)*10+(a & 0x0f);//change BCD code to common code
	time_now.weekday=read_DS1302(WDS1302_WEEKDAY);//no change required
	a=read_DS1302(WDS1302_DATE);
	time_now.date=((a>>4) & 0x03)*10+(a & 0x0f);//change BCD code to common code
	a=read_DS1302(WDS1302_HOUR);
	time_now.hour=((a>>4) & 0x03)*10+(a & 0x0f);//change BCD code to common code
	a=read_DS1302(WDS1302_MINUTE);
	time_now.minute=((a>>4) & 0x07)*10+(a & 0x0f);//change BCD code to common code
}

//Check conditions for programs
void program_main(void)
{
	unsigned char i;
	unsigned char j;
	unsigned char a[64];
	unsigned char b,c;//a and b are temp parameters
	read_time();
	j=0;
	for (i=0;i<valve_total;i++)
	{
		if ((time_now.hour==valve_closetime[i][0] && time_now.minute==valve_closetime[i][1]) || (time_now.hour==valve_closetime[i][2] && time_now.minute==valve_closetime[i][3]))
		{
			a[j]=i;
			clr_valve(i);
			j+=1;
		}
	}
	if (program_num==0 && rf_flag==1)
	{
		b=time_order.weekday+program[0].day;//The maximum day interval is 7 days
		if (b>7)
		{
			b=b-7;
		}
		if (time_now.weekday==b)
		{
			if ((time_now.hour==program[0].time1[0]*10+program[0].time1[0] && time_now.minute==program[0].time1[2]*10+program[0].time1[3]) || (time_now.hour==program[0].time2[0]*10+program[0].time2[1] && time_now.minute==program[0].time2[2]*10+program[0].time2[3]))
			{	
				for (i=0; i<valve_totalold; i++)
				{
					rf_flag=0;
					rf_open(i);
					while (rf_flag==0)
					{
						;
					}
					set_valve(i);
				}	
			}
		}
	}
	if (program_num==1 && rf_flag==1) 
	{
		if ((program[1].day>>time_now.weekday)&0x01==1)
		{
			if ((time_now.hour==program[1].time1[0]*10+program[1].time1[1] && time_now.minute==program[1].time1[2]*10+program[1].time1[3]) || (time_now.hour==program[1].time2[0]*10+program[1].time2[1] && time_now.minute==program[1].time2[2]*10+program[1].time2[3]))
			{
				for (i=0;i<valve_totalold;i++)
				{
					rf_flag=0;
					rf_open(i);
					while (rf_flag==0)
					{
						;
					}
					set_valve(i);
				}
			}
		}
	}
	for (i=0 ;i<j ;i++ )
	{
		rf_flag=0;
		rf_close(a[i]);
		while (rf_flag==0)
		{
			;
		}
		clr_valve(a[i]);
	}
	if (valve_totalold<valve_total)
	{
		for (i=valve_totalold; i<valve_total ;i++ )
		{
			check_valve(i);
			if (valve_statusnow==1)
			{
				goto program_end;
			}
		}
		for (i=valve_totalold; i<valve_total ;i++ )
		{
			program[program_num].valve[0][i]=0;
			program[program_num].valve[1][i]=0;
		}
		valve_total=valve_total;
	}
	program_end: asm("nop");
}

//Get closetime of valve
void get_closetime(void)
{
	unsigned char i;
	unsigned char c,d1,d2,e1,e2;
	for (i=0 ; i<valve_total ; i++ )
	{
		c=program[program_num].valve[1][i]/60;
		d1=program[program_num].time1[0]*10+program[program_num].time1[1]+c;
		e1=program[program_num].time1[2]*10+program[program_num].time1[3]+program[program_num].valve[1][i]-60*c;
		d2=program[program_num].time2[0]*10+program[program_num].time2[1]+c;
		e2=program[program_num].time2[2]*10+program[program_num].time2[3]+program[program_num].valve[1][i]-60*c;
		if (e1>59)
		{
			d1+=1;
			e1-=60;
		}
		if (e2>59)
		{
			d2+=1;
			e2-=60;
		}
		if (d1>23)
		{
			d1-=24;
		}
		if (d2>23)
		{
			d2-=24;
		}

		valve_closetime[i][0]=d1;
		valve_closetime[i][1]=e1;
		valve_closetime[i][2]=d2;
		valve_closetime[i][3]=e2;
	}
}


unsigned char unicode_number(int a)
{
	return(a-30);
}

void unavailable_order(void)
{
	unsigned char i;
	unsigned char a[10];
	a[0]=0x65;
	a[1]=0xe0;
	a[2]=0x65;
	a[3]=0x48;
	a[4]=0x54;
	a[5]=0x7d;
	a[6]=0x4e;
	a[7]=0xe4;
	a[8]=0x30;
	a[9]=0x02;
	for ( i=0 ; i<10 ; i++ )
	{
		UDR=a[i];
		while(!(UCSRA & 0x40))
		{
			;
		}
	}
}

void program0_order(void)
{
	int i,j;
	int valve_temp1[3];
	int valve_temp2[3];
	valve_total=0;
	if (*(rec_order+PROGRAM0_OFFSET1)>29 && *(rec_order+PROGRAM0_OFFSET1)<40)//PROGRAM0_OFFSET1 is offset of UNICODE_X for day(s) interval
	{
		program[0].day=unicode_number(*(rec_order+PROGRAM0_OFFSET1));
	}
	for (i=0 ; i<4 ; i++ )
	{
		if (*(rec_order+PROGRAM0_OFFSET2+i)>29 && *(rec_order+PROGRAM0_OFFSET2+i)<40)//PROGRAM_OFFSET2 is offset of UNICODE_X for the first time to open valves
		{
			program[0].time1[i]=unicode_number(*rec_order+PROGRAM0_OFFSET2+i);
		}
		else 
		{
			unavailable_order();
		}
	}
	
	for (i=0 ; i<4 ; i++ )
	{
		if (*(rec_order+PROGRAM0_OFFSET3+i)>29 && *(rec_order+PROGRAM0_OFFSET3+i)<40)//PROGRAM_OFFSET3 is offset of UNICODE_X for the second time to open valves
		{
			program[0].time2[i]=unicode_number(*rec_order+PROGRAM0_OFFSET3+i);
		}
		else
		{
			unavailable_order();
		}
	}
	i=0;
	do
	{
		for (j=0 ; j<3 ; j++)//PROGRAM_OFFSET4 is offset of UNICODE_X for ID of valves
		{
			if (*(rec_order+PROGRAM0_OFFSET4+i*8+j)>29 && *(rec_order+PROGRAM0_OFFSET4+i*8+j)<40)
			{
				valve_temp1[j]=unicode_number(*rec_order+PROGRAM0_OFFSET4+i*8+j);
			}
			else
			{
				unavailable_order();
			}
			//PROGRAM_OFFSET5 is offset of UNICODE_X for time of valves to open
			if (*(rec_order+PROGRAM0_OFFSET5+i*8+j)>29 && *(rec_order+PROGRAM0_OFFSET5+i*8+j)<40)
			{
				valve_temp2[j]=unicode_number(*rec_order+PROGRAM0_OFFSET5+i*8+j);
			}
			else
			{
				unavailable_order();
			}
		}
		program[0].valve[0][i]=valve_temp1[0]*100+valve_temp1[1]*10+valve_temp1[2];
		program[0].valve[1][i]=valve_temp2[0]*100+valve_temp2[1]*10+valve_temp2[2];
		i+=1;
	}//PROGRAM_OFFSET6 is offset of UNICODE_X for , and ; and .
	while (*(rec_order+PROGRAM0_OFFSET6+i*8)!= UNICODE_SEMICOLON && *(rec_order+PROGRAM0_OFFSET6+i*8)!= UNICODE_FULLSTOP);
	valve_total=i;
	valve_totalold=i;
}

void program1_order(void)
{
	int i,j;
	int valve_temp1[3];
	int valve_temp2[3];
	valve_total=0;
	for (i=0 ; i<7 ; i++ )
	{
		switch (*(rec_order+PROGRAM1_OFFSET1+i))
		{
			case UNICODE_RI: program[1].day |= 0x02;break;
			case UNICODE_YI: program[1].day |= 0x04;break;
			case UNICODE_ER: program[1].day |= 0x08;break;
			case UNICODE_SAN: program[1].day |= 0x10;break;
			case UNICODE_SI: program[1].day |= 0x20;break;
			case UNICODE_WU: program[1].day |= 0x40;break;
			case UNICODE_LIU: program[1].day |= 0x80;break;
			default:unavailable_order();
		}
	}
	for (i=0 ; i<4 ; i++ )
	{
		if (*(rec_order+PROGRAM1_OFFSET2+i)>29 && *(rec_order+PROGRAM1_OFFSET2+i)<40)//PROGRAM_OFFSET2 is offset of UNICODE_X for the first time to open valves
		{
			program[1].time1[i]=unicode_number(*(rec_order+PROGRAM1_OFFSET2+i));
		}
		else 
		{
			unavailable_order();
		}
	}
	for (i=0 ; i<4 ; i++ )
	{
		if (*(rec_order+PROGRAM1_OFFSET3+i)>29 && *(rec_order+PROGRAM1_OFFSET3+i)<40)//PROGRAM_OFFSET3 is offset of UNICODE_X for the second time to open valves
		{
			program[1].time2[i]=unicode_number(*rec_order+PROGRAM1_OFFSET3+i);
		}
		else
		{
			unavailable_order();
		}
	}
	i=0;
	do
	{
		for (j=0 ; j<3 ; j++)//PROGRAM_OFFSET4 is offset of UNICODE_X for ID of valves
		{
			if (*(rec_order+PROGRAM1_OFFSET4+i*8+j)>29 && *(rec_order+PROGRAM1_OFFSET4+i*8+j)<40)
			{
				valve_temp1[j]=unicode_number(*rec_order+PROGRAM1_OFFSET4+i*8+j);
			}
			else
			{
				unavailable_order();
			}
			//PROGRAM_OFFSET8 is offset of UNICODE_X for time of valves to open
			if (*(rec_order+PROGRAM1_OFFSET5+i*8+j)>29 && *(rec_order+PROGRAM1_OFFSET5+i*8+j)<40)
			{
				valve_temp2[j]=unicode_number(*rec_order+PROGRAM1_OFFSET5+i*8+j);
			}
			else
			{
				unavailable_order();
			}
		}
		program[1].valve[0][i]=valve_temp1[0]*100+valve_temp1[1]*10+valve_temp1[2];
		program[1].valve[1][i]=valve_temp2[0]*100+valve_temp2[1]*10+valve_temp2[2];
		i+=1;
	}//PROGRAM_OFFSET9 is offset of UNICODE_X for , and ; and .
	while (*(rec_order+PROGRAM1_OFFSET6+i*8 )!= UNICODE_SEMICOLON && *(rec_order+PROGRAM1_OFFSET6+i*8 )!= UNICODE_FULLSTOP);
	valve_total=i;
	valve_totalold=i;
}

void program_order(void)
{
	if (*(rec_order+PROGRAM_OFFSET2)==UNICODE_XU)//PROGRAM_OFFSET2 is offset of UNICODE_XU
	{
		switch (*(rec_order+PROGRAM_OFFSET2))//PROGRAM_OFFSET3 is offset of UNICODE_YI or UNICODE_ER
		{
			case UNICODE_YI: program0_order();break;
			case UNICODE_ER: program1_order();break;
			default: unavailable_order();
		}
	}
	else unavailable_order();
}

void halt_program(void)
{
	unsigned char i;
	if (*(rec_order+HALT_OFFSET)>29 && *(rec_order+HALT_OFFSET)<40)
	{
		program_num=unicode_number(*(rec_order+HALT_OFFSET));
	}
	else
	{
		unavailable_order();
	}	
	for (i=0; i<valve_totalold; i++)
	{
		rf_flag=0;
		rf_open(i);
		while (rf_flag==0)
		{
			;
		}
		clr_valve(i);
	}		
}
void start_program(void)
{
	if (*(rec_order+START_OFFSET)>29 && *(rec_order+START_OFFSET)<40)
	{
		program_num=unicode_number(*(rec_order+START_OFFSET));
	}
}
void startnow_program(void)
{
	
}
void add_program(void)
{
	unsigned char i,j;
	int valve_temp1[3];
	int valve_temp2[3];
	i=valve_total;
	if (*(rec_order+ADD_OFFSET1)>29 && *(rec_order+ADD_OFFSET1)<40)
	{
		program_num=unicode_number(*(rec_order+ADD_OFFSET1));
	}
	do
	{
		for (j=0 ; j<3 ; j++)//ADD_OFFSET1 is offset of UNICODE_X for ID of valves
		{
			if (*(rec_order+ADD_OFFSET2+i*8+j)>29 && *(rec_order+ADD_OFFSET2+i*8+j)<40)
			{
				valve_temp1[j]=unicode_number(*rec_order+ADD_OFFSET2+i*8+j);
			}
			//ADD_OFFSET2 is offset of UNICODE_X for time of valves to open
			if (*(rec_order+ADD_OFFSET3+i*8+j)>29 && *(rec_order+ADD_OFFSET3+i*8+j)<40)
			{
				valve_temp2[j]=unicode_number(*rec_order+ADD_OFFSET3+i*8+j);
			}
		}
		program[program_num].valve[0][i]=valve_temp1[0]*100+valve_temp1[1]*10+valve_temp1[2];
		program[program_num].valve[1][i]=valve_temp2[0]*100+valve_temp2[1]*10+valve_temp2[2];
		i+=1;
	}//PROGRAM_OFFSET9 is offset of UNICODE_X for , and ; and .
	while (*(rec_order+ADD_OFFSET4+(i-valve_total)*8 )!= UNICODE_SEMICOLON && *(rec_order+PROGRAM1_OFFSET6+(i-valve_total)*8 )!= UNICODE_FULLSTOP);
	valve_total=i;
	valve_totalold=i;
}
void delete_program(void)
{
	unsigned char i;
	if (*(rec_order+DEL_OFFSET)<29 && *(rec_order+DEL_OFFSET)<40)
	{
		program_num=unicode_number(*(rec_order+DEL_OFFSET));
	}	
	for (i=0; i<valve_totalold; i++)
	{
		rf_flag=0;
		rf_close(i);
		while (rf_flag==0)
		{
			;
		}
		clr_valve(i);
	}
	program[program_num].day=0;
	for (i=0 ; i<4 ; i++)
	{
		program[program_num].time1[i]=0;
		program[program_num].time2[i]=0;
	}
	for (i=0 ; i<64 ; i++ )
	{
		program[program_num].valve[0][i]=0;
		program[program_num].valve[1][i]=0;
	}
}
void open_valve(void)
{
	unsigned char i,j;
	unsigned char c,d,e;
	int valve_temp1[3];
	int valve_temp2[3];
	i=valve_total;
	do
	{
		for (j=0 ; j<3 ; j++)//ADD_OFFSET1 is offset of UNICODE_X for ID of valves
		{
			if (*(rec_order+OPEN_OFFSET1+i*8+j)>29 && *(rec_order+OPEN_OFFSET1+i*8+j)<40)
			{
				valve_temp1[j]=unicode_number(*rec_order+OPEN_OFFSET2+i*8+j);
			}
			//ADD_OFFSET2 is offset of UNICODE_X for time of valves to open
			if (*(rec_order+OPEN_OFFSET2+i*8+j)>29 && *(rec_order+OPEN_OFFSET2+i*8+j)<40)
			{
				valve_temp2[j]=unicode_number(*rec_order+OPEN_OFFSET2+i*8+j);
			}
		}
		program[program_num].valve[0][i]=valve_temp1[0]*100+valve_temp1[1]*10+valve_temp1[2];
		program[program_num].valve[1][i]=valve_temp2[0]*100+valve_temp2[1]*10+valve_temp2[2];
		i+=1;
	}//PROGRAM_OFFSET9 is offset of UNICODE_X for , and ; and .
	while (*(rec_order+OPEN_OFFSET3+(i-valve_total)*8 )!= UNICODE_SEMICOLON && *(rec_order+OPEN_OFFSET3+(i-valve_total)*8 )!= UNICODE_FULLSTOP);
	valve_totalold=valve_total;
	valve_total=i;
	for (i=valve_totalold ; i<valve_total ; i++ )
	{
		c=program[program_num].valve[1][i]/60;
		d=time_now.hour+c;
		e=time_now.minute+program[program_num].valve[1][i]-60*c;
		if (e>59)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -