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

📄 board.c

📁 单片机控制面板程序
💻 C
📖 第 1 页 / 共 5 页
字号:
					    {
						 SBUF=led_data;
						 send_point++;
						 send_or_number=FAULT_STACK_CMD^led_data;
						 send_on_kind=FAULT_STACK_CMD;
						 break;
						 }
					 case 2:
					    {
						 SBUF=send_or_number;
						 send_point=0;
						 send_over_kind=FAULT_STACK_CMD;// 同上
						 send_over_flag=1;//同上
						 send_on_kind=0;
						 break;
						 }
					 default:break;
					 }
                  break;
				 }
			   case SEND_HEART:
			     {
				 send_on_flag=1;
                 SBUF=HEART_CMD;
				 send_over_kind=HEART_CMD;//同上
				 send_over_flag=1;//同上
				 send_on_kind=0;
				 break;
				 }
			   case SEND_FAULT:
			     {
			      send_on_flag=1;
			      SBUF=FAULT_CMD;
				  send_over_kind=FAULT_CMD;//同上
				  send_over_flag=1;//同上
				  send_on_kind=0;
				  break;
                 } 
               case SEND_KEY:
			     {
			     send_on_flag=1; 
			     SBUF=RESET_KEY_CMD;
				 send_over_kind=RESET_KEY_CMD;//同上
				 send_over_flag=1;//同上
				 send_on_kind=0;
				 break;
                }//case
			  default:break;
			 }//switch
		   }//if
	   }//else
    }//if
}

