⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gsm-at.c

📁 基于AT89S52的GSM安防系统
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************
 ****************************************************************
 ****			    gsm-at.c  串口接收发送					*****
 ****														*****
 ****				本程序都是采用PDU格式					*****
 ****************************************************************
 ****************************************************************/
#include <at89x52.h>
#include <string.h>
#include <delayms.h>
#include <at24c02.h>
#include <lcd.h>	  //test

#define uchar unsigned char
#define uint  unsigned int
		 
#define	RsBuf_N		100
bit Do_command(uchar n_do);	//执行控制命令
bit Chk_Read_Do();//检测读取新短信执行控制命令
extern uchar idata phonenum[15];//存放要发送对象的号码
extern void test_code(uchar n_delay,uchar n_wait);/*测试函数*/
extern uchar sec_sign;//警报标志位

extern uchar send_Msg_sign1;//发送短信标志位	红外
extern uchar send_Msg_sign2;//发送短信标志位	燃气
extern uchar send_Msg_sign3;//发送短信标志位	烟雾

//test_code(,);/*测试函数*/

//串口函数声明
extern bit scan_Security();//安全监控扫描

uchar InStrLoc ; //存放接收到的数据在InStr中的位置
uchar idata A_string[RsBuf_N];		//总字符串
//---***----***-----***
uchar Nindex[]={'1'-48,'2'-48,'3'-48,'4'-48};	//存放发送到SIM卡中短信返回的index
uchar idata Rev_pho[15];	//存放来信中提取的号码
char Rev_index;	//存放来信的index号
//---***----***-----***

//***********************字符串查找******************************
//*功    能: 查找字符串
//*形    参: char *s, char *t  ;在s中查找t
//*返 回 值: s_temp(t在s中的位置)成功  0 失败
//*备    注: 
//***************************************************************
char *StrFind(char *s, char *t){
	char    *s_temp;        //s_temp指向s
	char    *m_temp;        //the mv_tmp used to move in the loop
	char    *t_temp;        //point to the pattern string

	if (NULL == s || NULL == t) return NULL;

	//s_temp point to the s string
	for (s_temp = s; *s_temp != '\0'; s_temp++){
   		//the move_tmp used for pattern loop
		m_temp = s_temp;
    	//the pattern string loop from head every time
		for (t_temp = t; *t_temp == *m_temp; t_temp++, m_temp++);
        //if at the tail of the pattern string return s_tmp
		if (*t_temp == '\0') return s_temp;
     }
	return NULL;
 }

//*********************** 串口发送一个字符 *********************
//*功    能: 通过串口发送一个字符
//**************************************************************
void putc(uchar ch)
{
	ES = 0;//关串口中断
	SBUF = ch;//送数据
	while(!TI);//送完?
	TI = 0;//清标志位
	ES = 1;//开中断
}

//************************ 串口发送字符串 **********************
//*功    能: 通过串口发送字符串
//**************************************************************
void putnstr(uchar *str)
{
	while (*str != '\0')
	{
		putc(*str);
		str++;
	}
}

//************************** 察除缓冲区 ************************
//*功    能: 清除缓冲区A_string
//**************************************************************
void ClrBuf(){
	uchar i;
	for(i=0;i<RsBuf_N;i++)
		A_string[i]='\0';
	InStrLoc = 0;
}

//********************* 检测缓冲区是否有效 *********************
//*功    能: 检测缓冲区中的OK和ERROR指令
//*返    回:OK,则返回1;ERROR,返回0
//**************************************************************
bit wait_ok()
{
	ClrBuf();
	while(StrFind(A_string,"OK") == NULL)
	{
		if(StrFind(A_string,"ERROR"))
			return 0;
	}
	return 1;
}

