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

📄 main.c

📁 基于C8051F310的485集线器
💻 C
字号:
/***************************************************************************
** 文 件 名:MAIN.C
** 编 写 者:
** 编写日期:2008年9月16日
** 简要描述:
** 修改记录:
** 版    本:
***************************************************************************/

#include "C8051F310.h"
#include <rtx51tny.h>  


/***************************************************************************
函数名称:PCA_Init()
简要描述:初始化PCA模块,PCA0-5均配置为边缘捕捉(上升沿和下降沿)
		  Called from the Init_Device() function
输入:    无        // 输入参数说明,包括每个参数的作用、取值说明及参数间关系
输出:    无        // 输出参数的说明, 返回值的说明
修改日志:
***************************************************************************/
void PCA_Init()
{
    PCA0CN    = 0x40;
    PCA0MD    &= ~0x40;
    PCA0MD    = 0x00;
    PCA0CPM0  = 0x30;
    PCA0CPM1  = 0x30;
    PCA0CPM2  = 0x30;
    PCA0CPM3  = 0x30;
    PCA0CPM4  = 0x30;

}

//void Timer_Init()
//{
//    TMR3CN    = 0x04; // time3
//}

/***************************************************************************
函数名称:Port_IO_Init()
简要描述:初始化端口// 函数目的、功能等的描述
输入:    无        // 输入参数说明,包括每个参数的作用、取值说明及参数间关系
输出:    无        // 输出参数的说明, 返回值的说明
修改日志:
***************************************************************************/
void Port_IO_Init()
{
    // P0.0  -  CEX0 (PCA),  Open-Drain, Digital
    // P0.1  -  CEX1 (PCA),  Open-Drain, Digital
    // P0.2  -  Skipped,     Open-Drain, Analog
    // P0.3  -  Skipped,     Open-Drain, Analog
    // P0.4  -  CEX2 (PCA),  Open-Drain, Digital
    // P0.5  -  CEX3 (PCA),  Open-Drain, Digital
    // P0.6  -  CEX4 (PCA),  Open-Drain, Digital
    // P0.7  -  Unassigned,  Open-Drain, Digital

    // P1.0  -  Unassigned,  Open-Drain, Digital
    // P1.1  -  Unassigned,  Open-Drain, Digital
    // P1.2  -  Unassigned,  Open-Drain, Digital
    // P1.3  -  Unassigned,  Open-Drain, Digital
    // P1.4  -  Unassigned,  Open-Drain, Digital
    // P1.5  -  Unassigned,  Open-Drain, Digital
    // P1.6  -  Unassigned,  Open-Drain, Digital
    // P1.7  -  Unassigned,  Open-Drain, Digital
    // P2.0  -  Unassigned,  Open-Drain, Digital
    // P2.1  -  Unassigned,  Open-Drain, Digital
    // P2.2  -  Unassigned,  Open-Drain, Digital
    // P2.3  -  Unassigned,  Open-Drain, Digital

    P0SKIP    = 0x0C;
    XBR1      = 0x45;
}

/***************************************************************************
函数名称:Oscillator_Init()
简要描述:初始化振荡器,使用外部晶振22.118432MHz,晶振频率作为系统时钟
输入:    无        // 输入参数说明,包括每个参数的作用、取值说明及参数间关系
输出:    无        // 输出参数的说明, 返回值的说明
修改日志:
***************************************************************************/
void Oscillator_Init()
{
    int i = 0;
    OSCXCN    = 0x67;
 /*  for (i = 0; i < 3000; i++);  // Wait 1ms for initialization
    while ((OSCXCN & 0x80) == 0);  */
    OSCICN    = 0x83;
}

/***************************************************************************
函数名称:Interrupts_Init()
简要描述:初始化中断
输入:    无
输出:    无
修改日志:
***************************************************************************/
void Interrupts_Init()
{
    EIE1      = 0x90;
    EIP1      = 0x10;
}

// Initialization function for device,
// Call Init_Device() from your main program
/***************************************************************************
函数名称:Init_Device(void)
简要描述:执行总初始化
输入:    无
输出:    无
修改日志:
***************************************************************************/
void Init_Device(void)
{	
	P1=0x00;
    PCA_Init();    
	Port_IO_Init();
    Oscillator_Init();
    Interrupts_Init();
}

