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

📄 gsmexa_1.c

📁 AVR MCU application to control valves and pumps
💻 C
📖 第 1 页 / 共 3 页
字号:
		{
			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 + -