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

📄 working.c

📁 Main program running when workpiece is ready on deferent belt(deferent_ready=ture). * Call Squ
💻 C
字号:
/*
*******************************************************************************************************************
*                                          XingChen
*                                (c)Copyright 2004,HangZhou,China
*                                     All Rights Reserved
*										   (2004/8/7)
*
*FileName  : Robot Control
*Programmer: xiaogang
* Version  : V1.0
*Finished  : 2004/8/26
******************************************************************************************************************
*/
/*$PAGE*/
/*
******************************************************************************************************************
*                                       INCLUDE FILES
*******************************************************************************************************************
*/
#include <AT89X52.H>					/* special function registers for AT89c52 device */
#include <math.h>						/* stanard C math-file 							*/
#include <stdio.h>						/* standard I/O .h-file							*/
#include "working.h"					/* selfdefined standard .h-file 	*/

/*$PAGE*/


/*
******************************************************************************************************************
*                                       MAIN PROGRAM
* Description: Main program running when workpiece is ready on deferent belt(deferent_ready=ture).
*			   Call Square_Wave subroutine to generate 0.5ms square wave on P1.2 to drive
*              electromotor,then drive deferent belt step forward. When it steps to the measure
*              zone, it stops to be measured. Then call A_D subroutine to transform analog
*              signals to digital signals , after then call serial subroutine to transfer
*              digital signals to PC. Call square wave subroutine to drive deferent belt step to
*              original position waitting for defere ready flag to run the next circle.
* Arguments  : none
*
* Returns    : none
*****************************************************************************************************************
*/
/*
******************************************************************************************************************
*                          通信数据格式
*          开中断,等待上位机送正确的命令  ’CS'(0X43 0x53) 回送’R’     (0x52)
*			       错误的命令         ,回送‘W’             (0x57)
*          关中断,开始AD()和送数   0XAD,K,低8位,高8位 ,和校验,等等上位机回送‘R’    (0x52)
*                  重复共做20次
*                  工件转回后,送通知‘CE’ (0x43 0x45),回收‘R’则一次操作结束,重新开始
*                                         ,10S没有正确回收,则重发通知
*
*
*****************************************************************************************************************
*/
					/* private variables */

INT16U UIntCounter;

INT8U idata send[SEND_SIZE];           
INT8U idata s_start ;
INT8U idata s_end ;
INT8U k ;

INT8U idata receive[RECE_SIZE];
INT8U idata r_start ;
//INT8U idata r_end ;
INT8U idata intcounter ;               //timer0 interrupt counter

 					/* Functions declared */

void   InitIOPort(void);                       // initialize I/O ports
void   Square_Wave(void);	
void   Initial_Timer0(void);	
void   Time0_Interrupt(void);				   // interrupt subroutine
void   delay(void);							   // delay subroutine
void   A_D(void);                              // AD subroutine
//INT16U Serial(void); 						   // serial port subroutine
void  Serial_s(void);      
void  Serial_r(void);     
void  Serial_init(void);
void main(void)
{
 //   INT16U UIntForwardSteps1,UIntForwardSteps2,UIntCounter;
     Serial_init();
     Initial_Timer0();
	for(;;){
                 Deferent_Ready=False;						// workpiece ready flag
                  ES=1;         
  //        Deferent_Ready=True;
	//	UIntForwardSteps  = 28000;					// steps per circle  28000
	//	UIntForwardSteps1 = 14;					// steps from ready position to measure position  14000
	//	UIntForwardSteps2 = UIntForwardSteps-UIntForwardSteps1;

               while(Deferent_Ready==False) ;
                //UIntForwardSteps1=receive[0]+256*receive[1] ;
                //UIntForwardSteps2 = UIntForwardSteps-UIntForwardSteps1;
               ES=0;
               for(UIntCounter=0;UIntCounter<=UIntForwardSteps1;++UIntCounter)
                  {
		    Square_Wave();
                  }
 //               delay();									// delay for workpieces to be measured
//		A_D();
 //               Serial_s();
        //        INT8U k ;
                for(k=0;k<20;k++)
                   { for(UIntCounter=0;UIntCounter<=iUIntForwardSteps;++UIntCounter)
                      {
		       Square_Wave();
                       }
                    delay();									// delay for workpieces to be measured
		    A_D();
                    Serial_s();
                    }
		for(UIntCounter=0;UIntCounter<=UIntForwardSteps2;++UIntCounter)
                   {
                          Square_Wave();
                   }
                  Deferent_Ready=False;

            SBUF='C';
            while(TI==0);TI = 0;
            SBUF='E';
            while(TI==0);TI = 0;

            while(RI==0);RI=0;		// wait for PC reply  ‘R’
            while(SBUF!=0x52);
            //ES=1;
		}

}
/*$PAGE*/
/*
******************************************************************************
Function name  : InitIOPort
Description    : initialize whole IO port Parameters

Input param    : none.

Output param   : none.

return         : none
******************************************************************************
*/
void InitIOPort(void)
{
	P1_0  =  0;
	P0    =  1;

}
/*
******************************************************************************************************************
*                                       SQUARE WAVE GENERATE
* Description: Interrupt mode generate 0.25ms square wave on P1.2 to drive electromotor
*
* Arguments  : none
*
* Returns    : none
*****************************************************************************************************************
*/
void Square_Wave()
{
       P1_0=0;                               //interrupt mode generate 0.5ms squre wave
       intcounter=0;
       TR0=1;
       ET0=1;
       EA=1;
       while(intcounter!=2);
       TR0=0;
       ET0=0;

}
/*$PAGE*/
/*
******************************************************************************************************************
*                                      INITIALIZE TIMEER0
* Description: none
*
* Arguments  : none
*
* Returns    : none
*****************************************************************************************************************
*/

