📄 13.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 asm_code_reception(void);
void baud_interval_time(void);
//--------------SMS FUNCTION----------------
void send_sms(char *a1, char *b1);
//------------------------------------------
char gps_rcv_data_array[75];
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=\"9944676010\"*";
//-------------------------------------------
#INT_EXT
void reception()
{
INT0IF = 0;
asm_code_reception();
while(gps_rcv_data_array[gps_j] == 0X0A)
{
gps_j = -1;
INT0IE = 0;
send_sms(sms, gps_rcv_data_array);
delay_ms(5000);
}
++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
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 )
}
#INT_EXT2
void ext_isr()
{
INT2IF = 0;
RE0 = 0;
delay_ms(500);
INT0IF = 0;
INT0IE = 1;
}
//************MAIN FUNCTION********************************************
void main()
{
io_ports_initialize();
usart_initialize();
transmit_message(0);
delay_ms(1500);
transmit_message(1);
delay_ms(1500);
transmit_message(2);
delay_ms(1500);
transmit_message(3);
delay_ms(1500);
transmit_message(4);
delay_ms(1500);
transmit_message(5);
delay_ms(1500);
enable_interrupt();
while(1)
{ RE0 = ~RE0;
delay_ms(50);
}
}
//************************SMS SENDING FUNCTION*************
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);
}
void io_ports_initialize()
{
TRISB = 0XFD; // 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;
}
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
INT2IP = 0; // LOW PRIORITY
INT2IE = 1; // ENABLE EXTERNAL INTERRUPT 2
INTEDG0 = 0; // Interrupt on falling edge for EXT0
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];
while(*tx_ptr)
{
delay_ms(5);
if((TXIF==1)||(TRMT==1))
{
TXREG = *tx_ptr;
tx_ptr++;
}
}
TXREG = 13;
delay_ms(5);
TXREG = 10;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -