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

📄 20051130152364.c

📁 C8051F020 东软电力载波集中器命令处理程序
💻 C
📖 第 1 页 / 共 2 页
字号:

//-----------------------------------------------------------------------------
// UART1_Int1.c
//-----------------------------------------------------------------------------
// Target: C8051F02x
// Tool chain: KEIL C51 6.03 / KEIL EVAL C51
//

//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------

#include <c8051f020.h>                 // SFR declarations
#include <stdio.h>
#include <string.h>
#include <intrins.h>
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F02x
//-----------------------------------------------------------------------------

sfr16 DP       = 0x82;                 // data pointer
sfr16 TMR3RL   = 0x92;                 // Timer3 reload value
sfr16 TMR3     = 0x94;                 // Timer3 counter
sfr16 ADC0     = 0xbe;                 // ADC0 data
sfr16 ADC0GT   = 0xc4;                 // ADC0 greater than window
sfr16 ADC0LT   = 0xc6;                 // ADC0 less than window
sfr16 RCAP2    = 0xca;                 // Timer2 capture/reload
sfr16 T2       = 0xcc;                 // Timer2
sfr16 RCAP4    = 0xe4;                 // Timer4 capture/reload
sfr16 T4       = 0xf4;                 // Timer4
sfr16 DAC0     = 0xd2;                 // DAC0 data
sfr16 DAC1     = 0xd5;                 // DAC1 data

//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------

#define RX1_LENGTH    64                 // 电力载波帧长
#define RX1_START     0X7E               // 电力载波帧起始符
#define RX1_END       0X0D               // 电力载波帧结束符

#define RX0_LENGTH    32                 // command length of UART RX buffer
#define RX0_END       0X0D               // command 帖结束符

#define fsa_init       0                 //状态机初始状态
#define fsa_data       1
#define password_time  500             //定时8分钟

#define SYSCLK       22118400          // SYSCLK frequency in Hz
#define BAUDRATE     9600            // Baud rate of UART in bps
#define RX_LENGTH    16                // length of UART RX buffer


//-----------------------------------------------------------------------------
// Global VARIABLES
//-----------------------------------------------------------------------------
unsigned char  xdata password[6]={'6','6','6','6','6','6'};          //集中器密码
bit  TX1_Ready;                          // '1' means okay to TX
char *TX1_ptr;                           // pointer to string to transmit
bit  RX1_Ready;                          // '1' means RX string received

bit  TX0_Ready;                          // '1' means okay to TX
char *TX0_ptr;                           // pointer to string to transmit
bit  RX0_Ready;                          // '1' means RX string received

char xdata RX1_Buf[RX1_LENGTH];          // receive string storage buffer
char xdata RX0_Buf[RX0_LENGTH];          // receive string storage buffer

static unsigned char RX1_index = 0;      // uart1 receive buffer index
static unsigned char RX0_index = 0;      // uart1 receive buffer index

bit password_flag;

bit sendinterva2;                        //T2定时到


sbit LED = P1^6;                         // LED = 1 means ON

unsigned char xdata SENDNUM1;            //uart1要发送数据的数目
unsigned char xdata RECEIVENUM1;         //uart1收到数据的数目
unsigned char xdata SENDNUM0;            //uart0要发送数据的数目
unsigned char xdata RECEIVENUM0;         //uart0收到数据的数目

unsigned int xdata time;                       //间隔采集时间累计
//unsigned int xdata tend;                       //设置间隔时间长短
//unsigned int xdata temp;

unsigned int xdata time2;                       //间隔采集时间累计
unsigned int xdata tend2;                       //设置间隔时间长短
unsigned int xdata temp2;


unsigned char xdata waddr[2];            //写传感器地址
unsigned char xdata raddr[2];            //读传感器地址

unsigned char xdata recv_state;
unsigned char xdata j;

