Вы находитесь на странице: 1из 18

#include <htc.

h>
#include <ctype.h>

#include "delay.h"
#include "usart.h"



#define Response 0
#define Data 1

#define TX_ToModem RC0
#define TX_ToPC RC1
#define RX_ToModem RC3
#define RX_ToPC RC2

#define LCD_RS RD5
#define LCD_RW RD6
#define LCD_EN RD7
#define LCD_DATA PORTB

#define PLAY RD4

#define AC RD0
#define UPS RD1
#define GEN RD2



void lcd_cmd(unsigned char);
void lcd_data(unsigned char);
void lcd_string(const unsigned char*);

void config();
void LcdInitialize();
void ReadStatus();
void configTimer();
void InterruptSetting(void);
void WithGSM();
void WithPC();


unsigned char RxS;
unsigned char RxH;
unsigned char ModemRxStr[100];
unsigned char TerminalRxStr[50];
unsigned char ModemSendString[4]={'\0','\0','\0','\0'};
unsigned char LFCount=0;
unsigned char i=0,j=0,k=0;
unsigned char RxLineCount;
unsigned char Mode;
unsigned char SendMsg=0;
unsigned char MakeCallFlag=0;
unsigned int Timer3Counter=0;
unsigned char RegularSMSSendFlag=1;
unsigned char attempts=1;

void main()
{
config();
LcdInitialize();
configTimer();
WithGSM();
USARTSetup(9600);
USARTInterrupts(TxIntDisable,RxIntEnable); //transmit interrupts disable and recieve interrupts
enable
InterruptSetting(); //enable all interrupts
DelayMs(10);
Mode=Response;
lcd_cmd(0x1);
DelayMs(20);
lcd_cmd(0x80);
DelayMs(20);
lcd_string("Response Sec");
DelayMs(20);
TransmitString("AT\r");
DelayMs(200);
TransmitString("AT\r");
DelayMs(200);
TransmitString("AT\r");
DelayMs(200);
TransmitString("AT+CMGF=1\r");
DelayMs(200);
TransmitString("AT+CNMI=1,2,0,0,0\r");
DelayMs(200);
ClearOverRunError();
lcd_cmd(0x1);
DelayMs(20);
lcd_cmd(0x80);
DelayMs(20);
lcd_string("Data Sec");
Mode=Data;


while(1)
{
ReadStatus();

if(RegularSMSSendFlag)
{
TMR3IE = 0;
RegularSMSSendFlag=0;
lcd_cmd(0x1);
DelayMs(20);
lcd_cmd(0x80);
DelayMs(20);
lcd_string("AC: ");
DelayMs(20);
lcd_data(ModemSendString[0]);
DelayMs(20);
lcd_string(" UPS: ");
DelayMs(20);
lcd_data(ModemSendString[1]);
DelayMs(20);
lcd_cmd(0xC0);
DelayMs(20);
lcd_string("GEN: ");
DelayMs(20);
lcd_data(ModemSendString[2]);
DelayMs(20);

CREN = 0;
TransmitString("AT+CMGS=\"+923135848502\"\r");
DelayMs(200);
TransmitString("Status is: AC= ");
DelayMs(100);
Transmit(ModemSendString[0]);
DelayMs(100);
TransmitString(",UPS= ");
DelayMs(100);
Transmit(ModemSendString[1]);
DelayMs(100);
TransmitString(",GEN= ");
DelayMs(100);
Transmit(ModemSendString[2]);
DelayMs(100);
Transmit(0x1A);
DelayMs(150);
SendMsg=0;
Mode=Data;
k=0;
CREN = 1;

TMR3IE = 1;

}

if(MakeCallFlag && attempts)
{
TMR3IE = 0;

MakeCallFlag=0;
attempts=0;
lcd_cmd(0x1);
DelayMs(20);
lcd_cmd(0x80);
DelayMs(20);
lcd_string("Calling");
CREN = 0;
TransmitString("ATD+923135848502");
Transmit(';');
DelayMs(250);
Transmit('\r');
CREN=1;
TMR3IE = 1;
}
if(SendMsg)
{
TMR3IE = 0;

lcd_cmd(0x1);
DelayMs(20);
lcd_cmd(0x80);
DelayMs(20);
lcd_string("Trans Sec");
CREN = 0;
TransmitString("AT+CMGS=\"+923135848502\"\r");
DelayMs(200);
TransmitString("Status is: AC= ");
DelayMs(100);
Transmit(ModemSendString[0]);
DelayMs(100);
TransmitString(",UPS= ");
DelayMs(100);
Transmit(ModemSendString[1]);
DelayMs(100);
TransmitString(",GEN= ");
DelayMs(100);
Transmit(ModemSendString[2]);
DelayMs(100);
Transmit(0x1A);
DelayMs(150);
SendMsg=0;
Mode=Data;
k=0;
CREN = 1;
lcd_cmd(0x1);
DelayMs(20);
lcd_cmd(0x80);
DelayMs(20);
lcd_string("Wait Sec");
DelayS(1);

lcd_cmd(0x1);
DelayMs(20);
lcd_cmd(0x80);
DelayMs(20);
lcd_string("AC: ");
DelayMs(20);
lcd_data(ModemSendString[0]);
DelayMs(20);
lcd_string(" UPS: ");
DelayMs(20);
lcd_data(ModemSendString[1]);
DelayMs(20);
lcd_cmd(0xC0);
DelayMs(20);
lcd_string("GEN: ");
DelayMs(20);
lcd_data(ModemSendString[2]);
DelayMs(20);

TMR3IE = 1;
}
}
}

