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

📄 gsm-at.c

📁 基于AT89S52的GSM安防系统
💻 C
📖 第 1 页 / 共 2 页
字号:
	if(situation==1)
		putnstr("29");	  	//14+14+1
	else if(situation==2)
		putnstr("25");		//14+10+1
	else if(situation==3)
		putnstr("31");		//14+16+1
	else if(situation==4)
		putnstr("31");		//14+16+1
	putc('\r');			//回车

	while(StrFind(A_string,">") == NULL)
	{
		if(StrFind(A_string,"ERROR"))
			return 0;
	}				

	putnstr("0011000D91");	//1100:固定的,0D:手机号码长度,+不算在内,十六进制表示,91:发送到手机为91
	del_pho(phone);			//补全手机号码到偶数位,将奇数位与偶数位相交换	
	putnstr(phonenum);		//发送交换后的号码   
	putnstr("0008");		//4位,8bit方式
	putnstr("00");			//2位,允许时间	A7

	while( !Send_sms_meat(situation) );	//发送第situation条PDU短信内容到串口

	putc('\x1a');			//<Ctrl>+<z>	
	putc('\r');				//回车
	delayms_100ms();
	if(wait_ok())			//判断发送是否成功
	{
		tmp=StrFind(A_string,": ")+2;	//记录index在A_string中的位置 
		Nindex[situation-1]=*tmp-48;   //记录刚发送到SIM卡中短信的index号
/*		for(i=0,n_addr=0x0;i<4;i++)
		{
			I2C_On(I2C_SEND, 0x18, n_addr++, &Nindex[i], 1);//写Nindex短信序号到0x18+n_addr地址
			delayms_10ms();
		}  */
		Nindex[5] = '\0';
		return 1;
	}
	else	
		return 0;
}

//************* 开机初始化将所有写短信到SIM卡 ******************
//*功    能: 开机初始化时,将所有要发送出去的短信写到SIM卡
//*返 回 值: 失败无返回,成功则返回1
//*备    注:调用该函数时,请在前面初始化相应函数,如:
//*			init_uart();				//初始化串口
//*			while(!connect_gsm());	  	//发送联机指令
//*			init_gsm();					//禁止回显,设置为pdu模式
//*			while(!connect_gsmnet()); 	//获取网络注册情况
//*			init_sim();					//不接受广播短信
//*			 
//**************************************************************
bit init_Send_sms_sim(uchar * phone)
{	

	EraseMsg_All();		   //删除所有短信

	while( !Send_sms_sim(phone,1) );//写短信内容为:家里一切正常!	到SIM卡中的Nindex[1-1]
//LCD_write_char('1');//测试用
	while( !Send_sms_sim(phone,2) );//写短信内容为:有人行窃!		到SIM卡中的Nindex[2-1]
//LCD_write_char('2');//测试用
	while( !Send_sms_sim(phone,3) );//写短信内容为:厨房有燃气泄漏!	到SIM卡中的Nindex[3-1]
//LCD_write_char('3');//测试用
	while( !Send_sms_sim(phone,4) );//写短信内容为:屋内有火灾警情!	到SIM卡中的Nindex[4-1]
//LCD_write_char('4');//测试用

	return 1;
}

//**************** 从SIM卡中发送第index条短信 ******************
//*功    能: 从SIM卡中发送第index条短信,注:SIM卡中一定要存有信息
//*返 回 值: 失败则返回0,成功则返回1
//*备    注:index的可取值是1、2、3、4 
//**************************************************************
bit Send_message(uchar index)
{
//	LCD_clear();//清屏
//	LCD_write_String(0,0,"Sending message");
	LCD_write_char('S');
	putnstr("AT+CMSS=");
//	putc(index);	
	NumIn(index);
	LCD_write_char(Nindex[index]+48);
	putc('\r');
	delayms_1000ms();
	if(wait_ok())
	{
		//LCD_write_String(2,2,"OK!");
		LCD_write_char('Y');
		return 1;
	}
	else
	{
		//LCD_write_String(2,2,"ERROR!");
		LCD_write_char('N');
		return 0;
	}
}

//************************ 检测新短信 **************************
//*功    能: 检测是否有新的短信,有则记录其index号到Rev_index
//*返 回 值: 失败则返回0,成功返回1
//*备    注:
//**************************************************************
bit Rev_message()
{
	char *tmp;
//	test_code(1,5);//测试用	
	putnstr("AT+CMGL=0\r");//列出未读取的信息	
	if(wait_ok())
	{
		if(StrFind(A_string,"+CMGL")==NULL)
			return 0;
		else
		{
			tmp = StrFind(A_string,"+CMGL")+7;//获取新短信的index号
			Rev_index = *tmp-48;
			tmp++;
			if(*tmp>=48 && *tmp<=57)
			{
				Rev_index =Rev_index*10+(*tmp-48);
				LCD_write_char(Rev_index/10+48);//显示十位
				LCD_write_char(Rev_index%10+48);//显示个位
			}
			else
				LCD_write_char(Rev_index+48);//只有一位数时直接显示
			
			return 1;
		}
	}

}

//********************** 提取来信的号码 ************************
//*功    能: 在缓冲区中提取来信的号码,前提是已经把短信内容读取到
//*	       :缓冲区中。即执行了at+cmgr=1
//*返 回 值: 返回信息内容长度的地址
//*备    注:
//**************************************************************
bit Rev_message_pho(void)
{
	char *tmp;
	uchar i;
	tmp=StrFind(A_string,"0891");
	tmp += 23;		//把指针指向来信的号码开始位置
	for(i=0;i<15;i++)		  //把来信的号码提取到Rev_pho中
	{
		Rev_pho[i] = A_string[*tmp++];
	}
	tmp = tmp+2+2+14;//tmp指向来信号码的下一个位置,2表示普通GSM,点到点方式
					 //2表示编码方式(UCS2编码);14表示年月日时分秒和时区,每个
	return *tmp;	 //占两位。此时tmp指向内容的长度的第一个字符	
}


//********************** 检测来信的内容 ************************
//*功    能: 在缓冲区中检测来信的内容,查看其是否为有效的控制命令
//*返 回 值: 返回控制指令要执行命令的序号(2 红外,3 燃气,4 烟雾)。
//*		   : 失败返回0
//*备    注:有效的控制命令短信内容:
//*		   : 1、家里情况	2、关闭红外		3、关闭烟雾
//*		   : 4、关闭燃气	5、关闭所有
//**************************************************************
bit Rev_message_meat()
{
	LCD_clear();//清屏
	if( StrFind(A_string,"5BB691CC60C551B5")!=NULL )//1、家里情况 "5BB691CC60C551B5"
	{
		LCD_write_char('1');
		Do_command(1);
		test_code(3,0);//响铃300ms提示
		return 1;
	}
	else if( StrFind(A_string,"517395ED7EA25916")!=NULL )//2、关闭红外 "517395ED7EA25916"
	{
		LCD_write_char('2');
		Do_command(2);
//		test_code(3,1);test_code(3,0);//连续两次响铃300ms提示,中间停顿100ms
		return 1;
	}
	else if( StrFind(A_string,"517395ED70DF96FE")!=NULL )//3、关闭烟雾 "517395ED70DF96FE"
	{
		LCD_write_char('3');
		Do_command(3);
//		test_code(3,1);test_code(3,1);test_code(3,0);//连续三次响铃300ms提示,中间停顿100ms
		return 1;
	}
	else if( StrFind(A_string,"517395ED71C36C14")!=NULL )//4、关闭燃气 "517395ED71C36C14"
	{
		LCD_write_char('4');
		Do_command(4);
		//连续四次响铃300ms提示,中间停顿100ms
//		test_code(3,1);test_code(3,1);test_code(3,1);test_code(3,0);
		return 1;
	}
	else if( StrFind(A_string,"517395ED62406709")!=NULL )//5、关闭所有 "517395ED62406709"
	{
		LCD_write_char('5');
		Do_command(5);
		test_code(10,0);//响铃1S提示
		return 1;
	}
	else
	{
		LCD_write_char('0');
		test_code(1,0);//响铃100ms提示
		return 0;	//非有效控制指令,返回0
	}				   
}
//********************** 执行控制命令 **************************
//*功    能: 执行控制操作
//*返 回 值: 失败返回0
//*备    注:
//**************************************************************
bit Do_command(uchar n_do)
{
	
	if(n_do == 1) //1、家里情况
	{

		if( !scan_Security())//没有安全隐患发生
		{
			P0_7 = 0;//开指示灯4 表示安全
			P0_3 = 1;//关蜂鸣器
			sec_sign=0;//关警报标志位
			Send_message(Nindex[0]);//发送短信:家里一切正常!	
		}
	}
	else if(n_do == 2)//2、关闭红外
	{
		P0_4 = 1;//关指示灯1
		if(send_Msg_sign2 !=0 && send_Msg_sign3 != 0)
		{
			P0_3 = 1;//关蜂鸣器
			sec_sign=0;//关警报标志位
		}
		LCD_clear();//清屏
		disp16_16(0,0,39);//关
		disp16_16(2,0,40);//闭
		disp16_16(4,0,4);//红
		disp16_16(6,0,5);//外
		delayms_1000ms();
	}
	else if(n_do == 3)//3、关闭烟雾
	{
		P0_5 = 1;//关指示灯2
		if(send_Msg_sign1 !=0 && send_Msg_sign2 != 0)
		{
			P0_3 = 1;//关蜂鸣器
			sec_sign=0;//关警报标志位
		}
		LCD_clear();//清屏
		disp16_16(0,0,39);//关
		disp16_16(2,0,40);//闭
		disp16_16(4,0,6);//烟
		disp16_16(6,0,7);//雾
		delayms_1000ms();
	}
	else if(n_do == 4)//4、关闭燃气
	{
		P0_6 = 1;//关指示灯3
		if(send_Msg_sign1 !=0 && send_Msg_sign3 != 0)
		{
			P0_3 = 1;//关蜂鸣器
			sec_sign=0;//关警报标志位
		}
		LCD_clear();//清屏
		disp16_16(0,0,39);//关
		disp16_16(2,0,40);//闭
		disp16_16(4,0,8);//燃
		disp16_16(6,0,9);//气
		delayms_1000ms();
	}
	else if(n_do == 5)//5、关闭所有
	{
		P0_4 = 1;//关指示灯1
		P0_5 = 1;//关指示灯2
		P0_6 = 1;//关指示灯3
		P0_7 = 0;//开指示灯4 表示安全
		P0_3 = 1;//关蜂鸣器
		sec_sign=0;//关警报标志位

		LCD_clear();//清屏
		disp16_16(0,0,39);//关
		disp16_16(2,0,40);//闭
		disp16_16(4,0,41);//所
		disp16_16(6,0,42);//有
		delayms_1000ms();
	}
	else 
		return 0;
}

//*************** 检测读取新短信执行控制命令 *******************
//*功    能: 读取新的信息,取出其来信人,并检测短信内容是否有关键
//*		   :的控制命令
//*返 回 值: 失败返回0,成功返回1
//*备    注:只有设定的目标号码发送的指令才有效
//**************************************************************
bit Chk_Read_Do()
{
	ClrBuf();
	if( Rev_message() )	//有新的信息到来
	{
		while(!connect_gsm());	  	//发送联机指令
		ClrBuf();	
		LCD_clear();//清屏
		disp16_16(0,1,0);//收
		disp16_16(2,1,1);//到
		disp16_16(4,1,2);//短
		disp16_16(6,1,3);//信
		putnstr("AT+cmgr=");  //读取Rev_index号的新信息
		//putnstr(Rev_index);
		NumIn(Rev_index);
		putc('\r');
		delayms_100ms();
		if(wait_ok())			//成功将短信内容读取到缓冲区
		{
			Rev_message_pho();	//提取来信的号码
		//	LCD_write_char('E');//测试用
			
			del_pho(phonenum);	//补全手机号码到偶数位,将奇数位与偶数位相交换
			//if(strcmp(Rev_pho,phonenum)==0)//判断是否为指定目标的号码
				Rev_message_meat();//检测来信的内容
			scan_Security();//安全监控扫描			
		}
		Msg_Full();//判断信息是否已满
		return 1;
	}
	else
		return 0;
}

//************************ 串口中断接收 ************************
//*功    能: 接收字符串。A_string为接收缓冲区,InStrLoc接收计数
//*返 回 值: 无返回值
//**************************************************************
void uart_interrupt() interrupt 4
{
	if(RI && InStrLoc<RsBuf_N)
	{
		RI = 0;
		A_string[InStrLoc] = SBUF;			
		InStrLoc++;
		A_string[InStrLoc] = 0;
	} 		 
	return;
}




⌨️ 快捷键说明

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