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

📄 project1.c

📁 这是一个用于RS485通讯的协议转换程序,采用89S52芯片,KEIL 51开发
💻 C
字号:

/*------------------------------------------------------------------------------

------------------------------------------------------------------------------*/

#include "reg52.h"
#include "main.h"
#include "INTRINS.H"
   

/*extern char getchar(void);
extern char putchar(char c);*/

unsigned char idata *boot_flag;

unsigned char data wdt_count;


unsigned char data Camera;
unsigned char data Cummun;

unsigned char data ID5;
unsigned char data Baut; 
unsigned char data Protocol;
unsigned char data in_p3;
unsigned char data ad_aux;

unsigned char data g;
unsigned  int data t;
unsigned  int data s;
unsigned char data i;
unsigned char data j;

#define TBUF_SIZE	10		
#define RBUF_SIZE	10		
	

bit flag_cycle = 0; /* bit variable */
bit flag_ea = 1; /* bit vareniable */


static data unsigned char tbuf [TBUF_SIZE];
static data unsigned char rbuf [RBUF_SIZE];
static data unsigned char checksum;





static data unsigned char r_in = 0;
static data unsigned char r_out = 1;

 /*----------------------------------------------------------------------------
                             TX-485,北京Pelco_d 9600,
   ----------------------------------------------------------------------------*/
 unsigned char code My_Array4[29][4]={0xFF,0x01,0x00,0x08,
	                                      0xFF,0x01,0x00,0x10,
										  0xFF,0x01,0x00,0x04,
										  0xFF,0x01,0x00,0x02,
										  0xFF,0x01,0x02,0x00,
										  0xFF,0x01,0x04,0x00,
										  0xFF,0x01,0x01,0x00,
										  0xFF,0x01,0x00,0x80,
										  0xFF,0x01,0x00,0x40,
										  0xFF,0x01,0x00,0x20,
										  0xFF,0x01,0x00,0x09,
                                          0xFF,0x01,0x00,0x0B,
										  0xFF,0x01,0x90,0x00,
                                          0xFF,0x01,0x00,0x00,
										  0xFF,0x01,0x00,0x0C,
										  0xFF,0x01,0x00,0x14,
										  0xFF,0x01,0x00,0x0A,
										  0xFF,0x01,0x00,0x12,
										  0xFF,0x01,0x00,0x00,
                                          0xFF,0x01,0x09,0x00,
                                          0xFF,0x01,0x00,0x03,                         //2003-10-29 added for bj Pelco-d (aux function)
                                          0xFF,0x01,0x10,0x00,                         //2003-10-29 added for bj pelco-d (auto function)
										  0xFF,0x01,0x00,0x01,                         //2004-5-26  added for 王波	PELCO-D AUTO FUNCTION 
                                          0xFF,0x01,0x00,0x07,                         //2004-7-27  added for  Auto Function
                                          0xFF,0x01,0x00,0x06,                         //2004-10-24 added 
                                          0xFF,0x01,0x00,0x16,                         
                                          0xFF,0x01,0x98,0x00,
                                          0xFF,0X01,0X08,0X00,
                                          0xFF,0x01,0x20,0x00,      
                                      };
/*-------------------------------------------------------------------------------
                           ADT8050 KEY BOARD
  -------------------------------------------------------------------------------*/
unsigned char code My_Array15[18] = {  0x01,0x02,0x04,0x08,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x05,0x06,0x09
                                   ,0x0a,0x03,0x07};  
 
unsigned char code My_Array16[14] = { 0x88,0x8a,0x91,0x81,0xaa,0xa2,0xa9,0xa1,0xa8,0xa0,0xab,0xa3,0x8b,0x9b};


                                    
/*----------------------------------------------------------------
   serial receive interrupt
  ----------------------------------------------------------------*/
static void com_isr (void) interrupt 4 using 2
 {
    wdt_count++;	
	if (RI != 0)	  
	{
	  RI = 0;
	  
	  if ((r_in + 1) != r_out)
	   rbuf [r_in++] = SBUF;

      else
	  {
	   rbuf[r_in]=SBUF;
	   flag_ea=0;
       r_in=0;
       EA=0;
	   REN=0;
      }
    }	
 }

/*------------------------------------------------
         for system set
------------------------------------------------*/
void SystemSet ()
	{
	 WREN3=0;
	 P0=Baut;
	 WREN1=0;
     while(BUSY1)
	 {;}
     WREN1=1;
	 while(!BUSY1)
	 {;}
	 P0=Protocol;
	 WREN1=0;
	 while(BUSY1)
	 {;}
	 WREN1=1;
    }

/*------------------------------------------------
  for execuation
------------------------------------------------*/
void Action (char e)
	{
	 WREN3=0;
	 P0=rbuf[1];
	 WREN1=0;
     while(BUSY1)
	 {;}
     WREN1=1;
	 while(!BUSY1)
	 {;}
	 P0=e;
	 WREN1=0;
	 while(BUSY1)
	 {;}
	 WREN1=1;
    }
