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

📄 参赛最终版.c

📁 本文针对目前利用GSM进行无线数据通信的需要
💻 C
📖 第 1 页 / 共 2 页
字号:
		{ 	
			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 + -