plc51x.c

来自「PLC源代码」· C语言 代码 · 共 621 行 · 第 1/3 页

C
621
字号
0x4,0x26,0x3,0xc5,0x3,0x25,0x5,0x6,0xa,0x80,0x0,0x80,0x5,0x26,0x4,0xc5,0x4,0x25,0x6,0x6,0xa,0x80,
0x0,0x80,0x6,0x26,0x5,0xc5,0x5,0x25,0x7,0x6,0xa,0x80,0x0,0x80,0x7,0x26,0x6,0xc5,0x6,0x25,0x8,0x6,
0xa,0x80,0x0,0x80,0x8,0x26,0x7,0xc5,0x7,0x25,0x0,0x6,0xa,0x80,0x0,0x80,0x0,0x26,0xc,0x0,0x1,0x86,
0xc,0x0,0x2,0x86,0xc,0x0,0x3,0x86,0xc,0x0,0x4,0x86,0xc,0x0,0x5,0x86,0xc,0x0,0x6,0x86,0xc,0x0,0x7,
0x86,0xc,0x0,0x8,0x86,0xc,0x0,0x9,0x86,0xc,0x0,0x0,0x86,0x0f,0x0
 };	
*/

#endif



//-----------------------------------------------------------------------------------------//
//    子函数名:  void inc_CODE_p(void)                                                    //
//                                                                                         //
//    注    释:  指向 PLC 运行程序的当前指针 CODE_p 值加 1                                //
//                                                                                         //
//    入口参数:  无                                                                       //
//    出口参数:  无                                                                       //
//-----------------------------------------------------------------------------------------//
//void inc_CODE_p(void)
//{ CODE_p++;
//}

//-------------------------------------------------------------------------------------//
//  10ms延时子程序                                                                     //
//-------------------------------------------------------------------------------------//

void Time_10ms(void)   
{ volatile unsigned char i;  
  for(i=0; i<10; i++)
    { ; }
}

//-------------------------------------------------------------------------------------//
//  74HC166并入串出芯片输入键盘扫描程序                                                //
//-------------------------------------------------------------------------------------//

unsigned char Get_EX_BIT(void)   
{ unsigned char i;   
  unsigned char EX_data = 0;   
   
  HC166_SL = 0;       // HC166_Disable; 将并行口的数据锁存
  Time_10ms();
  HC166_CLK = 0;      // CLK : 0->1
  Time_10ms();
  HC166_CLK = 1; 
  Time_10ms();
  HC166_SL = 1;       // HC166_Enable; 转为串行
  Time_10ms();
  for(i=0; i<8; i++) 
    { EX_data <<= 1;   
      if (HC166_DATA == 1)    // DATA : QH
        { EX_data |= 0x01; }  
      HC166_CLK = 0;          // CLK : 0->1 
      Time_10ms(); 
      HC166_CLK = 1;
    }   
  return(EX_data);   
}   

//-------------------------------------------------------------------------------------//
//  74HC595串入并出芯片输出(16bit数据)LED显示扫描程序                                //
//-------------------------------------------------------------------------------------//

void Out_EY_BIT(void) 
{ static unsigned char con;
  unsigned char i;
  unsigned int  Ia;
  if (++con >=5)  { con = 0; }
  switch(con)
    { case 0: Ia =( Value       & 0x000f);
              Ia = TYPE_BCD[Ia];
	          Ia |= 0x0800;
	          if (Vc0 == 1)  { Ia |= 0xff; }
              else  { if (Vb0 == 1)  { Ia &= 0xff7f; }
                    }
	          break;
      case 1: Ia =((Value >> 4) & 0x000f);
              Ia = TYPE_BCD[Ia];
	          Ia |= 0x0400;
	          if (Vc1 == 1)  { Ia |= 0xff; }
              else  { if (Vb1 == 1)  { Ia &= 0xff7f; }
                    }
	          break;
      case 2: Ia =((Value >> 8) & 0x000f);
              Ia = TYPE_BCD[Ia];
	          Ia |= 0x0200;
	          if (Vc2 == 1)  { Ia |= 0xff; }
              else  { if (Vb2 == 1)  { Ia &= 0xff7f; }
                    }
	          break;
      case 3: Ia =((Value >>12) & 0x000f);
              Ia = TYPE_BCD[Ia];
	          Ia |= 0x0100;
	          if (Vc3 == 1)  { Ia |= 0xff; }
              else  { if (Vb3 == 1)  { Ia &= 0xff7f; }
                    }
	          break;
      default:
              Ia = (~((Va4 << 4) | (Va3 << 3) | (Va2 << 2) | (Va1 << 1) | Va0) & 0x00ff) | 0x1000; 
	          break;
	}
 for (i = 16; i > 0; i--)
    { HC595_SCLK = 0;            //拉低74HC595时钟   
      Time_10ms();
      if ((Ia & 0x8000) == 0)    //先送高bit位数据   
          { HC595_SDATA = 0; } 
        else                     //送74HC595的数据
          { HC595_SDATA = 1; } 
      Time_10ms();
      Ia <<= 1;   
      HC595_SCLK = 1;            //拉高74HC595时钟
      Time_10ms(); 
    } 
    HC595_SDATA = 1;             //释放数据总线
    Time_10ms();
    HC595_RCLK = 0;              //锁存数据
    Time_10ms();
    HC595_RCLK = 1; 
    Time_10ms();
}

//-------------------------------------------------------------------------------------//
//  100ms 定时子函数                                                                   //
//-------------------------------------------------------------------------------------//

void _T100mS(void)
{ unsigned char i;
  if (Timer_100ms != 0)
    { Timer_100ms--;
      Pulse_val_Sec++;
      if (Pulse_val_Sec == 5) 
	    { Pulse_Sec = ~Pulse_Sec;
	    }   
      if (Pulse_val_Sec == 10) 
	    { Pulse_Sec = ~Pulse_Sec; 
		  Pulse_val_Min++; 
          Pulse_val_Sec = 0;
		}
	  for (i=0; i<_T_num; i++ )
        { if ((rTF[i/8].BYTE & (1 << (i%8))) != 0)
            { if (_T[i][0] < _T[i][1])  { _T[i][0]++; }
            }
        }
	}
}

//-------------------------------------------------------------------------------------//
//  1Set 定时子函数                                                                    //
//-------------------------------------------------------------------------------------//

void _T1Set(void)
{ if ((Pulse_val_Min == 30) && (Pulse_val_Sec == 0)) 
	{ Pulse_Min = ~Pulse_Min;
	}   
  if ((Pulse_val_Min == 60) && (Pulse_val_Sec == 0))  
	{ Pulse_Min = ~Pulse_Min;
	  Pulse_val_Min = 0;
	}
}

//-------------------------------------------------------------------------------------//
//  5ms 定时中断 子函数,使用定时器 0                                                  //
//-------------------------------------------------------------------------------------//

void timer0(void) interrupt 1 using 1
{ TH0 = (Value_T0_cons >> 8);
  Pulse_10ms = ~Pulse_10ms;
  if ((++Timer_5ms & 0x01) != 0)  { Timer_10ms++; }
  if (Timer_5ms == 10)  { Pulse_100ms = ~Pulse_100ms; }
  if (Timer_5ms == 20)
    { Pulse_100ms = ~Pulse_100ms;
      Timer_100ms++;  
	  Timer_5ms = 0;
    }
  if(UartRxTimerStartFlag)			// 接收超时...50ms
	{ if(UartWaitForCounter>=10)
		{ UartWaitForCounter=0;
		  UartRxTimerStartFlag=0;
		  UartDataReadyFlag=1;
		  REN=0;						// 禁止UART接收器
		}
	  else UartWaitForCounter++;
	}
}


//-------------------------------------------------------------------------------------//
//  初始化,输入输出,内存处理 子函数                                                  //
//-------------------------------------------------------------------------------------//
void input_IO(void)           // X输入,Y输出刷新
{ unsigned char i;
  i = P2;
  i = ((i << 1) & 0xaa) | ((i >> 1) & 0x55);
  i = ((i << 2) & 0xcc) | ((i >> 2) & 0x33);
  rX[0].BYTE = ~((P1 & 0x0f) | (i & 0xf0));
  rX[1].BYTE = ~(i & 0x0f) & 0x0f;
  rX[2].BYTE = ~Get_EX_BIT();
  P0 = rY[0].BYTE;
  Out_EY_BIT();
  _M8011_ = Pulse_10ms;
  _M8012_ = Pulse_100ms;
  _M8013_ = Pulse_Sec;
  _M8014_ = Pulse_Min;
}

⌨️ 快捷键说明

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