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

📄 functionprototype.c

📁 UCOSii for c8051f020
💻 C
📖 第 1 页 / 共 5 页
字号:
// Include File
//****************************************************************************************************************
#include "includes.h"
#define  FUNCTION_GLOBALS
#include "FunctionPrototype.h"

//Automatic Prototypes
//---- 初始化定时器0,作为ucOS-II的系统时钟。
void InitTimer0(void) 
{
    TMOD |= 0x01;    //--------------------------------------------------- 定时器0:模式1(16位定时器),仅受TR0控制
    TH0  = 0xBE;     //-------------------------------- 定义Tick=100次/秒(即0.02秒/次),TH,TL值与CPU的频率有关(20M)
    TL0  = 0xE4;     //-------------------- OS_CPU_C.C中定时器中断响应也要设置,OS_CFG.H中OS_TICKS_PER_SEC也有关系
    ET0=1;           //-------------------------------------------------------------------------------- 允许T0中断
    TR0=1;   
}

/*****************************************************************************************************************
 FUNCTON NAME              : Timer3_Init
 FUNCTION VERSION          :   
 CREATED ON                :
 FUNCTION DESCRIPTION      : configure timer3 register as a delay counter(100MS)
 INPUT PARAMETER           : None
 RETURN VALUE              : None
 MODIFY RECORD             :
****************************************************************************************************************/
void Timer3_Init(void)
{
    TMR3CN = 0x00;         //---------------------------------- Stop Timer3, Clear TF3, use SYSCLK/12 as timebase 
    TMR3RLH = 0x15;
    TMR3RLL = 0x9F;
    TMR3H = 0xff;          //---------------------------------------------------------- set to reload immediately
    TMR3L = 0xff;
    EIE2 = (EIE2 | 0x01);         //---------------------------------------------------- Enable Timer3 interrupts
    TMR3CN |= 0x04;               //---------------------------------------------------------------- start Timer3
}
//---------------------------------------------------------------------------------------------------------------


/*****************************************************************************************************************
 FUNCTON NAME:   Variables_Init
 FUNCTION VERSION:   
 CREATED ON:   
 FUNCTION DESCRIPTION: intialize the port input and output
 INPUT PARAMETER:None
 RETURN VALUE:None
 MODIFY RECORD:
******************************************************************************************************************/
void Variables_Init(void)
{
	PcTx_Number = 0; 
	A_MODIFY_TIME = 0;
    L_MODIFY_TIME = 0;
    T_MODIFY_TIME = 0; 
    TIME = 0;

    FLG_ActiveSendToPc = FALSE;

//TL16C554初始化参数
	RevvCharNumber_A = 0;
	RevvCharNumber_B = 0;
	RevvCharNumber_C = 0;    
	RevvCharNumber_D = 0;
	
	RS485_CanSend = 1;
	RS485_CanRevv = 1;
	ErrRS485Number = 0;	
	RS485_SendNew = 1;
	SuudRevvRS485 = 1;
}
//-----------------------------------------------------------------------------------------------------------------



/******************************************************************************************************************
 FUNCTON NAME:   SYSCLK_Init
 FUNCTION VERSION:  
 CREATED ON:   
 FUNCTION DESCRIPTION: This routine initializes the system clock to use an 20MHz crystal as its clock source.
 INPUT PARAMETER: None
 RETURN VALUE: None
 MODIFY RECORD:
******************************************************************************************************************/	

void SYSCLK_Init (void)
{
   int i;      //------------------------------------------------------------------------------------ delay counter

   OSCXCN = 0x67;       //---------------------------------------------------------- start external oscillator with
                                       //------------------------------------------------------------ 20MHz crystal

   for (i=0; i < 256; i++) ;           //------------------------------------------ XTLVLD blanking interval (>1ms)

   while (!(OSCXCN & 0x80)) ;          //------------------------------------------ Wait for crystal osc. to settle

   OSCICN = 0x88;                      //------------------------------------- select external oscillator as SYSCLK
                                       //------------------------------------------ source and enable missing clock
                                       //----------------------------------------------------------------- detector
}

//-----------------------------------------------------------------------------------------------------------------


/******************************************************************************************************************
 FUNCTON NAME:   PORT_Init
 FUNCTION VERSION:   
 CREATED ON:   
 FUNCTION DESCRIPTION: intialize the port input and output
 INPUT PARAMETER:None
 RETURN VALUE:None
 MODIFY RECORD:
******************************************************************************************************************/
void PORT_Init(void)
{
    XBR0 = 0x05;       //--------------------------------------------------------------------- Enable UART0 , SMBUS
    XBR1 = 0x14;       //------------------------------------------------------------------------- Enable INT0,INT1
	XBR2   = 0x42;	   //------------------------------------------------- Enable weak pull-up , csrossbar , EMIFLE

	P0MDOUT = 0xff; 	 //------------------------------------------------- P0口为漏极开路输入
 	P1MDIN  = 0xff;		// -------------------------------------------------P1口
	P1MDOUT = 0xff;		//-------------------------------------------------推挽方式输出
	P2MDOUT = 0xff;		//------------------------------------------------- p2口为推挽输出,作为数据总线
	P3MDOUT = 0xff;		//------------------------------------------------- P3.3 P3.4为输出口,其余口为输入口
	P74OUT  = 0xff;	//-------------------------------------------------推挽方式输出

	P4 = 0x00;
	P5 = 0x00;
	P6 = 0x00;
	P7 = 0x00;
	EMI0CF  = 0x04;	//
}
//----------------------------------------------------------------------------------------------------------------

