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

📄 gsm-dtu-gr47avr.c

📁 AVR单片机应用开发指南及实例,包含许多实例,挺不错
💻 C
📖 第 1 页 / 共 4 页
字号:
		                                      meter_rx_a_buffer2[3]=info_buffer[5];
		                                      meter_rx_a_buffer2[4]=0;
		                                       meter_rx_a_buffer2[5]=0;
		                                        meter_rx_a_buffer2[6]=0;
		                                      info_meter_rx_flag=1;   //表示第二次数据接收成功
		                                      }
                                                     } 
                                                   else
                                                     {
                                                      WDR();
       	                                              delay_us(50);
                                                     }   
						  }  
						}////第二次FA
						
	    //  }
				///////////////////////		
	/*  else
	      {//B类仪表
						
						info_meter_rx_flag=0;
						 //发指令57 01 56 31 30 02 03 BD
						 //01 56 31 30 02 36 33 2E 36 20 20 20 20 20 20 63 6D 20 20 20 20 03 9A (23个字节)
						 //,此时返回的数据包的第6个到第12个字节是数据,作为模块采集到的数据1;
						USART0_Transmit(0x57);
						USART0_Transmit(0x01);
						USART0_Transmit(0x56);
						USART0_Transmit(0x31);
						USART0_Transmit(0x30);
						USART0_Transmit(0x02);
						USART0_Transmit(0x03);
						USART0_Transmit(0xBD);
						
						//等待1S
						delay_ms(1000);
						
						USART0_Transmit(0x57);
						USART0_Transmit(0x01);
						USART0_Transmit(0x56);
						USART0_Transmit(0x31);
						USART0_Transmit(0x30);
						USART0_Transmit(0x02);
						USART0_Transmit(0x03);
						USART0_Transmit(0xBD);
						//meter_rx_a_buffer1[7]
						//meter_rx_a_buffer2[7]
						//meter_rx_a_buffer3[7]
						//接收第一个数据参量
						//info_meter_rx_flag
						WDR();
						info_lenght=0x00;
						for(i=0;i<250;i++)
						  {
						   if(UCSR0A&(1<<RXC0))
                                                     {
                                                     info_buffer[info_lenght]=UDR0;
                                                     info_lenght++;
		                                     i=1;
		                                     if(info_lenght==23)
		                                      {
		                                      i=250;
		                                      meter_rx_a_buffer1[0]=info_buffer[5];
		                                      meter_rx_a_buffer1[1]=info_buffer[6];
		                                      meter_rx_a_buffer1[2]=info_buffer[7];
		                                      meter_rx_a_buffer1[3]=info_buffer[8];
		                                      meter_rx_a_buffer1[4]=info_buffer[9];
		                                      meter_rx_a_buffer1[5]=info_buffer[10];
		                                       meter_rx_a_buffer1[6]=info_buffer[11];
		                                      
		                                      info_meter_rx_flag=1;   //表示接收成功
		                                      
		                                      }
                                                     } 
                                                   else
                                                     {
                                                      WDR();
       	                                              delay_us(500);
                                                     }   
						  }
						//接收第二个参量
						//57 01 76 31 30 02 03 DD
						//01 76 31 30 02 32 34 2E 34 31 20 20 20 20 20 64 65 67 20 43 20 03 29 (23个字节),
						//此时返回的数据包的第3个到第6个字节是数据,作为模块采集到的数据2;
						info_meter_rx_flag=0;
						USART0_Transmit(0x57);
						USART0_Transmit(0x01);
						USART0_Transmit(0x76);
						USART0_Transmit(0x31);
						USART0_Transmit(0x30);
						USART0_Transmit(0x02);
						USART0_Transmit(0x03);
						USART0_Transmit(0xDD); 
						info_lenght=0x00;
						for(i=0;i<250;i++)
						  {
						   if(UCSR0A&(1<<RXC0))
                                                     {
                                                     info_buffer[info_lenght]=UDR0;
                                                     info_lenght++;
		                                     i=1;
		                                     if(info_lenght==23)
		                                      {
		                                      i=250;
		                                      meter_rx_a_buffer2[0]=info_buffer[5];
		                                      meter_rx_a_buffer2[1]=info_buffer[6];
		                                      meter_rx_a_buffer2[2]=info_buffer[7];
		                                      meter_rx_a_buffer2[3]=info_buffer[8];
		                                      meter_rx_a_buffer2[4]=info_buffer[9];
		                                      meter_rx_a_buffer2[5]=info_buffer[10];
		                                       meter_rx_a_buffer2[6]=info_buffer[11];
		                                       info_meter_rx_flag=1;
		                                      }
                                                     } 
                                                   else
                                                     {
                                                      WDR();
       	                                              delay_us(500);
                                                     }   
						  }  
						
						
						  	
	      }	 */
	   ///组合保存数据流,在info_buffer中
	       //时间
	    //for(i=0;i++;i<6)
	    for(i=0;i<6;i++)
	      {
	       info_buffer[i]=now_time_hex[i];
	       
	      }
	      //数据1,2,3
	     j=6;
	  // for(i=0;i++;i<6)
	   for(i=0;i<7;i++)
	      {
	       info_buffer[j]=meter_rx_a_buffer1[i];
	       j++;
	       
	      }
	  // for(i=0;i++;i<6)
	   for(i=0;i<7;i++)
	      {
	       info_buffer[j]=meter_rx_a_buffer2[i];
	       j++;
		  }
	   //for(i=0;i++;i<6)
	   for(i=0;i<7;i++) 
		  {
	       info_buffer[j]=meter_rx_a_buffer3[i];
	       j++;
	      }
	    //判断当前电池状态, pine, power_detect
	     if(PINE&(1<<power_detect))
	      {
	      batt_status=00;
	      }
	     else   //低压
	      {
	      batt_status=1;
	      }    
             info_buffer[j]=batt_status;
             j++;
             info_buffer[j]=0x20;
             j++;
             info_buffer[j]=0x20;
            ///
            //开始保存	
            
           //data_save_sequence_num=0;     eeprom adress   130
