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

📄 gpscx.c

📁 GPS调试程序
💻 C
📖 第 1 页 / 共 5 页
字号:
	TWSR=0;
	TWCR=(1<<TWEN)|(0<<TWIE)|(0<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC);
}

void delay (unsigned int byte)
{
	unsigned int i;
	while(byte--)
	for(i=0;i<1000;i++);	
}

void SpiWrite(unsigned char  byte)
{
 	SPDR=byte;
	SPI_STATUS ();
}

unsigned char SpiRead(void)
{
 	SPDR=45;
	SPI_STATUS ();
	return SPDR;			// Return function parameter
}

void mb_proc(void)
{
	unsigned char m,temp,flag_ptr_rxerror=0;
	do {
	while (1)
	{
	m=PINE & ptr_dr;
	temp=1;
	temp=1;
	if (m) break;
	}
//PORTF &=led_cloader;	
	PORTE &=ptr_ctxce;
	PORTB &=ptr_ccsn;
	delay (1);

	SpiWrite(ptr_rrp);
	for(m=0;m<len_ptr_data;m++)
	{
	delay (1);
	mb_jdtarg[m]=SpiRead();
	}
	for(m=0;m<23;m++)
	{
	delay (1);
	temp=SpiRead();
	}
	PORTB |=ptr_scsn;
	temp=PINE;
	while (((temp & ptr_dr) == ptr_dr)
			|| ((temp & ptr_am) == ptr_am));	//数据已收到

	temp =mb_jdtarg[0]*100+mb_jdtarg[1];
	if ((temp>179) || (mb_jdtarg[4]>99))
	   {
		flag_ptr_rxerror=1;
		delay (10);
		PORTB &=ptr_ctxen;
		PORTB |=ptr_stxce;	//to rx
		delay (10);
	   }
	else  
		 {
		 LBH_Targ[0]=temp+mb_jdtarg[2]/60.0+(mb_jdtarg[3]+mb_jdtarg[4]/100.0)/3600.0;
		 LBH_Targ[1]=mb_jdtarg[5]+mb_jdtarg[6]/60.0+(mb_jdtarg[7]+mb_jdtarg[8]/100.0)/3600.0;
		 LBH_Targ[2]=atof(mb_hdtarg);
		}
	
//	mb_proc();
	}
	while (flag_ptr_rxerror);
	Targ_load=TRUE;				//置目标已装定标志
PORTF &=led_cloader;	
	lcd_targ();				//LCD上显示目标数据
	lcd_mbcircle();									//LCD上画目标点
}

void spiport_ini(void)			//spi初始化													  
{
 	 unsigned char temp;
 	 SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);
	 SPSR=0x00;
	 temp=SPSR;
	 temp=SPDR;
}

void spi_ini(void)			//use TO ptr8000	无线模块初始化													  
{
  	 unsigned char temp;

	PORTB &=ptr_ccsn;
	delay (1);
	SpiWrite(ptr_wc);
	for(temp=0;temp<len_ptr_config;temp++)		//CONFIG
	{
	SpiWrite(flash_ptr8000_config[temp]);
	}
	PORTB |=ptr_scsn;
	delay (2);

	PORTB &=ptr_ctxen;
	PORTB |=ptr_stxce;	//to rx
}

void usart_ini(void)	
{
	UCSR0B=0x98;		//RX-INT EN,RXEN,
	UCSR0C=0x06;		//,ASYNC ,NO-PARITY,1-STOP,8bit data bit	
	UBRR0H=0x00;
	UBRR0L=gpsubrrL;


	UCSR1B=0x98;		//RX-INT EN,TX-INT EN,RXEN,TXEN
	UCSR1C=0x06;		//,ASYNC ,NO-PARITY,1-STOP,8bit data bit
	UBRR1H=0x00;
	UBRR1L=lbubrrL;	
}

void e16c550_ini(void)			 //use TO uSb 
{
 	unsigned char temp;
	
	MUB_LCTRREG=d_inidlb550;
	MUB_HDLBREG=d_hband550;
	MUB_LDLBREG=d_lband550;
	temp=MUB_LCTRREG;
	MUB_LCTRREG=d_lctr550;
	MUB_MODEMCREG=d_modemc550;
//	MUB_IENREG=d_ienable550;
	MUB_IENREG=0;	
	MUB_IIDREG=0x00;				//	16C550 初始化

	temp=MUB_IIDREG;
//	pusb_open_file();				//打开USB上的"HTCPROC"文件	用于存储数据
/*	MUB_LCTRREG=d_inidlb550;
	MUB_HDLBREG=d_hband550;
	MUB_LDLBREG=d_lband550;
	temp=MUB_LCTRREG;
	MUB_LCTRREG=d_lctr550;
	MUB_MODEMCREG=d_modemc550;
*/	MUB_IENREG=d_ienable550;
	MUB_IIDREG=0x00;
	temp=MUB_IIDREG;				//	16C550 重新初始化,开中断
}

void adc_ini(void)					// A/D初始化
{
	ADCSRA=0x00;
	ADMUX=0x40;		//AREF
	ACSR=(1<<ACD);	//CLOSE M
	ADCSRA=(1<<ADSC)|(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);	//fclk/128						  
    AD_num=0;
	
//	ADCSRA=(1<<ADSC);		//START AD
}

void time_ini(void)				//检测流速的定时器1和3初始化
{
	TIMSK=(1<<TOIE2);
	ETIMSK=(1<<TOIE3);

	TCCR2=0;
	TCCR3B=0;	//1024/14.7456	//SPEED
}

void time_start(void)			//检测流速的定时器1启动
{
	 TCNT3=0;
	 speed_intctount=0;
	 buf_speerfirst=0;		 
	 speed_buf=0;
	 last_time=0;
	 buf_zspeed_cttime=0;
	 buf_zspeed_ctint=0;
	 TCNT2=0x0ff;
	 TCCR2=0x07;
	speed_ctgap=d_speedgap;
}

void time_stop(void)			//检测流速
{
	double temp=0;
	move_pulse=speed_buf;///2;
	if (move_pulse==1)
	{
	move_time=speed_intctount*4;
	if (TCNT3>0x1F00) temp=(TCNT3-0x1F00);
	else temp=0;
	}
	else 
	{
	   if(move_pulse>1) move_pulse=move_pulse-1;
	   move_time=buf_zspeed_ctint*4;
	   if (buf_zspeed_cttime>0x1F00) temp=(buf_zspeed_cttime-0x1F00);
	   else temp=0;
	}
	temp=(temp/14400.0);//*4/57600.0;	//65536-0x1f00
	move_time+=temp;//*5;
//	temp=move_time;
	new_move_vel=TRUE;
	//lcd_bit4dis(120,60,move_time);
	
   // lcd_bit3dis(18,48,move_pulse);
	//move_velocity();
	//lcd_bit3dis(18,68,move_vel);
//lcd_pressure (move_time);
 //     lcd_compass(move_pulse);
}

void ini_rob(void)
{
 	 unsigned char m;

	 PORTB=(1<<PB0)|(1<<PB3)|(1<<PB4);	//PB3=MISO
	 DDRB=(1<<DDB0)|(1<<DDB1)|(1<<DDB2)|(1<<DDB4)|(1<<DDB5)|(1<<DDB6);	//PB0=csn,PB1=SCK,PB2=MOSI,PB3=MISO,PB4=PTRT_PWR,PB5=PTRT_CE,PB6=PTRT_EN
//	 PORTC=0;
	 DDRC=0xff;	//
	 PORTD=(1<<PD6)|(1<<PD7);	//	PD6=SPEED,PD7=SPEED
	 DDRD=(1<<DDD0)|(1<<DDD3);	//
	 PORTE=(1<<PE0)|(1<<PE4)|(1<<PE5);			//(1<<PE4)|(1<<PE5);
	 DDRE=(1<<DDE1);	//PE2=IUB,IPTRCD,/INTCLK,/IUBPTR,IPTRAM,IPTRDR
	 PORTF=(1<<PF1)|(1<<PF2);	//PF1=UPWATER-LED,PF2=LOAD-LED,
	 DDRF=(1<<PF1)|(1<<PF2);	//
	 PORTG=(1<<PG0)|(1<<PG1);
	 DDRG=(1<<DDG0)|(1<<DDG1);
	 	
	
	lcd_clr_ping();				//LCD清屏
	lcd_ini_zf();					//LCD初始化
	time_ini();					//检测流速初始化
	usart_ini();				//用于GPS和电子罗盘的串口初始化
	adc_ini();					//水深A/D初始化
	
		
	twi_master_initialise();	//用于板上时钟的I2C初始化
//	m=clk_ini();		//i2c
	 I2CStop();
//	 while ((TWCR&(1<<TWSTO))!=0);
	 TWCR=0;

	speed_ctgap=d_speedgap;			//检测流速的时间间隔
	flag_second_int=flag_adcrxed=0;
	stste_pwr=d_strongpwr;	
	flag_gps_have=0;						//GPS卫星存在标志
	flag_gpsrhead=flag_gpshead1=0;			//GPS的"$ G"标志和"$"标志
	flag_gps_perrxdata=flag_mproc_gps=0;	//有GPS有效数据,正在处理GPS数据标志
	is_new_gps=0;							//GPS有效数据可以使用标志
	flag_lbhead=0;							//电子罗盘的"$"标志
	Current_i=0;							//电子罗盘数据使用指针
	//is_new_depth=0;							//水深A/D的数据可以使用标志
	Targ_load=0;							//目标装定标志
	
	//pressure_comput=move_comput=0;			//计算出水深和流速存储单元初始值为0

	TCNT3=0;
	flag_first_zd=TRUE;						//第一次定位标志

	spiport_ini();
	spi_ini();					 //无线模块初始化
	mb_proc();
PORTF &=led_cloader;	
//	e16c550_ini();				//用于USB的16C550 和USB初始化			
	EIMSK=0x00;			 //EINT7----------EINT0 MARK
	EICRB=/*(1<<ISC71)|(1<<ISC70)|*/(1<<ISC61)|(1<<ISC60)|(1<<ISC41)|(1<<ISC51);	 //7,6 EINT7 5,4EINT6,3,2EINT5,1,0EINT4,;00=LOW-LEVEL,01=YAN
					 	  //10=SAN YAN 11=XIA YAN TARET
						  				  //EINT 3--0 TARET MODE
	TIMSK=(1<<TOIE2);
	ETIMSK=(1<<TOIE3);
	EIMSK=(1<<INT4)|(1<<INT5);//|(1<<INT6)|(1<<INT7);			 //EINT7----------EINT0 MARK
//////EIFR=0;
	EIFR|=(1<<INTF4)|(1<<INTF5);//|(1<<INTF6)|(1<<INTF7);
}

unsigned char clk_ini(void)				//板上时钟初始化
{
 	unsigned char temp=2;
	DDRD &=~((1<<PD0)|(1<<PD1));
 	 I2CStart();
	 I2CWaitAck();
	 if (I2CChkAck()!=I2C_START ) return 0;
	 I2CSendByte(d_clk_w);
	 I2CWaitAck();
	 if (I2CChkAck()!=I2C_MT_SLA_ACK ) return 0;
	 I2CSendByte(d_clk_reg1add);
	 I2CWaitAck();
	 if (I2CChkAck()!=I2C_MT_DATA_ACK ) return 0;
 	I2CSendByte(d_clk_regcmd)	 //second level int
	I2CWaitAck();
	if (I2CChkAck()!=I2C_MT_DATA_ACK ) return 0;
 	I2CSendByte(d_clk_reg2cmd)	 //24hour no 32k
	I2CWaitAck();
	if (I2CChkAck()!=I2C_MT_DATA_ACK ) return 0;
//	 I2CStop();
	 return temp;
 }


void gps_rxproc(void)
{
	unsigned char k,m,n,t;
	unsigned int s;
	
	flag_gps_have=0;
	flag_mproc_gps=TRUE;

	k=(gps_mtimedata[0]&0x0f)*10;
	k+=gps_mtimedata[1]&0x0f;
	k=(k+8)%24;
	m=(gps_mtimedata[2]&0xf)*10;
	m+=gps_mtimedata[3]&0xf;
	n=(gps_mtimedata[4]&0xf)*10;
	n+=gps_mtimedata[5]&0xf;
	LBH_Current[3]=k*3600.0+m*60.0+n;	//GPS 时间
	
	if (k&&(n==0))						//每分对时
	{
	  sd2300_clk[0]=n;
	  sd2300_clk[1]=m;
	  sd2300_clk[2]=k;
	  m=clk_verify_proc();
	  I2CStop();
//	 while ((TWCR&(1<<TWSTO))!=0);
	 TWCR=0;
	}
	m=gps_mwdudata[0]&0x0f;
	n=gps_mwdudata[1]&0x0f;
	LBH_Current[1]=m*10+n;
	m=gps_mwdudata[2]&0x0f;
	n=gps_mwdudata[3]&0x0f;
	k=m*10+n;
	m=gps_mwdudata[5]&0x0f;
	n=gps_mwdudata[6]&0x0f;
	t=gps_mwdudata[7]&0x0f;
	s=m*1000+n*100+t*10+(gps_mwdudata[8]&0x0f);
	LBH_Current[1]+=k/60.0+s/600000.0;			//GPS 纬度
												
	s=gps_mjdudata[0]&0x0f;
	m=gps_mjdudata[1]&0x0f;
	n=gps_mjdudata[2]&0x0f;
	LBH_Current[0]=s*100+m*10+n;
	m=gps_mjdudata[3]&0x0f;
	n=gps_mjdudata[4]&0x0f;
	m=m*10+n;
	n=gps_mjdudata[6]&0x0f;
	t=gps_mjdudata[7]&0x0f;
	k=gps_mjdudata[8]&0x0f;
	s=n*1000+t*100+k*10+(gps_mjdudata[9]&0x0f);
	LBH_Current[0]+=m/60.0+s/600000.0;				//GPS 经度
	
//	LBH_Current[2]=atof(gps_mgdu);
    flag_mproc_gps=0;
 if (flag_first_zd)	
    {      k_gps++;
          if(k_gps>5)
          {LBH_jin[k_gps-6]=LBH_Current[0];
          LBH_wei[k_gps-6]=LBH_Current[1];}
	   if (k_gps>13)
	     { 
		 LBH_Current[0]=GPSprocess(LBH_jin,9);
		 LBH_Current[1]=GPSprocess(LBH_wei,9); 
		   lcd_zdcircle();
	       lcd_drawline (0,0,0,250,d_greencolor_lcd);
	       lcd_drawline (1,0,1,250,d_greencolor_lcd);
	       lcd_drawline (-1,0,-1,250,d_greencolor_lcd);
		   
		   
	        is_new_gps=TRUE;
	        lcd_newloc(LBH_Current[0],LBH_Current[1]);		//LCD的GPS 的定位信息
            lcd_upwbright(); 
	        flag_first_zd=0;		    
			k_gps=0;
			//time_temp=LBH_Current[3];
	     }

	}
	else
	{
   
	        is_new_gps=TRUE;
            lcd_newloc(LBH_Current[0],LBH_Current[1]);		//LCD的GPS 的定位信息
         //   lcd_upwbright(); 
	
	}
	
	
    PORTF &=led_cupwater;
}

