📄 dzgsm1.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 + -