void config()
{
TRISB=0x00;
TRISD=0x0F;
PORTB=0x00;
PORTD=0x08;
TRISC=0x80;
}

void configTimer()
{
T3CON = 0xB0;

TMR3H = 0;
TMR3L = 0;

TMR3IF=0;
PEIE=1;
GIE=1;

TMR3IE=1;
TMR3ON=1;

}
void LcdInitialize()
{
lcd_cmd(0x38);
DelayMs(10);
lcd_cmd(0x0E);
DelayMs(10);
lcd_cmd(0x80);
DelayMs(10);
lcd_cmd(0x01);
DelayMs(10);
}

void ReadStatus()
{

if(AC==0 && UPS ==0 && GEN==0)
{
ModemSendString[0]='1';
ModemSendString[1]='1';
ModemSendString[2]='1';
}
if(AC==0 && UPS ==0 && GEN==1)
{
ModemSendString[0]='1';
ModemSendString[1]='1';
ModemSendString[2]='0';
}
if(AC==0 && UPS ==1 && GEN==0)
{
ModemSendString[0]='1';
ModemSendString[1]='0';
ModemSendString[2]='1';
}
if(AC==0 && UPS ==1 && GEN==1)
{
ModemSendString[0]='1';
ModemSendString[1]='0';
ModemSendString[2]='0';
}
if(AC==1 && UPS ==0 && GEN==0)
{
ModemSendString[0]='0';
ModemSendString[1]='1';
ModemSendString[2]='1';
}
if(AC==1 && UPS ==0 && GEN==1)
{
ModemSendString[0]='0';
ModemSendString[1]='1';
ModemSendString[2]='0';
}
if(AC==1 && UPS ==1 && GEN==0)
{
ModemSendString[0]='0';
ModemSendString[1]='0';
ModemSendString[2]='1';
}
if(AC==1 && UPS ==1 && GEN==1)
{
MakeCallFlag=1;
}

}
void interrupt ISR(void)
{
if(TMR3IE && TMR3IF)
{
TMR3IF=0;
Timer3Counter++;
if(Timer3Counter == 200) // 2860 for 5 min, 1718 for 3 min
{
Timer3Counter=0;
RegularSMSSendFlag=1;
}
}

if(RCIF)
{
di();
RCIF=0;
RxH=RCREG;
ClearOverRunError();

if(Mode==Response)
{

if(RxH=='\n')
{
LFCount++;

}
if(LFCount<2 && RxH!='\r' && RxH!='\n')
{
ModemRxStr[j++]=RxH;
}
if(LFCount==2 )
{
ModemRxStr[j]='\0';
j=0;
LFCount=0;
}
else
NOP();

RCIF=0;
ei();
}
if(Mode==Data)
{
if(RxH!='\n' && RxH!='#')
{
ModemRxStr[k++]=RxH;
}
if(RxH=='#')
{
ModemRxStr[k]='\0';
k=0;
SendMsg=1;



}
RCIF=0;
ei();

}

}
}

void InterruptSetting(void)
{
PEIE=1;
GIE=1;
}

void WithGSM()
{
TX_ToModem=1;
TX_ToPC=0;
RX_ToModem=1;
RX_ToPC=0;

}

void WithPC()
{
TX_ToModem=0;
TX_ToPC=1;
RX_ToModem=0;
RX_ToPC=1;

}

// LCD COMMAND SENDING FUNCTION
void lcd_cmd(unsigned char item)
{
LCD_DATA = item;
LCD_RS= 0;
LCD_RW=0;
LCD_EN=1;
DelayMs(1);
LCD_EN=0;
return;
}
// LCD DATA SENDING FUNCTION
void lcd_data(unsigned char item)
{
LCD_DATA = item;
LCD_RS= 1;
LCD_RW=0;
LCD_EN=1;
DelayMs(1);
LCD_EN=0;
return;
}
// LCD STRING SENDING FUNCTION
void lcd_string(const unsigned char *str)
{

while(*str)
{
lcd_data(*str++);
DelayMs(10);
}
return;
}

Вам также может понравиться