void Initial_Timer0()
{
	TMOD=	(TMOD|0x0f)&0xf2;  				// initialize Timer0 mode 2
	TL0 =	0x20;					//TL0 =	0x12;
	TH0 =	0x20;
}


/*$PAGE*/
/*
******************************************************************************************************************
*                                      INTERRUPT SUBROUTINE
* Description: none
*
* Arguments  : none
*
* Returns    : none
*****************************************************************************************************************
*/
void timer0(void) interrupt 1 using 1
{
 	P1_0 =!	P1_0;                   // reverse P1_2
        intcounter++ ;
}

/*$PAGE*/
/*
****************************************************************************************************
*										DELAY SUBROUTINE
* Description: delay
*
* Arguments  : none
*
* Returns    : none
*****************************************************************************************************
*/
 void delay(){
	unsigned int i;
	for(i=0;i<=2;i++);
}
/*$PAGE*/


/*
******************************************************************************************************************
*                                      A/D
* Description: none
*
* Arguments  : none
*
* Returns    :
*****************************************************************************************************************
*/
void  A_D(void)
 {
         INT16U i,AD,AD_SUM=0 ;
         INT8U	ADHI,ADLO;
    for(i=0;i< AD_SIZE; i++ )
       {
	write = 0;
        ADCOM = AD_8EAB;		/*RC=0;A0=0;CS=0 enable 12 bit switch  */
        while(adbusy==1);
        read=0;
        ADCOM = AD_READH;		/*RC=1;A0=0;CS=0 enable high 8 bit out */
	ADHI  = P0;
	ADCOM = AD_READL;		/*RC=1;A0=1;CS=0 enable low 4 bit out  */
	ADLO  = P0;
	read  = 1;
	write = 1;
	CS    = 1;
        AD=ADHI*16+ADLO/16;
        AD_SUM+=AD ;
       }
        send[0]=0x0ad ;
        send[1]=k;
        send[2]=(AD_SUM/AD_SIZE)%256;
        send[3]=(AD_SUM/AD_SIZE)/256;

}
/*$PAGE*/
/*
******************************************************************************************************************
*                                      SERIAL SUBROUTE
* Description: none

* Arguments  : none
*
* Returns    : none
*****************************************************************************************************************
*/
void Serial_init(void)
{            TMOD = (TMOD|0xf0)&0x2f;			// Timer1 Mode 1
             TH1 = 0x0f3;			// Baud 2400, 11.059 MHZ
             TL1=0x0f3;
             TR1=1;
             SCON = 0x50;			// Serial port Mode 1, enable receive and  send
             EA=1;                              // Enable interrupt
            // ES=1;
}


/*
*********************************************************************************************************************
*send data format:flag byte(0xad,AD valve(L),AD valve(H),checkout byte(wait reply 0x00 is correct flag)
* after send 4 bytes,wait for pc reply,if pc receive correct flag byte and checkout byte,reply is 0x00,
*else should send again

*/

void  Serial_s(void)
{

             ES=0;     			// disable serial port interrupt
   do {
        INT8U k,pf=0;
        for(k=0;k<SEND_SIZE;k++ )
        {
	   SBUF=send[k];			// transfer AD value to PC
           pf+=send[k];
	   while(TI==0);
           TI = 0;
           delay();		// wait for Transfer Interrupt enable   , clear TI
         }
           SBUF=pf;
           while(TI==0);
           TI = 0;
           while(RI==0);
           RI=0;		// wait for PC reply
        }while(SBUF!=0x52);		// PC transfer a flag to MCU if false then repeat
          ES=1;
}

/**************************************************************************************
*format:flag byte 0x0aa(reply 0x00(true) or 0x0ff),step number(L),step number(h),checkout type(reply 0x00(true) or 0x0ff)
*receive flag word=0x0aa,answer 0x0aa,else answer 0x0ff  and return
**receive motor step number
**then receive checkout word,if correct,send 0x00,then Deferent_Ready=True and return.
**else send 0x0ff,repeat receive motor step number
***************************************************************************************/

void  Serial_sr(void)   interrupt 4 using 3
{
   INT8U k,i,pf=0;
   INT8U srtemp ;
   ES=0;             			// disable serial port interrupt
      if(RI)
       {
           srtemp=SBUF;
           RI=0;
           receive[r_start]=srtemp;
           pf+=receive[r_start];
           if(r_start<(RECE_SIZE-1))
              {
                r_start++;
               }
           else
              {
                r_start=0;
                   // if( (receive[0]-'c')||(receive[1]-'s')==0)
                    if( (receive[0]=='C')&& (receive[1]=='S') )
                     {
                       Deferent_Ready=True;          // deferent start

	                 SBUF='R';			// send correct flag to PC
                         while(TI==0);TI = 0;
                      }
                    else
                      {
                       SBUF='W';			// send correct flag to PC
                       while(TI==0);
                       TI = 0;
                      }

              }
     ES=1;                            //enable serial port interrupt
     }
    }

⌨️ 快捷键说明

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