unsigned char   code valid_cmd0[256]={     //如果输入有效命令则为1
         0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,   //00--0F   CR有效
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //10--1F 
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //20--2F
         1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,   //30--3F   0_9有效
         0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,   //40--4F   A_Z有效
         1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,   //50--5F
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //60--6F
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //70--7F
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //80--8F
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //90--9F
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //A0--AF
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //B0--BF
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //C0--CF
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //D0--DF
		 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //E0--EF
		 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //F0--FF
         }; 
unsigned char     code  valid_cmd1[256]={     //如果输入有效命令则为1
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //00--0F
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //10--1F 
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //20--2F
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //30--3F
         0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,   //40--4F  A_M有效,O_T有效,V_Z有效
         1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,   //50--5F
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //60--6F
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //70--7F
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //80--8F
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //90--9F
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //A0--AF
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //B0--BF
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //C0--CF
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //D0--DF
		 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //E0--EF
		 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   //F0--FF
         };
unsigned char  code NO[] ="NO\x0d\x0a";
unsigned char  code OK[] ="OK\x0d\x0a";
unsigned char  code Lock[] ="Lock\x0d\x0a";
unsigned char  code UnLock[] ="UnLock\x0d\x0a";
unsigned char  code CCE16[]="CCE16 v3.00xx0d\x0a";  //程序版本号


//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------

void SYSCLK_Init (void);
void PORT_Init (void);
void Timer0_Init (void);
void Timer0_ISR (void);
void Timer2_Init(void);
void Timer2_ISR(void);
void UART0_Init (void);
void UART0_ISR (void);
void UART1_Init (void);
void UART1_ISR (void);
void RX0_BufClear(void);
void RX1_BufClear(void);
void FlashWrite(unsigned char xdata *pwrite,unsigned char *BufFrom);
void FlashRead(unsigned char code *pread,unsigned char *BufTo);
void send_string_com(unsigned char *str,unsigned char strlen);