//data_save_sequence_num=1;     eeprom adress   160
//data_save_sequence_num=2;     eeprom adress   190
//data_save_sequence_num=3;     eeprom adress   220
//       读出当前该保存的序号, 取出起始地址,保存, 保存序号+1,存入EEPROM
          data_save_No=EEPROM_read(0x03);
          if(data_save_No>99)
            {
            data_save_No=0;
            }
          

           PORTB &=~(1<< r232_onoff);     //禁止UART0
           
           _CLI();
           
           //取出起始地址
	   eeprom_data_addr=meter_data_eeprom_start_addr[data_save_No];    //16位
	                                       
	                                       for(i=0;i<30;i++)
                                 
                                                     {
                                                      EEPROM_write(eeprom_data_addr,info_buffer[i]);	
                                                      eeprom_data_addr++;
                                                      WDR();
                                                      } 
	   
	
	 //保存完30个数
	 //在EEPROM里面存入下次的序号
	 data_save_No++;
	 EEPROM_write(0x03,data_save_No);
	  
	
	
	/*   
	   
	switch(data_save_sequence_num)
           {
            case   0:                              j=130;
					 	for(i=0;i<30;i++)
                                                     {
                                                      EEPROM_write(j,info_buffer[i]);	
                                                      j++;
                                                      WDR();
                                                      } 
                          break;
            case   1:                            j=160;
					 	for(i=0;i<30;i++)
                                                     {
                                                      EEPROM_write(j,info_buffer[i]);	
                                                      j++;
                                                      WDR();
                                                      }
                          break;
            case   2:                            j=190;
					 	for(i=0;i<30;i++)
                                                     {
                                                      EEPROM_write(j,info_buffer[i]);	
                                                      j++;
                                                      WDR();
                                                      }
                          break;
          
            case   3:                              j=220;
					 	for(i=0;i<30;i++)
                                                     {
                                                      EEPROM_write(j,info_buffer[i]);	
                                                      j++;
                                                      WDR();
                                                      }
                          break;
           }
				 	
       */    // switch                                      
	   //_SEI();	
         delay_ms(5);  	
     }   //if  (now_time_hex[5]==0x04)  05  06
   else
    {
    }        	
           	
 }
   	              
   	
                                 
///////////////

///中断入口程序



/************************************************************************************
* function:         main()

* use:              
* input parameter:  None
* output parameter: None
************************************************************************************/
void  main(void)
 {
    uchar i, j,time_temp;
    uchar     csreg ;  
    
         WDR();
	
	
	WDTCR=0x1f;
	WDTCR=0x0f; 
    io_init();   //I/O初始化
    PORTC |=(1<<power_onoff); //1 关掉GSM电源
    uart_out_init();  //串口初始化 
    
     WDR();
     if(MCUCSR&(1<<WDRF)) // if((MCUCSR & 0x08)==0x08)
	{ //看门狗复位	
	MCUCSR = 0;	
	}
     else     //上电复位
        {
      MCUCSR = 0;
      PORTC &=~(1<<power_onoff); //开启GSM模块电源
      delay_ms(2000);   /
      PORTC &=~(1<<gsm_onoff);
      delay_ms(2000);
      PORTC |=(1<<gsm_onoff);    //1
    
       //判断时间格式, 如果正常,表示上电复位后直接进入原来模式
      if((i2c_Read(0x60)>0x05)&&((i2c_Read(0x60)<0x09)||(i2c_Read(0x60)==0x09))&&(i2c_Read(0x50)>0)&&(i2c_Read(0x50)<0x13)&&(i2c_Read(0x40)>0)&&(i2c_Read(0x40)<0x32) )
       {
       WDR();
       }
      else  //时间格式不对,则进入等待设置模式
       {
       WDR();
      EEPROM_write(0x02, 0x00);   //上电自动为未设置模式
       }  
      delay_ms(12000); //确保网络
      gsm_init(); //GSM初始化
        if(gsm_init_flag==1)
	  {
	  }
	else
	  {
	  }
        }	
 read_save_model_info();  //读出eeprom 模块参数设置内容,分别保存 
                     
  WDR();
  while(1)
       {
 //读DTU模块第一次设置标志,0x02 单元不是0xd9,则说明模块还从未设置

switch(EEPROM_read(0x02))
   {
   case   0xd9:       //已设置过
   	            /*
   	            判断模式,等待短信,功能命令处理
   	            */ 
   	           break;
  
   	          
  default :           //模块从未设置
                   //只响应短消息设置和读本模块参数设置两条指令	
                   
                  
                 break;
   }   
       }   	  
}     

⌨️ 快捷键说明

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