?? 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 + -