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

📄 main.c

📁 利用SMALL RTOS51做的一个项目
💻 C
📖 第 1 页 / 共 4 页
字号:
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: OSSemCreate(),DispStr(),OSWait(),DispClr(),OSSemPost(),
**
** 作 者: 龚树强
** 日 期: 2004年10月15日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
*****************************************************************                   ***************************************/
        void BH_Serial(void)	
{

	uint8 idata temp;
	uint16 idata i;
    
	OSQCreate(CommandData,7);
    OSQCreate(SerialInData,10);
    OSQCreate(SerialOutData,22);                   /* 建立所需要的消息队列 */   

	//OSSemCreate(SEM_SendBuffer,3);

	OSWait(K_TMO, OS_TICKS_PER_SEC/5 );

	
    while (1)
    {
		SM2=1;

        OSQPend(&temp,SerialInData,0);          // 接收一个字节         
        if (temp != LOCOAL_ADDR)
        {
			continue;                         	//接收到起始字符       
        }
        SM2=0;

		_Sum = LOCOAL_ADDR;
        
		OSQPend(&temp,SerialInData,0);          // 接收一个字节         
        if (temp != LOCOAL_ADDR)
        {
			SM2=1;
			continue;           	 
        }
		
			
        _Sum += temp;
            
        OSQPend(&temp,SerialInData,0);      	//    接收数据             
        _Sum += temp;

		switch(temp)
		{
			case 	CMD_TARGET_VALUE	:	OSQPend(&temp,SerialInData,0);      	//    接收数据      
											_Sum += temp;
											_TempValue=temp;
											_TempValue<<=8;
											

											OSQPend(&temp,SerialInData,0);      	//    接收数据             
        									_TempValue+=temp;
											_TempValue<<=8;
											_Sum += temp;

											OSQPend(&temp,SerialInData,0);      	//    接收数据             
        									_TempValue+=temp;
											_Sum += temp;
										
											OSQPend(&temp,SerialInData,0);      	//    接收数据  
   
											SM2=1;    
    
											if(!_Flag_State_Producing)
											{
												if(temp==_Sum)
												{
													
													_TargetValue=_TempValue;

												}
												
											}
											
											continue;
											
			case 	CMD_CURRENT_VALUE	:	OSQPend(&temp,SerialInData,0);      	//    接收数据             
        									_Sum += temp;
											_TempValue=temp;
											_TempValue<<=8;
											
					
											OSQPend(&temp,SerialInData,0);      	//    接收数据             
       										_TempValue+=temp;
											_TempValue<<=8;
											_Sum += temp;

											OSQPend(&temp,SerialInData,0);      	//    接收数据             
       										_TempValue+=temp;
											_Sum += temp;

											OSQPend(&temp,SerialInData,0);      	//    接收数据    

											SM2=1;
         
       										if(!_Flag_State_Producing)
											{
												if(temp==_Sum)
												{
													if(_TargetValue>_CurrentValue)
													{
														OSQIntPost(SerialOutData,LOCOAL_ADDR);
												  		_Sum=LOCOAL_ADDR;
														OSQIntPost(SerialOutData,LOCOAL_ADDR);
												    	_Sum+=LOCOAL_ADDR;
														OSQIntPost(SerialOutData,CMD_ACK);
														_Sum+=CMD_ACK;
														OSQIntPost(SerialOutData,0);
														OSQIntPost(SerialOutData,0);
														OSQIntPost(SerialOutData,0);
														OSQIntPost(SerialOutData,_Sum);

														OSQAccept(&temp,SerialOutData);
												
														SERIAL_DIRECTION_CTRL=1;
													//	for(i=0;i<10000;i++);
												
														_BufferIndex=0;

														//_ResendBuffer[_BufferIndex]=temp;

														TB8=1;
														TI=0;
												
		    											SBUF = temp;
														
														_CurrentValue=_TempValue;
			
														
														DispNum(0,_TargetValue);
		
														DispNum(1,_CurrentValue);
												
														_Flag_CounteEnable=1;
														_Flag_State_TaskAccepted=1;
														_Flag_State_Producing=0;
														_Flag_State_Finish=0;
													}
												}
												
											}
											else if(_Flag_State_Producing)
											{
												if(temp==_Sum)
												{
													
													_CurrentValue=_TempValue;

													DispNum(1,_CurrentValue);

												}
												
											}
											continue;

			
			case 	CMD_FINISHED_PERSENT:	OSQPend(&temp,SerialInData,0);      	//    接收数据             
        									//_TempValue=temp;
											//_TempValue<<=8;
											_Sum += temp;
											
											OSQPend(&temp,SerialInData,0);      	//    接收数据             
        									_TempValue=temp;
											_TempValue<<=8;
											_Sum += temp;

											OSQPend(&temp,SerialInData,0);      	//    接收数据             
        									_TempValue+=temp;
											_Sum += temp;
										
											OSQPend(&temp,SerialInData,0);      	//    接收数据     

											SM2=1;
        
        									if(temp==_Sum)
											{
												if(_Flag_State_Producing)
												{
													_ProducedPersent=_TempValue;
												}
											
												continue;
											}
											//else
											//{
											//	goto CURRENT_STATE_RETURN;
											//}
											continue;

			case 	CMD_QUARY			:	OSQPend(&temp,SerialInData,0);      	//    接收数据             
        									_Sum += temp;
											
											OSQPend(&temp,SerialInData,0);      	//    接收数据             
        									_Sum += temp;

											OSQPend(&temp,SerialInData,0);      	//    接收数据             
        									_Sum += temp;
										
											OSQPend(&temp,SerialInData,0);      	//    接收数据   

											SM2=1;
          
        									if(temp==_Sum)
											{
												
//CURRENT_STATE_RETURN:							
												if(OSQAccept(&temp,SerialOutData) != OS_Q_OK)
												{
													
													OSQIntPost(SerialOutData,LOCOAL_ADDR);
	    											_Sum=LOCOAL_ADDR;
													
													OSQIntPost(SerialOutData,LOCOAL_ADDR);
	    											_Sum+=LOCOAL_ADDR;
													
													if(_Flag_State_Error)
													{
														OSQIntPost(SerialOutData,CMD_STOP);
														_Sum+=CMD_STOP;
													}
													else if(_Flag_State_Producing)
													{
														OSQIntPost(SerialOutData,CMD_PROCESSING);
														_Sum+=CMD_PROCESSING;
													}
													else if(!_Flag_State_Producing)
													{
														OSQIntPost(SerialOutData,CMD_STANDBY);
														_Sum+=CMD_STANDBY;
													}
													
													temp=_CurrentValue>>16;

													_Sum+=temp;
													

													OSQIntPost(SerialOutData,temp);

													temp=_CurrentValue>>8;
													_Sum+=temp;
													
													OSQIntPost(SerialOutData,temp);

													temp=_CurrentValue;
													_Sum+=temp;

													OSQIntPost(SerialOutData,temp);

													OSQIntPost(SerialOutData,_Sum);

													OSQAccept(&temp,SerialOutData);
												}
												SERIAL_DIRECTION_CTRL=1;
											//	for(i=0;i<10000;i++);
												
												//_ResendBuffer[_BufferIndex]=temp;

												TB8=1;
												TI=0;
												
		    									SBUF = temp;

												_BufferIndex=0;
												continue;
											}
											temp=0;
											continue;
											
			case	CMD_INCORRECT		:	OSQPend(&temp,SerialInData,0);      	//    接收数据             
        									_Sum += temp;
											
											
											OSQPend(&temp,SerialInData,0);      	//    接收数据             
        									_Sum += temp;

											OSQPend(&temp,SerialInData,0);      	//    接收数据             
        									_Sum += temp;
										
											OSQPend(&temp,SerialInData,0);      	//    接收数据     

											SM2=1;
        
        									
        									if(temp==_Sum)
											{
												OSQIntPostFront(SerialOutData,_ResendBuffer[5]);
												OSQIntPostFront(SerialOutData,_ResendBuffer[4]);
												OSQIntPostFront(SerialOutData,_ResendBuffer[3]);
												OSQIntPostFront(SerialOutData,_ResendBuffer[2]);
												OSQIntPostFront(SerialOutData,_ResendBuffer[1]);
												OSQIntPostFront(SerialOutData,_ResendBuffer[0]);

												//OSQAccept(&temp,SerialOutData);

												SERIAL_DIRECTION_CTRL=1;
											//	for(i=0;i<10000;i++);
												
												_BufferIndex=0;

												//_ResendBuffer[_BufferIndex]=temp;

												TB8=1;

		    									SBUF = LOCOAL_ADDR;
											
												continue;
											
											}
											//else
											//{
											//	goto CURRENT_STATE_RETURN;
											//}
											continue;
											
			case 	CMD_CURRENT_VALUE_REQUEST	:	

											OSQPend(&temp,SerialInData,0);      	//    接收数据             
        									_Sum += temp;
										
															
											OSQPend(&temp,SerialInData,0);      	//    接收数据             
       										_Sum += temp;

											OSQPend(&temp,SerialInData,0);      	//    接收数据             
       										_Sum += temp;

											OSQPend(&temp,SerialInData,0);      	//    接收数据  

											SM2=1;
           
       										if(temp==_Sum)
											{
												//OSSemPend(SEM_SendBuffer,0);
												
												OSQIntPost(SerialOutData,LOCOAL_ADDR);
												_Sum=LOCOAL_ADDR;

												OSQIntPost(SerialOutData,CMD_CURRENT_PRODUCED);
												_Sum+=CMD_CURRENT_PRODUCED;

												temp=_CurrentValue>>16;

												_Sum+=temp;
	
												OSQIntPost(SerialOutData,temp);

												temp=_CurrentValue>>8;
												_Sum+=temp;

												OSQIntPost(SerialOutData,temp);

												temp=_CurrentValue;
												_Sum+=temp;

												OSQIntPost(SerialOutData,temp);
												
												OSQIntPost(SerialOutData,_Sum);

												OSQAccept(&temp,SerialOutData);

												SERIAL_DIRECTION_CTRL=1;
										//		for(i=0;i<10000;i++);
												
												_BufferIndex=0;

												_ResendBuffer[_BufferIndex]=temp;

												TB8=1;

			    								SBUF = temp;
											}
											continue;
									
			case 	CMD_NO_ORDER		:	OSQPend(&temp,SerialInData,0);      	//    接收数据             
        									_Sum += temp;

											OSQPend(&temp,SerialInData,0);      	//    接收数据             
        									_Sum += temp;

											OSQPend(&temp,SerialInData,0);      	//    接收数据             
        									_TempValue=temp;
											_Sum += temp;
										
											OSQPend(&temp,SerialInData,0);      	//    接收数据     

											SM2=1;
        
        									if(temp==_Sum)
											{
												if(!_Flag_State_TaskAccepted)
												{
													_TargetValue=0;

													for(temp=0;temp<6;temp++)
													{
														Write728x(temp,0xFF);
													}
													DispNum(0,_TargetValue);
	
													_CurrentValue=0;
											
													for(temp=6;temp<12;temp++)
													{
														Write728x(temp,0xFF);
													}

													DispNum(1,_CurrentValue);
												
													_ProducedPersent=0;
												
													DispNum(2,_ProducedPersent);

													_Flag_DispChanged=1;

													_Flag_CounteEnable=0;
													_Flag_State_TaskAccepted=0;
													_Flag_State_Producing=0;
													_Flag_State_Finish=0;
												}
												continue;
											}
											//else
											//{
											//	goto CURRENT_STATE_RETURN;	
											//}
											continue;

			default						:	//goto CURRENT_STATE_RETURN;
											continue;	
		}

        //OSSemPend(SEM_SendBuffer,0);
		
												
    }
}


/*********************************************************************************************************
** 函数名称: BH_Counter
** 功能描述: 一个任务,Counter的BottomHalf函数
**
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: OSSemCreate(),DispStr(),OSWait(),DispClr(),OSSemPost(),
**
** 作 者: 龚树强
** 日 期: 2004年10月15日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
*******************************************************************************************************/
       	void BH_Counter(void)	
{

    for(;;)
	{	
		EA=0;
		EX0=1;
		IE0=0;
		EA=1;

 		while(!_Flag_CounterFallDown);                              		//_Flag_CounterFallDown=1时继续
		_Flag_CounterFallDown=0;

		do
		{
			if(_Flag_CounterTimeOut)										//超时时可以推出
				break;
		}while(!_Counter);													//高电平时也可以推出

		if(!_Flag_CounterTimeOut)											//_Flag_CounterFallDown=1时表明低电平维持时间比最小值大
			continue;														//可以继续往下,否则重新开始
		_Flag_CounterTimeOut=0;
		
		if(!Flag_State_Finish)
		{
			if(_Flag_CounteEnable)
			{
				_CurrentValue++;
				_ProduceSpeed++;

				_Flag_DispChanged=1;

				_Flag_State_Producing=TRUE;										//工作状态

				_IdleTimer=180;
			}
		}
		else
		{
			_Flag_State_Producing=FALSE;
			_Flag_State_Finish=TRUE;

			_Flag_State_TaskAccepted=FALSE;


		}
		
		EX0=0;

		do
		{
			while(!_Counter);												//低电平时维持,高电平时继续往下

			TH0=TIME_THREADHOLD_HIGH>>8;
			TL0=TIME_THREADHOLD_HIGH;

			TR0=1;
			ET0=1;
	
		
			do
			{
				if(_Flag_CounterTimeOut)									//超时时可以推出
					break;
			}while(_Counter);												//低电平时也可以推出

			if(!_Flag_CounterTimeOut)										//_Flag_CounterFallDown=1时表明高电平维持时间比最小值大
				continue;													//可以继续往下,否则重新开始
			_Flag_CounterTimeOut=0;

		}while(!_Counter);
		
    }   
}




/*********************************************************************************************************
** 函数名称: ExecuteFunc
** 功能描述: 一个任务,后台执行函数
**
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: OSSemCreate(),DispStr(),OSWait(),DispClr(),OSSemPost(),
**
** 作 者: 龚树强
** 日 期: 2004年10月15日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
		void ExecuteFunc(void)
{
	static data uint8  temp;
	uint8 i,j;
	
	

⌨️ 快捷键说明

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