|
之前寫了一個智能家居下gsm模塊的程序,可以根據(jù)按鍵輸入的密碼來判斷是否可以進(jìn)行修改報警號碼,并向?qū)?yīng)的手機號碼發(fā)送報警信息,不過得注意需要插入sim卡。程序附錄如下:
#include "gsm.h"
#include "common.h"
#include "serial.h"
#include "string.h"
#include "delay.h"
#include <stdio.h>
#include <stdlib.h>
#include "key.h"
#include "24c02.h"
#include "lcd1602.h"
#if 0
/* 發(fā)送AT指令 */
int gsm_send_command(uchar *command, uchar *response, uchar waittime)
{
int xdata res = 0;
uart_send_str(command);
if(response && waittime) //需要等待應(yīng)答
{
while(--waittime) //等待倒計時
{
delay_ms(10);
if(RI)//接收到期待的應(yīng)答結(jié)果
{
if(is_gsm_get_response(response)) break;//得到有效數(shù)據(jù)
RI = 0;
}
}
if(waittime == 0) res = 1;
}
return res;
}
/*
*是否得到想要的回應(yīng)
* return 0 : 響應(yīng)正確
* return -1: 沒得到正確的響應(yīng)
*/
uchar* is_gsm_get_response(uchar *response)
{
uchar xdata resp[20];
uchar *strx = 0;
int xdata len = 0;
int xdata i;
uart_receive_str(resp); //讀取響應(yīng)
strx = strstr((const char*)resp, (const char*)response);
return strx;
}
int gsm_send_sms(uchar *phone_number, uchar *sms_message)
{
const uchar xdata message[] = "Someone in your home,please check.";
int xdata res;
char xdata *p1;
p1 = malloc(sizeof(char)*4);
res = gsm_send_command("AT+CMGF=1\r\n", "OK",200); //設(shè)置文本模式
res =gsm_send_command("AT+CSCS=\"GSM\"\r\n","OK",200); //設(shè)置TE字符集為GSM
res = gsm_send_command( "AT+CSMP=17,0,2,25\r\n", "OK",200); //設(shè)置短消息文本模式參數(shù)
res = gsm_send_command("AT+CMGS=\"18819467282\"\r\n", ">", 300);
delay_ms(10);
uart_send_str(message);
delay_ms(10);
sprintf(p1,"%c",0x1a);
return 0;
}
#endif
void gsm_call(void)
{
uchar phone_num[12];
uchar all[24] = "ATD";
uchar one[] = ";\r\n";
iic_read_password_phone(phone_num, 1); //讀出電話號碼
strcat(all, phone_num);
strcat(all, one);
uart_send_str(all);
}
void change_phone_number(uchar *password)
{
uchar xdata pass_set_suceess[16] = "phone number set";
uchar xdata new_phone[16] = "New phone number";
uint i;
int flag = -1;
if(check_password(password, 0, 1) == 0) //密碼正確
{
flag = password_display(password, new_phone, 16);
if(flag == 0)
{
iic_write_password_phone(password, 1); //寫入新號碼
delay_ms(10);
lcd1602_init(0x0c);
write_1602com(FIRST_LINE);
for(i = 0; i < 16; i++)
write_1602dat(pass_set_suceess[i]);
delay_ms(2000);
lcd1602_init(0x0c);
}
else
lcd1602_init(0x0c);
}
}
|
|