📄 rfid.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 + -