/*------------------------------------------------------
                       ADT 距阵
  ------------------------------------------------------*/
void Get_Order4(void)
	{
	
	  if(r_out!=7)
      {
	  r_out = 7;
	  r_in= 1;
	  EA=1;

	  }
    /*else if( rbuf[1]!= Camera)	 
          {
		  r_in=0;
		  r_out=1;
          }*/

	  else
	  {rbuf[1]=0x01;
       WREN2=0;
     for(i=0;i<29; i++)
       {                
	     flag_cycle=1;
		 for (j=0;j<4;j++)  
         {
            t=My_Array4[i][j];
            s=rbuf[j];   
		    if(t!= s)
            {
             flag_cycle=0;
             break; 
             } 
		  }
         if(flag_cycle)
			 {
              if(i>=12)
			   i=i+4;
              if((i==10)||(i==11))
			   {
			   if(rbuf[5]==0x01)
			     i=i;
		  else if(rbuf[5]==0x02)
			     i=i+2;
		  else if(rbuf[5]==0x03)
			     i=i+4;
		  else if(rbuf[5]==0x04)
		         i=i+6;
		       else
			   break;

			   }

              if(i==0x11)
        	  i=22;
		

              if(i==23)
              i=10;

              if(i==31)
                i=22;
              if(i==32)
                i=4;
              
		      Action(i);
			  
			  flag_ea=1;
			  EA=1;						  
			  break;
		      }

		}
	 r_out=1;
     r_in=0;
	 }
	}  
/*---------------------------------------------------------------
                          ADT KEYBOARD
-----------------------------------------------------------------*/
void Get_Order12(void)
{
    	
   
	   
	if(r_out!=9)
      {
	  r_out = 9;
	  r_in= 1 ;
	  EA=1;

	  }
    
/*	else if((rbuf[1])!= Camera)	 
          {
		 
		  r_out=1;
		  r_in=0;
          }*/
     else
	 {
	  
      s=rbuf[3];    
     for(i=0;i<18;i++)
     {               
	  
	   t=My_Array15[i];
        
	   if(t==s)
         {
		 
	      if(i>15)
		  i=22;
		   
	      if(i>11 && i<16)
 		     i=i+6;	   
          if(i==10 || i==11)
            {
             i=(rbuf[4]-1)*2 + i;
             if(i>17)
             break;
            }
            
		   Action(i);
           flag_ea=1;
		   EA=1;						  
		   break;
		  }
		}
     flag_ea=1;
     EA=1;
	 r_out=1;
     r_in=0;
      }
  }

/*--------------------------  
MAIN()
----------------------------*/
 
void main (void)
{     
    P0=0xFF;
    boot_flag=0xff;
	EA =1;
    ES=0;
    

    RT_CON1=1;
    RT_CON2=0;
    ID5=Camera;
   
	PCON  = 0x00;
	SCON  = 0x50;                   /* SCON: mode 1, 8-bit UART, enable rcvr    */
	TMOD  = 0x21;                   /* TMOD: timer 1, mode 2, 8-bit reload      */
    
    in_p3=~P3;
    Baut  = in_p3 & 0x60; 
    Protocol = in_p3 & 0x80;
    
    SystemSet();  

   	if (Baut==0x00)
    {
	TH1   = 0xFD;                               /* TH1:  reload value for 9600 baud         */
    }                                
    else if (Baut==0x40)
    {
	TH1   = 0xFA;                               /* TH1:  reload value for 4800 baud         */
	}
    else if (Baut==0x20)          
    {  
	TH1   = 0xF4;                               /* TH1:  reload value for 2400 baud         */
	}
    else 
	{
	TH1   = 0xE8;                               /* TH1:  reload value for 1200 baud         */
	}
                                    
    REN   = 1; 
    TR1= 1;                                     /* TR1:  timer 1 run                        */                                                                      
    ES=1;                                       //使能中断

	if((SCONF | 0x7F)==0xFF)                    //WATCH DOG 
	{
	 SCONF = 0x00;
	 WDTC  = WDTC | 0x20;
	}

	WDTC = 0x84;

	/*---------------主循环----------------*/ 
    while(1)                                   
    {	 
     P0=0xFF;
     if(wdt_count<20)
     WDTC = WDTC | 0x20;                              /*Clear WDT*/

  	 if(flag_ea)		                            /*wait the interrupt*/
	 {
	 EA=1;
	 REN=1;
	 }
  	
     else if (rbuf[0]==0x80)
     {
      wdt_count=0;
      EA=1;
	  REN=1;
      flag_ea=1;
     }

     else if (rbuf[0]==0xFF || rbuf[0]==0xF0 )
     { 
	  if(rbuf[0]==0xFF)
	  Get_Order4();
      if(rbuf[0]==0xF0)
      Get_Order12();
      EA=1;
	  REN=1;
      flag_ea=1;
      wdt_count=0;
     } 

     else
     flag_ea=1;
	}
}			  

⌨️ 快捷键说明

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