📄 main.c
字号:
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 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 + -