📄 keil00.c
字号:
if(Command==0x04)
{
ClrBit=1;
break;
} /*清牌*/
}
//if(xbit)
// {TX[2]='M';
// TX[4]=0x27; /*取牌报告*/
// Transmit();
//
}
break;
}
OPTOV=1; //+
AllCard=AllCardbak;
RemnantCard=RemnantCardbak;
}
/***********************************/
void ShaoCar(void) /*少牌处理*/
{
OPTOV=0;
Delay50ms();
TX[2]='M';
TX[4]=0x28; /*少牌报警*/
Transmit();
while(Back_OPTO) /*等待放牌*/
{
_nop_();
if(Command==0x04)
{
ClrBit=1;
break;
}
}
ShaoCardBit=0;
TX[2]='M';
TX[4]=0x29; /*补牌报告*/
Transmit();
OutCard(); /*发牌*/
}
/***************************************
* 变量BoxNO是将要接牌的牌盒编号
* 变量azimuth是当前的方位数
* 定位可靠处理:预留2度的长度低速定位
****************************************/
void Turn(void)
{
unsigned int y,Pulse; /*Pulse---脉冲变量*/
unsigned char i,b,x,z;
TX[2]='M';
TX[4]=0x40; /*转动报告*/
//ransmit();
EA=0;
DIR=0; /*顺时针转动*/
Step=0;
A3986_EN=0;
ConVref=1; /*释放电机*/
Delay50ms();
i=BoxNO; /*BoxNO---将要接牌的牌盒编号*/
if(i==Place) goto outa;
else if(i>Place) i=i-Place; /*转动量的处理*/
else i=i+4-Place; /*Place--位置变量*/
if(i==1) {Pulse=930;} //960---90'
else if(i==2) {Pulse=2530;} //2560---180'
else if(i==3) {Pulse=4130;} //4160---270'
else goto outa;
z=124; //z=120;
for(i=0;i<20;i++) /*启动加速(18度)*/
{
for(b=0;b<32;b++) /*每1.8度变速一次*/
{
for(x=0;x<z;x++)
{
_nop_();
}
Step=!Step;
}
z=z-5;
} /*变速量*/
for(y=0;y<(Pulse-32);y++) /*快速转动*/
{
for(x=0;x<z;x++) //
{_nop_();} //
Step=1; //
for(x=0;x<z;x++) //
{_nop_();} //
Step=0;
} //
for(i=0;i<15;i++) /*for(i=0;i<20;i++)停止减速(18度)*/
{
for(b=0;b<32;b++) /*每1.8度变速一次*/
{
for(x=0;x<z;x++)
{_nop_();}
Step=!Step;
}
z=z+5;
} /*变速量*/
switch(BoxNO)
{
case 1: i=0x7f; break; /*当前接牌盒编号判断*/
case 2: i=0xef; break; //
case 3: i=0xbf; break; //
case 4: i=0xdf; break; //
default: break;
}
while(azimuth!=i) /*低速定位*/
{
for(x=0;x<255;x++)
{
_nop_();
_nop_();
} //-
Step=!Step;
} //
outa:
Delay50ms();
Place=BoxNO;
ConVref=0; /*锁定电机*/
EA=1;
TX[2]='M';
TX[4]=0x41; /*停转报告*/
Transmit();
}
/********************************************************/
/*-----发牌程序--------------*/
/********************************************************/
void OutCard(void)
{
unsigned char Ydata,Card; /*有无牌检测次数和发牌数变量*/
unsigned char Blockdata; /*卡牌时间计数变量*/
bit NoCardBIT; /*牌盒无牌标志位*/
bit CardBIT,OkBIT; /*计数器有牌和发牌完成标志位*/
bit BlockCardBIT; /*卡牌标志位*/
Card=0;
NoCardBIT=0;
CardBIT=0; /*变量清零*/
OkBIT=0;
Blockdata=0;
BlockCardBIT=0;
while(1)
{
OPTOV=0; /*开传感器电源*/
Delay50ms();
if(!Back_OPTO)
{
NoCardBIT=0;
} /*牌盒有牌时清无牌标志位*/
if(Back_OPTO) /*牌盒有无牌检测*/
{
if(Ydata>20) /*检测20次*/
{
Ydata=0;
if(!Count_OPTO) /*计数器无牌*/
{
Back_motor=1; /*牌盒马达全停*/
Front_motor=1;
if(Card<Card_data)
{
ShaoCardBit=1;
} /*置少牌标志*/
OkBIT=1;
NoCardBIT=1;} /*置牌盒无牌标志*/
}
else
Ydata++; /*检测次数加1*/
}
if(Card>=Card_data) /*牌盒发牌完成?*/
{
Front_motor=1;
Back_motor=1; /*牌盒马达全停*/
OkBIT=1;
} /*置完成标志位*/
if(OkBIT)
{
OkBIT=0;
break;
}
if(!NoCardBIT)
{
if(!OkBIT) /*有牌则启动牌盒发牌*/
{
Back_motor=0;
Front_motor=0;
}
}
if(!CardBIT)
{
if(Count_OPTO) /*计数器有牌*/
{
Back_motor=1;
_nop_(); //Delay50ms();
if(Count_OPTO)
{
Ydata=0;
CardBIT=1; /*置有牌标志*/
}
}
}
else
{
if(CardBIT)
{
if(!Count_OPTO)
{
Ydata=0;
Blockdata=0;
Card++; /*牌过计数器后加1*/
CardBIT=0;
}
}
}
Blockdata++; /*卡牌计数变量加1*/
if(Blockdata>=0xfe)
{
BlockCardBIT=1; /*置卡牌标志*/
break;
}
}
OPTOV=1; /*关传感器电源*/
if(BlockCardBIT) /*卡牌标志有效为卡牌*/
{
Back_motor=1;
Front_motor=1; /*卡牌时所有马达停*/
TX[2]='M';
TX[4]=0x25; /*发送卡牌信息*/
TX[5]=1; /*A卡牌*/
Transmit();
}
else
{
if(ShaoCardBit) /*少牌置标志*/
{
Card_data=Card_data-Card;
}
}
}
/***********************************
******* 任务发出及反馈 ***********
***********************************/
void TXok(void)
{
unsigned char x,a,b,c;
x=0;
a=TX[2];
b=TX[4];
c=TX[5]; //BboxErr=0;
while(1)
{
Delay50ms();Delay50ms();
if(Command==0x21) /*确认收到命令*/
break;
else
{
TX[2]=a;
TX[4]=b;
TX[5]=c;
Transmit();x++;}
if(x>5)
{
ErrorNO=0x2a;
break;
}
}
Command=0;
}
/***********************************/
/*-------有无牌状态查询程序--------*/
/***********************************/
void StateB(void)
{
unsigned char x,y;
OPTOV=0;
Delay50ms();
BboxState(); /*查询B仓有无牌状态*/
y=0;
for(x=0;x<50;x++) /*判断50次,确定牌盒内是否有牌*/
{
if(!Back_OPTO||Count_OPTO) /*牌盒内检测是否有牌*/
y++;
}
if(y>40) /*有牌次数超过40次为有牌,否则为无牌*/
TX[5]=1;
else
TX[5]=0;
TX[2]='M';
TX[4]=0x23; /*有无牌状态返回*/
Transmit();
}
/******************************************/
void BboxState(void)
{
TX[2]='B'; /*B1仓有无牌查询*/
TX[4]=0x07;
Transmit();
TXok();
if(ReceivePack[5]==0)
Wupai1=0;
else
Wupai1=1;
if(ReceivePack[6]==0)
Wupai2=0;
else
Wupai2=1;
TX[2]='C'; /*B2仓有无牌查询*/
TX[4]=0x07;
Transmit();
TXok();
if(ReceivePack[5]==0)
Wupai3=0;
else
Wupai3=1;
if(ReceivePack[6]==0)
Wupai4=0;
else
Wupai4=1;
TX[6]=Wupaidata; /*B仓有无牌状态*/
}
/***********************************/
/*----------485发送程序------------*/
/***********************************/
void Transmit(void)
{
unsigned char x;
R485cs=1; //rs485_cs
LED=0;
_nop_();
_nop_();
_nop_();
_nop_();
EA=0;
for(x=0;x<8;)
{
SBUF=TX[x++];
while(!TI)
{_nop_();}
TI=0;
}
TI=0;
RI=0;
EA=1;
LED=1;
R485cs=0;
}
/***************************************/
/* rs232中断 */
/***************************************/
void Rs232int() interrupt 4 using 0
{
ES=0;
if(!TI)
{
Receive();
if(ReceivePack[2]=='A')
{
if(ReceivePack[0]=='R'&&ReceivePack[1]=='B')
{
if(ReceivePack[7]==0x0d||ReceivePack[9]==0x0d)
{
LED=0;
Command=ReceivePack[4];
TX[2]='M';
TX[4]=0x21;
TX[5]=Command;
Transmit();
}
ReceivePack[2]=0;
}
}
TH0=0; /* Delay 2us */
TL0=0;
}
ES=1;
LED=1;
}
/*-------------------------------*/
/*-------接收程序----------------*/
/*-------------------------------*/
void Receive(void)
{
unsigned char TrReCount0;
TrReCount0=0;
TR0=1;
while(TrReCount0<11)
{
if(RI)
{
ReceivePack[TrReCount0++]=SBUF;
TH0=0x0;
TL0=0x0;
RI=0;
}
else if(TF0)
break;
}
if(TrReCount0<7)
{
ReceivePack[2]=0;
}
RI=0;
TR0=0;
TF0=0;
}
/**********************************/
void Delay50ms(void)
{
unsigned char i,Count0;
for(i=0;i<45;i++)
{
for(Count0=0;Count0<0xff;Count0++)
{
_nop_();
}
}
}
/**************************************************************/
void Test1(void)
{
OPTOV=0; /*开传感器电源*/
Delay50ms();
while(1)
{
if(!Back_OPTO) /*牌盒内有牌时传牌电机转动,LED亮*/
{
LED=0;
Back_motor=0;
}
else if(Count_OPTO) /*计数器有牌时出牌电机转动,LED亮*/
{
LED=0;
Front_motor=0;
}
else /*否则无动作*/
{
LED=1; //
Back_motor=1; //
Front_motor=1;
}
}
}
/**************************************************************/
void Test2(void)
{
unsigned char i;
i=0;
OPTOV=0; /*开传感器电源*/
Delay50ms();
while(!KEY) /*按键3秒以上为转动90度,3秒以下为发牌3张*/
{
Delay50ms(); //@
if(!KEY) //@
{
if(i<200) //@
{
i++;
} //@
else break;
} //@
else break; //@
} //@
if(i>15) //*转动测试:按键转90'*/
{
BoxNO++; //
if(BoxNO==5) //
{
BoxNO=1;
} //
Turn();} //
if(i>1)
{
if(i<15) /*发牌测试:按键发3张*/
{
Card_data=3; //
OutCard();
} //
}
OPTOV=1; /*关传感器电源*/
}
/***********************************/
/* 初始化 */
/***********************************/
void Init(void)
{
IE0=0;
TMOD=0x20;
PCON=0x00;
SCON=0x50; /*SCON=0xf0;串口为方式3,单机通讯*/
TH1=0x0fd; /* 9.6k */
TL1=0x0fd;
TH0=0x0; /* Delay-2ms */
TL0=0x0;
TH2=0x0; /* Delay */
TL2=0x0;
TR0=0; /* 关闭定时器0 */
TR1=1; /* 允许定时器1 */
IT0=1; /* 中断0边沿触发方式 */
ES=1;
EA=1;
R485cs=0;
P2=0xff;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -