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

📄 zdjjc.c

📁 织带机产量检测系统的监测终端。RS-485总线
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "zdjjc.h"

void Delay(uint time, uint time2) 
{ 
	uint data i, j;
	for (i=0; i<time; i++)
	     for (j=0; j<time2; j++);
	return;
}

uint InitBaud ()    //设置波特率
{
     uint Baud;
	 switch (BaudIndex)
	 {
	 case 0:
	         Baud = 1200;
	         RCAP2H = 0xFE;
	         RCAP2L = 0xE0; 
	         break;
     case 1:
	         Baud = 2400;
	         RCAP2H = 0xFF;
	         RCAP2L = 0x70;
	         break;
     case 2:
	         Baud = 4800;
	         RCAP2H = 0xFF;
	         RCAP2L = 0xB8;	
	         break;
	 case 3:
	         Baud = 9600;
	         RCAP2H = 0xFF;
	         RCAP2L = 0xDC;
	         break;
	 case 4:
	         Baud = 19200;
	         RCAP2H = 0xFF;
	         RCAP2L = 0xEE;
	         break;
     }
	 return Baud;
}

void ReStoreData (uchar data RecordIndex) reentrant
{	 	 
	 uchar data RecordBuf[11];
	 C24GetBuf (RECORD_ROOT+RecordIndex*32, RecordBuf, 11); 
	 
	 //初始化各变量
	 RunLength.b[0] = RecordBuf[0];
	 RunLength.b[1] = RecordBuf[1];
	 RunTime.b[0] =	RecordBuf[2];
	 RunTime.b[1] =	RecordBuf[3];
	 DebugLength.b[1] = RecordBuf[4];
	 DebugLength.b[1] = RecordBuf[5];
	 DebugTime.b[0] = RecordBuf[6];
	 DebugTime.b[1] = RecordBuf[7];
	 PulseCheat.b[0] = RecordBuf[8];
	 PulseCheat.b[1] = RecordBuf[9];

	 C24GetBuf (RECORD_ROOT+RecordIndex*32+11, RecordBuf, 11); 

     curMotorStopCount = RecordBuf[0];        
	 curMotorStopTimeLength.b[0] = RecordBuf[1];
	 curMotorStopTimeLength.b[1] = RecordBuf[2];
	 JingCutCount = RecordBuf[3];
	 JingCutTime = RecordBuf[4];
	 WeiCutCount = RecordBuf[5];
	 WeiCutTime = RecordBuf[6];
	 DiCutCount = RecordBuf[7];
	 DiCutTime = RecordBuf[8];
	 JuanCutCount =	RecordBuf[9];
	 JuanCutTime = RecordBuf[10];
} 

void LocateGroupIndex (uchar uYear, uchar uMonth, uchar uDate, uchar uHour, uchar uMin)
{
	 uchar idata TimeGroup[17], uTempIndex; 
	 
	 C24GetBuf (GROUP_TIME, TimeGroup, 17);
	 GroupCount = TimeGroup[16]; //定班数
	
	 //比较时间,得到班号
	 for (;;)
	 {
	      uTempIndex = GroupIndex * 4;
		  if (uHour > TimeGroup[uTempIndex] &&
	          uHour < TimeGroup[uTempIndex+2])
	          break;
	      else if (uHour == TimeGroup[uTempIndex+2])
	      {
	           if (uMin < TimeGroup[uTempIndex+3])
    	           break;
          }
          else if (uHour == TimeGroup[uTempIndex])
          {
          	   if (uMin >= TimeGroup[uTempIndex+1])
    	           break;
      	  }
          GroupIndex ++;
     	  GroupIndex %= GroupCount;
     }

	 C24GetBuf (RECORD_INDEX, &RecordIndex, 1); //读到上一次记录位置
	 
	 //读上一次记录
	 C24GetBuf (RECORD_ROOT+RecordIndex*32+22, TimeGroup, 8); 

	 //比较日期
	 if (TimeGroup[7] == uYear &&
	     TimeGroup[5] == uMonth &&
	     TimeGroup[4] == uDate)
	 {
		 //比较班时间
		 if (uHour > TimeGroup[0] &&
	         uHour < TimeGroup[2])
		 {
             ReStoreData (RecordIndex);
			 return;
		 }
		 else if (uHour == TimeGroup[2])
	     {
	          if (uMin < TimeGroup[3])
			  {
    	          ReStoreData (RecordIndex);
			      return; 
			  }	  
         }
         else if (uHour == TimeGroup[0])
         {
              if (uMin >= TimeGroup[1])
			  {
    	          ReStoreData (RecordIndex);
				  return;
			  }
      	 }
	 }

	 ClearAllData ();
	 
	 displayBuf[6] = 0x08;
	 RecordIndex ++;    //本次记录位置加1 	  
	 RecordIndex %= RECORDCOUNT;
	 C24SetBuf (RECORD_INDEX, &RecordIndex, 1);	//更新记录索引号
}

