your problem is placing the TX,RX,GROUND in GSM board. you have to connect these pin from micro controller to directly max rs 232 in GSM modem just check and tell.
#include<htc.h>
#include<pic16f877a.h>
#include<string.h>
#include<stdio.h>
#define _XTAL_FREQ 20e6
__CONFIG( FOSC_HS & WDTE_OFF & PWRTE_ON & CP_OFF & BOREN_ON & LVP_OFF & CPD_OFF & WRT_OFF & DEBUG_OFF);
#define BAUDRATE 9600
#define load PORTB
#define rs RC0 // lcd register select
#define rw RC1 // lcd register write
#define en RC2 // lcd register enable
#define swit RD0 // gas sensor input to the microcontroller
#define msg_init "AT\r"
#define msg_format "AT+CMGF=1\r"
#define msg_send "AT+CMGS="
#define number "9578671198" // ashok number
#define message1 "\rGSM CHECKING\r"
void InitUART(void); // serial communication init
void SendByteSerially(unsigned char); // serial communication data sending
unsigned char UART_Read(void);
void SendStringSerially(const unsigned char*); // send byte serially
void delayms(unsigned int); // delay ms
void lcd_cmnd(unsigned char); //lcd command
void lcd_data( char); // lcd indication for data sending
void lcd_string(const char*); // lcd c0nstant value of string sending
void lcd_init(void);// lcd init
void interrupt ISR(void);
void sms_modem(void);
unsigned int value;
unsigned char uart_rd[20], k = 0, m = 0;
void main(void)
{
TRISC = 0x80;
TRISB=0;
TRISC0=0;
TRISC1=0;
TRISC2=0;
TRISC3=0;
TRISD0=0;
swit=0;
load=0X00;
lcd_init();
lcd_cmnd(0X01);
lcd_cmnd(0X80);
lcd_string("Welcome !");
InitUART();// Intialize UART
GIE = 1;
PEIE = 1;
while(1)
{
if(swit==1)
{
// InitUART(); // Intialize UART
sms_modem();
}
}
}
void sms_modem(void)
{
InitUART();
SendStringSerially(msg_init);
SendByteSerially(0X0D);
SendByteSerially(0X0A);
delayms(20);
SendStringSerially(msg_format);
SendByteSerially(0X0D); // Send string on UART
SendByteSerially(0X0A);
delayms(20);
SendStringSerially(msg_send); // send string to UART
SendByteSerially(0X22);
SendStringSerially(number); // send string to UAR
SendByteSerially(0X22);
SendByteSerially(0X0D);
SendByteSerially(0X0A);
delayms(20);
SendStringSerially(message1);
SendByteSerially(0X0D);
SendByteSerially(0X1A);
SendByteSerially(0X0D);
delayms(30);
lcd_init();
lcd_cmnd(0X01);
lcd_cmnd(0X80);
lcd_string("GSM WORKING");
}
/************************************* interrupt declare *********************/
void interrupt ISR(void)
{
if(RCIF)
{
if(OERR)
{
CREN = 0;
CREN = 1;
}
uart_rd[m] = RCREG;
if(uart_rd[m] == '"')
{
k++;
m = 0;
}
if(k == 6)
{
uart_rd[m] = '\0';
k = 0;
m = 0;
}
}
}
/************************** serial communication init ********************/
void InitUART(void)
{
// TRISC6 = 1; // TX Pin
// TRISC7 = 1; // RX Pin
SYNC=0; //Asynchronous mode
BRGH=1; //High Speed
SPBRG=25; //9600 bps
//BRGH = 1; // Fast baudrate
// SYNC = 0; // Asynchronous
SPEN = 1; // Enable serial port pins
CREN = 1; // Enable reception
SREN = 0; // No effect
TXIE = 0; // Disable tx interrupts
RCIE = 1; // Enable rx interrupts
TX9 = 0; // 8-bit transmission
RX9 = 0; // 8-bit reception
TXEN = 0; // Reset transmitter
TXEN = 1; // Enable the transmitter
TRISC = 0x80;
// TXSTA = 0x24;
// RCSTA = 0x90;
}
/********************* serial communication data sending ******************/
void SendStringSerially(const unsigned char* st)
{
while(*st)
SendByteSerially(*st++);
}
/********************** serial data receiving **********************************/
void SendByteSerially(unsigned char Byte) // Writes a character to the serial port
{
while(!TXIF); // wait for previous transmission to finish
TXREG = Byte;
}
/************************** write from uart **********************/
unsigned char UART_Read(void)
{
if(OERR)
{
CREN = 0;
CREN = 1;
}
while(!RCIF);
return RCREG;
}
/***************************** LCD INIT *************************/
void lcd_init()
{
lcd_cmnd(0X38); // configuring LCD as 2 line 5x7 matrix
lcd_cmnd(0X0C); // Display on, Cursor blinking
lcd_cmnd(0X01); // Clear Display Screen
lcd_cmnd(0X06); // Increment Cursor (Right side)
}
/******************************** LCD COMMAND ***************************/
void lcd_cmnd(unsigned char command)
{
load=command;
rs=0;
rw=0;
en=1;
delayms(1);
en=0;
}
/********************************* LCD STRING **************************/
void lcd_string(const char *string)
{
while(*string)
{
lcd_data(*string++);
}
}
/************************************ LCD DATA *************************/
void lcd_data(char data)
{
load=data;
rs=1;
rw=0;
en=1;
delayms(1);
en=0;
}
/********************************** delay calling ********************/
void delayms(unsigned int delayms)
{
unsigned int i,j;
for(i=0;i<=delayms;i++)
{
for(j=0;j<=500;j++);
}
}
please tell me what is the problem in this code. its not working in hardware working good in proteus..