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

📄 vt.c

📁 This is the source code for GSM - GPS based Vehicle Tracking System done using PIC microcontroller a
💻 C
字号:
#include <18F4550.h>
#include <stdio.h>
#include <18F4550_SFR.h>
#FUSES HS,NOPROTECT,NOLVP,PUT,NOWDT,CPUDIV1,NOPBADEN,NOSTVREN
#use delay(clock = 20000000)
#BYTE RCBUF = 0X3A1
#BYTE TEMP = 0X3A2

void io_ports_initialize(void);
void usart_initialize(void);
void enable_interrupt(void);
void transmit_message(int i);
void receive_data();
void display_data();
void disp();
void receive_data_test();
void clear_arrays();
int check_response(int i,char *c_value);
void asm_code_reception(void);
void baud_interval_time(void);

//--------------SMS FUNCTION----------------
void send_sms(char sms[], char sms1[]);
//------------------------------------------

int rcv_cnt=1;
char arr[250];	
char gps_rcv_data_array[75] = "$GPRMC,161229.487,A,3723.2475,N,12158.3416,W,0.13,309.62,120598, ,*10>";
char *gps_rcv_ptr = &gps_rcv_data_array[0];
signed int gps_j = 0;
char at_cmd[10][35] = { 
						"AT+CPIN?",
						"AT+CCLK=\"08/02/29,14:55:00\"",
						"AT+CPMS=\"SM\"",
						"AT+CMGF=1",
						"AT+CNMI=2,1,0,0,0",
						"AT+CSAS"
					 };
//------------SENDING SMS-------------------
char sms[25] = "AT+CMGS=\"9965113555\"";
char sms1[28] = "1059.76,N,7659.73,E";
//-------------------------------------------
char *rcv_ptr=&arr[0];
char response_arr[50];
char *response=&response_arr[0];
char rcv_ch=' ';
int count = 5, count1 = 2;

#INT_EXT
void reception()
{	
	INT0IF = 0;
	asm_code_reception();
	while(gps_rcv_data_array[gps_j] == 0X2A)
	{
		gps_j = -1;
	}
	++gps_j;
}

#INT_EXT2
void ext_isr()	
{
	char *resp_message1;
	char resp_mess_arr1[15];
	INT2IF = 0;
	RE0 = 1;
	if(RB2 == 1)	
	{
		delay_ms(10);
		if(RB2 == 1)	
		{
		//ISR ROUTINE FOR INTERRUPT TO AVOIDE KEY BOUNCE
		//********************SENDING SMS***************************
		send_sms(sms, sms1);
		delay_ms(1500);
		/*if (check_response(4,resp_message1))
			{
				resp_message1=resp_mess_arr1;
				delay_ms(300);
			}
			else
			{
				resp_message1=resp_mess_arr1;
				delay_ms(300);
			}*/
		}
	}
}

#INT_RDA
void rcv_isr()
{
	*rcv_ptr = RCREG;
	rcv_ptr++;
	rcv_cnt++;
	/*if (rcv_cnt>0 && *rcv_ptr==10 && rcv_ch==13)
	{
		RE0=~RE0;
	}*/
	rcv_ch=*rcv_ptr;
}

/****************************************************************************************************************
************MAIN FUNCTION********************************************************************************************
*******************************************************************************************************************/

void main()	
{
	char *resp_message,resp_mess_arr[50];
	int flag = 0;
	resp_message=resp_mess_arr;
	io_ports_initialize();
	usart_initialize();
	enable_interrupt();
	resp_message=resp_mess_arr;

	
		
//------------------FIRST COMMAND CHECKING---------------------------
	
	transmit_message(0);
	RE0  = 1;
	delay_ms(1500);
	

/*	if (check_response(2,resp_message))
	{
		resp_message=resp_mess_arr;
		delay_ms(300);
	}
	else
	{
		resp_message=resp_mess_arr;
		delay_ms(300);
	}*/
//-------------------SECOND COMMOND CHECKING------------------------
	transmit_message(1);
	RE0 = 0;
	delay_ms(1500);
/*	if (check_response(2,resp_message))
	{
		resp_message=resp_mess_arr;
		delay_ms(300);
	}
	else
	{
		resp_message=resp_mess_arr;
		delay_ms(300);
	}*/
//-------------------THIRD COMMOND CHECKING------------------------
			
	transmit_message(2);
	RE0 = 1;
	delay_ms(1500);
/*	delay_ms(1000);
	delay_ms(1000);
	if (check_response(4,resp_message))
	{
		flag = 1;
		resp_message=resp_mess_arr;
		delay_ms(300);
	}	
	else
	{
		flag = 0;
		resp_message=resp_mess_arr;
		delay_ms(300);
	}  */
//-------------------FOURTH COMMOND CHECKING------------------------
	
	transmit_message(3);
	RE0 = 0;
	delay_ms(1500);
/*	if (check_response(2,resp_message))
	{
		resp_message=resp_mess_arr;
		delay_ms(300);
	}
	else
	{
		resp_message=resp_mess_arr;
		delay_ms(300);
	}   */
//-------------------FIVTH COMMOND CHECKING------------------------
	
	transmit_message(4);
	RE0 = 1;
	delay_ms(1500);
/*	if (check_response(2,resp_message))
	{
		resp_message=resp_mess_arr;
		delay_ms(300);
	}
	else
	{
		resp_message=resp_mess_arr;
		delay_ms(300);
	} */
//-------------------SIXTH COMMOND CHECKING------------------------
		
	transmit_message(5);
	RE0 = 0;
	delay_ms(1500);
	
	send_sms(sms, sms1);
	RE0 = 1;
	delay_ms(3000);
	
	
	while(1);
/*	if (check_response(2,resp_message))
	{
		resp_message=resp_mess_arr;
		delay_ms(300);
	}
	else
	{
		resp_message=resp_mess_arr;
		delay_ms(300);
	}*/
	


}
//************************SMS SENDING FUNCTION*************