/***************************************************************************
函数名称:PCA_ISR (void) interrupt 11
简要描述:PCA中断服务程序
输入:    无
输出:    无
修改日志:
***************************************************************************/
void PCA_ISR (void) interrupt 11 
{
	EA=0;
	if (CCF0)
	{		
		if (CEX0 == 0) // 下降沿跳变
		{
			P2 = 0x01; // 除第一通道RTS1外RTS2~RTS5置低电平
			P2 = 0x01; // 除第一通道RTS1外RTS2~RTS5置低电平
			P2 = 0x01; // 除第一通道RTS1外RTS2~RTS5置低电平
			TXD_BUS = 0;	  // 发送总线跟随跳变
		}
		else		   // 上升沿跳变
		{
			TXD_BUS = 1; // 发送总线跟随跳变
			TXD_BUS = 1; // 发送总线跟随跳变
			TXD_BUS = 1; // 发送总线跟随跳变
			P2 = 0xff; // 所有通道恢复为高电平
		}
		CCF0 = 0;
		CCF4 = 0;
									
	}

	if (CCF1)
	{	
		if (CEX1 == 0) // 下降沿跳变
		{
			P2 = 0x02; // 除第二通道RTS2外RTS1~RTS5置低电平
			P2 = 0x02; // 除第二通道RTS2外RTS1~RTS5置低电平
			P2 = 0x02; // 除第二通道RTS2外RTS1~RTS5置低电平
			TXD_BUS = 0;
		}
		else		   // 上升沿跳变
		{
			TXD_BUS = 1;
			TXD_BUS = 1;
			TXD_BUS = 1;
			P2 = 0xff; // 所有通道恢复为高电平
		}		
		CCF1 = 0;
		CCF4 = 0;
	} 

	if (CCF2)
	{		
		if (CEX2 == 0) // 下降沿跳变
		{
			P2 = 0x04; // 除第一通道RTS1外RTS2~RTS5置低电平
			P2 = 0x04; // 除第一通道RTS1外RTS2~RTS5置低电平
			P2 = 0x04; // 除第一通道RTS1外RTS2~RTS5置低电平
			TXD_BUS = 0;	  // 发送总线跟随跳变
		}
		else		   // 上升沿跳变
		{
			TXD_BUS = 1; // 发送总线跟随跳变
			TXD_BUS = 1; // 发送总线跟随跳变
			TXD_BUS = 1; // 发送总线跟随跳变
			P2 = 0xff; // 所有通道恢复为高电平
		}
		CCF2 = 0;							
		CCF4 = 0;
	}

	if (CCF3)
	{
		if (CEX3 == 0) // 下降沿跳变
		{
			P2 = 0x08; // 除第四通道RTS4外RTS1~RTS5置低电平
			P2 = 0x08; // 除第四通道RTS4外RTS1~RTS5置低电平
			P2 = 0x08; // 除第四通道RTS4外RTS1~RTS5置低电平
			TXD_BUS = 0;
		}
		else		   // 上升沿跳变
		{
			TXD_BUS = 1;
			TXD_BUS = 1;
			TXD_BUS = 1;
			P2 = 0xff; // 所有通道恢复为高电平
		}		
		CCF3 = 0;
		CCF4 = 0;
	}

	if (CCF4)
	{
		if (CEX4 == 0) // 下降沿跳变
		{
			P2 = 0x10; // 除第五通道RTS5外RTS1~RTS5置低电平
			P2 = 0x10; // 除第五通道RTS5外RTS1~RTS5置低电平
			P2 = 0x10; // 除第五通道RTS5外RTS1~RTS5置低电平
			TXD_BUS = 0;
		}
		else		   // 上升沿跳变
		{
			TXD_BUS = 1;
			TXD_BUS = 1;
			TXD_BUS = 1;
			P2 = 0xff; // 所有通道恢复为高电平
		}		
		CCF4 = 0;
	}
 	EA = 1;
}
/***************************************************************************
函数名称:ComDisplay()
简要描述:RXD通道运行状态显示,COMn_OK = 0正常,1不正常
输入:    无
输出:    无
修改日志:
***************************************************************************/
void Com1Display()
{ 
	if(RXD1 == 1)
	{
		COM1_OK = 0;
		PCA0CPM0 = 0x31;	   //开捕捉中断
	}
	else 
	{
		if(COM1_OK == 0)
		{	
	 		os_wait( K_TMO,20,0);	  //延迟约20MS后,判断RXD是否恢复为高电平
	 		if(RXD1 == 1)
	  		{ 
	   			COM1_OK = 0;			  //通道1正常
	   			PCA0CPM0 = 0x31; 
			}
	 		else
	    	{  
				TXD_BUS = 1;
		   		COM1_OK = 1;		 //通道1不正常
		   		PCA0CPM0 = 0x30;	//禁止PCA捕捉模块0中断产生
		   		TXD_BUS = 1;
		   		P2 = 0xff;
		  	}
		 }
	   }
}
/***************************************************************************
函数名称:ComDisplay()
简要描述:RXD通道运行状态显示,COMn_OK = 0正常,1不正常
输入:    无
输出:    无
修改日志:
***************************************************************************/
void Com2Display()
{	
	if(RXD2 == 1)
	{
		COM2_OK = 0;
		PCA0CPM1 = 0x31;	 //开捕捉中断
	}
	else 
	{
	  	if(COM2_OK == 0)
	  	{
	  		os_wait( K_TMO,20,0);
	   		if(RXD2 == 1)
	   		{
	    		COM2_OK = 0;
				PCA0CPM1 = 0x31;
			}
	   		else
	    	{
				TXD_BUS = 1;
		    	COM2_OK = 1;		 
		    	PCA0CPM1 = 0x30;	 //禁止PCA捕捉模块1中断产生
				TXD_BUS = 1;
		    	P2 = 0xff;
		 	}
		 } 
	   }	
}
/***************************************************************************
函数名称:ComDisplay()
简要描述:RXD通道运行状态显示,COMn_OK = 0正常,1不正常
输入:    无
输出:    无
修改日志:
***************************************************************************/
void Com3Display()	
{
 	if(RXD3 == 1)
	{
		COM3_OK = 0;
		PCA0CPM2 = 0x31;
	}
 	else 
	{
	 	if(COM3_OK == 0)
	 	{
	  		os_wait( K_TMO,20,0);
	  		if(RXD3 == 1)
	   		{ 
				COM3_OK = 0;
				PCA0CPM2 = 0x31;
			}
	 		 else
	  	  	{  
				TXD_BUS = 1;
		  	 	COM3_OK = 1;		 
		   		PCA0CPM2 = 0x30;	  //禁止PCA捕捉模块2中断产生
		   		TXD_BUS = 1;
		   		P2 = 0xff;
		 	}
		}	
	   }
}
/***************************************************************************
函数名称:ComDisplay()
简要描述:RXD通道运行状态显示,COMn_OK = 0正常,1不正常
输入:    无
输出:    无
修改日志:
***************************************************************************/
void Com4Display()
{	
 	if(RXD4 == 1)
	{
		COM4_OK = 0;
		PCA0CPM3 = 0x31;
	}
 	else 
   	{
	 	if(COM4_OK == 0)
     	{
	   		os_wait( K_TMO,20,0);
	  		if(RXD4 == 1)
	   		{ 
				COM4_OK = 0;
				PCA0CPM3 = 0x31;	//开捕捉中断
			}
	  		else
	    	{ 
				TXD_BUS = 1;
		  		COM4_OK = 1;		
		  		PCA0CPM3 = 0x30;	//禁止PCA捕捉模块3中断产生
				TXD_BUS = 1;
		  		P2 = 0xff;		  		
		 	}
		}	
	 }
}
/***************************************************************************
函数名称:ComDisplay()
简要描述:RXD通道运行状态显示,COMn_OK = 0正常,1不正常
输入:    无
输出:    无
修改日志:
***************************************************************************/	
void Com5Display()
{	
 	if(RXD5 == 1)
	{
		COM5_OK = 0;
		PCA0CPM4 = 0x31;
	}
 	else 
	{
	 	if(COM5_OK == 0)
	 	{
	  		os_wait( K_TMO,20,0);
	  		if(RXD5 == 1)
	   		{
	    		PCA0CPM4 = 0x31; 
				COM5_OK = 0;
			}
	  		else
	    	{  
				TXD_BUS = 1;
		   		COM5_OK = 1; 		
		   		PCA0CPM4 = 0x30;	 //禁止PCA捕捉模块4中断产生
		   		TXD_BUS = 1;
		   		P2 = 0xff;
	     	}
  	    }
	}
}
/***************************************************************************
函数名称:Task0()
简要描述:任务0,初始化,建立任务1,2
输入:    无
输出:    无
修改日志:
***************************************************************************/
void Task0() _task_ 0
{ 
	EA=0;
	Init_Device();
	EA = 1;	
    os_create_task(1);
    os_create_task(2);
	os_create_task(3);
	os_create_task(4);
	os_create_task(5);
	os_create_task(6);
	os_delete_task(0);
}
/*******************任务1 通道状态灯显示****************************/
void Task1() _task_ 1
{  while(1)
 {
 Com1Display();
  }
}
/*******************任务2 通道状态灯显示****************************/
void Task2() _task_ 2
{  while(1)
 {
 Com2Display();
  }
}
/*******************任务3 通道状态灯显示****************************/
void Task3() _task_ 3
{  while(1)
 {
 Com3Display();
  }
}
/*******************任务4 通道状态灯显示****************************/
void Task4() _task_ 4
{  while(1)
 {
 Com4Display();
  }
}
/*******************任务5 通道状态灯显示****************************/
void Task5() _task_ 5
{  while(1)
 {
 Com5Display();
  }
}
/*******************任务6 系统状态灯显示****************************/
void Task6() _task_ 6
{ 	
  while(1)
  {
    os_wait( K_TMO,500,0);   //延时500MS 		
	SYS_RUNNING = ~SYS_RUNNING;	
	}
}

⌨️ 快捷键说明

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