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

📄 pl3201demo.c

📁 福星晓程芯片pl3200DEMO电力载波抄表系统的全部代码
💻 C
📖 第 1 页 / 共 2 页
字号:
   SSC_ADR=0x02; 
   GOLD_KSAMI=SSC_DAT; 
   if ( GOLD_KSAMI!=0x1F ) 
   { 
      SSC_ADR=0xFF; 
      SSC_DAT=0xFF; 
      SSC_ADR=0x02; 
      SSC_DAT=0x1F; 
      SSC_ADR=0xFF; 
      SSC_DAT=0x00; 
   } 
 
   // 串口设置重置 
   if ( TMOD!=0x21 ) 
      TMOD = 0x21 ;   // 设 T/C1 为定时方式2 设置为8位自装载计数器  T/C0 为定时方式 14 
   if ( PCON!=0x80 ) 
      PCON=0X80;      // 波特率加倍 
 
   s1=SCON; 
   s1=s1&0xf0; 
   if ( s1!=0x50 ) 
     initsys (); 
 
   if ( TH1!=0xF6 ) 
      TH1=0xF6; 
   if ( TR1!=1 ) 
      TR1=1;          // 启动定时器1 
      // 定时器0重置 
   if ( TR0!=1 ) 
     TR0 = 1;        // 启动 T0 定时器 
 
   // 中断设置重置 
   if ( IE!=0x82 ) 
      IE=0x82; 
   if ( IP!=2 ) 
      IP=2; 
   if ( EIP!=1 ) 
      EIP=1; 	         // 外部中断2 为高级中断 
} 
/************************************************************************************** 
 * 
 * FUNCTION:    PLC_prog 
 * 
 * DESCRIPTION: 载波接收数据包后的处理函数 
 *              1. 进行数据包的校验和合法性判断 
 *              2. 点亮上传指示灯 
 *              3. 进行数据包的向上转发 
 *              4. 清com_buf[] 
 * 
 * PARAMETERS:  in:  PLC_Rxd_OK=1 ; R_T_buf_bak[]数据存入接收和数据 
 *              out: none 
 * 
 * 
 * RETURNED:    none 
 * 
 *************************************************************************************/ 
void PLC_prog ( void ) 
{ 
     uchar data i; 
 
     if ( EIE!=0X01 ) EIE=0X01;               // 先判断后再操作LXW2006-3-2 9:28 
  
     RS_TLED=0;                          		// 串口发送指示灯亮 
     PLC_Rxd_OK=0;                         	// 清载波接收好标志 
     COM_State=0; 
     COM_recv_pointer=0;                    // 停止串口接收 
 
     txdbyte ( 'D' ); 
     txdbyte ( 'A' ); 
     txdbyte ( 'T' );                     	//发送协议命令字 
     PLC_Rxd_tlen=PLC_Rxd_tlen+3;         	//加09.AF两个字节 
     txdbyte ( PLC_Rxd_tlen );              //发送长度 
     txdbyte ( 0x09 ); 
     txdbyte ( 0xaf ); 
     PLC_Rxd_tlen=PLC_Rxd_tlen-3;         	// 恢复数据体长度。 
     for ( i=0;i<=PLC_Rxd_tlen;i++ )					//  
     { 
         txdbyte ( R_T_buf_bak[i] ); 
         WDI=0x9a;													// not interrupt set the soft  dog 
     } 
       
     PLC_Rxd_state=0; 
     PLC_Rxd_pointer=0; 
     PLC_Rxd_tlen=0; 
     RS_TLED=1;                          		// 发送完毕串口发送指示灯灭 
      
     COM_State=8; 
 
     if ( EIE!=0X01 ) EIE=0x01;           // 先判断后再操作lxw2006-3-2 9:30 ( A9H 使能INT2中断(EX2=1) 
} 
/************************************************************************************** 
 * 
 * FUNCTION:    COM_Re_prog 
 * 
 * DESCRIPTION: 接收串口数据包并做载波转发处理 
 *              1. 点亮上传指示灯 
* 
 * PARAMETERS:  in:  RI=1 
 *              out: none 
 * 
 * 
 * RETURNED:    none 
 * 
 *************************************************************************************/ 
void COM_Re_prog ( void ) 
{ 
  if ( RI )   // 有串口下发命令处理 
  { 
  	RI=0; 
  	switch ( COM_State ) 
  	{ 
  		case 0:																 //接收初始态 
  			if ( SBUF == 'S' )  
  			{ 
  				RS_RLED=0; 
  				COM_State=1;  
  				COM_recv_pointer=1; 
  			} 
  			else 
  			{ 
  				COM_State=0; COM_recv_pointer=0; 
  			} 
  		break; 
  		 
  		case 1:																	//接收到第一字节准备接收第2个字节 
  			if ( SBUF == 'N' ) 
  			{ 
  				COM_State=2; COM_recv_pointer=1; 
  			} 
  			else 
  			{ 
  				COM_State=0; COM_recv_pointer=0; 
  			} 
  		break; 
  		 
  		case 2: 
  			if ( SBUF == 'D' ) 
  				{ COM_State=3; COM_recv_pointer=1; } 
  			else  
  				{ COM_State=0; COM_recv_pointer=0;} 
  		break; 
  		 
  		case 3:																	//接收串口数据长度 
  			if ( COM_recv_pointer == 1 )  
  				{  
  					COM_State=4;  
  					COM_recv_pointer=0;  
  					COM_recv_len=SBUF;  
  					if(COM_recv_len>100)  
  						COM_State=0; 
  				} 
  			else       
  				{ COM_State=0; COM_recv_pointer=0; } 
  		break;  		 
  		 
  		case 4:																	// 
  			COM_recv_buf[COM_recv_pointer]=SBUF; 
  			COM_recv_pointer++; 
  			COM_State=5; 
  		break;  		 
  		 
  		case 5: 
         COM_recv_buf[COM_recv_pointer]=SBUF; 
         COM_recv_pointer++; 
         if ( COM_recv_pointer>=COM_recv_len ) 
         { 
         	  PLC_total_len=COM_recv_len; 
         		COM_State=6;											//接收完成态 
         		RS_RLED=1;  											// 串口接收指示灯灭lxw2006-3-14 15:44 
         		for  ( COM_recv_pointer=0; COM_recv_pointer < PLC_total_len ; COM_recv_pointer++ ) 
         			R_T_buf_bak[ COM_recv_pointer ] = COM_recv_buf[ COM_recv_pointer ]; 
         		//备份串口的接收数据         	 
         }           
  		break; 
  		default:  
  			COM_State=0; 
  			COM_recv_pointer=0; 
  		break; 
  	} 
  } 
} 
/************************************************************************************** 
 * 
 * FUNCTION:    LED_flash3 
 * 
 * DESCRIPTION: 开机指示指示灯闪烁三次表示复费率 
 * 
 * PARAMETERS:  none 
 * 
 * RETURNED:    none 
 * 
 *************************************************************************************/ 
void  LED_flash3 ( ) 
{ 
   uchar data i; 
   uchar data j; 
   uchar data k; 
   uchar data h; 
 
 
   for ( h=0;h<3;h++ ) 
   { 
       FUNC_LED	= 0; 
		   RS_RLED 	= 0;            		// 串口接收指示灯D2 
			 PLC_TLED = 0;      		  		// 载波发送指示灯D3 
			 PLC_RLED = 0;      		  		// 载波接收指示灯D4 
			 RS_TLED 	= 0;            		// 串口发送指示灯D5 
			 FUNC_LED	= 0;            		// 载波通讯方式,亮:3200模式;灭:3105模式D6 
 
       for ( k=0;k<4;k++ ) 
       { 
          for ( j=0;j<250;j++ ) 
          { 
            WDT_RST=0xa1;            // 清看门狗 
            for ( i=0;i<0xff;i++ ); 
          } 
       } 
 
 
		   FUNC_LED	= 1; 
		   RS_RLED 	= 1;            		// 串口接收指示灯D2 
			 PLC_TLED = 1;      		  		// 载波发送指示灯D3 
			 PLC_RLED = 1;      		  		// 载波接收指示灯D4 
			 RS_TLED 	= 1;            		// 串口发送指示灯D5 
			 FUNC_LED	= 1;            		// 载波通讯方式,亮:3200模式;灭:3105模式D6 
 
       for ( k=0;k<4;k++ ) 
       { 
          for ( j=0;j<250;j++ ) 
          { 
            WDT_RST=0xa1;           // 清看门狗 
            for ( i=0;i<0xff;i++ ); 
          } 
       } 
   } 
} 
/************************************************************************************** 
 * 
 * FUNCTION:    PLC_rset 
 * 
 * DESCRIPTION: redundancy check  PLC set when no sending and receiving 
 * 
 * PARAMETERS:  none 
 * 
 * RETURNED:    none 
 * 
 *************************************************************************************/ 