//***********************发送联机指令******************************
//*功    能: 串口发送数组命令"AT",
//*形    参: 
//*返 回 值:
//*备    注: 测试GSM模块是否连接正确
//*****************************************************************
bit connect_gsm(void)
{
	//等待应答"OK"
	ClrBuf();
   	putnstr("AT\r");
	delayms_100ms();
	if(StrFind(A_string,"OK") == NULL)
		return 0;
	else
		return 1;
}
//*********************** 获取网络注册情况 ***********************
//*返 回 值: 成功返回1,失败返回0
//*备    注: 
//****************************************************************
bit connect_gsmnet()
{
	ClrBuf();
	putnstr("AT+CREG?\r");
	delayms_100ms();
	if(StrFind(A_string, "+CREG: 0,1") != NULL || StrFind(A_string, "+CREG: 0,5") != NULL)
		return 1;
	else
		return 0;
}
//************************ 初始化设置GSM ***********************
//*功    能: 禁止回显,设置为pdu模式
//**************************************************************
void init_gsm()
{
	//串口发送"禁止回显"指令
	putnstr("ATE0\r");
	wait_ok();
	putnstr("AT+CMGF=0\r");//pdu模式
	wait_ok();
}

//************************ 初始化设置SIM ***********************
//*功    能: AT+CSCB=1 不接受广播短信
//**************************************************************
void init_sim()
{
	putnstr("AT+CSCB=1\r");          //不接受广播短信
	wait_ok();
}

//************************* 串口初始化 *************************
//*功    能: 设置波特率9600,开串口中断,清除接收缓冲区
//**************************************************************
void init_uart(void)
{
	TMOD|=0x20;			//
	PCON = 0x00;		//波特率不加培
	TH1=0xfd;
	TL1=0xfd;		 	//波特率为9600
	SCON=0X50;			//工作方式1,开串口接收
	IE   |= 0x90;     	//开串口中断
	PS=1;
	TR1=1;
	EA = 1;
	ClrBuf();
}

//************************* 数字转ASCII ************************
//*功    能: 把数字转化为ASCII码值发送到串口
//**************************************************************
void NumIn(uchar i)
{
	//数字小于10
	if(i>=0&&i<=9)
	{
		putc(i+48);
	}
	//数字小于100
	else if(i<=99)
	{
		putc(i/10+48);
		putc(i%10+48);
	}
	//数字大于100
	else 
	{
		putc(i/100+48);
		putc(i%100/10+48);
		putc(i%10+48);
	}
}

//************************* 删除短信息 *************************
//*功    能: AT+CMGD 删除第index条短信
//*返 回 值: 若index为0则返回0,成功则直接返回
//**************************************************************
bit EraseMsg(uchar index)
{
	putnstr("AT+CMGD=");		//向tc35i发送删除指令"AT+CMGD="
	if(!index)
		return 0;
	NumIn(index);				//如果index不为0输入index
	putc('\r');					//向tc35i发送回车指令
	wait_ok();
}

//********************** 删除SIM所有短信息 *********************
//*功    能: 删除SIM中所有的信息
//*返 回 值: 失败返回0,成功返回1
//**************************************************************
bit EraseMsg_All(void)
{	
	uchar n_tmp,i;
	char *tmp;

	ClrBuf();			//擦除缓存
	putnstr("AT+CPMS?\r");	//查看SIM卡存储情况
	while(wait_ok()==NULL);			//判断发送是否成功
	
	if( StrFind(A_string,"SM") )
	{
		tmp=StrFind(A_string,"SM")+6;	//取出SIM卡中的信息容量
		n_tmp=*tmp-48;  
		tmp++;	//取出SIM卡中的信息容量
		n_tmp=(*tmp-48)+n_tmp*10;//取两位数到n_tmp  

		LCD_write_char(n_tmp/10+48);//TEST
		LCD_write_char(n_tmp%10+48);//TEST
	}  
	
	for(i=1;i<=n_tmp;i++)	
		EraseMsg(i);			//删除短信	
 
	test_code(3,1);//响铃300ms提示	
	return 1;
}