/*void chk_power(void)
{
	unsigned int ipwr;
	unsigned char pwrstate_temp=0;

	flag_adcrxed=0;
	ipwr=ADC;
	if (ipwr<mix_pwr)  pwrstate_temp=d_lostpwr;
	else if (ipwr<middle_pwr) pwrstate_temp=d_midpwr;
	else if (ipwr<max_pwr) pwrstate_temp=d_maxpwr;
	else pwrstate_temp=d_strongpwr;
		pwrstate_temp=d_midpwr;

	if (stste_pwr>pwrstate_temp)
	{
		stste_pwr=pwrstate_temp;
		lcd_pwrbright();
	}
}
*/
void lcd_clr_ping(void)					//LCD清屏
{
	unsigned char y;
	unsigned int x;

	lcd_stateadd=d_lcdini_state_word;
	lcd_xadd=0;
	lcd_yadd=0;
	for (y=0;y<234;y++)
	for (x=0;x<320;x++)
	{lcd_dataadd=d_darkc;}
}

void lcd_ini_zf(void)					//LCD初始化界面
{
	unsigned char x,y,z,t;
	unsigned int ct_ounter;
	
/////////////////////////////////////////
	lcd_xadd=loc_lcdxmbz_head;
	lcd_yadd=z=loc_lcdyleft1_head;
	for (t=0;t<len_4zct;t++)
	for (y=0;y<len_zi;y++)
	{
	for (x=0;x<len_zi;x++) lcd_dataadd=flash_mbzlcd[t][y][x];
	lcd_yadd=z=z-1;
	lcd_xadd=loc_lcdxmbz_head;
	}		//ini mbjdz
	mao_hao(loc_xmbzmaohao,loc_lcdy4zmao_head);		//目标位置

/////////////////////////////////////

	//////////////////////mb-//////////////////
	lcd_xadd=loc_lcdxmbjdz_head;
	lcd_yadd=z=loc_lcdyq_head;
	for (y=0;y<7;y++)
	{
	for (x=0;x<7;x++) lcd_dataadd=flash_qzlcd[y][x];
	lcd_yadd=z=z-1;
	lcd_xadd=loc_lcdxmbjdz_head;
	}		//0
//	lcd_xadd=loc_lcdxmbjdz_head;
	lcd_yadd=z=loc_lcdyp_head;
	for (y=0;y<2;y++)
	{
	for (x=0;x<5;x++) lcd_dataadd=flash_pzlcd[y][x];
	lcd_yadd=z=z-1;
	lcd_xadd=loc_lcdxmbjdz_head;
	}		// "/"
//	lcd_xadd=loc_lcdxmbjdz_head;
	lcd_yadd=z=loc_lcdysp_head;
	for (y=0;y<6;y++)
	{
	for (x=0;x<5;x++) lcd_dataadd=flash_dpzlcd[y][x];
	lcd_yadd=z=z-1;
	lcd_xadd=loc_lcdxmbjdz_head;
	}		// "//"										//目标经度的  0, ',"

	lcd_xadd=loc_lcdxmbwdz_head;
	lcd_yadd=z=loc_lcdyq_head;
	for (y=0;y<7;y++)
	{
	for (x=0;x<7;x++) lcd_dataadd=flash_qzlcd[y][x];
	lcd_yadd=z=z-1;
	lcd_xadd=loc_lcdxmb

⌨️ 快捷键说明

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