//===========================================================
//程序说明:这里有两类中断:一是发送中断;二是接收中断
//===========================================================
void receive(void) interrupt 4        //外中断,接收中断子程序
{
    if(TI==1)
      {
       TI=0;
	   send_on_flag=0;//每次8位字发送完成后,清楚正在发送标志位
       }
    else
      {
	   RI=0;
       rx_buffer[rx_point]=SBUF;//接收数据,接收指针加一
	   rx_point++;
	   reveive_pro();
      }
}
//============================================================
//程序说明:接收程序根据数据类别进行接收,必须与前面发送的数据
//一一对应接收,否则将不出错,根据心跳数据来断开通讯
//============================================================
reveive_pro()
{
      char kind,temp_data;
	  kind=rx_buffer[0];
	  switch(kind)
	    {
		 case HAND_CMD:
		    {
			rx_point=0;
			send_success_flag=1;//置联网成功标志
			send_over_kind=0;
			send_over_flag=0;
			break;
		    }
		 case SET_CMD:
		    {
			rx_point=0;
			if(send_over_kind==SET_CMD)
			  {
		      send_over_kind=0;
			  send_over_flag=0;//清除一类数据发送完标志位
			  send_kind=send_kind&0xfb;//清除本次设置命令标志位
              if(function_key_kind==2)//参数粘帖键处理程序
                 {
                 led_data++;
                 } 
			  }
			break;
			}
		 case SHOW_CMD:
		    {
			if(rx_point>=5)
			  {
			  rx_point=0;
			  if(send_over_kind==SHOW_CMD)
			     {
				 send_over_kind=0;
                 send_over_flag=0;//清除一类数据发送完标志位
			     send_kind=send_kind&0xbf;//清除本次显示命令标志位
			     temp_data=rx_buffer[0]^rx_buffer[1]^rx_buffer[2]^rx_buffer[3];
			     if(temp_data==rx_buffer[4])
			      {
				  show_data=(rx_buffer[2]<<8)|rx_buffer[3];	
	 			  switch(led_data)
				    {
					 case 24:case 25:
					   {
					    show_data=(long)show_data/30;//3000表示T1周期寄存器最大值
						break;
						}
					 default:break;
					 }
				  }
				}
			  }
			break;
			}
		 case FAULT_STACK_CMD:
		    {
			if(rx_point>=4)
			  {
			  rx_point=0;
			  if(send_over_kind==FAULT_STACK_CMD)
			     {
				 send_over_kind=0;
                 send_over_flag=0;//清除一类数据发送完标志位
			     send_kind=send_kind&0xdf;//清除本次显示命令标志位
			     temp_data=rx_buffer[0]^rx_buffer[1]^rx_buffer[2];
			     if(temp_data==rx_buffer[3])
			      {
				  error_data=rx_buffer[2];		 
				  }
				}
			  }
			break;
			}
		 case HEART_CMD:
		    {
			rx_point=0;
			if(send_over_kind==HEART_CMD)
			  {
			   send_over_kind=0;
			   send_over_flag=0;//清除一类数据发送完标志位
			   send_heart_last_count=0;
			   send_kind=send_kind&0x7f;//清除本次心跳命令标志位
 			  }
			break;
			}
		  case FAULT_CMD:
		    {
			if(rx_point>=5)
			  {
			  rx_point=0; 
			  if(send_over_kind==FAULT_CMD)
			   {  
			    send_over_kind=0; 
			    send_over_flag=0;//清除一类数据发送完标志位
			    send_kind=send_kind&0xef;//清除本次故障显示命令标志位
			    temp_data=rx_buffer[0]^rx_buffer[1]^rx_buffer[2]^rx_buffer[3];
			    if(temp_data==rx_buffer[4])
			     {
                 fault_data=(rx_buffer[1]<<8)|rx_buffer[2];	
                 sys_state=rx_buffer[3];
				 }
			   }
			  }
			break;
		    }
	      case RESET_KEY_CMD:
		    {    
			rx_point=0;
			if(send_over_kind==RESET_KEY_CMD)
			  {
              send_over_kind=0;
			  send_over_flag=0;//清除一类数据发送完标志位
			  send_kind=send_kind&0xfd;//清除本次按键命令标志位
			  }
			break;
			}
		  case SET_FU_CMD:
		    {
            if(rx_point>=5)
			  {
			  rx_point=0;
			  if(send_over_kind==SET_FU_CMD)
			    {
			    send_over_kind=0;
			    send_over_flag=0;//清除一类数据发送完标志位
			    send_kind=send_kind&0xf7;//清除本次设置菜单命令标志位
                temp_data=rx_buffer[0]^rx_buffer[1]^rx_buffer[2]^rx_buffer[3];
			    if(temp_data==rx_buffer[4])
			     {
				 set_data=(rx_buffer[2]<<8)|rx_buffer[3];
                 if(led_data==5)
				   {
				   if(set_data>0) 
				     set_data=ceil((long)set_data*1.5*5/(1.5*0.4*6*2.048*100));
				   if(set_data<0)
				     set_data=floor((long)set_data*1.5*5/(1.5*0.4*6*2.048*100));
				   }
				  }
                if(function_key_kind==1)//是参数COPY键时处理
                  {
                   led_data++;
                  }
				}
			   }
			 break;
			}
		  default:break;
		 }
}
//============================================================
//程序说明:这里根据实际情况将5个LED灯进行控制
//============================================================
void light_pro()
{
    char j,led_temp=0xff;
	bit  led_bit;
//===========================================================
//参数设置灯置标志位
//===========================================================
	if(confirm==0x21)//系统处于设置菜单时点亮菜单设置灯
       light_set_flag=1;
    else
       light_set_flag=0;
//===========================================================
//故障灯置标志位
//===========================================================
    if(fault_data!=0)//系统有故障产生,则闪烁故障灯
	    light_fault_flag=1;
	else
	    {
		 light_fault_flag=0;
		 light_fault_flash_flag=0;
		 light_fault_flash_count=0;
		 }
//===========================================================
//能量回馈灯置标志位
//===========================================================
    if(sys_state&0x4)//已经有能量回馈后回馈灯常亮,
	   { 
	    light_work_flag=1;
		light_work_flash=0;
		light_work_flash_flag=0;
		light_work_flash_count=0;
		}
    else
	  {
	   if(sys_state&0x8)//没有回馈只有使能时,回馈灯闪烁
	     {
		  light_work_flag=1;
		  light_work_flash=1;
		  }
	   else             //没有回馈也没有使能,则不亮灯
	      {
		  light_work_flag=0;
		  light_work_flash=0;
		  light_work_flash_flag=0;
		  light_work_flash_count=0;
		  }
	   }
//============================================================
//参数复制、粘贴置标志位
//============================================================
    if((function_key_kind==1)||(function_key_kind==2))
       light_copy_paste_flag=1;
    else
       light_copy_paste_flag=0;
//============================================================  
    if(light_power_flag==1)//电源灯点亮处理
	   led_temp=led_temp&0x7f;
//============================================================
	if(light_set_flag==1)//设置灯点亮处理
	   led_temp=led_temp&0xbf;
//============================================================
	if(light_fault_flag==1)//故障灯闪烁处理
	   {
	    if(light_fault_flash_flag==1)
		   led_temp=led_temp&0xdf;
		light_fault_flash_count++;
        if(light_fault_flash_count>200)//故障灯闪烁处理
		  {
		   light_fault_flash_count=0;
		   if(light_fault_flash_flag==1)
		      light_fault_flash_flag=0;
		   else
		      light_fault_flash_flag=1;
		   }
		}
//===========================================================
	if(light_work_flag==1)//工作指示灯处理
	  {
       if(light_work_flash==0)
	      led_temp=led_temp&0xef;//回馈灯不闪烁处理
       else
        {
         if(light_work_flash_flag==1)
          led_temp=led_temp&0xef;//回馈灯闪烁处理

          light_work_flash_count++;
	     if(light_work_flash_count>200)
		   {
		    light_work_flash_count=0;
		    if(light_work_flash_flag==1)
			   light_work_flash_flag=0;
		    else
			   light_work_flash_flag=1;
		   }
         }
	   }
//============================================
	if(light_copy_paste_flag==1)//参数复制、粘贴指示灯处理
	   led_temp=led_temp&0xf7;
//============================================
//指示灯处理程序
//============================================
	for(j=0;j<8;j++)
           {
            if(led_temp&0x1==1)
              led_bit=1;
            else
              led_bit=0;
            CLK=0;
            DI=led_bit;
            CLK=1;//数据锁存
            led_temp=led_temp>>1;
           }
       RCK=0;
       RCK=1;//595芯片锁存输出信号
       led_temp=P2|0xf8;
       led_temp=led_temp&0xf7;
       P2=led_temp;

}
//============================================================
//程序说明:一旦检测到主机故障,人机界面跳到故障显示
//============================================================
fault_pro(void)
{

		 fault_number=0;
		 if(time_i==16)//参数复位
		    time_i=1;
		 if(fault_temp&0x8000)//参数复位
		    fault_temp=0x1;

		 for(time_i;time_i<16;)
		   {
		    if(fault_data&fault_temp)
			   {
			    fault_number=time_i;
				}
			fault_temp=fault_temp<<1;
			time_i++;
			if(fault_number!=0)//已经采集到故障后,跳出
			   break;
			}

		  if(fault_number==0)//这里重新开始故障位检测的目的是:当上面的循环没有检测到相应的故障位时。
		    {//这段程序可以保证在每次调用故障代码检测程序时都能检测到故障位,防止显示为空
			 time_i=1;
			 fault_temp=0x1;
             for(time_i;time_i<16;)
		      {
		       if(fault_data&fault_temp)
			     {
			      fault_number=time_i;
				  }
		       fault_temp=fault_temp<<1;
			  time_i++;
			 if(fault_number!=0)//已经采集到故障后,跳出
			    break;
			 }
		    }

	  switch(fault_number)
	     {
		 case 0:
		     {
			  led01=10;//F.--
              led02=10;
              led03=15;
              led04=19;
			  fault_flash_flag=0;
			  break;
			  } 
		 case 1:
		     {
			  led01=17;//F.OC
              led02=22;
              led03=15;
              led04=19;
			  fault_flash_flag=1;
			  break;
			  }
		  case 2:
		     {
			  led01=17;//F.SC
              led02=25;
              led03=15;
              led04=19;
			  fault_flash_flag=1;
			  break;
			  }
		  case 3:
		     {
			  led01=28;//F.EF 表示外部输入故障
              led02=18;
              led03=15;
              led04=19;
			  fault_flash_flag=1;
			  break;
			  }
		  case 4:
		     {
			  led01=23;//F.EP
              led02=18;
              led03=15;
              led04=19;
			  fault_flash_flag=1;
			  break;
			  }
		  case 5:
		     {
			  led01=24;//F.FR
              led02=28;
              led03=15;
              led04=19;
			  fault_flash_flag=1;
			  break;
			  }
		  case 6:
		     {

⌨️ 快捷键说明

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