void GetEEPromData ()
{
	 uchar idata Buffer[7];
	 C24GetBuf (TERM_H, Buffer, 7);
	 PulseTerm.b[0] = Buffer[0];  //得到正常脉冲周期
	 PulseTerm.b[1] = Buffer[1];
	 uKValue.b[0] = Buffer[2];    //K值
	 uKValue.b[1] = Buffer[3]; 
	 RunStatus = Buffer[4]^1;     //本机状态
	 motorStatus = Buffer[4]^0;   //电机转动状态
	 BaudIndex = Buffer[5];   //波特率选择
	 Address = Buffer[6];     //通信地址
}

void ChangeGroup (uchar uHour, uchar uMin)
{
	 uchar idata TimeGroup[4];
	 C24GetBuf (GROUP_TIME+GroupIndex*4, TimeGroup, 4);
	 
	 //比较时间
     if ((uHour > TimeGroup[0]) && (uHour < TimeGroup[2]))
          return;
	 else if (uHour == TimeGroup[0])
	 {
	     if (uMin >= TimeGroup[1]) 
		     return;  
	 }
     else if (uHour == TimeGroup[2])
     {
         if (uMin < TimeGroup[3])
    	     return;
	 }	  

	 //保存当前数据
	 SaveCurrData ();
	 //数据清零,换下一班
	 ClearAllData ();	 
	 GroupIndex ++;
	 GroupIndex %= GroupCount;
	 RecordIndex ++;
     RecordIndex %= RECORDCOUNT;
     C24SetBuf (RECORD_INDEX, &RecordIndex, 1);	//更新记录索引号
}

void ClearAllData (void)   //所有当前记录变量清0
{
	 uPulseInc = 0;
	 RunLength.w = 0;
	 RunTime.w = 0;
	 DebugLength.w = 0;
	 DebugTime.w = 0;
	 curMotorStopCount = 0;      
	 curMotorStopTimeLength.w = 0;
	 PulseCheat.w = 0;

	 JingCutCount = 0;
	 JingCutTime = 0;

	 WeiCutCount = 0;
	 WeiCutTime = 0;

	 DiCutCount = 0;
	 DiCutTime = 0;

	 JuanCutCount = 0;
	 JuanCutTime = 0;
}