/*****************************************************************************************************************
 FUNCTON NAME:   UART0_Init
 FUNCTION VERSION:   
 CREATED ON:   
 FUNCTION DESCRIPTION: Configure the UART using Timer1, for <baudrate> and 8-N-1.
 INPUT PARAMETER: 
 RETURN VALUE: 
 MODIFY RECORD:
*****************************************************************************************************************/	
void UART0_Init (void)
{
   SCON0  = 0x50;        //------------------------------------------------- SCON0: mode 1, 8-bit UART, enable RX
   TMOD   = 0x20;        //-------------------------------------------------- TMOD: timer 1, mode 2, 8-bit reload
   TH1    = -(SYSCLK/BAUDRATE/16);     //----------------------------------- set Timer1 reload value for baudrate
   TR1    = 1;                         //----------------------------------------------------------- start Timer1
   CKCON |= 0x10;                      //---------------------------------------- Timer1 uses SYSCLK as time base
   PCON  |= 0x80;                      //------------------------------------------------------------- SMOD00 = 1
   //TI0    = 1;                       //----------------------------------------------------- Indicate TX0 ready
   IP = 0x10;					       //--------------------------------------------------------- 串口为高优先级
   ES0 = 1;                            //------------------------------------------------- enable UART interrupts
}

//-----------------------------------------------------------------------------------------------------------------

/******************************************************************************************************************
 FUNCTON NAME             : init_devices
 FUNCTION VERSION         :   
 CREATED ON               :   
 FUNCTION DESCRIPTION     : 设置硬件寄存器的初始值。
							还有其他的与硬件相关的初始化也可以放在这里。
 INPUT PARAMETER          : None
 RETURN VALUE             : None
 MODIFY RECORD            :
******************************************************************************************************************/


void Hardware_Init(void)
{   
    //---- 禁止看门狗
    WDTCN = 0xde;	    
	WDTCN = 0xad;

    SYSCLK_Init (); //---------------晶振初始化
    PORT_Init ();	//---------------单片机端口初始化
	UART0_Init ();  //---------------串口初始化
	//TL16C554复位,并初始化
	RSSET_554 = 1;
	DelayUS(2);
	RSSET_554 = 0;
	DelayMS(300);
	TL16554_init();//---------------串口芯片TL16C554C初始化

	Timer3_Init();	//----------------定时器3初始化
	Timer2_init();	//----------------定时器2初始化
	INTER_Init();
}

//----------------------------------------------------------------------------------------------------------------


/******************************************************************************************************************
 FUNCTON NAME             : Table_TilitStatus
 FUNCTION VERSION         :   
 CREATED ON               :   
 FUNCTION DESCRIPTION     : 
 INPUT PARAMETER          : None
 RETURN VALUE             : None
 MODIFY RECORD            :
 REMARK                   :                                  _________________ 
            断开延时定时器:   Control Signal:         _____|                 |________________
                                                             ________________________
                               Timer Flag    :        _____|                        |_________
            SoftTimer每100ms中断一次
******************************************************************************************************************/

