📄 gsmexa_1.c
字号:
{
d+=1;
e-=60;
}
if (d>23)
{
d-=24;
}
valve_closetime[i][0]=d;
valve_closetime[i][1]=e;
valve_closetime[i][2]=100;
valve_closetime[i][3]=100;
}
for (i=valve_totalold; i<valve_total; i++)
{
rf_flag=0;
rf_open(i);
while (rf_flag==0)
{
;
}
set_valve(i);
}
}
void close_valve(void)
{
unsigned char i,j;
unsigned char c,d,e;
int valve_temp[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+CLOSE_OFFSET1+i*8+j)>29 && *(rec_order+CLOSE_OFFSET1+i*8+j)<40)
{
valve_temp[j]=unicode_number(*rec_order+CLOSE_OFFSET2+i*8+j);
}
}
program[program_num].valve[0][i]=valve_temp[0]*100+valve_temp[1]*10+valve_temp[2];
program[program_num].valve[1][i]=0;
i+=1;
}
while (*(rec_order+CLOSE_OFFSET3+(i-valve_total)*8 )!= UNICODE_SEMICOLON && *(rec_order+CLOSE_OFFSET3+(i-valve_total)*8 )!= UNICODE_FULLSTOP);
valve_totalold=valve_total;
valve_total=i;
for (i=valve_totalold ; i<valve_total ; i++ )
{
rf_flag=0;
rf_close(i);
while (rf_flag==0)
{
;
}
clr_valve(i);
}
valve_total=valve_totalold;
}
void all_close(void)
{
unsigned char i;
for ( i=0 ; i<valve_total ; i++)
{
rf_flag=0;
rf_close(i);
while (rf_flag==0)
{
;
}
clr_valve(i);
}
}
//Check the password
void password_check(void)
{
unsigned char i;
for (i=0;i<4 ;i++ )
{
password_input[i]=unicode_number(*(rec_order+PSW_OFFSET+i));
}
for (i=0; i<4 ; i++)
{
if (password_input[i]!=password[i])
{
password_flag1=0;
password_error();
break;
}
}
}
//Reset the password
void renew_password(void)
{
unsigned char i;
for (i=0;i<4;i++)
{
if (*(rec_order+RENP_OFFSET2+i)!=*(rec_order+RENP_OFFSET1+i))
{
password_flag2=0;
newpassword_error();
break;
}
}
if (password_flag2==1)
{
for (i=0 ; i<4 ; i++)
{
password[i]=password_input[i];
}
EEPROM_WRITE((int)&bak_password,password);
}
}
void renew_time(void)
{
if ((*(rec_order+RENT_OFFSET1)>29 && *(rec_order+RENT_OFFSET1)<40) && (*(rec_order+RENT_OFFSET2)>29 && *(rec_order+RENT_OFFSET2)<40))
{
time_now.year=unicode_number(*(rec_order+RENT_OFFSET1))*10+unicode(*(rec_order+RENT_OFFSET2));
}
if ((*(rec_order+RENT_OFFSET3)>29 && *(rec_order+RENT_OFFSET3)<40) && (*(rec_order+RENT_OFFSET4)>29 && *(rec_order+RENT_OFFSET4)<40))
{
time_now.month=unicode_number(*(rec_order+RENT_OFFSET3))*10+unicode(*(rec_order+RENT_OFFSET4));
}
if ((*(rec_order+RENT_OFFSET5)>29 && *(rec_order+RENT_OFFSET5)<40) && (*(rec_order+RENT_OFFSET6)>29 && *(rec_order+RENT_OFFSET6)<40))
{
time_now.date=unicode_number(*(rec_order+RENT_OFFSET5))*10+unicode_number(*(rec_order+RENT_OFFSET6));
}
if ((*(rec_order+RENT_OFFSET7)>29 && *(rec_order+RENT_OFFSET7)<40) && (*(rec_order+RENT_OFFSET8)>29 && *(rec_order+RENT_OFFSET8)<40))
{
time_now.hour=unicode_number(*(rec_order+RENT_OFFSET7))*10+unicode_number(*(rec_order+RENT_OFFSET8));
}
if ((*(rec_order+RENT_OFFSET9)>29 && *(rec_order+RENT_OFFSET9)<40) && (*(rec_order+RENT_OFFSET10)>29 && *(rec_order+RENT_OFFSET10)<40))
{
time_now.minute=unicode_number(*(rec_order+RENT_OFFSET9))*10+unicode_number(*(rec_order+RENT_OFFSET10));
}
if ((*(rec_order+RENT_OFFSET11)>29 && *(rec_order+RENT_OFFSET11)<40) && (*(rec_order+RENT_OFFSET12)>29 && *(rec_order+RENT_OFFSET12)<40))
{
time_now.hour=unicode_number(*(rec_order+RENT_OFFSET11))*10+unicode_number(*(rec_order+RENT_OFFSET12));
}
if (*(rec_order+RENT_OFFSET13)>29 && *(rec_order+RENT_OFFSET13)<40)
{
time_now.weekday=unicode_number(*(rec_order+RENT_OFFSET13));
}
set_DS1302(0x80,&time_now.second,7);
}
void check_device(void)
{
unsigned char i;
unsigned char a,b;
for (i=0;i<18;i++)
{
if (unicode_number(*(rec_order+i))==bug[0][i])
{
a+=1;
if (a==18)
{
device_flag=0;
}
}
if (unicode_number(*(rec_order+i))==bug[1][i])
{
b+=1;
if (b==18)
{
device_flag=1;
}
}
}
}
void device_bug(void)
{
while (!device_flag)
{
check_device();
WDR();
}
}
void password_error(void)
{
unsigned char i;
unsigned char a[10];
a[0]=0x5b;
a[1]=0xc6;
a[2]=0x78;
a[3]=0x01;
a[4]=0x95;
a[5]=0x19;
a[6]=0x8b;
a[7]=0xef;
a[8]=0x30;
a[9]=0x02;
for ( i=0 ; i<10 ; i++ )
{
UDR=a[i];
while(!(UCSRA & 0x40))
{
;
}
}
}
void newpassword_error(void)
{
unsigned char i;
unsigned char a[14];
a[0]=0x65;
a[1]=0xb0;
a[2]=0x65;
a[3]=0xe7;
a[4]=0x5b;
a[5]=0xc6;
a[6]=0x78;
a[7]=0x01;
a[8]=0x4e;
a[9]=0x0d;
a[10]=0x54;
a[11]=0x0c;
a[12]=0x30;
a[13]=0x02;
for ( i=0 ; i<14 ; i++ )
{
UDR=a[i];
while(!(UCSRA & 0x40))
{
;
}
}
}
void order(void)
{
switch(*(rec_order+PROGRAM_OFFSET1))//PROGRAM_OFFSET1 is offset of UNICODE_CHENG1
{
case UNICODE_CHENG1: program_order(); break;
case UNICODE_TING: halt_program();break;
case UNICODE_KAI: start_program();break;
case UNICODE_LI: startnow_program();break;
case UNICODE_ZENG: add_program();break;
case UNICODE_QING: delete_program();break;
case UNICODE_KAI: open_valve();break;
case UNICODE_GUAN: close_valve();break;
case UNICODE_QUAN: all_close();break;
case UNICODE_XIN: renew_password();break;
case UNICODE_QUESTION: query();break;
case UNICODE_XIAN: renew_time();break;
default :unavailable_order();
}
}
//Interrupt of SCI for RS232
#pragma interrupt_handler uart0_rx_isr:14
void uart0_rx_isr(void)
{
//uart has received a character in UDR
*p_order=UDR;
if (*p_order==UNICODE_FULLSTOP || *p_order==UNICODE_SEMICOLON)
{
if (*p_order==UNICODE_FULLSTOP)
{
EEPROM_WRITE((int)&bak_program[program_num],program[program_num]);
}
p_order=rec_order;
}
p_order+=1;
password_check();
if (passwor_flag==1)
{
order();
}
else
{
password_error();
}
}
//Dealling with accidents in twi communication
void twi_error(void)
{
}
//Write a byte to eeprom
void write_byte(unsigned int address, unsigned char ucdat)
{
unsigned char address_low;
unsigned char address_high;
address_low = (unsigned char)address;
address_high = (unsigned char)((address & 0xf0)>>8);
TWCR=(1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)))
{
;
}
if ((TWSR & 0xf8) != I2C_START)
{
twi_error();
}
TWDR = EEPROM_W;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)))
{
;
}
if ((TWSR & 0xf8) != I2C_MTA_ACK)
{
twi_error();
}
TWDR = address_high;
TWCR = (1<<TWINT) | (1<<TWINT);
while (!(TWCR & (1<<TWINT)))
{
;
}
if ((TWSR & 0xf8) != I2C_MTD_ACK)
{
twi_error();
}
TWDR = address_low;
TWCR = (1<<TWINT) | (1<<TWINT);
while (!(TWCR & (1<<TWINT)))
{
;
}
if ((TWSR & 0xf8) != I2C_MTD_ACK)
{
twi_error();
}
TWDR = ucdat;
TWCR = (1<<TWINT) | (1<<TWINT);
while (!(TWCR & (1<<TWINT)))
{
;
}
if ((TWSR & 0xf8) != I2C_MTD_ACK)
{
twi_error();
}
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
}
//Read a byte from eeprom
unsigned char read_byte(unsigned int address, unsigned char ucdat)
{
unsigned char address_low;
unsigned char address_high;
unsigned char read_byte;
address_low = (unsigned char)address;
address_high = (unsigned char)((address & 0xf0)>>8);
TWCR=(1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)))
{
;
}
if ((TWSR & 0xf8) != I2C_START)
{
twi_error();
}
TWDR = EEPROM_W;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)))
{
;
}
if ((TWSR & 0xf8) != I2C_MTA_ACK)
{
twi_error();
}
TWDR = adddress_high;
TWCR = (1<<TWINT) | (1<<TWINT);
while (!(TWCR & (1<<TWINT)))
{
;
}
if ((TWSR & 0xf8) != I2C_MTD_ACK)
{
twi_error();
}
TWDR = adddress_low;
TWCR = (1<<TWINT) | (1<<TWINT);
while (!(TWCR & (1<<TWINT)))
{
;
}
if ((TWSR & 0xf8) != I2C_MRD_ACK)
{
twi_error();
}
TWCR=(1<<TWINT) | (1<<TWSTA) | (1<<TWEN);//Restart
while (!(TWCR & (1<<TWINT)))
{
;
}
if ((TWSR & 0xf8) != I2C_RESTART)
{
twi_error();
}
TWDR = EEPROM_R;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)))
{
;
}
if ((TWSR & 0xf8) != I2C_MRA_ACK)
{
twi_error();
}
read_byte = TWDR;
TWCR &= 0xbf;
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
return (read_byte);
}
//Write a byte to 24LC64
void write_24LC64(void)
{
}
//UART0 initialisation
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
// char size: 5 bits
// parity: Disabled
void query_trans(void)
{
unsigned char a[12];
a[0]=0x00;
a[1]=0x30;
a[2]=0x00;
a[4]=0x00;
a[6]=0x96;
a[7]=0x00;
a[10]=0xff;
a[11]=0x0c;
for (k=0 ; k<7; k++)
{
for ( i=0 ; i<10 ; i++ )
{
for ( j=0 ; j<10 ; j++ )
{
UDR=a[j];
a[3]=0x30+i/10;
a[5]=0x30+i%10;
check_valve(i);
if (vlave_statusnow)
{
a[8]=0x5f;
a[9]=0x00;
}
else
{
a[8]=0x51;
a[9]=0x73;
}
while(!(USR & 0x40))
{
;
}
}
}
delay_ms(1000);
}
}
unsigned char number_unicode(unsigned char a)
{
return(a+30);
}
//ADC initialisation
// Conversion time: 3uS
void adc_init(void)
{
ADCSR = 0x00; //disable adc
ADMUX = ADC_VREF_TYPE; //select adc input 0
ACSR = 0x80;
ADCSR = 0xA1;
}
//Delay time of ius
void delay_us(int time)
{
{
time--;
}
while (time>1);
}
void delay_ms(int time)
{
unsigned int i;
for ( i=0; i<time ;i++ )
{
delay_us(1000);
}
}
//ADC convert
int adc_convert(unsigned char *p_adc_mux)
{
ADMUX=*p_adc_mux;
ADCSR=0xE1;
while(!(ADCSR & 0x10);
return (ADC & 0x3ff);
}
void get_adc(void)
{
int sum;
unsigned char a;
sensor.water_result[adc_num][adc_offset]=adc_convert(&adc_num);
adc_num+=1;
if (adc_mux==ADC_NUM)
{
adc_mux=0;
adc_offset+=1;
if (adc_offset==5)
{
adc_offset=0;
for (i=0 ; i<8 ; i++)
{
for (j=0 ; j<5; j++)
{
sum+=sensor.water_result[i][j];
}
}
sum/=40;
if (sum>sensor.water_threshold)
{
for (i=0;i<8;i++)
{
for (j=0;j<8;j++)
{
if ((sensor.attend_valve[i]>>j)&0x01)
{
a=i*8+j;
rf_flag=0;
set_valve(a);
rf_open(a);
while (rf_flag==0)
{
;
}
}
}
}
}
}
}
}
//Main function
void main(void)
{
p_order=rec_order;
rf_type=1;
rf_time=0;
program_num=3;
password_flag1=1;
password_flag2=1;
sensor.water_threshold=;
EEPROM_READ((int)&bak_password,pass_word);
EEPROM_READ((int)&bak_device_flag,device_flag);
EEPROM_READ((int)&bak_bug,bug);
EEPROM_READ((int)&bak_program,program);
init_devices();
while(1)
{
device_bug();
program_main();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -