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

📄 dzgsm1.c

📁 gsm短消息报警程序
💻 C
字号:
#include "REG52.H"
#include "stdio.h"
#include "math.h"
#include "string.h"
#include "absacc.h"
#include "intrins.h"
//#include "gsm1.h"
#include "intrins.h"
#include "stdlib.h"

#define  uchar unsigned char 	/*宏定义*/
#define  uint  unsigned int
#define  _Nop()  _nop_(),_nop_(),_nop_(),_nop_()      /*定义空指令*/
#define ulong	unsigned long

#define ERRORCOUNT 10
#define MAXLENTH 128          //接收缓冲最大长度
#define YIFENG 2000           //电话线路信号检测时间间隔(可调)
#define SANSHI 3000           //短消息和呼叫后,等待回叫的时间间隔(可调)

sbit PWON=P1^1;
//模块启动信号

sbit DSR=P0^2;
sbit DTR=P3^6;
sbit CTS=P3^3;
sbit RTS=P1^4;
sbit TELCTR=P0^0;
//继电器控制位,低电平继电器线圈得电,控制电话的模拟摘挂机
sbit ONLINE=P0^7;
//线路有无电压信号,为1有、为0无
sbit GSM=P0^1;
//ONOFF  
//GSM模块电源控制位,低电平GSM模块电源得电
sbit LED1=P2^0;
//sbit errorflag
sbit Bit_SDA=P2^1;
/*模拟I2C数据传送位*/
sbit Bit_SCL=P2^2;
/*模拟I2C时钟控制位*/
sbit dat165=P2^5;
// 报警数据线
sbit clk165=P2^6;
// 报警时钟线
sbit lod165=P2^7;
// 报警信号载入线
//enum eepromtype {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256};
//enum eepromtype EepromType; 
bit timef1=0;
//
bit sanshidao=0;
//短消息和呼叫后,等待回叫的时间间隔到报警标志
bit AUTOalarm=0;
//定时检查线路短消息报警(自动报警)成功标志,为1成功
bit KEYalarm=0;
//键盘手动报警成功标志,为1成功
bit ATDalarm=0;
//呼叫报警成功标志,为1成功
bit StopSMS=0;
//禁止发短消息,用于报警失败后再次报警时不再发短消息,只打电话
bit AUTO=0;
bit smcb=0;
//短消息到标志
bit flag1=0;
//有消息收到为1
bit flag2=0;
//报过警了标志为1,等待30秒(sansh),清除
bit flag10=0;
//
bit flag11=0;
bit flag12=0;
bit flag13=0;
bit flag14=0;
bit flag15=0;
bit flag16=0;
bit flag17=0;
//以上八个标志为中心复位命令操作标志
//*****<<<<<<
unsigned char code AT_COPS[] = "\"CHINA  MOBILE\"";
//网络搜索到特征字
unsigned char code SMSTEXT[]="over";
//接收短信内容
unsigned char code SMSTISHI[]="+CMTI";
//新短消息到特征字
unsigned char code SMSSEND[]="+CMGS";
//短消息发送成功特征字  
unsigned char code SMSCENTER[]="+CSCA";
//短消息中心读取成功特征字	
unsigned char code SMSCSQ[]="+CSQ";
//信号强度	
unsigned char code ERROR1[]="ERR";
//*****<<<<<中心设置命令
unsigned char code alarmcenter[]="11#13#";
//1原来 alarmcenter
//改报警中心命令 特征字
unsigned char code shtmacenter[]="11#07#";
//2
//改消息中心命令 特征字
unsigned char code phonecenter[]="11#08#";
//3
//改电话中心命令 特征字 
unsigned char code voicecenter[]="11#09#";
//4
//改语音中心命令 特征字

//*******<<<<<中心查询命令
unsigned char code falarmcenter[]="11#14";
//1
//查报警中心命令特征字
unsigned char code fshtmacenter[]="11#10";
//2
//查报警中心命令特征字
unsigned char code fphonecenter[]="11#11";
//3
//查报警中心命令特征字
unsigned char code fvoicecenter[]="11#12";
//4
//查报警中心命令特征字

//******<<<<<中心 发出复位(报警) 命令
unsigned char code alarmreset[]="11#03";
//1


//******<<<<<中心发出(报警)设防命令
unsigned char code alarmstart[]="11#05#";
//1




uchar idata recestr[MAXLENTH];
//串口中断接收缓冲	
uchar idata temp3[9] =
{
	0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,'\0'
}
;
//发送报警字串初始化(清除报警)
uchar idata temp4[9] =
{
	0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,'\0'
}
;
//接收设防/撤防字串初始化(全部//ss撤防)
uchar idata temp5[13] =
{
	0,0,0,0,0,0,0,0,0,0,0,0,'\0'
}
;
//向报警中心回复的电话号码
uchar idata temp[20];
//临时数据存储区
uchar idata temp2[12];
//原来12
//临时数据存储区2
uchar idata k=0;
//主要作为缓冲数组的序号
uchar idata k2=0;
//清空数据区的数据数量
uchar idata select=0;
//报警流程启动信号,为10是自动报警,为100是人工按键报警
uchar idata count=0;
//电话信号音脉冲计数变量
uchar idata time=0;
//定时器10MS到的次数
uchar idata timeselect=0;
//时间选择标志
uchar idata error=0;
//拨号音检测失败的次数
uchar idata ATD3=0;
//记录拨号报警的拨号次数

uchar idata counter=0;
//初始化各变量和标志
uchar idata genlenth=0;

uchar idata len24=0;
//存入24XX中的数据长度
uchar idata len=0;
//从接收缓冲中要取出的数据的位置
uchar idata almdat;
//报警接收数据
uchar idata almdat2;
//报警数据分析数据
uchar idata sansh;
//报警过后30秒延迟计数
uchar idata chaxun;
//5秒查询GSM模块
//****************************************************************************************
//延时程序
//****************************************************************************************
char delay(unsigned long j)        //长时间粗略延时
{
	while(--j)
	{
		WDTRST=0x1E;
		//_nop_();
		WDTRST=0xE1;
	}
	return j;
}

void msdelay(unsigned int j)        //分辨率11us
{
	while(--j)
	{
		WDTRST=0x1E;
		WDTRST=0xE1;
	}
	;
}

//****************************************************************************************
//发送字符程序
//****************************************************************************************

void sendb(uchar sendata)    //发送一个字节数据
{
	WDTRST=0x1E;
	//_nop_();
	WDTRST=0xE1;
	TB8=PSW^0;
	SBUF=sendata;
	
	while(1)
	{
			
		if(TI==0)
		;
		else  
		{
			TI=0;
			break;
		}
	}
}

sendtest(uchar idata sendstr[], uchar a)   //发送一组字符串及一个字节
{
	uchar idata i,j;
	i=strlen(sendstr);

	for(j=0;j<i;j++)
	sendb(sendstr[j]);

	if(a!=0) sendb(a);
}



sendset(uchar idata sendstr1[],uchar idata sendstr2[],uchar a)   //发送二组字符串及一个字节
{
	uchar idata i,j;
	i=strlen(sendstr1);
	for(j=0;j<i;j++)
	sendb(sendstr1[j]);

	i=strlen(sendstr2);
	for(j=0;j<i;j++)
	sendb(sendstr2[j]);

	if(a!=0)
	sendb(a);
}


//****************************************************************************************
//字符长度,比较,搜索程序
//****************************************************************************************

int cust_strlen(char* pChar)                    //pChar字符串长度判断
{
	int data iLen = 0;
	for(iLen = 0; (*(pChar++) != 0 ); iLen ++);
	return iLen;
}