//************************ 判断信息已满 ************************
//*功    能: 若信息已满,则删除SIM中除预备发送的所有的信息
//*返 回 值: 失败返回0,成功返回1
//**************************************************************
bit Msg_Full(void)
{
	uchar s_msg,all_msg,i;
	char *S_msg_tmp;	//SIM卡中已存的信息数
	ClrBuf();			//擦除缓存
	putnstr("AT+CPMS?\r");	//查看SIM卡存储情况
	while(wait_ok()==NULL);			//判断发送是否成功
	
	if( StrFind(A_string,"SM") )
	{
		S_msg_tmp=StrFind(A_string,"SM")+4;	//取出SIM卡中已存的信息数
		s_msg=*S_msg_tmp-48;
		  
		S_msg_tmp++;	//判断是否为两位数
		if(*S_msg_tmp>='0' && *S_msg_tmp<='9')
		{
			s_msg=(*S_msg_tmp-48)+s_msg*10;//取两位数到n_tmp  

		//	LCD_write_char(s_msg/10+48);//显示十位		
		//	LCD_write_char(s_msg%10+48);//显示个位
			S_msg_tmp++;
		}
	//	else	
		//	LCD_write_char(s_msg+48);//只有一位数时直接显示

		S_msg_tmp++;	//取出SIM卡中的信息容量 十位
		all_msg=*S_msg_tmp-48;
		S_msg_tmp++;
		all_msg=(*S_msg_tmp-48)+all_msg*10;//取两位数到all_msg  
	//	LCD_write_char(all_msg/10+48);//显示十位
	//	LCD_write_char(all_msg%10+48);//显示个位

		if(s_msg < all_msg)
			return 0;

		LCD_clear();//清屏
		LCD_write_String(0,2,"Message Full");
		for(i=5;i<=all_msg;i++)	
			EraseMsg(i);			//删除短信
		test_code(1,1);//响铃100ms提示
		return 1;
	}
	else
		return 0;
}

//************************** 号码处理 **************************
//*功    能: 在手机号码(包括86)的末尾添加F,凑成偶数个,然后把
//*          整串号码的奇数位和偶数位相互交换,如0位和1位,2位
//*          和3位,以此类推
//**************************************************************
void del_pho(char *phonenum)
{	
	unsigned char  i;
	unsigned char tmp_ch;
	phonenum[13]='F';

	for(i=0;i<14 ;i+=2)		//手机号码的奇数位与偶数位相交换
	{
		tmp_ch=phonenum[i];	
		phonenum[i]=phonenum[i+1];
		phonenum[i+1]=tmp_ch;
	}
	phonenum[14]='\0';
//	putnstr(phonenum);
}

//*********************** 发送短信的内容 ***********************
//*功    能: 选择要发送短信的内容(PDU)
//*返 回 值: 选择错误则返回0,选择成功则返回1
//*备    注:situation的可取值是1、2、3、4 
//**************************************************************
uchar Send_sms_meat(uchar situation )
{
	if(situation == '1' || situation == 1)
		putnstr("0D5BB691CC4E0052076B635E38FF01");		//家里一切正常!	(14)0x0D个
	else if(situation == '2' || situation == 2)
		putnstr("0A67094EBA884C7A83FF01");				//有人行窃!		(10)0x0A个
	else if(situation == '3' || situation == 3)
		putnstr("1053A8623F670971C36C146CC46F0FFF01"); 	//厨房有燃气泄漏!	(16)0x10个
	else if(situation == '4' || situation == 4)
		putnstr("105C4B51856709706B707E8B6660C5FF01"); 	//屋内有火灾警情!	(16)0x10个
	else
		return 0;
	return 1;
}

//*********************** 写短信到SIM卡 ************************
//*功    能: 把要发送出去的短信先发送短信到SIM卡
//*返 回 值: 失败则返回0,成功则返回1
//*备    注:situation的可取值是1、2、3、4 
//**************************************************************
bit Send_sms_sim(uchar * phone, uchar situation)
{
	char *tmp;
//	uchar i,n_addr=0x0;
		
	putnstr("AT+CMGW=");	//用于存储一条消息在SIM卡的存储区中
//PDU短信的总长度

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -