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

📄 main.c

📁 封胶机程序,用于装订书本和检测温度,文件运行可靠
💻 C
字号:
#include "reg52.h"
#include "string.h"
#include "communication.h"


 bit Fstopwork=0; //Note:It must be 0.  the sytem is working
 bit Ftemprature=0;
 bit FOutHeat=0;
 bit FOutBenInversion=0;
 bit FOutBenForward=0 ;
 bit FOutMainInversion=0 ;
 bit FOutMainForward=0 ;
 bit FOutPingInversion=0 ;
 bit FOutXi=0 ;
 bit FOutJiao=0;
 bit FOutPingForward=0 ;
 bit FtestTemprature=0;
 bit FBenForwardtime0=0;
 bit FBenForwardtime1=0;
 bit FBenpingtime1=0;
 bit FXiDaoCloseOpen=0;
 bit FStartWork=0;
 bit FOutoHand=0;
 bit FKeepTemprature=0;



 
 
 unsigned char CountStop=0 ;
 unsigned char RInStopWork,RInBenG,RInLeft,RInRight,RInPingG,RInPingX,RInBen,RInTemprature;

 unsigned char SetTemprature,ReadTemprature ;
 unsigned char RearOffset;
 unsigned char idata uart1RingBuffer[RxBufSize];
 unsigned char idata TempReceiveData[RxBufSize];
 unsigned int  ReadpingTime,ReadBenTime;
 unsigned char SetpingTime,SetBenTime;
 unsigned char SetJiaYaLi;







void main(void)
{
	delay();//wait system stabilization 
	InitPort();
    InitSerialPort();
	InitTimer0();
	EX1interrupt();
    while(1)
      {
       CompearTemprature();
       OutDoWork();
	   StopWork();
      }
}

 

void delay(void)     //35ms
{
   unsigned long temp;
   for(temp=0;temp<0x2fff;temp++);
}


void DoWithRxData(void)
{
  unsigned char codeType;
    if(TempReceiveData[0]==TempReceiveData[2]==TempReceiveData[4])
    	{
		if(TempReceiveData[1]==TempReceiveData[3]==TempReceiveData[5])
			{
        		codeType=TempReceiveData[0];
                 switch(codeType)
	            	{
		               	case ComndXiDao :
			                 if(0x55==TempReceiveData[1])
                                FXiDaoCloseOpen=1;
                             else if(0xAA==TempReceiveData[1])
			   	                FXiDaoCloseOpen=0;
			            break ;

		            	case ComndStartWork :
				             if(0x55==TempReceiveData[1])
				  	            FStartWork=1;
		            	break ;
			
			            case ComndOutoHand :
				             if(0x55==TempReceiveData[1])
                                FOutoHand=0;
                             if(0xAA==TempReceiveData[1])
                                FOutoHand=1;
			            break ;
			
			            case ComndKeepTemp :
				             if(0x55==TempReceiveData[1])
				                FKeepTemprature=1;
				             if(0xAA==TempReceiveData[1])
				  	            FKeepTemprature=0;

		            	break ;

                        case ComndSetTemp :
                                SetTemprature=TempReceiveData[1];
				
                        break ;

			            case ComndJiaTime :
        
			            break ;

			            case ComndJiaYaLi :
                                SetJiaYaLi=TempReceiveData[1];
			            break ;

	            		case ComndWaitTime :
                                SetBenTime=TempReceiveData[1];
			            break ;

                        case ComndFengMianTime :
                                SetpingTime=TempReceiveData[1];
			            break ;

			           default :
					   		;
			
	             }
			}
    	}
}


void CompearTemprature(void)
{
	if(ReadTemprature>SetTemprature)
		{
		 FtestTemprature=1;
		 OutHeat=0;
		}
	
	else
		{
        OutHeat=1;  //heat up
	    }
}