void InitParam ()
{
    uchar idata TimeBuf[7];

	//初始化各引脚
    DAT_595 = HIGH;
    CLK_595 = HIGH;
    STB_595 = HIGH;
    EN_SEND = FALSE;//使能接收数据
    MOTOR   = HIGH;

	//初始化定时器0,1
    TMOD = 0x11;
	
	//定时器0,方式1,用于伪脉冲检测
    TH0 = TH0_VAL;
    TL0 = TL0_VAL;
    TR0 = TRUE;
    ET0 = FALSE;
		
	//定时器1,方式1,用于显示
    TH1 = TH1_VAL;
    TL1 = TL1_VAL;
    TR1 = TRUE;
	ET1 = TRUE;
	
	//初始化定时器2,用于通信
	T2CON = 0x30;
	TR2 = TRUE;
	ET2 = TRUE;
	PS = TRUE;
	SCON = 0x50;  //8位
	ES = TRUE;    //中断允许位
			    
	//初始化外中断0
    IT0 = TRUE; //边沿触发方式
    EX0 = TRUE;

	//初始化外中断1
    IT1 = TRUE; //边沿触发方式
    EX1 = FALSE;
    PX1 = TRUE; //外部中断1优先级最高

    if (!RstStatus)
	{
	    //初始化各变量
	    curKey = NO_KEY;
	    KeyFlag = FALSE;
	    
	    RecOver = FALSE;
	    TrasOver = FALSE;
	    IsReceive = FALSE;
	    UartLength = 255;
        Address = 255;
	    Rindex = 0;
	    Tindex = 0;

	    TimeStatus = FALSE;  

	    JingStatus = JING_PIN;
	    WeiStatus = WEI_PIN;
	    DiStatus = DIXI_PIN;
	    JuanStatus = JUAN_PIN;

	    v_Get1302 (TimeBuf);
        C24SetBuf (START_TIME, TimeBuf, 7);

    	displayBuf[6] = 0x00;

        //显示年月日
	    displayBuf[5] = SEVEN_BLK1[TimeBuf[3] & 0x0F];
	    displayBuf[4] = SEVEN_BLK1[(TimeBuf[3]>>4) & 0x0F];
	    displayBuf[3] = SEVEN_BLK1[TimeBuf[4] & 0x0F];
	    displayBuf[2] = SEVEN_BLK1[(TimeBuf[4]>>4) & 0x0F];
	    displayBuf[1] = SEVEN_BLK1[TimeBuf[6] & 0x0F];
	    displayBuf[0] = SEVEN_BLK1[(TimeBuf[6]>>4) & 0x0F];
	}

	//开中断
    EA = TRUE;
    GetEEPromData ();
	InitBaud();	 
	Delay (100, 350);
	
	if (!RstStatus)
	{
	    //显示时分秒
	    displayBuf[5] = SEVEN_BLK1[TimeBuf[0] & 0x0F];
	    displayBuf[4] = SEVEN_BLK1[(TimeBuf[0]>>4) & 0x0F];
	    displayBuf[3] = SEVEN_BLK1[TimeBuf[1] & 0x0F];
	    displayBuf[2] = SEVEN_BLK1[(TimeBuf[1]>>4) & 0x0F];
	    displayBuf[1] = SEVEN_BLK1[TimeBuf[2] & 0x0F];
	    displayBuf[0] = SEVEN_BLK1[(TimeBuf[2]>>4) & 0x0F];
		
   	    LocateGroupIndex (TimeBuf[6], TimeBuf[4], TimeBuf[3], TimeBuf[2] ,TimeBuf[1]); //在此确定班号

	    Delay (100, 350);
	}	  
	EX1 = TRUE;	 //开始脉冲记数
}

void IntToLED (uint uData, uchar uPos, bit bIsDot) 	  //数据转换到LED
{
     uchar i; 
	 for (i=uPos; i>0; i--)
	 {
	      displayBuf[i] = SEVEN_BLK1[uData % 10];
	      uData /= 10;
     }

     //对高位0消影
     while (++i < uPos)
	 {
			if (displayBuf[i] == SEVEN_BLK1[0]) 
			{
			    displayBuf[i] = 0x00;  
			}
			else break;	  
	 }
	 if (bIsDot)
	     displayBuf[4] |= 0x80;
}


void KBSendData (word data595)
{
    uchar data  i;
	word data mid;
    _nop_ ();
    _nop_ ();
    _nop_ ();
    _nop_ ();
    _nop_ ();
    _nop_ ();
    for (i=0; i<16; i++)
    {
		mid = 0x8000 >> i;
        if (data595 & mid)
            DAT_595 = HIGH;
        else
            DAT_595 = LOW;
        _nop_ ();
        _nop_ ();
        _nop_ ();
		_nop_ ();
        _nop_ ();
        _nop_ ();
        CLK_595 = LOW;
        _nop_ ();
        _nop_ ();
        _nop_ ();
		_nop_ ();
        _nop_ ();
        _nop_ ();
        CLK_595 = HIGH;
        _nop_ ();
        _nop_ ();
        _nop_ ();
		_nop_ ();
        _nop_ ();
        _nop_ ();
    }

    STB_595 = LOW;
    _nop_ ();
    _nop_ ();
    _nop_ ();
	_nop_ ();
    _nop_ ();
    _nop_ ();
    STB_595 = HIGH;
    _nop_ ();
    _nop_ ();
    _nop_ ();
    _nop_ ();
    _nop_ ();
    _nop_ ();
    DAT_595 = HIGH; //数据线保持高电平
    _nop_ ();
    _nop_ ();
    _nop_ ();
    _nop_ ();
    _nop_ ();
    _nop_ ();
}