//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void) 
{
   
   WDTCN = 0xde;                       // 关闭看门狗
   WDTCN = 0xad;
   
   password_flag=0;

   sendinterva2=1;
   time=0x0000;

   time2=0x0000;
   temp2=0x0064;
   
   
   SYSCLK_Init ();                     // initialize oscillator
   PORT_Init ();                       // initialize crossbar and GPIO
   UART1_Init ();                      // initialize UART0
   Timer0_Init ();
   UART0_Init ();
   
   Timer2_Init();
   EA = 1;                             // enable global interrupts

   while (1) 
   { 
//--------------------------------------------------------------------------------------      
	  if(RX0_Ready == 1)
	  {  		 
            switch(RX0_Buf[0])
		   {
		         case'A':               //A
				      break;
                 case'B':
                      break;
				 case'C':
				      break;
                 case'D':
                      break;
				 case'E':
				      break;
                 case'F':
                      break;
				 case'G':
				      break;
                 case'H':
                      break;
				 case'I':
				      break;
                 case'J':
                      break;
				 case'K':
				      break;
                 case'L':
                      break;
				 case'M':
				      break;
                 case'O':
                      break;
				 case'P':
				      switch(RX0_Buf[1])
					  {
					         case'A':  //####PAMR手动启动补抄末成功表####要通过口令检测
							      if(RX0_Buf[2]=='M'&& RX0_Buf[3]=='R'&& RX0_Buf[4]==RX0_END  && j==4)
								  {
								       if(password_flag)
									   {    
									        //>>>>>
											//>>>>>
									        send_string_com(OK,4);
											time=0;
                                            TR0=1;              //定时8分钟

									   }
									   else
									   {
									        send_string_com(Lock,6); 
									   }
								   }
							      break;
                             case'W':
                                  switch(RX0_Buf[2])
								  {
								         case'R':  //####PWR 口令检测####
										      if(RX0_Buf[3]==password[0] && RX0_Buf[4]==password[1] && RX0_Buf[5]==password[2] && RX0_Buf[6]==password[3]
											     && RX0_Buf[7]==password[4] && RX0_Buf[8]==password[5] && RX0_Buf[9]==RX0_END  && j==9)
											  {
											       password_flag=1;          //命令检测通过
												   send_string_com(UnLock,8); 
												   time=0;
                                                   TR0=1;              //定时8分钟 
											  }
											  else
											  {
											       send_string_com(NO,4);
												   password_flag=0; 
											  }	                   
										      break;
                                         case'W':  //####PWW设置新口令#### 要通过口令检测
										      if(RX0_Buf[9]==RX0_END  && j==9)
											  {
											       if(password_flag)
											       {
												         password[0]=RX0_Buf[3];
														 password[1]=RX0_Buf[4];
														 password[2]=RX0_Buf[5];
														 password[3]=RX0_Buf[6];
														 password[4]=RX0_Buf[7];
														 password[5]=RX0_Buf[8];
                                                         send_string_com(OK,4);
														 time=0;
                                                         TR0=1;              //定时8分钟

												   }
												   else
												   {
												        send_string_com(Lock,6); 
												   }
											  }
										      break;
									     default:break;
								  }							      
							      break;
                             default:break;
					  }
				      break;
                 case'Q':  //####QUIT暂停集中器工作####
				      if(RX0_Buf[1]=='U' && RX0_Buf[2]=='I' && RX0_Buf[3]=='T' && RX0_Buf[4]==RX0_END  && j==4)
					  { 
					      if(password_flag)
						  {    
						        //>>>>>
								//>>>>>
						        send_string_com(OK,4);
								time=0;
                                TR0=1;              //定时8分钟
						   }
						   else
						   {
						        send_string_com(Lock,6); 
						   }
					  }
                      break;
				 case'R':
				      break;
                 case'S':
                      break;
				 case'T':
				      break;
                 case'V':
				      if(RX0_Buf[1]=='E' && RX0_Buf[2]=='R' && RX0_Buf[3]==RX0_END  && j==3)  //程序版本号检测 
                      send_string_com(CCE16,14);
                      break;
				 case'W':
				      break;
                 case'X':
                      break;
				 case'Y':
                      break;	  	  	  	  
				 default:break;	
		   }  	  	   
		   RX0_BufClear();
		   j=0;
		   RX0_Ready=0;

      }
//---------------------------------------------------------------------------------------
	  if(sendinterva2)
	   {
          TR2=1;
		  sendinterva2=0;
		    

	   }       
//--------------------------------------------------------------------------------------
      /*
	  if(sendinterval)        //间隔采集定时时间到
	   {   
	    	sendinterval=0;
			TR0=1;

        } */
  
   }

}


//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
//
// This routine initializes the system clock to use an 22.1184MHz crystal
// as its clock source.
//
void SYSCLK_Init (void)
{
   int i;                              // delay counter

   OSCXCN = 0x67;                      // start external oscillator with
                                       // 22.1184MHz crystal

   for (i=0; i < 256; i++) ;           // wait for crystal osc. to start up

   while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle

   OSCICN = 0x88;                      // select external oscillator as SYSCLK
                                       // source and enable missing clock
                                       // detector
}

//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports
//
void PORT_Init (void)
{
   
   XBR0    = 0x05;                     // Enable UART0
   XBR1    = 0x00;
   XBR2    = 0x44;                     // Enable crossbar and weak pull-ups
   P0MDOUT |= 0x11;                    // enable TX0 as a push-pull output
   P2MDOUT |= 0x03;                    // enable P2 as push-pull output
   P1MDOUT |= 0x40;                    // enable LED as push-pull output
   P74OUT  |=0Xf4;
}

//-----------------------------------------------------------------------------
// UART1_Init
//-----------------------------------------------------------------------------
//
// Configure UART1 using Timer1, for <baudrate> and 8-N-1.
//
void UART1_Init (void)
{
   SCON1   |= 0x50;                     // SCON1: mode 1, 8-bit UART, enable RX
   T4CON   |=0X30;                       // Stop Timer; clear int flags; enable

⌨️ 快捷键说明

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