void OutDoWork(void)
{
if(FStartWork)
  //启动	
{
if(!Fstopwork)
	//检测急停
   {
    if(Ftemprature)
		//检测温度
    	{
       if((!InBenG)&(!InLeft))
	   	//检测本台光电与左限位是否满足
       	    {
             FBenForwardtime0=1;
			   do {
                   OutBenInversion=MotorClose;
				   //打开置本台正转电机等待夹书完成否
			       OutBenForward=MotorOpen;
			       }while(!FBenForwardtime1);  
                   OutBenForward=MotorClose;
				   FBenForwardtime1=0;      

					   if(!InPingG)
					   	 //检测平台光电既是否放有封面
        	                {

                             do {
  	                               OutMainInversion=MotorClose;   
			                       OutMainForward=MotorOpen;         //主电机正转
                                   if(FXiDaoCloseOpen)
								       OutXi=MotorOpen;              //铣刀开
			                     }while(!InRight);                   //检测右限位到否
                                    OutMainForward=MotorClose;       //停止主电机正转
                                    OutXi=MotorClose;                //铣刀关
		                           FBenpingtime1=1; 
                             do   {
			                        OutPingForward=MotorOpen;   
  	                                OutPingInversion=MotorClose; 
                                 }while(!FBenpingtime1);             //等待封胶时间

				                    FBenpingtime1=1; 
			                 do   {
				                    OutPingForward=MotorClose;   
  	     	                        OutPingInversion=MotorOpen; 
              	                 }while(!FBenpingtime1);            //封胶完毕退回
			                        OutPingInversion=MotorClose;
                             do   {
  	                               OutMainInversion=MotorOpen;   
			                       OutMainForward=MotorClose;       //主电机反转
			                      }while(!InLeft);                  //检测左限位
                                    OutMainInversion=MotorClose;    //停止主电机反转
                                   

								 
        	               }
       	              }
		         }
           }

else
	{
     OutBenInversion=MotorClose;
     OutBenForward=MotorClose;
     OutMainInversion=MotorClose;
     OutMainForward=MotorClose;
     OutPingInversion=MotorClose;
     OutXi=MotorClose;
     OutJiao=MotorClose;
     OutPingForward=MotorClose;
	 FBenForwardtime0=0;
    }
}
}
 
void StopWork(void)
//急停标志	
{
   if(!InStopWork)
 	     {
           if(++CountStop==3)
		     {
		      CountStop=0;
              Fstopwork=1;
        	 }
	     }
   else
   	     {
           CountStop=0;
           Fstopwork=0;
         }
}


void PrintChar(unsigned char ch) 
{
//串口 向显示板 发送数据
     	ES=0;
        SBUF=ch;
	 	 	while(TI==0);
	  	 	TI=0;
		ES=1;
}

void SerialPort(void)interrupt 4
{   
 //接收显示板的命令
 //相同命令显示板连续发送三次,所以接收三次
  unsigned char *ptr,*Outptr;
         if(RI){
                RI=0;
		        *(uart1RingBuffer+RearOffset)=SBUF ;
                  RearOffset++;
	             if(RearOffset>6)
				 	{
				 	RearOffset=0 ;
					Outptr=TempReceiveData;
					for(ptr=uart1RingBuffer;ptr<uart1RingBuffer+RxBufSize;*ptr++)
							{
								*Outptr++=*ptr;
							}
                            DoWithRxData();
		          	 }
               }
		 if(TI){
                TI=0;
		 	   }
}


void timer0(void)interrupt 1
{
   unsigned int TTSetBenTime,TTSetpingTime;

  TTSetBenTime=(int)SetBenTime*20;
  TTSetpingTime=(int)SetpingTime*20;

	TL0=TL0LOAD ;
	TH0=TH0LOAD ;
	//计算夹书时间与设定时间比较
  if(FBenForwardtime0)
  	   ++ReadBenTime;
     if(ReadBenTime==TTSetBenTime)  
	 	  {
	 	   FBenForwardtime1=1;
	       FBenForwardtime0=0;
		  }
  //计算封书时间
  if(FBenpingtime1)               
 	 ++ReadpingTime;
      if(TTSetpingTime==ReadpingTime) 
      	 {
	  	  FBenpingtime1=0;
          ReadpingTime=0;
      	 }
}	


void EX0INTER(void)interrupt 0
//读取电位器及温度值
{



}






⌨️ 快捷键说明

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