void PLC_rset() 
{ 
  uchar s1; 
	PSK_OUT=1;	 
	if( function_now == 0 )						// 3200 check every 6 sec  
 	 { 
  	  FUNC_LED=0;										// MEAN 3200 FUNCTION 
	 	 	SSC_ADR=0x03; 
	 	 	s1=SSC_DAT; 
	 	 	if ( ( s1&0xf0 )!=0xc0 ) 
	 	 		set_PLC_3200 (); 
	 } 
	 else if ( function_now == 0xff )	//3105 
   { 
	 	 	FUNC_LED=1;										// MEAN 3105 FUNCTION 
	 		SSC_ADR=0x03; 
		 	s1=SSC_DAT; 
		 	if ( ( s1&0xf0 )!=0xe0 ) 
	 	 	 set_PLC_3105 (); 
   } 
} 
///////////////////////////////////// 
// 主程序 
///////////////////////////////////// 
void main ( void ) 
{ 
   uchar data i; 
   uchar data j; 
 
   for ( i=0; i<5; i++ )		//wait for the stabilization of power 
   { 
      for ( j=0; j<0xff; j++ ); 
   }   
 
   for ( i=0; i<5; i++ ) 
   { 
      for ( j=0; j<0xff; j++ ); 
   } 
    
   LED_flash3();					//上电时所有led(除电源灯)闪亮3下 
    
   for ( i=0; i<250;i++ )	//clear the buf of com 、PLC and their bak 
   { 
       COM_recv_buf[i]  =0x00; 
       PLC_recv_buf[i]  =0x00; 
       R_T_buf_bak[i]   =0x00; 
   } 
    
	 /***clear the state of com and the PLC **/ 
   COM_State=0; 
   COM_recv_pointer=0; 
   PLC_Rxd_OK=0; 
   PLC_sending=0; 
   PLC_Rxd_state=0; 
   PLC_timer=0; 
   PLC_Rxd_timer=0x00; 
   PLC_Rxd_flag	=0;					// lxw2006-3-2 
    
   /***turn off the led***************/    
    
   FUNC_LED	= 1; 
   RS_RLED 	= 1;            // 串口接收指示灯D2 
	 PLC_TLED = 1;      		  // 载波发送指示灯D3 
	 PLC_RLED = 1;      		  // 载波接收指示灯D4 
	 RS_TLED 	= 1;            // 串口发送指示灯D5 
	 FUNC_LED	= 1;            // 载波通讯方式,亮:3200模式;灭:3105模式D6 
	  
   function_now=0xff;			// defaut function 3105 
    
     initsys ();						// init settings   
     txdbyte ( 'S' ); 
     txdbyte ( 't' ); 
     txdbyte ( 'a' ); 
     txdbyte ( 'r' ); 
     txdbyte ( 't' ); 
   while ( 1 )							//主循环 
   { 
       WDI=0x9a;            // 清看门狗        
        
       if(!(PLC_Rxd_timer||PLC_sending))	// no sending and receiving 
       { 
       	 PLC_rset(); 
       } 
 
       Txd_p31=1; Rxd_p30=1;					// REDUNDANCY 
 
       initsys_ref();                 // REDUNDANCY 
        
       if ( PLC_Rxd_OK )							// 载波接收完毕 
         PLC_prog ();                 // 载波接收处理 
 
       if (RI)                        // 有串口下发命令 
         COM_Re_prog ();              // 串口接收处理函数 
 
       if ( COM_State == 6 )					// com receive data ok 
       {                              // 设置载波发送起始数据 
         COM_State=7; 
         COM_recv_pointer=0; 
          
         /*position the 09 af*/ 
         while  ( R_T_buf_bak[COM_recv_pointer] == 0xff ) 	 
         	 COM_recv_pointer++; 
          
         PLC_total_len=PLC_total_len-COM_recv_pointer;		// LENTH OF PLC SEND  

⌨️ 快捷键说明

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