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

📄 gsm-dtu-gr47avr.c

📁 AVR单片机应用开发指南及实例,包含许多实例,挺不错
💻 C
📖 第 1 页 / 共 4 页
字号:
      return temp; 
} 

//等待GSM响应OK,  
void  gsm_wait_ok()  
  { 
    uchar  i,j;
    gsm_ok_flag=0;          //1有OK响应
    for(i=0;i<250;i++)
     {
   if(UCSRA & (1<<RXC))
        {
        j=UDR;
		i=1;
	    if(j=='O')
        {
        i=100;
		
		
        }
        else if(j=='K')
           {gsm_ok_flag=1;
		   
            i=251;
           }
		
        }
	
     else
       {
       	 WDR();
       	 delay_us(500);
       }	
      // */ 	
     }  
       
   }	 



void   gsm_init()       //如果gsm_init_flag=1成功
    {
	   //检查模块   AT  ENTER  ,等待响应OK,最多三遍
    uchar i;
    for(i=0;i<3;i++)
     {
    USART1_Transmit('A');  //0x41  0x54(参见ASCII码表)
    USART1_Transmit('T');
    USART1_Transmit(0x0d);
    gsm_wait_ok();
    if(gsm_ok_flag==1)
        {
        i=3;
   
        PORTC |=(1<<run_led);   //1  灭
        delay_ms(500);
		PORTC &=~(1<<run_led);   //0  亮
		gsm_init_flag=1;
        }
      
     }	  
  //关闭回显ATE0
    USART1_Transmit('A');  //0x41  0x54
    USART1_Transmit('T');
    USART1_Transmit('E');
    USART1_Transmit('0'); 
    USART1_Transmit(0x0d);
     gsm_wait_ok();
	gsm_init_flag=0;
    if(gsm_ok_flag==1)
        {
		gsm_init_flag=1;
        }
      
     
	
	
	
	
//新短信来提示设置:  AT+CNMI=3,2 
    USART1_Transmit('A');  //0x41  0x54
    USART1_Transmit('T');
    USART1_Transmit('+');
    USART1_Transmit('C'); 
    USART1_Transmit('N');
    USART1_Transmit('M');
    USART1_Transmit('I');
    USART1_Transmit('=');
    USART1_Transmit('3');
    USART1_Transmit(',');
    USART1_Transmit('2');
    USART1_Transmit(0x0d); 
	    gsm_wait_ok();
	gsm_init_flag=0;
    if(gsm_ok_flag==1)
        {
		gsm_init_flag=1;
        }
 //设置短信方式AT+CMGF=1,TEXT 
    USART1_Transmit('A');  //0x41  0x54
    USART1_Transmit('T');
    USART1_Transmit('+');
    USART1_Transmit('C'); 
    USART1_Transmit('M');
    USART1_Transmit('G');
    USART1_Transmit('F');
    USART1_Transmit('=');
    USART1_Transmit('1');
    USART1_Transmit(0x0d);   
    gsm_wait_ok();
	gsm_init_flag=0;
	
   if(gsm_ok_flag==1)
        {
		
	PORTC |=(1<<run_led);   //1  灭
       delay_ms(500);
      PORTC &=~(1<<run_led);   //0  亮
	    gsm_init_flag=1;
      }
      
	}    
 
 
 
 
