51单片机与SIM800LGSM模块联合,作为安防终端

一个小程序,SIM800L模块某宝上买的,30几一个,可以自动设置波特率,前提是要不停给他发AT指令。

安防为两路门磁,没有加密措施。但是我估计知道了我这个特殊指令也不会去做小偷了。

本来开始还有自动见红功能,装虚拟运营商的卡比较有用,需要设置GSM模块的时间,但是貌似不需要,把这部分代码删了。




/*-------------------------------------------------------------


                VERSION 1.0 FOR POWERCHINA


-------------------------------------------------------------*/


#include
#include
#include


#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long


void delay_ms(ulong);//延时1ms
void delay_s(ulong);//延时1s
void InitUART();//串口初始化函数
void InitSMS();//GSM初始化
void Init();//初始化函数
void SendByte(char);//发送一个字节
void SendStr(char*);//发送一串字符
void RecStr();//串口接收函数
void SendAlarmSMS();//发送SMS
void Send_SMS(char*);//发送自定义内容SMS
void resetbuff();//清空recdata
void recSMSCheck();//检测是否收到短信,以及收到的短信中的指令
bit SensorCheck();//检测前三路是否又两路接上,若有,状态正常
bit Hand(char*);//检查是否返回设定值
void StatusCheck();//传感器状态判定
void bit2Str(char*,bit);//将传感器状态转换为文字,方便发送出去


sbit Sensor1=P0^0;//第一路传感器
sbit Sensor2=P0^1;//第二路传感器
sbit Sensor3=P0^3;//第三路传感器
sbit LED=P1^0;//LED
sbit BEEP=P1^1;//BEEP


char recdata[128];//串口接收的数据BUFF
uint i=0;//接收数据变量指针
char AlarmSMS[15]={"#ALARM#\n"};
char SensorStatus[4][8];//传感器状态
char PhoneNum[12]={"18888888888"};//控制台电话号码
bit Sensor1_Enable;//传感器1使能状态位
bit Sensor2_Enable;//传感器2使能状态位
bit Sensor3_Enable;//传感器3使能状态位
bit AlarmStatus;//报警状态
bit SilenceStatus;//静默状态:1静默,0正常;短信发送“GOON”解除
int delay_min=5;//设置报警后的静默时间


void main(){
Init();
while(1){
recSMSCheck();
LED=1;
BEEP=1;
while(SilenceStatus){
recSMSCheck();
delay_s(5);
}
StatusCheck();
if(AlarmStatus){
BEEP=0;
LED=0;
Send_SMS(AlarmSMS);
      AlarmStatus=0;
do{
delay_s(60);
delay_min--;
recSMSCheck();
}while((delay_min>0)&&(!SilenceStatus));
}
}
}


/*-------------------------------------------------------------------


                           终端初始化


--------------------------------------------------------------------*/
void Init(){
InitUART();
InitSMS();//清空短信,检测信号是否正常
}


//设置前3个传感器有并且只有两个连接上即显示状态正常
bit SensorCheck(){
if(!Sensor1&&!Sensor2&&Sensor3){
Sensor1_Enable=1;
Sensor2_Enable=1;
Sensor3_Enable=0;
return 1;
}
else if(!Sensor1&&Sensor2&&!Sensor3){
Sensor1_Enable=1;
Sensor2_Enable=0;
Sensor3_Enable=1;
return 1;
}
else if(Sensor1&&!Sensor2&&!Sensor3){
Sensor1_Enable=0;
Sensor2_Enable=1;
Sensor3_Enable=1;
return 1;
}
else
return 0;
}





/*--------------------------------------------------------------------


                          传感器状态判定


--------------------------------------------------------------------*/
void StatusCheck(){
if(!((Sensor1&&Sensor1_Enable)||(Sensor2&&Sensor2_Enable)||(Sensor3&&Sensor3_Enable)))
AlarmStatus=0;
else
AlarmStatus=1;
}



/*--------------------------------------------------------------------


                          串口操作函数


---------------------------------------------------------------------*/
//串口初始化
void InitUART(){
SCON=0x50;//串行口工作方式1,8位UART;
PCON=0x00;//SMOD1=0,定时器1用来产生波特率
TMOD=0x20;//T1工作方式1,波特率不倍增
TH1=0xFD;//选用9600,误差0%
TR1=1;//打开波特率发生器T1
ES=1;//打开串行中断
EA=1;//打开全局中断
}


