📄 参赛最终版.c
字号:
{
led1=1;
while(!RI);
rec[i] = SBUF;
RI = 0;
if(rec[2]=='B'&&i==7)
{
break;
}
}
led1=1;
if(rec[8]==0x00&&rec[6]==0x0D&&rec[7]==0x0A)
break;
if(rec[12] == 0x0D&&rec[13] ==0x0A) //返回ok说明通信成
break;
}
Serial_Inter_Open();
Delay1ms(1000);
RI = 0;
}
/***************************** 函数名称: Uart_send **************************
** 功能描述: 串口数据发送函数
** 输 入: data_buffer, data_len
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
******************************************************************************/
void Uart_send(INT8U data_buffer[], INT8U data_len)
{
INT8U data i;
T1=0; //clear send flag
for(i = 0; i < data_len; i++)
{
SBUF = data_buffer[i];
while(TI == 0);
TI = 0;
}
}
void deal_with_error(void)
{
led1_open(); //系统重新启动所有指示灯亮
led2_open();
led3_open();
led4=0;
Delay1s();
Delay1s();
Delay1s();
//软复位 ,系统热启动
}
/******************************************************************************** 函数名称:
Signal_test
** 功能描述: 查询信号质量,Signal quality test dB大于10就认为信号质量良好
** 输 入:
** 输 出: 无
** 全局变量: 无
** 调用模块: Start_timer2,Uart_send,Close_timer2, deal_with_error
******************************************************************************/
void Signal_test(void)
{
INT8U i, error_counter;
error_counter = 0;
Serial_Inter_Close();
while(1) // AT+CSQ
{
TI = 0;
RI = 0;
for(i = 0; i < 21; i++)
rec[i] = 0x00;
Uart_send(Command_Csq,7);
for(i = 0;i < 21; i++)
{
while(!RI);
rec[i] = SBUF;
RI = 0;
}
if(rec[8]>='1'&&rec[11]=='9'&& rec[12]=='9')
break;
else if(error_counter++<5)
Delay1ms(1000);
else
deal_with_error();
}
Serial_Inter_Open();
Delay1ms(1000);
RI=0;
}
/******************************************************************************** 函数名称:
AT_Creg
** 功能描述: 查询注册情况
** 输 入:
** 输 出: 无
** 全局变量: 无
** 调用模块: Start_timer2,Uart_send,Close_timer2, deal_with_error
******************************************************************************/
void AT_Creg(void)
{
INT8U i, error_counter;
error_counter = 0;
Serial_Inter_Close();
while(1)
{
TI = 0;
RI = 0;
for(i = 0; i <20; i++)
rec[i] = 0x00;
Uart_send(Command_Creg,9);
for(i = 0; i < 20; i++)
{
while(!RI);
rec[i] = SBUF;
RI = 0;
}
if((rec[11] == '1' || rec[11] == '5')&&rec[16] == 'O'&&rec[17] == 'K')
break;
else if(error_counter ++< 5)
Delay1ms(1000);
else
deal_with_error();
}
Serial_Inter_Open();
Delay1ms(1000);
RI = 0;
}
/******************************************************************************** 函数名称:
AT_cmgs
** 功能描述: 发送短消息命令函数
**After sending "CMGS" command,there will be 16 bytes received,
**among which the 14th and 15th must be "0x3E"and "0x20"
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: Start_timer2,Uart_send,Close_timer2, deal_with_error
******************************************************************************/
void AT_cmgs(INT8U Cmgs_buffer[],INT8U Cmgs_len)
{
INT8U i;
Serial_Inter_Close();
while(1)
{
TI = 0;
RI = 0;
for(i = 0; i < 4; i++)
rec[i] = 0x00;
Uart_send(Cmgs_buffer,Cmgs_len);
for(i=0;i < 4;i++)
{
while(!RI);
rec[i] = SBUF;
RI = 0;
}
if(rec[2]== 0x3E&& rec[3]== 0x20)
break;
else
deal_with_error();
}
Serial_Inter_Open();
Delay1ms(1000); //时一段时间
RI=0;
TI=0;
}
/******************************************************************************** 函数名称:
Send_sms
** 功能描述: 发送短消息函数 ,发送GSMhead[],Phone_number,GSM_set[],GSM_sms[],0x1A结束符号;
** 输 入: 无
** 输 出: ok or error
** 全局变量: 无
** 调用模块: Serial_Inter_Close(), deal_with_error,Serial_Inter_Open();
******************************************************************************/
void Send_sms(INT8U GSM_sms_buffer[],INT8U Send_sms_len)
{
INT8U i;
Serial_Inter_Close();
TI=0;
RI=0; //send GSMhead(12 bytes)
for(i=0;i<8;i++)
{
SBUF = GSMhead[i];
while(!TI);
TI = 0;
} //send phone number(12 bytes)
for(i=0;i<16;i++)
{
SBUF = User_number[i];
while(!TI);
TI = 0;
} //send GSM_set(6 bytes)
for(i=0;i<6;i++)
{
SBUF = GSM_set[i];
while(!TI);
TI = 0;
} //send sms contents(Send_sms_len bytes)
for(i=0;i<Send_sms_len;i++)
{
SBUF = GSM_sms_buffer[i];
while(!TI);
TI = 0;
} //send end bytes:0x1A
SBUF =0x1A;
while(!TI); TI = 0; //发送信息结束
Serial_Inter_Open();
Delay1ms(1000);
RI=0;
TI=0;
}
/******************************************************************************** 函数名称:
AT_sms_test
** 功能描述: 发送短信成功测试
** 输 入:
** 输 出: 无
** 全局变量: 无
** 调用模块: Start_timer2,Uart_send,Close_timer2, deal_with_error
******************************************************************************/
void AT_sms_test(void)
{
INT8U i;
Serial_Inter_Close();
while(1)
{
TI = 0;
RI = 0;
for(i = 0; i < 20; i++)
rec[i] = 0x00;
for(i = 0; i < 20; i++)
{
while(!RI);
rec[i] = SBUF;
RI = 0;
if(rec[18] == 0x0A)
break;
if(rec[17] == 0x0A)
break;
}
if(rec[18] == 0x0D&&rec[19] == 0x0A) //返回ok说明通信成
break;
if(rec[17] == 0x0D&&rec[18] == 0x0A) //返回ok说明通信成
break;
if(rec[16] == 0x0D&&rec[17] == 0x0A) //返回ok说明通信成
break;
}
Serial_Inter_Open();
Delay1ms(1000);
RI = 0;
}
/********************************************************************************
Send_AP+CPBR
** 功能描述: 读电话薄
** 输 入: 无
** 输 出: HM1[],HM2[],HM3[]
** 全局变量: 无
** 调用模块: Serial_Inter_Close(),Uart_send, deal_with_error,Serial_Inter_Open();
/********************************************************************************/
void AT_CPBR(INT8U Command_CPBR[],INT8U Cpbr_len)
{
INT8U i,j = 0,k = 0,error_counter=0;
Serial_Inter_Close();
while(1)
{
TI = 0;
RI = 0;
rec[0] = 0x00;
rec[1] = 0x00;
for(i=0;i<11;i++)
User_number1[i]=0x00;
Uart_send(Command_CPBR,Cpbr_len);
for(i = 0;i <42;i++)
{
while(RI==0);
if((i >= 12)&&(i <= 22))
User_number1[j++]=SBUF;
if(i == 38 || i == 39)
rec[k++] = SBUF;
RI = 0;
}
if(rec[0]== 0x4F&& rec[1]== 0x4B)
break;
else if(error_counter++<5)
{
j=0;k = 0;Delay1ms(1000);
}
else
deal_with_error();
}
Serial_Inter_Open();
Delay1ms(1000); //时一段时间
RI=0;
TI=0;
}
/************************************************
** 功能描述: 接收号码转换
** 输 入: 无
** 输 出: HM[16]
** 全局变量: 无
** 调用模块: Serial_Inter_Close(),Uart_send, deal_with_error,Serial_Inter_Open();
******************************************************************************/
void Number_change()
{
INT8U i;
int f = 1;
User_number[0] = '9';
User_number[1] = '1';
User_number[2] = '6';
User_number[3] = '8';
User_number[14] = 'F';
User_number[15] = User_number1[10];
for(i = 0;i < 10;i++)
{
User_number[i+4] = User_number1[i + f];
f = -f;
}
}
/************************************************
** 功能描述: open and close led
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
******************************************************************************/
void led1_open(void)
{
led1 = ON;
}
void led1_close(void)
{
led1 = OFF;
}
void led2_open(void)
{
led2 = ON;
}
void led2_close(void)
{
led2 = OFF;
}
void led3_open(void)
{
led3 = ON;
}
void led3_close(void)
{
led3 = OFF;
}
/******************************************************************************/
void Delay1ms(INT8U t)
{
INT8U i,j;
for(i = 0;i<t;i++)
for(j = 0;j < 140;j++);
}
void Delay1s()
{
INT8U i,j;
for(i = 0;i<1000;i++)
for(j = 0;j < 140;j++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -