📄 参赛最终版.c
字号:
#include<AT89X52.H>
#include <string.h>
#include <intrins.h>
typedef unsigned char INT8U; //无符号8位数
#define OFF 1
#define ON 0
#define OK 1
/**************************************************************************
* 与GSM模块相关的定义
* (Read and writ GSM)
**************************************************************************/
//工作指示灯
sbit led1=P2^0; //
sbit led2=P2^3; // (0-亮,1-灭)
sbit led3=P2^2; //
sbit led4=P2^4;
sbit Test=P1^0;
sbit Test1=P1^1;
sbit Test2=P1^2;
sbit Test3=P1^3;
sbit flag = P3^7;
/***********************************GSM指令定义**************************/
INT8U code Command_AtE[4] = "ATE\r"; //Send AT
INT8U code Command_IPR[12] = "AT+IPR=9600\r"; //Set baud rate
INT8U code Command_Csq[7] = "AT+CSQ\r"; //Signal quality test
INT8U code Command_Creg[9] = "AT+CREG?\r";
INT8U code Command_Cmgf[10] = "AT+CMGF=0\r"; //发送短信模式选择
INT8U Command_Cmgs1[12] = "AT+CMGS=031\r"; //030是指去掉短信中心号码,和紧接其后的00后
INT8U Command_Cpbr[10] = "AT+CPBR=1\r"; //查前3个电话号码INT8U code GSMhead[8] = "0011000D"; //短信中心号码默认为00
INT8U code GSM_set[6] = "000801";
INT8U code GSM_sms1[30] = "0E4E3B63A7533A67098B6660C53002"; // 短信内容:主控区有警情。"104f60597dff0c53d190016210529fff01"
INT8U code GSM_sms2[34] = "104E0053F79632533A67098B6660C53002"; // 短信内容:一号防区有警情。
INT8U code GSM_sms3[34] = "104E8C53F79632533A67098B6660C53002"; // 短信内容:二号防区有警情。
INT8U code GSM_sms4[34] = "104E0953F79632533A67098B6660C53002"; // 短信内容:三号警情有警情。
INT8U code GSM_sms5[34] = "1056DB53F79632533A67098B6660C53002"; // 短信内容:四号防区有警情。
INT8U code GSM_sms6[30] = "0E9632533A67095E7262706E903002"; // 短信内容:防区有干扰源。
INT8U code GSM_sms7[34] = "104E0053F74E3B533A67098B6660C53002"; // 短信内容:一号主区有警情。
INT8U code ATD_number[7] = "ATD>1;\r";
//短消息内容:你好,发送成功。
//===================================函数声明===========================
void Serial_Inter_Open(void);
void Serial_Inter_Close(void);
void Inter_Enable(void);
//void Inter_Disable(void);
bit Test_Set_GSM(void);
void Uart_send(INT8U data_buffer[], INT8U data_len);
void ATE_Send(void);
void AT_Creg(void);
void Signal_test(void) ;
void AT_CPBR(INT8U Command_CPBR[],INT8U Cpbr_len);
void AT_cmgs(INT8U Cmgs_sbuffer[],INT8U Cmgs_len);
void Send_sms(INT8U GSM_sms_buffer[],INT8U Send_sms_len);
void led1_open(void);
void led1_close(void);
void led2_open(void);
void led2_close(void);
void led3_open(void);
void led3_close(void);
void Delay1ms(INT8U t);
void Delay1s(void);
void Baudrate_Init();
void deal_with_error(void);
void Number_change();
void AT_sms_test(void);
void AT_test1(void);
void ATD();
//===================================变量声明===========================
INT8U rec[30];
INT8U ok_flag; //初始化成功标志位
INT8U User_number1[11]; //电话号码存储单元
INT8U User_number[16]; //编辑过的电话号码存储单元
INT8U temp; //读取P3口变量
INT8U zhqu; //主区报警
INT8U zhqu1; //一号主控区报警
INT8U f1; //辅助区一
INT8U f2; //辅助区二
INT8U f3; //辅助区三
INT8U f4; //辅助区四
INT8U wf; //违法操作
//===================================主函数===========================
void main(void)
{
INT8U t,i;
Inter_Enable(); //总中断开启
Baudrate_Init(); //串口初始化
Serial_Inter_Open();
for(t = 0;t < 4;t++) //延时一段时间等待GSM模块启动完毕
{
Delay1ms(800);
led1_open();
Delay1ms(800);
led1_close();
}
while(1)
{
temp=0;
if(Test == 0) //测试调试用,调试或首次启动把该引脚接地
{
Delay1ms(200);
if(Test == 0)
ok_flag=Test_Set_GSM();
zhqu=1;
}
if(Test1 == 0) //测试调试用,调试或首次启动把该引脚接地
{
Delay1ms(200);
if(Test1 == 0)
ok_flag=Test_Set_GSM();
zhqu1=1;
}
if( flag == 0)
{
Delay1ms(10);
if( flag == 0)
{
temp=P3&0x78;
for(i=0;i<30;i++)
{
if(flag == 1)
{
break;
}
else Delay1ms(100);
}
if(i==30)
{
ok_flag=Test_Set_GSM();
temp=0xff;
wf=1;//违法
}
}
}
if(temp== 0x20)
{
ok_flag=Test_Set_GSM();
f1=1;
}
if(temp == 0x40)
{
ok_flag=Test_Set_GSM();
f2=1;
}
if(temp == 0x08)
{
ok_flag=Test_Set_GSM();
f3=1;
}
if(temp == 0x10)
{
ok_flag=Test_Set_GSM();
f4=1;
}
if(ok_flag)
{
ok_flag=0;
for(i=1;i<3;i++)
{
led2_open();
Command_Cpbr[8]=i+0x30;
AT_CPBR(Command_Cpbr,10);
Number_change();
if(zhqu == 1)
{
Command_Cmgs1[9]=0x32;
Command_Cmgs1[10]=0x39;
AT_cmgs(Command_Cmgs1,12);
Send_sms(GSM_sms1,30);
}
if(f1 == 1)
{
AT_cmgs(Command_Cmgs1,12);
Send_sms(GSM_sms2,34);
}
if(zhqu1 == 1)
{
AT_cmgs(Command_Cmgs1,12);
Send_sms(GSM_sms7,34);
}
if(f2 == 1)
{
AT_cmgs(Command_Cmgs1,12);
Send_sms(GSM_sms3,34);
}
if(f3 == 1)
{
AT_cmgs(Command_Cmgs1,12);
Send_sms(GSM_sms4,34);
}
if(f4 == 1)
{
AT_cmgs(Command_Cmgs1,12);
Send_sms(GSM_sms5,34);
}
if(wf == 1)
{
Command_Cmgs1[9]=0x32;
Command_Cmgs1[10]=0x39;
AT_cmgs(Command_Cmgs1,12);
Send_sms(GSM_sms6,30);
AT_sms_test();
if(i==2)
{
while(!flag);
}
}
if(wf != 1)
{
AT_sms_test();
}
led2_close();
Delay1ms(1000);
}
if(zhqu ==1 )
{
led1=0;
led2=0;
led3=0;
led4=0;
ATD();
Delay1ms(1000);
led1=1;
led2=1;
led3=1;
led4=1;
}
zhqu=0;
f1=0;
f2=0;
f3=0;
f4=0;
wf=0;
}
}
}
/******************************************************************************** 函数名称:
start_GSM
** 功能描述: 启动gsm模块,并进行初始设置
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
******************************************************************************/
bit Test_Set_GSM(void)
{
led3_close();
ATE_Send(); // Send command AT
led3_open();
Delay1ms(100);
led3_close();
Delay1ms(1000);
Signal_test(); // Test signal quality
led3_open();
Delay1ms(100);
led3_close();
Delay1ms(1000);
AT_Creg(); //查询GSM 注册情况
led3_open();
Delay1ms(100);
led3_close();
Delay1ms(1000);
return OK;
}
/******************************************************************************** 函数名称:
** 功能描述: Interrupts Open and Close
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
******************************************************************************/
void Serial_Inter_Close(void)
{
ES=0;
}
void Serial_Inter_Open(void)
{
ES=1;
}
void Inter_Enable(void)
{
EA=1;
}/*
void Inter_Disable(void)
{
EA=0;
} */
/********************************************************************************
Baudrate_Init
** 功能描述: 串口初始化,波特率设置 9600,n,8,1,外部晶振18.432MHz
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
******************************************************************************/
void Baudrate_Init(void)
{
TMOD |= 0x20; // T1使用工作方式2
TH1 = 0xFD; // 设置T1初值
TL1 = 0xFD;
SCON = 0x50; // 工作方式1,波特率9600bit/s,允许接收
TR1 = 1; // T1开始计数
ET1 =0; //定时器1中断关
}
/******************************************************************************** 函数名称:
AT_Send
** 功能描述: 发送AT联机命令,通信正常返回'ok'
** 输 入:
** 输 出: 无
** 全局变量: 无
** 调用模块: Start_timer2,Uart_send,Close_timer2, deal_with_error
******************************************************************************/
void ATE_Send(void)
{
INT8U i, error_counter;
error_counter = 0;
Serial_Inter_Close();
while(1)
{
TI = 0;
RI = 0;
for(i = 0; i < 6; i++)
rec[i] = 0x00;
Uart_send(Command_AtE,4);
for(i = 0; i < 6; i++)
{
while(!RI);
rec[i] = SBUF;
RI = 0;
}
if(rec[2] == 'O'&&rec[3] == 'K') //返回ok说明通信成
break;
else if(error_counter++<5) //否则延时重发
Delay1ms(1000);
else
deal_with_error();
}
Serial_Inter_Open();
Delay1ms(1000);
RI = 0;
}
/******************************************************************************** 函数名称:
ATD
** 功能描述: 发送AT联机命令,通信正常返回'ok'
** 输 入:
** 输 出: 无
** 全局变量: 无
** 调用模块: Start_timer2,Uart_send,Close_timer2, deal_with_error
******************************************************************************/
void ATD()
{
INT8U i,error_counter;
error_counter = 0;
Serial_Inter_Close();
while(1)
{
TI = 0;
RI = 0;
for(i = 0; i < 14; i++)
rec[i] = 0x00;
Uart_send(ATD_number,7);
led1=0;
for(i = 0; i < 14; i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -