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

📄 vt.3.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
#BYTE TXBUF = 0X3A3
#BYTE UART_STA = 0X3A4
#BIT UART_TXIF = UART_STA.7

char gps_rcv_data_array[100];
signed int gps_j = 0;
char sms[25];
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",
					   };
void io_ports_initialize(void);
void usart_initialize(void);
void enable_interrupt(void);

void transmit_message(int i);
void send_sms(char *a1, char *b1);
void gsm_asmcode_transmission(void);
void gsm_baudtime(void);

void gps_reception(void);
void gps_asmcode_reception(void);
void gps_baudtime(void);

#INT_EXT
void gps_reception()
{	
	INT0IF = 0;
	gps_asmcode_reception();
	while(gps_rcv_data_array[gps_j] == 0X0A)
	{
		gps_j = -1;
		INT0IE = 0;
		sprintf(sms,"AT+CMGS=\"9952910522\"*");
		send_sms(sms, gps_rcv_data_array);
	}
	++gps_j;
}

void gps_asmcode_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
		gps_baudtime();
#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
		gps_baudtime();
		gps_rcv_data_array[gps_j] = RCBUF;
}

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

#INT_EXT2
void ext_isr()	
{
	INT2IF = 0;
	RE0 = 1;
	INT0IE = 1;
	INTEDG0 = 0;		// Interrupt on falling edge for EXT0
	INT0IF = 0;
}

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

void main()	
{
	io_ports_initialize();
	usart_initialize();
	
	RE0 = 1;
	delay_ms(1000);

	transmit_message(0);
	delay_ms(2000);

	transmit_message(1);
	delay_ms(2000);

	transmit_message(2);
	delay_ms(2000);

	transmit_message(3);
	delay_ms(2000);

	transmit_message(4);
	delay_ms(2000);

	transmit_message(5);
	delay_ms(2000);

	enable_interrupt();

	while(1)
	{
		RE0 = ~RE0;
		delay_ms(10);
	}		
}

void io_ports_initialize()
{	
	TRISB = 0X05;		// software uart RB0 is Used as RX PIN and XXX is Used as TX PIN
	RBPU = 0;			// PORTB Pull-up Resistors Enabled 
    TRISC = 0XBF;
	TRISE = 0X00;
	PORTE = 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
	INTCON = 0XC0;
	INT2IE = 1;			// ENABLE EXTERNAL INTERRUPT 2
	INT2IP = 0;			// low PRIORITY
	INTEDG2 = 0;		// Interrupt on falling edge for EXT2
}

void transmit_message(int i)
{
	char *tx_ptr=&at_cmd[0][0];
	tx_ptr=&at_cmd[i][0];
	UART_TXIF = 1;
	while(*tx_ptr)
	{	
		delay_ms(25);
		if(UART_TXIF==1)
		{
			TXBUF = *tx_ptr;
			UART_TXIF = 0;
			gsm_asmcode_transmission();
			tx_ptr++;	
		}
	}
	TXBUF = 13;
	UART_TXIF = 0;
	gsm_asmcode_transmission();
	delay_ms(25);
}

void send_sms(char *tx_ptr1, char *tx_ptr2)	
{
	while((*tx_ptr1 !='*'))
	{	
		delay_ms(25);
		if(UART_TXIF==1)
		{	
			TXBUF = *tx_ptr1;
			UART_TXIF = 0;
			gsm_asmcode_transmission();
			tx_ptr1++;	
		}
	}
	TXBUF = 13;
	UART_TXIF = 0;
	gsm_asmcode_transmission();
	delay_ms(25);

	while((*tx_ptr2 != 0X0A))
	{	
		delay_ms(25);
		if(UART_TXIF==1)	
		{
			TXBUF = *tx_ptr2;
			UART_TXIF = 0;
			gsm_asmcode_transmission();
			tx_ptr2++;	
		}
	}
	TXBUF = 0X1A;
	UART_TXIF = 0;
	gsm_asmcode_transmission();
	delay_ms(25);
}


void gsm_asmcode_transmission()
{
#asm
outch_n: 	
			movlw 8; 			THE CHARACTER HAS 8 BITS
			movwf TEMP;
			bcf PORTB,4; 		SET START-BIT TO A "SPACE"
#endasm
			gsm_baudtime();
#asm
outch_n1:
			rrcf TXBUF,F; 		ROTATE THE FIRST BIT INTO CARRY
			btfss STATUS,0; 	TEST THE CARRY BIT
			bcf PORTB,4; 		IF BIT IS 0 SET OUTPUT PIN TO A "0" (SPACE)
			btfsc STATUS,0 ; 	TEST THE CARRY BIT AGAIN
			bsf PORTB,4; 		IF BIT IS 1 SET OUTPUT PIN TO A "1" (MARK)
#endasm
			gsm_baudtime();
#asm
			decfsz TEMP,F; 		IF COUNT IS ZERO THEN XMIT A STOP BIT
			goto outch_n1; 		...ELSE XMIT NEXT BIT
			rrcf TXBUF,F; 		ROTATE CARRY, GET THE MSB BACK INTO BIT 7
			bsf PORTB,4; 		SET PIN TO A 1 (A "MARK") FOR THE STOP BIT
#endasm
			gsm_baudtime();
			TXBUF = 0X00;
			UART_TXIF = 1;
}

void gsm_baudtime()
{
	delay_us(104);		
}

⌨️ 快捷键说明

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