int cust_strfnd(char *pStr, char* pSrc) //pStr与pSrc比较,前者要求小于后者。如果在后者中搜索到前者,那么需将
{
	//后者偏移几次才能找到前者的值返回,如果找不到前者,则返回-1
	//TR1=0;      //禁止定时中中断
	int iStrLoop = 0;
	int iSrcLoop = 0;
	int iStrLen = cust_strlen(pStr);
	int iSrcLen = cust_strlen(pSrc);
	if((iStrLen > 0) && (iSrcLen > 0) && (iSrcLen > iStrLen))
	{
		for(iSrcLoop = 0; iSrcLoop < (iSrcLen - iStrLen + 1); iSrcLoop ++)
		{
			WDTRST=0x1E;
			WDTRST=0xE1;
			for(iStrLoop = 0; iStrLoop < iStrLen; iStrLoop ++)
			{
				if(*(pStr + iStrLoop) != *(pSrc + iStrLoop))
				break;
			}
			if(iStrLoop == iStrLen)
			return iSrcLoop;
			pSrc ++;
		}
	}
	return -1;

}



//****************************************************************************************
//GSM模块应用程序   搜索网络子程序
//****************************************************************************************

void Findnet(void)                              //搜索网络子程序
{
	uchar k1=0;
	while(1)
	{
		ES=0;
		for(k=0;k<=MAXLENTH;k++)    			//清空接收缓冲
		recestr[k]=0;
		k=0;
		while(RTS);
		msdelay(30000);
		
		sendtest("AT+COPS?",13);
		//发送搜索网络指令
		sendb('\n');
		ES=1;
		while(RTS);
		msdelay(40000);
		//打开串口接收中断,等待接收指令返回的响应字符
		ES=0;
         
		if (cust_strfnd(AT_COPS,recestr)!=-1)  //比较指令的返回字符与预定字符是否相等,连续3次相等则跳出,否则循环搜索
		{
			k1++;
			if (k1==3) break;
		}
		else 
		k1=0;
	}
}
//****************************************************************************************
//GSM模块应用程序   初始化GSM模块
//****************************************************************************************
void IniGSM(void)                               //初始化GSM模块
{
	
	GSM=0;
	//模块加电
	PWON=1;
	DTR=0;
	PWON=1;
	LED1=0;
	delay(90000);
	PWON=0;
	LED1=1;
	//模块启动信号
	//delay(50000);
	delay(150000);
	//PWON=1; 
	delay(150000);     //用于西门子模块的启动信号,用华为模块时屏蔽
	while(RTS);	
	sendtest("AT+CGMI",13);
	//读取华为标志
	//为了在串口数据显示软件中能整齐的显示而加入一个回车,平时可去除。
	LED1=0;
	//msdelay(20000);
	//while(RTS);
	delay(50000);
	sendtest("ATE0",13);
	//清除回显
	LED1=1;
	msdelay(50000);
	//while(RTS);
	sendtest("AT+CMGF=1",13);
	//设置短消息为TEXT模式
	LED1=0;
	//msdelay(20000);
	//while(RTS);
	//LED1=1;
	//msdelay(10000);
	//delay(50000);
	//sendtest("AT+CMGL=\"REC UNREAD\"",13);
	//读新收到的短消息内容
	LED1=0;
	//while(RTS);
	delay(50000);

	while(1)									//读短消息中心号,为了能启动SIM卡	
	{
		ES=0;
		for(k=0;k<=MAXLENTH;k++)    		//清空接收缓冲
		recestr[k]=0;
		k=0;
		LED1=1;
		//while(RTS);
		delay(10000);
		sendtest("AT+CSCA?",13);
		//?读短消息中心号,为了能启动SIM卡
		sendb('\n');
		//while(RTS);
		ES=1;
		LED1=0;
		//打开串口接收中断,等待接收指令返回的响应字符
		msdelay(80000);
		ES=0;
	         
		if (cust_strfnd(SMSCENTER,recestr)!=-1)  //比较指令的返回字符与预定字符是否相等
		break;
	}

	for (k=0;k<5;k++)					  //设置短消息

⌨️ 快捷键说明

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