void Table_TilitStatus(void)
{ 
    //21---- 从正90度到正角度区
	  //注:I_正90度限位  下降沿   
	  //    --->>  置位A_正角度区域  、 清位A_水平区域  、 清位A_负角度区域 
    if(IS_NEG_EDGE(Tilit_Switch,I_T_P90)) 
    {
        SET_STATUS(Tilit_Switch,A_Table_POS);
        CLR_STATUS(Tilit_Switch,A_Table_ZERO);
        CLR_STATUS(Tilit_Switch,A_Table_NEG);
    }
    UPDATE_EDGE(Tilit_Switch,I_T_P90);
    
    //22---- 水平位置位(抗齿轮间隙扰动) A_Table_POS(正角度区域标志)A_Table_NEG(负角度区域标志)条件避免再次置位
      //注:I_0度限位  上升沿   并且   A_正角度区域标志  &&  V_床体倾斜断开延时定时器 计时到 标志
	  //    --->>   置位A_水平区域  、 清位A_正角度区域  、 清位A_负角度区域 
    if(IS_POS_EDGE(Tilit_Switch,I_T_0))
    {
        if(CHECK_STATUS(Tilit_Switch,A_Table_POS) && CHECK_STATUS(Soft_Timer[Tilit_Timer],Timer_Flag))
        {
            SET_STATUS(Tilit_Switch,A_Table_ZERO);
            CLR_STATUS(Tilit_Switch,A_Table_POS);
            CLR_STATUS(Tilit_Switch,A_Table_NEG);
        }
    }
      //注:I_0度限位  下降沿   并且   A_负角度区域标志  &&  V_床体倾斜断开延时定时器 计时到 标志
	  //    --->>   置位A_水平区域  、 清位A_正角度区域  、 清位A_负角度区域 
    if(IS_NEG_EDGE(Tilit_Switch,I_T_0))
    {
        if(CHECK_STATUS(Tilit_Switch,A_Table_NEG) && CHECK_STATUS(Soft_Timer[Tilit_Timer],Timer_Flag))
        {
            SET_STATUS(Tilit_Switch,A_Table_ZERO);
            CLR_STATUS(Tilit_Switch,A_Table_POS);
            CLR_STATUS(Tilit_Switch,A_Table_NEG);
        }
    }


    //---- 从零度到正角度区(置标志位)床体位置是其它位置标志的条件(加入 I_T_0 的常闭条件用以防止在水平限位开关有效时搬动床体运动手柄对床体旋转的扰动)
    //注:A_水平区域  &&  !I_0度限位开关  && Q_正倾
	  //    --->>     置位A_正角度区域  、 清位A_水平区域 
	if(CHECK_STATUS(Tilit_Switch,A_Table_ZERO) && !CHECK_STATUS(Tilit_Switch,I_T_0))
    {
        if(CHECK_STATUS(Local_Flag_1,V_Tilit_EnTilit))
        {
            if(IS_POS_EDGE(Control_1,C_T_TilitPOS))
            {
                SET_STATUS(Tilit_Switch,A_Table_POS);
                CLR_STATUS(Tilit_Switch,A_Table_ZERO);
            }
        }
        else if(CHECK_STATUS(Output_1,Q_T_TilitPOS))
             {
                 SET_STATUS(Tilit_Switch,A_Table_POS);
                 CLR_STATUS(Tilit_Switch,A_Table_ZERO);
             }
        
    }
    UPDATE_EDGE(Control_1,C_T_TilitPOS);
  
    //---- 从零度到负角度区
	  //注:A_水平区域  &&  !I_0度限位开关  && Q_负倾
	  //    --->>     置位A_负角度区域  、 清位A_水平区域 
    if(CHECK_STATUS(Tilit_Switch,A_Table_ZERO) && !CHECK_STATUS(Tilit_Switch,I_T_0) && CHECK_STATUS(Output_1,Q_T_TilitNEG))
    { 
        SET_STATUS(Tilit_Switch,A_Table_NEG);
        CLR_STATUS(Tilit_Switch,A_Table_ZERO);  
    }


    //---- 到限位位置清区域位置标志位
	  //注:I_负90度限位 || I_正90度限位 
	  //    --->>    清位A_正角度区域  、 清位A_负角度区域 
    if(CHECK_STATUS(Tilit_Switch,I_T_N90) || CHECK_STATUS(Tilit_Switch,I_T_P90))
    {
         CLR_STATUS(Tilit_Switch,A_Table_NEG);
         CLR_STATUS(Tilit_Switch,A_Table_POS);
    }
     
    //27--从负90度到达负角度区 
       //注:I_负90度  下降沿
	   //    --->>    置位A_负角度区域  、 清位A_正角度区域 
    if(IS_NEG_EDGE(Tilit_Switch,I_T_N90))
    {
        SET_STATUS(Tilit_Switch,A_Table_NEG);
        CLR_STATUS(Tilit_Switch,A_Table_POS);
    }
    UPDATE_EDGE(Tilit_Switch,I_T_N90);
    
    //69--PHILIPS控制台负倾允许在水平位切换;床体在水平位置时,逆时针运动命令的上升沿则置位负倾允许标志
    if(CHECK_STATUS(Local_Flag_2,V_GIM_PMS))
    {
        if(IS_POS_EDGE(Control_1,C_T_TilitNEG))
        {
            if(CHECK_STATUS(Tilit_Switch,A_Table_ZERO))
            {
                SET_STATUS(Local_Flag_1,V_Tilit_EnTilit);
            }
            
        }
        UPDATE_EDGE(Control_1,C_T_TilitNEG);

        if(!CHECK_STATUS(Tilit_Switch,A_Table_ZERO))
        {
            CLR_STATUS(Local_Flag_1,V_Tilit_EnTilit);
        }
      
    }
}
//---------------------------------------------------------------------------------------------------------------



/****************************************************************************************************************
 FUNCTON NAME              : Table_TilitExecute
 FUNCTION VERSION          :   
 CREATED ON                :   
 FUNCTION DESCRIPTION      : 
 INPUT PARAMETER           : 
 RETURN VALUE              : 
 MODIFY RECORD             :
*****************************************************************************************************************/ 
void Table_TilitExecute(void)
{
    //1--正转输出控制
    //注:C_正倾 && !C_负倾  &&  !Q_负倾    
	//    --->>   启动 Q_正倾
    if(CHECK_STATUS(Control_1,C_T_TilitPOS) && !CHECK_STATUS(Control_1,C_T_TilitNEG) && !CHECK_STATUS(Output_1,Q_T_TilitNEG))
    {
        SET_STATUS(Output_1,Q_T_TilitPOS);

⌨️ 快捷键说明

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