Академический Документы
Профессиональный Документы
Культура Документы
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;
}