?? working(偉福)
字號:
/*
*******************************************************************************************************************
* XingChen
* (c)Copyright 2004,HangZhou,China
* All Rights Reserved
* (2004/8/7)
*
*FileName : Robot Control
*Programmer: Beyond Z.H.
* 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]; //自己:idata 是什么定義???
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); //自己:產生方波做什么?? // generate 500us square wave on P1.2
void Initial_Timer0(void); //自己:怎么這個還有單獨列??(難道是控制波特率??) // initialize Timer0
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; //自己: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 + -