//2007 
 
 
 
 
 
 
 
 
    
    
void  info_gsm_recieve()               //已收到"+,从86开始接收短信信息,如正常
                                       //则info_gsm_rx_flag=1; 短信GD..保存在data_buffer中
                                       //来源手机号保存在gsm_rx_mobile_num中
                                       //短信时间在gsm_rx_time中
 {
               uchar  i,j;      
                     info_gsm_rx_flag=0;
                      //清info_buffer[] RAM
                     for(i=0;i<250;i++)
                      {
                      info_buffer[i]=0x00;
                      }	
                          //可以接收后面的内容了
                       info_lenght=0x00;
                       for(i=0;i<250;i++)
                         {
                         if(UCSR1A&(1<<RXC1))
                                {
                                 info_buffer[info_lenght]=UDR1;
                                 info_lenght++;
		                         i=1;
		                
                                } 
                         else
                                {
       	                       delay_us(500);
                                }     
                         }
                           //接收完毕,
                           //清数据区
                           for(i=0;i<120;i++)
                              {
                               data_buffer[i]=0x00;
                              }
                           for(i=0;i<11;i++)
                               {
                               rx_mobile_num[i]=0x00;
                               }
                            for(i=0;i<17;i++)
                               {
                               gsm_rx_time[i]=0x00;
                               }
                               
                             //保存来源手机号 
							// USART0_Transmit('y');
							// USART0_Transmit('z');
							// USART0_Transmit('z');
							// USART0_Transmit('-');
							// USART0_Transmit('t');
							// USART0_Transmit('e');
							// USART0_Transmit('l');
							// USART0_Transmit(':');
							 
                             j=2; 
                             for(i=0;i<11;i++)
                               {//把真正内容放到rx_mobile_num中
                               	rx_mobile_num[i]=info_buffer[j];
                               	//USART0_Transmit(info_buffer[j]);
                               	j++;
                               	
                               }   
							// USART0_Transmit('-');
							// USART0_Transmit('t');
							// USART0_Transmit('i');
							// USART0_Transmit('m');
							// USART0_Transmit('e');
							// USART0_Transmit(':');
                             //保存短信来时间 
                             j=17; 
                             for(i=0;i<17;i++)
                               {//把真正内容放到rx_mobile_num中
                               	gsm_rx_time[i]=info_buffer[j];
								//USART0_Transmit(info_buffer[j]);
                               	j++;
                               	
                               }    
                               
                           //确定真正内容长度
                           //info_buffer[70]是长度
						   //或info_buffer[70]+info_buffer[71]
						   //或info_buffer[70]+info_buffer[71]+info_buffer[72]
                          
						        //USART0_Transmit('-');
							// USART0_Transmit('l');
							// USART0_Transmit('e');
							// USART0_Transmit('n');
							// USART0_Transmit('g');
		                                        //USART0_Transmit('t');
							// USART0_Transmit('h');
							// USART0_Transmit(':');
                           if(info_buffer[71]==0x0d)
                             {
                              data_length=(info_buffer[70]-0x30);
							  //USART0_Transmit(info_buffer[70]);
                              j=73;
                             }
                           else if (info_buffer[72]==0x0d)
                             {
                              data_length=(((info_buffer[70]-0x30))*10+(info_buffer[71]-0x30));
                              //USART0_Transmit(info_buffer[70]);
							  //USART0_Transmit(info_buffer[71]);
		
							  j=74;
                             }
                           else
                             {
                              data_length=(((info_buffer[70]-0x30))*100+(info_buffer[71]-0x30)*10+(info_buffer[72]-0x30));
                              //USART0_Transmit(info_buffer[70]);
							  //USART0_Transmit(info_buffer[71]);
							  //USART0_Transmit(info_buffer[72]);
		
							  j=75;
                             }
							 //USART0_Transmit('-');
							// USART0_Transmit('d');
							// USART0_Transmit('a');
							// USART0_Transmit('t');
							// USART0_Transmit('a');
							// USART0_Transmit(':');
                           for(i=0;i<data_length;i++)
                               {//把真正内容放到data_buffer中
                               	data_buffer[i]=info_buffer[j];
								//USART0_Transmit(data_buffer[i]);
                               	j++;
                               	
                               }
                           //判断
                              if((data_buffer[0]=='G')&&(data_buffer[1]=='D'))
                              {//正常短信
                               info_gsm_rx_flag=1;	
                              }  
                              
 } 
    
  //now_time(12) ,ACSCII -TO -BCD ,now_time_hex(6)
 void time_acscii_to_bcd()
  {
 now_time_hex[0]=now_time[0]-0x30;
 now_time_hex[0]=(now_time_hex[0])*16;
 now_time[1]=(now_time[1]-0x30);
 now_time_hex[0]=now_time_hex[0]+now_time[1];
 //year
 now_time_hex[1]=now_time[2]-0x30;
 now_time_hex[1]=(now_time_hex[1])*16;
 now_time[3]=(now_time[3]-0x30);
 now_time_hex[1]=now_time_hex[1]+now_time[3];
 //month
  now_time_hex[2]=now_time[4]-0x30;
 now_time_hex[2]=(now_time_hex[2])*16;
 now_time[5]=(now_time[5]-0x30);
 now_time_hex[2]=now_time_hex[2]+now_time[5];
 //date
  now_time_hex[3]=now_time[6]-0x30;
 now_time_hex[3]=(now_time_hex[3])*16;
 now_time[7]=(now_time[7]-0x30);
 now_time_hex[3]=now_time_hex[3]+now_time[7];
 //hour
  now_time_hex[4]=now_time[8]-0x30;
 now_time_hex[4]=(now_time_hex[4])*16;
 now_time[9]=(now_time[9]-0x30);
 now_time_hex[4]=now_time_hex[4]+now_time[9];
 //minute
  now_time_hex[5]=now_time[10]-0x30;
 now_time_hex[5]=(now_time_hex[5])*16;
 now_time[11]=(now_time[11]-0x30);
 now_time_hex[5]=now_time_hex[5]+now_time[11];
 //seconds
   }
   
 
 //当前时间写,要写的时间在now_time中
void  set_now_time()
  {
 //now_time ,ACSCII -TO -BCD ,now_time_hex, save the time;
  time_acscii_to_bcd();

 
 WDR();
 //save
 //先设置24小时制
 i2c_Write(0x20,0xE0);
 //再设置具体值
 i2c_Write(now_time_hex[0],0x60);
 i2c_Write(now_time_hex[1],0x50);
 i2c_Write(now_time_hex[2],0x40);
 i2c_Write(now_time_hex[3],0x20);
 i2c_Write(now_time_hex[4],0x10);
 i2c_Write(now_time_hex[5],0x00);  
 
 
 
 
 
  }
             
   //当前时间读,BCD---ASCII, 时间保存在now_time中
void   read_now_time()
					        {
						time_reg=i2c_Read(0x60);
						now_time[1]=time_reg&0x0f;
						now_time[1]=now_time[1]+0x30;
						now_time[0]=time_reg&0xf0;
						now_time[0]=now_time[0]/16+0x30;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -