📄 gsmexa_1.c
字号:
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 + -