#include<htc.h>
#include<stdio.h>
//#fuses HS,NOWDT,NOPROTECT,NOLVP
//#use delay(clock=20000000)
//#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
/////////////
#define enter 0x0d
#define ctrlz 0x1a
unsigned int time;
void initialisemodem();
void deleteallmsg();
void sendtestmsg();
void send_data();
void snumber(); //stored number
void message_read();
void delay(int);
void main()
{
TRISB=0x00;
PORTB=0x00;
TRISC=0xFF; // PORTC is input
TXSTA=0b00100100; // Configure serialport
RCSTA=0b10010000; // Configure serialport
SPBRG=25; // Configure serialport
/////////////////////////
//INTCON=0b00001111;
//PIE=0b00001111;
initialisemodem();
delay(1000);
deleteallmsg();
delay(1000);
sendtestmsg();
delay(1000);
time=0;
}
/////////////////////
void delay(int time)
{
int i,j;
for(j=1;j<=time;j++)
{
for(i=0;i<=64;i++)
{
}
}
}
void initialisemodem()
{
TXREG='A'; //change modem to text mode
delay(5);
TXREG='T';
delay(5);
TXREG='+';
delay(5);
TXREG='C';
delay(5);
TXREG='M';
delay(5);
TXREG='G';
delay(5);
TXREG='F';
delay(5);
TXREG='=';
delay(5);
TXREG='1';
delay(5);
TXREG=enter;
delay(5);
}
void snumber()
{
TXREG='A';
delay(5);
TXREG='T';
delay(5);
TXREG='+';
delay(5);
TXREG='C';
delay(5);
TXREG='M';
delay(5);
TXREG='G';
delay(5);
TXREG='S';
delay(5);
TXREG='=';
delay(5);
TXREG=0x22;
delay(5);
TXREG='8';
delay(5);
TXREG='8';
delay(5);
TXREG='9';
delay(5);
TXREG='1';
delay(5);
TXREG='1';
delay(5);
TXREG='6';
delay(5);
TXREG='6';
delay(5);
TXREG='8';
delay(5);
TXREG='8';
delay(5);
TXREG='0';
delay(5);
TXREG=0x22;
delay(5);
TXREG=enter;
delay(5);
}
/////////////
void deleteallmsg()
{
TXREG='A'; //DELETE ALL MESSAGES
delay(5);
TXREG='T';
delay(5);
TXREG='+';
delay(5);
TXREG='C';
delay(5);
TXREG='M';
delay(5);
TXREG='G';
delay(5);
TXREG='D';
delay(5);
//TXREG='A';
//delay(5);
TXREG='=';
//delay(5);
TXREG='1';
delay(5);
/*TXREG='D';
delay(5);
TXREG='E';
delay(5);
TXREG='L';
delay(5);
TXREG=' ';
delay(5);
TXREG='A';
delay(5);
TXREG='L';
delay(5);
TXREG='L';
delay(5);
TXREG=0x22;
delay(5);
*/
TXREG=enter;
delay(5);
}
//////////////////////
void sendtestmsg()
{
snumber();
TXREG='T';
delay(5);
TXREG='E';
delay(5);
TXREG='S';
delay(5);
TXREG='T';
delay(5);
TXREG=ctrlz;
delay(5);
}
////////////////////
void message_read()
{
TXREG='A';
delay(5);
TXREG='T';
delay(5);
TXREG='+';
delay(5);
TXREG='C';
delay(5);
TXREG='M';
delay(5);
TXREG='G';
delay(5);
TXREG='R';
delay(5);
TXREG='=';
delay(5);
TXREG='1';
}
Code C - [expand] 1 TRISC = 0x80
Code C - [expand] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 /* * Author: Jayanth Devarayanadurga * */ #define _XTAL_FREQ 16000000 #include <htc.h> #define BAUDRATE 9600 __CONFIG( FOSC_HS & WDTE_OFF & PWRTE_ON & CP_OFF & BOREN_ON & LVP_OFF & CPD_OFF & DEBUG_OFF); void interrupt ISR(void); void UART_Init(void); void UART_Write(unsigned char); unsigned char UART_Read(void); void UART_Write_Text(const unsigned char*); void delaySec(unsigned int sec); void sendSMS(unsigned char *phoneNo); unsigned char uart_rd[20], k = 0, m = 0; 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; } } } void UART_Init(void) { TRISC = 0x80; TXSTA = 0x24; RCSTA = 0x90; SPBRG = 0x67; //Fosc = 16 MHz //SBBRG = 0x81; //Fosc = 20 MHz } void UART_Write(unsigned char uartData) { while(!TXIF); TXREG = uartData; } unsigned char UART_Read(void) { if(OERR) { CREN = 0; CREN = 1; } while(!RCIF); return RCREG; } void UART_Write_Text(const unsigned char *uartString) { while(*uartString) UART_Write(*uartString++); } void delaySec(unsigned int sec){ unsigned int i = 0; for(i = 0; i < sec; i++){ __delay_ms(250); __delay_ms(250); __delay_ms(250); __delay_ms(250); } } void sendSMS(unsigned char *phoneNo){ UART_Write_Text("AT"); UART_Write(0x0D); UART_Write(0x0A); delaySec(2); UART_Write_Text("AT+CMGF=1"); UART_Write(0x0D); UART_Write(0x0A); delaySec(2); UART_Write_Text("AT+CMGS="); UART_Write(0x22); UART_Write_Text(phoneNo); UART_Write(0x22); UART_Write(0x0D); UART_Write(0x0A); delaySec(3); UART_Write_Text("SMS from RangerSkm"); UART_Write(0x0D); UART_Write(0x1A); UART_Write(0x0D); } void main(){ TRISC = 0x80; UART_Init(); __delay_ms(100); GIE = 1; PEIE = 1; while(1){ sendSMS("0000000000"); //"8891166880" delaySec(10); } }
//==========================================================================
// Project description : GSM Enabled Smart Home.
// This sample source code is valid for
// 20MHz crystal.
//
//==========================================================================
// include
//==========================================================================
#include <pic.h>
#include <string.h>
// configuration
//==========================================================================
//__CONFIG ( 0x3F32 ); //configuration for the microcontroller
// define
//==========================================================================
#define LED2 RB3 //RS pin of the LCD display
#define LED1 RB4 //RS pin of the LCD display
#define rs RB5 //E pin of the LCD display
#define lcd_data PORTD //LCD 8-bit data PORT
#define SW1 RB0
#define SW2 RB1
#define rw RB6
#define e RB7
// function prototype (every function must have a function prototype)
//==========================================================================
void delay(unsigned long data);
void send_config(unsigned char data);
void send_char(unsigned char data);
void lcd_goto(unsigned char data);
void lcd_clr(void);
void send_string(const char *s);
unsigned char uart_rec(void); //receive uart value
void uart_send(unsigned char data);
void uart_str(const char *s);
void gsm_send_command(const char *command);
void gsm_read_line(char *buffer);
// global variable
//==========================================================================
char gsm_response[20];
char command[10];
// main function (main fucntion of the program)
//==========================================================================
void main()
{
char read_sms_command[] = "AT+CMGR=1";
char delete_sms_command[] = "AT+CMGD=1";
//set I/O input output
TRISB = 0b00000011; //configure PORTB I/O direction
TRISD = 0b00000000; //configure PORTD I/O direction
TRISA = 0b00000111; //configure PORTA I/O direction
LED1=0; // OFF LED1
LED2=0; // OFF LED2
//Configure UART
SPBRG=10; //set baud rate as 115200 baud
BRGH=1; //baud rate high speed option
TXEN=1; //enable transmission
TX9 =0; //8-bit transmission
RX9 =0; //8-bit reception
CREN=1; //enable reception
SPEN=1; //enable serial port
//setup ADC
ADCON1 = 0b00000110; //set ADx pin digital I/O
//configure lcd
send_config(0b00000001); //clear display at lcd
send_config(0b00000010); //lcd return to home
send_config(0b00000110); //entry mode-cursor increase 1
send_config(0b00001100); //display on, cursor off and cursor blink off
send_config(0b00111000); //function set
//display startup message
lcd_clr(); //clear lcd
send_string("wind magic system."); //display "Cytron Tech."
lcd_goto(20); //set the lcd cursor to location 20
send_string("Smart Home"); //display "Smart Home"
// Delay for a while.
delay(100000);
// Clear the LCD and display the new message.
lcd_clr();
send_string("Testing Com...");
// Make sure we can communicate with the GSM modem.
gsm_send_command("AT");
// Read the response.
gsm_read_line(&gsm_response);
// We should receive "OK" from the GSM modem.
// If we don't, display "Error".
if (memcmp("OK", &gsm_response, 2) != 0)
{
lcd_clr();
send_string("Error...");
while(1);
}
// Clear the LCD and display the new message.
lcd_clr();
send_string("Waiting for");
lcd_goto(20);
send_string("Call Ready");
// Waiting for the GSM modem to search for the network.
// We will receive a blank line before receiving "Call Ready".
gsm_read_line(&gsm_response);
gsm_read_line(&gsm_response);
// We should receive "Call Ready" from the GSM modem.
// If we don't, display "Error".
if (memcmp("Call Ready", &gsm_response, 10) != 0)
{
lcd_clr();
send_string("Error...");
while(1);
}
// Clear the LCD and display the new message.
lcd_clr();
send_string("Setting Text");
lcd_goto(20);
send_string("Mode...");
// Set text mode for SMS.
gsm_send_command("AT+CMGF=1");
// Read the "OK".
gsm_read_line(&gsm_response);
// Clear the LCD and display the new message.
lcd_clr();
send_string("Ready");
while(1)
{
// Check whether there is new data from the GSM modem.
if (RCIF == 1)
{
// Check is there a new SMS?
gsm_read_line(&gsm_response);
if (memcmp("+CMTI: \"SM\",", &gsm_response, 12) == 0)
{
// Get the SMS index.
// The command array is already initialized as "AT+CMGR=1" and "AT+CMGD=1",
// we need to changed the index to the actual one.
read_sms_command[8] = gsm_response[12];
delete_sms_command[8] = gsm_response[12];
// Clear the LCD and display the new message.
lcd_clr();
send_string("Reading SMS...");
// Send command to read the SMS.
gsm_send_command(&read_sms_command);
// Read the response.
// The first line is the SMS info which we don't need.
// We only need the second line which is the message content.
gsm_read_line(&gsm_response);
gsm_read_line(&command);
// Read the newline and "OK".
gsm_read_line(&gsm_response);
gsm_read_line(&gsm_response);
// Switch on the light if we received "on".
if (memcmp("on", &command, 2) == 0)
{
LED1 = 1;
LED2 = 1;
}
// Switch off the light if we received "off".
else if (memcmp("off", &command, 3) == 0)
{
LED1 = 0;
LED2 = 0;
}
// Send command to delete the SMS.
gsm_send_command(&delete_sms_command);
// Read the "OK".
gsm_read_line(&gsm_response);
// Clear the LCD and display the new message.
lcd_clr();
send_string("Ready...");
}
}
// Check whether SW1 is pressed.
if (SW1 == 0)
{
// Clear the LCD and display the new message.
lcd_clr();
send_string("Sending SMS...");
// Send the SMS to notify the owner.
// Please change this to your own number.
gsm_send_command("AT+CMGS=\"8891166390\"");
// We should receive '>' from the modem.
// If we don't, display "Error".
if (uart_rec() != '>')
{
lcd_clr();
send_string("Error...");
while(1);
}
// Send the message.
uart_str("Warning: Switch 1 has been triggered !");
// Send <CTRL+Z>.
uart_send(0x1a);
// Read the newline and response.
gsm_read_line(&gsm_response);
gsm_read_line(&gsm_response);
// We should receive "+CMGS: <Message ID>" from the GSM modem.
// If we don't, display "Error".
if (memcmp("+CMGS:", &gsm_response, 6) != 0)
{
lcd_clr();
send_string("Error...");
while(1);
}
// Read the newline and "OK".
gsm_read_line(&gsm_response);
gsm_read_line(&gsm_response);
// Clear the LCD and display the new message.
lcd_clr();
send_string("Ready...");
// Wait until SW1 is released so that we don't send duplicated message.
while (SW1 == 0);
}
}
}
// functions
//==========================================================================
void delay(unsigned long data) //delay function, the delay time
{ //depend on the given value
for( ;data>0;data--);
}
void send_config(unsigned char data) //send lcd configuration
{
rs=0;
rw=0; //set lcd to configuration mode
lcd_data=data; //lcd data port = data
e=1; //pulse e to confirm the data
delay(50);
e=0;
delay(50);
}
void send_char(unsigned char data) //send lcd character
{
rs=1;
rw=0; //set lcd to display mode
lcd_data=data; //lcd data port = data
e=1; //pulse e to confirm the data
delay(10);
e=0;
delay(10);
}
void lcd_goto(unsigned char data) //set the location of the lcd cursor
{ //if the given value is (0-15) the
if(data<16) //cursor will be at the upper line
{ //if the given value is (20-35) the
send_config(0x80+data); //cursor will be at the lower line
} //location of the lcd cursor(2X16):
else // -----------------------------------------------------
{ // | |00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15| |
data=data-20; // | |20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35| |
send_config(0xc0+data); // -----------------------------------------------------
}
}
void lcd_clr(void) //clear the lcd
{
send_config(0x01);
delay(600);
}
void send_string(const char *s) //send a string to display in the lcd
{
while (s && *s)send_char (*s++);
}
unsigned char uart_rec(void) //receive uart value
{
unsigned char rec_data;
while(RCIF==0); //wait for data
rec_data = RCREG;
return rec_data; //return the data received
}
void uart_send(unsigned char data)
{
while(TXIF==0); //only send the new data after
TXREG=data; //the previous data finish sent
}
void uart_str(const char *s)
{
while(*s)uart_send(*s++);
}
void gsm_send_command(const char *command)
{
unsigned char rec_data;
while (*command != 0)
{
uart_send(*command++); // Send the AT command.
rec_data = uart_rec(); // Read the echo.
}
// Send <ENTER>.
uart_str("\r\n");
// Read the echo until Line Feed character is received.
do {
rec_data = uart_rec();
} while (rec_data != '\n');
}
void gsm_read_line(char *buffer)
{
unsigned char rec_data;
// Read the data until Line Feed character is received.
do {
rec_data = uart_rec();
*buffer++ = rec_data;
} while (rec_data != '\n');
}
Ðþ ýþ þþ þ û þ øüþè þ þþ þüüüþö ïêøþ xìüþ
ð û |¾« ìüøìüAk ÞþÏ A +u=M ›ããïÏÏûûß Ãuû x? ç x+ ›ïßÏûûßïÛ
?ûû û | û ìüxìüx?
ÞþÏ þ›ããïÏÏûûßïÛ û °û û ìüøìüþßþ ðüü
ðß üþ ðüüþþð
÷ ýýýýý ý 8+w×›ããïÏn¿ ‚›j… àß T2ɽõ`
ý ý÷þ ç þ /þþ ÷ ÷ ý þ þ ü þ þ
þþ þ þ þ þ þ þ þþ þü ü
þìü üþøñô ý ý þ ü AT+CM”ý ý ý ýþý ýþ ýýý üþ ý ýþ
÷ ý ýý ýþü ï ü þü ï ý÷ý üx+CMGS="\ÏÏûûßÛ
ý ÷ýü ü ýý ý ý ïý ý
ý ýýý ý ý ü ü þý ýþý ýý ý þ üý ýý ýýýý ý ý ý ý SMS æ
ýüþ Þ ý ý ý ýýý ÷ þõýõ ý ýý ýý ýý ï ýý þ ý ý ý ï ýþþýýï
ý ýþ üþ ý ýþ ý ýý þ þ ýý ý ý ýý þ þ ïþý ý ý ý ýýýý ýý
ý ü ýý ý þ ýüý ýýþý þ ü ýýþÞþ þþþ ýþ þü þ üþ üþ ý
þ ý ý üþýüýüþü þ ïýýï ýý ý÷ýýü÷þ ýýõ ý ððþüþüý üâðýþ
üýàü
þ þðþþþþþý þ þøþþþþüüøüôüÐñøþüôþøþ þŠ* þü ø
þ ý üý üü þ üüxãã16~ïÛüþþ þÞþîìü:ãïÏÏû þ °÷û °û
ìü ýüýðü þ ýý üü øøþðþøüø þìü üø çïÏÏûûß û Rù½ þ ø î
þ
PJL þ þ þþýþøôüþþþþþýþþþýüüøþþýþþøþþðøþõþüþøõüôþþþøþþþþðø S
M="8x;q ûßïÛìüõý ôõý ý °Fo `5 û ìü
Code C - [expand] 1#define _XTAL_FREQ 16000000
Code C - [expand] 1#define _XTAL_FREQ 20000000
thanks a lot by using your syntax i learned how to communicate controller to gsm thank you againyour code will not work.should be used as rx pin is input pin. While(1) loop is missing. See code at this link. https://saeedsolutions.blogspot.in/2012/11/pic16f877-uart-code-proteus-simulation.html
Code C - [expand] 1 trisc = 0x80
try to write a new code and post if you face any problem.
Edit:
Code C - [expand] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 /* * author: Jayanth devarayanadurga * */ #define _xtal_freq 16000000 #include <htc.h> #define baudrate 9600 __config( fosc_hs & wdte_off & pwrte_on & cp_off & boren_on & lvp_off & cpd_off & debug_off); void interrupt isr(void); void uart_init(void); void uart_write(unsigned char); unsigned char uart_read(void); void uart_write_text(const unsigned char*); void delaysec(unsigned int sec); void sendsms(unsigned char *phoneno); unsigned char uart_rd[20], k = 0, m = 0; 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; } } } void uart_init(void) { trisc = 0x80; txsta = 0x24; rcsta = 0x90; spbrg = 0x67; //fosc = 16 mhz //sbbrg = 0x81; //fosc = 20 mhz } void uart_write(unsigned char uartdata) { while(!txif); txreg = uartdata; } unsigned char uart_read(void) { if(oerr) { cren = 0; cren = 1; } while(!rcif); return rcreg; } void uart_write_text(const unsigned char *uartstring) { while(*uartstring) uart_write(*uartstring++); } void delaysec(unsigned int sec){ unsigned int i = 0; for(i = 0; i < sec; i++){ __delay_ms(250); __delay_ms(250); __delay_ms(250); __delay_ms(250); } } void sendsms(unsigned char *phoneno){ uart_write_text("at"); uart_write(0x0d); uart_write(0x0a); delaysec(2); uart_write_text("at+cmgf=1"); uart_write(0x0d); uart_write(0x0a); delaysec(2); uart_write_text("at+cmgs="); uart_write(0x22); uart_write_text(phoneno); uart_write(0x22); uart_write(0x0d); uart_write(0x0a); delaysec(3); uart_write_text("sms from rangerskm"); uart_write(0x0d); uart_write(0x1a); uart_write(0x0d); } void main(){ trisc = 0x80; uart_init(); __delay_ms(100); gie = 1; peie = 1; while(1){ sendsms("0000000000"); //"8891166880" delaysec(10); } }
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?