void send_sms(char sms[], char sms1[])	
{
	char *tx_ptr;
	tx_ptr = &sms[0];
	while(*tx_ptr)
	{	
		delay_ms(25);
		if((TXIF==1)||(TRMT==1))
		{	
			TXREG = *tx_ptr;
			tx_ptr++;	
		}
	}
	TXREG = 13;
	delay_ms(25);
	tx_ptr=&sms1[0];
	while(*tx_ptr)
	{	
		delay_ms(25);
		if((TXIF==1)||(TRMT==1))	
		{
			TXREG = *tx_ptr;
			tx_ptr++;	
		}
	}
	delay_ms(25);
	TXREG = 0X1A;
}
//*********************************************************

/*int check_response(int i,char *c_value)
{	
	int tj=0,ti=0;
	int len = 0;
	response=response_arr;
	while (tj<rcv_cnt)
	{	
		if (ti==i)
		{	
			*response++=arr[tj];
			len=1;
		}
		if (tj>0 && arr[tj]==10 && arr[tj-1]==13)
			ti++;
		tj++;
	}
	delay_ms(500);
	if (len==1)
	{	response--;
		response--;
		*response='\0';
	}
	response=response_arr;
	tj=strcmp(c_value,response);
	clear_arrays();
	if (tj)
		return 0;
	else
		return 1;
}*/

void io_ports_initialize()
{	
	TRISB = 0XFF;		// RB0 is Used as RX PIN and RD1 is Used as TX PIN
	RBPU = 0;			// PORTB Pull-up Resistors Enabled 
    TRISC = 0XBF;
	TRISE = 0X00;
}

void usart_initialize()
{
	TXSTA = 0X20;		//TXSTA,BRGH: USE HIGH SPEED  BAUD RATE
	RCSTA = 0X90;	//	
	SPBRG = 0X20;	// baud rate = 9600
}	 

void enable_interrupt()
{
	IPEN = 1;			//RCON,IPEN: ENABLE INTERRUPT PRIORITY
	GIE = 1;			//INTCON,GIE:  ENABLE HIGH PRIORITY INTR'S
	PEIE = 1;			//INTCON,PEIE:  ENABLE LOW PRIORITY INTR'S
	RCIP = 0;			//IPR1,RCIP:  SET RCV IS LOW PRIORITY
	RCIE = 1;			//PIE1,RCIE:  RCV INTERRUPT
	INT2IP = 0;			// HIGH PRIORITY
	INT0IE	= 1;
	INT2IE = 1;
	INTEDG0 = 0;		// Interrupt on falling edge for EXT0
	INTEDG2 = 1;
}

void transmit_message(int i)
{
	char *tx_ptr=&at_cmd[0][0];
	tx_ptr=&at_cmd[i][0];

	rcv_ptr=&arr[0];
	rcv_cnt=0;

	while(*tx_ptr)
	{	
		delay_ms(5);
		if((TXIF==1)||(TRMT==1))
		{
			TXREG = *tx_ptr;
			tx_ptr++;	
		}
	}
	TXREG = 13;
	delay_ms(5);
	TXREG = 10;
}

void clear_arrays()
{	
	int i=0;
	for (i=0;i<250;i++)
	arr[i]='\0';
	for (i=0;i<50;i++)
	response_arr[i]='\0';
}

void asm_code_reception()
{
#asm
inch_n:
		btfsc PORTB,0; 		SKIP ON START BIT = 1 (A "MARK")
		goto inch_n; 		ELSE KEEP LOOKING FOR A START BIT
		movlw 0x08; 		START SERIAL INPUT SEQUENCE
		movwf TEMP; 		COLLECT 8 DATA BITS
		clrf RCBUF; 		CLEAR SERIAL CHARACTER BUFFER
		btfsc PORTB,0; 		FALL THRU IF START BIT STILL = 1 (A "MARK")
		goto inch_n; 		ELSE IT WAS JUST A NOISE SPIKE, KEEP LOOKING
inch_n1:
#endasm
		baud_interval_time();
#asm
		bcf STATUS,0; 		CLEAR THE CARRY BIT
		rrcf RCBUF,F; 		ROTATE CRY -> MSB, ROTATE MSB RIGHT
		btfsc PORTB,0; 		IS IT A "MARK" ?
		bsf RCBUF,7; 		...SKIP IF YES, ELSE SET BIT TO LOGIC '1'
		decfsz TEMP,F; 		EIGHT COUNTS YET?
		goto inch_n1; 		...NO, GET ANOTHER BIT
#endasm
		baud_interval_time();
		gps_rcv_data_array[gps_j] = RCBUF;
}

void baud_interval_time()
{
	delay_us(49);		// baudrate interval time(it should be 3 micro secs less than actual interval time )
}

⌨️ 快捷键说明

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