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

📄 rfid.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 RCBUF1 = 0X3A3
#BYTE TEMP1 = 0X3A4


char gps_rcv_data_array[100];
char rfbuffer[15];
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",
					   };
char rfid_data[20]="RF:";


signed int gps_j = 0;
signed int rf = 0;
void io_ports_initialize(void);
void usart_initialize(void);
void enable_interrupt(void);

void asm_code_reception(void);
void rf_reception();

void transmit_message(int i);
void send_sms(char *a1, char *b1);	
void baudrate();
void baudrate1();

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

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

void baudrate()
{
	delay_us(104);
}


#INT_EXT1
void rf_isr()
{	
	INT1IF = 0;
	
	rf_reception();
	while(rfbuffer[rf] == 0x0D)
	{
		GIE=0;
		rf = -1;
		strcat(rfid_data,rfbuffer);
		//sprintf(sms,"AT+CMGS=\"9944933305\"*");
		send_sms(sms,rfid_data);
		GIE=1;
	}
	++rf;
}

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

void baudrate1()
{
	delay_us(104);
}

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

void main()	
{
	io_ports_initialize();
	usart_initialize();
	
	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();
	RE0 = 1;
	while(1);
}

void io_ports_initialize()
{	
	TRISB = 0X07;		// software uart RB0,RB1 is Used as RX PIN 
	RBPU = 0;			// PORTB Pull-up Resistors Enabled 
    TRISC = 0XBF;		// 1011 1111
	TRISE = 0X00;
	PORTE = 0X00;
}

void usart_initialize()
{
	TXSTA = 0X20;		//
	RCSTA = 0X90;		//	
	SPBRG = 0X20;		// baud rate = 9600
}	 

void enable_interrupt()
{
	IPEN = 1;			// RCON,IPEN: ENABLE INTERRUPT PRIORITY
	INTCON = 0X00;	// 1100 0000
	
	INT2IE = 1;			// ENABLE EXTERNAL INTERRUPT 2
	INT2IP = 0;			// low PRIORITY
	INTEDG2 = 0;		// Interrupt on falling edge for EXT2
	
	INT1IE = 1;			// ENABLE EXTERNAL INTERRUPT 1
	INT1IP = 0;			// low PRIORITY
	INTEDG1 = 0;		// Interrupt on falling edge for EXT1

	INT0IE = 1;
	INTEDG0 = 0;		// Interrupt on falling edge for EXT0

	GIE = 1;
	PEIE = 1;
}

void transmit_message(int i)
{
	char *tx_ptr=&at_cmd[0][0];
	tx_ptr=&at_cmd[i][0];
	while(*tx_ptr)
	{	
		delay_ms(25);
		if((TXIF==1)||(TRMT==1))
		{
			TXREG = *tx_ptr;
			tx_ptr++;	
		}
	}
	TXREG = 13;
	delay_ms(25);
}

void send_sms(char *tx_ptr1, char *tx_ptr2)	
{
	while(*tx_ptr1 !='*')
	{	
		delay_ms(25);
		if((TXIF==1)||(TRMT==1))
		{	
			TXREG = *tx_ptr1;
			tx_ptr1++;	
		}
	}
	TXREG = 13;
	delay_ms(25);

	while((*tx_ptr2 != 0x0A))
	{	
		delay_ms(25);
		if((TXIF==1)||(TRMT==1))	
		{
			TXREG = *tx_ptr2;
			tx_ptr2++;	
		}
	}
	TXREG = 0X1A;
	delay_ms(25);
}

⌨️ 快捷键说明

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