void Display ()
{											   
    uchar data kbIndex;
    word data595;	
	//计算显示数据
	data595 = (0x0001 << displayIndex) + (displayBuf[displayIndex] << 8);
    //蜂鸣器
    if (buzzState == TRUE)
        data595 |= 0x0080;
    KBSendData (data595);
	
	//判断键盘
	kbIndex = displayIndex - 2;
	if (kbIndex < KBI_COUNT)
	{
	    if (KB_DATA == LOW)
		{
			/*
			if (KeyCount == 0)
			{
				FirstKey = kbIndex;
			}
			else if (kbIndex == FirstKey)
			{	
				    
			} 
			*/
			//KeyCount ++;
				
	        //if (KeyCount == KEYDELAY)
	        {
	            curKey = kbIndex;
			    //hasKey = FALSE;  
			    KeyFlag = TRUE;
			    //KeyCount = 0;
		    }
	    }
	}

    //计算下一次显示下标
	displayIndex ++;
    displayIndex = displayIndex % DISPLAY_BUF_LEN;
}

void IntKey () interrupt 0
{
	 //关闭显示
	 word data595 = 0x0000;
	 KBSendData (data595);
	 SaveCurrData ();
	 //进入掉电模式
	 PCON = 0x02;
}

void OnPulseTerm (void) interrupt 1
{    
	 if (RunStatus)
	 {    
	     PulseAct ++;
     }
	 else
	 {
	     PulseTotal ++;
     }

	 TH0 = TH0_VAL;
     TL0 = TL0_VAL;
}

void IntPulse () interrupt 2
{ 
     ET0 = FALSE;
	 
	 if (!RunStatus)
	 {
	     PulseCount ++;
	     displayBuf[6] = 0x00;
          
	     if (PulseCount == TERM_COUNT)
	     {
		      displayBuf[6] = 0x02;
		      PulseTerm.w = PulseTotal / 16;
		      PulseTerm.w = PulseTerm.w * 9;
		      PulseTerm.w /= 10;
		      PulseCount = 0;
		      PulseTotal = 0;
		      C24SetBuf (TERM_H, PulseTerm.b, 2);
	     } 
		 uDebugPulse ++;

	     if (uKValue.w != 0)
	     {
		     if (uDebugPulse < uKValue.w)
		     {
			     displayBuf[5] = SEVEN_BLK1[uDebugPulse * 10 / uKValue.w];
			 }
			 else 
			 {	  DebugLength.w ++; 
			      uDebugPulse = 0;
			      displayBuf[5] = SEVEN_BLK1[0];
			 }
		 }
		
		 IntToLED (DebugLength.w, 4, TRUE);
	 }
     else
	 {
	 	 if (PulseAct != 0)
	 	 {
	    	 if (PulseAct > PulseTerm.w)
	    	 {
     	    	 uPulseInc ++;
             
                 if (uKValue.w != 0)
	    	     {
				     if (uPulseInc < uKValue.w)
					 {
					     displayBuf[5] = SEVEN_BLK1[uPulseInc * 10 / uKValue.w];
					 }
					 else 
					 {	  RunLength.w ++; 
					      uPulseInc = 0;
						  displayBuf[5] = SEVEN_BLK1[0];
					 }
		         } 
		         PulseAct = 0;
				 displayBuf[6] &= 0x7F;	
	    	 }
			 
	    	 else
		     {
		         PulseCheat.w ++;
			     buzzState = TRUE;
				 displayBuf[6] |= 0x80;
		     }
	     } 	
		 displayBuf[6] = 0x01;
		 
		 IntToLED (RunLength.w, 4, TRUE);
	 }
	 
	 //显示
     displayBuf[0] = SEVEN_BLK1[GroupIndex];
     
	 ET0 = TRUE;
}

void LEDShow (void) interrupt 3
{
	GroupSaveCount ++; 

	if (RunStatus)
	{
        //主电机停机监测
	    if (!MOTOR)
	    {
		    motorStatus = FALSE;	 
		    buzzState = FALSE;
	    }
	    else
	    {
		    if (motorStatus == FALSE)
		    {
		        motorStatus = TRUE;
		        curMotorStopCount ++;
		    }
			buzzState = TRUE; 
	    }
	}

    Display ();

    TH1 = TH1_VAL;
    TL1 = TL1_VAL;	
} 

void SetBaud ()
{
     uint Baud;

	 while (TRUE)
	 {
		   Baud = InitBaud ();
		   //显示当前波特率
	       displayBuf[0] = SEVEN_BLK1[11];
           IntToLED (Baud, 5, FALSE);
	  
	       Delay (200, 200);
		   switch (curKey)
	       {
	        case 0:  //加
	             BaudIndex ++;
				 BaudIndex = BaudIndex % 5;
	             break;
	        case 1:  //减
			     BaudIndex --; 
			     BaudIndex = BaudIndex % 5;

⌨️ 快捷键说明

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