//串口发送函数
void SendByte(uchar send_dat){
SBUF=send_dat;
while(!TI);
TI=0;
}
void SendStr(uchar *s){
while(*s!='\0'){
SendByte(*s);
s++;
}
}


//串口接收中断
void RecStr(void) interrupt 4 {
if(RI){
RI=0;
recdata[i]=SBUF;
i++;
i&=0x007F;
}
}




/*---------------------------------------------------------------


                           GSM通信部分
        此部分包含短信的发送与接收,以及对GSM模块的操控


---------------------------------------------------------------*/
//清空前5条短信,将短信格式设置为格式1,检测GSM模块是否启动正常
//若正常则发送短信“Status OK”
void InitSMS(){
char StrTemp[20];
resetbuff();
do{     
SendStr("AT\r\n");
delay_s(3);
}while(!(Hand("SMS")&&Hand("OK")));
resetbuff();
delay_s(20);
do{
 SendStr("AT+CMGF=1\r\n");
delay_s(2);
}while(!Hand("OK"));
resetbuff();
  do{
 SendStr("AT+CMGD=\"ALL\"\r\n");
 delay_s(2);
}while(!Hand("OK"));
resetbuff();
do{
 strcpy(StrTemp,"AT+CMGS=\"");
 strcat(StrTemp,PhoneNum);
 strcat(StrTemp,"\"\r\n");
 SendStr(StrTemp);
 delay_s(1);
if(SensorCheck())
   SendStr("Status OK");
else
SendStr("Status FALSE");
 SendByte(0x1A);
delay_s(10);
}while(!Hand("+CMGS:"));
resetbuff();
}




//检测是否接收到关闭命令或者开启命令短信
void recSMSCheck(){
uchar sendtmp[20]={"AT+CMGR="};
  char StrTemp[20];
if(Hand("+CMTI:")){
delay_ms(1);
strcat(sendtmp,"1\r\n");
SendStr(sendtmp);
delay_s(2);
if(Hand("SILENCE")){
resetbuff();
Send_SMS("RECEIVED SILENCE!");
SilenceStatus=1;
}
if(Hand("GOON")){
resetbuff();
Send_SMS("RECEIVED GOON!");
SilenceStatus=0;
}
if(Hand("CHECKSTATUS")){
resetbuff();
do{
     strcpy(StrTemp,"AT+CMGS=\"");
     strcat(StrTemp,PhoneNum);
     strcat(StrTemp,"\"\r\n");
     SendStr(StrTemp);
     delay_s(1);
   if(SensorCheck())
       SendStr("Status OK");
   else
   SendStr("Status FALSE");
     SendByte(0x1A);
   delay_s(10);
   }while(!Hand("+CMGS:"));
}
resetbuff();
do{
SendStr("AT+CMGD=\"ALL\"\r\n");
delay_s(2);
}while(!Hand("OK"));
resetbuff();
  }
}



//检测是否返回值是否包含某字符
bit Hand(uchar *s){
if(strstr(recdata,s)==NULL)
return 0;
else
return 1;
}




//发送自定义短信
void Send_SMS(char *SMS){
char tmp[30]={"AT+CMGS=\""};
  strcat(tmp,PhoneNum);
  strcat(tmp,"\"\r\n");
  do{
SendStr(tmp);
delay_ms(300);
}while(!Hand(">"));
  resetbuff();
do{
SendStr(SMS);
SendByte(0x1A);
delay_s(10);
}while(!Hand("+CMGS"));
}




/*--------------------------------------------------------
                  
                    清空接收buff并将i置零


--------------------------------------------------------*/
void resetbuff(){
strcpy(recdata,"");
i=0;
}




/*--------------------------------------------------------


                        延时函数部分


---------------------------------------------------------*/
//delay 1ms
void delay_ms(ulong i){
ulong j=60*i;
while(j){
j--;
}
}
//delay 1s
void delay_s(ulong stime){
while(stime--){
delay_ms(808);
}
}



上位机部分以后再贴

你可能感兴趣的:(玩单片机)