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

📄 keil00.c

📁 提供包括硬件、软件在内的高效、低成本的完整嵌入式开发平台及解决方案。典型产品为以386EX CPU为核心的嵌入式网络模块系列
💻 C
📖 第 1 页 / 共 2 页
字号:
         		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 + -