📄 vt.3.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 + -