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

📄 at16c554.c

📁 这是一个C51的有关16c554的驱动源码
💻 C
📖 第 1 页 / 共 2 页
字号:
//------------------------------------------------------------------------
#include   "AT16C554.H"
//--------------------------------------------------------------------------------------------------
code  		Uint  	PORTAddrTABLE[PortNumber]={STARTADDR_SERIAL1,
											   STARTADDR_SERIAL2,
											   STARTADDR_SERIAL3,
											   STARTADDR_SERIAL4};          //串口端口地址映射表


xdata 		TCommHandle		CommDevice[PortNumber];
sbit 		reset_16c554 = 	P1^4;			                                //ST16C554 复位控制线
//---------------------------------------------------------------------------------------------------
//  Define Private Faction
//-----------------------------------------------------------------------------------------------------

bool ReadPortRecBuf(uchar Port,Uchar *Byte);
bool WritePortSendBuf(uchar Port,Uchar Byte);
void Port_open(Uchar PortID,Uint Baud);

//-------------------------------------------------------------------------
//  Define Public Faction
//-------------------------------------------------------------------------

bool Init_16c554(void);
void Port_open(Uchar PortID,Uint Baud);
//void Port_open(Uchar PortID,int Baud,Uchar DataBitNum,Uchar Parit,Uchar Stop);
void Port_close(Uchar PortID);
int  Port_Receive(Uchar PortID,void *Buffer,int Count);
int  Port_Send(Uchar PortID,void *Buffer,int Count);



//---------------------------------------------------------------------------------------------
//  Public Faction Code
//---------------------------------------------------------------------------------------------




//---------------------------------------------------------------------------------------------
//  初始化ST16C554
//---------------------------------------------------------------------------------------------
bool Init_16c554(void)
{
uchar xdata *ptr;
uchar i=Init_16c554_Count;
bool Result=false;

while(--i) 									 				// 复位10次不成功,则返回出错
	{
	  _nop_();
	  reset_16c554 = FREE_RESET;
	  ms_delay(5);
	  reset_16c554 = RESET;		        	              	// 复位16C554
	  ms_delay(10);				                          	// 延时1毫秒
	  reset_16c554 = FREE_RESET;
	  ms_delay(10);
	  ptr = STARTADDR_SERIAL1+SPR;	    	              	// 通道1临时寄存器
	  *ptr = 0xaa;				                          	// 写测试值到临时寄存器
	  _nop_();
	  _nop_();
	  if(*ptr == 0xaa) 
	  	{
	  	   Result=true;
	  	   break;
	  	};//end if
	};//end while
for(i=0;i<PortNumber;i++) CommDevice[i].RAMAddress_Map=PORTAddrTABLE[i];

return Result;
}
//---------------------------------------------------------------------------------------------
//    打开串口    
//---------------------------------------------------------------------------------------------
void Port_open(Uchar PortID,Uint Baud)
{
uchar xdata *ptr;

ptr = CommDevice[PortID].RAMAddress_Map;		                          				// 取端口的基地址
*(ptr+LCR) = LCR_DIV_EN;																// 允许发送波特率
*(ptr+DLM) = (uchar)(Baud>>8);
*(ptr+DLL) = (uchar)Baud;		                      									// 设置默任波特率为19200
*(ptr+LCR) = LCR_WORD_LEN8|LCR_STOP_LEN1;               								// 设置字长为8,1个停止位,无校验位
*(ptr+FCR) = FIFO_EN|FIFO_TRI_LEVEL_1|FIFO_CLEAR_RCVR|FIFO_CLEAR_XMIT|FIFO_DMA_MODE;  	// 设置FIFO 控制寄存器
*(ptr+IER) = IER_TRANSMITHOLD_INT|IER_RECEIVEHOLD_INT;									// 设置中断屏蔽寄存器
*(ptr+MCR) = MCR_INTX_EN;																// 允许中断引脚输出

if(PortID==0)	EX0 = true;							// 开外部中断0(通道1中断)
if(PortID==1)	EX1 = true;							// 开外部中断1(通道2中断)
if(PortID==2)	EX2 = true;							// 开外部中断2(通道3中断)
if(PortID==3)	EX3 = true;							// 开外部中断3(通道4中断)

CommDevice[PortID].CommReceive_Head=0;
CommDevice[PortID].CommReceive_Trail=0;
CommDevice[PortID].CommSend_Head=0;
CommDevice[PortID].CommSend_Trail=0;
CommDevice[PortID].Comm_Stu=SERIAL_STU_FREE;
}
//---------------------------------------------------------------------------------------------
//       关闭指定的端口
//---------------------------------------------------------------------------------------------
/*void Port_close(Uchar PortID)
{
uchar xdata *ptr;

ptr = CommDevice[PortID].RAMAddress_Map;			// 取端口的基地址
*(ptr+LCR) = LCR_DIV_Dis;							// 禁止发送波特率
*(ptr+MCR) = MCR_INTX_Dis;							// 允许中断引脚输出

CommDevice[PortID].CommReceive_Head=0;
CommDevice[PortID].CommReceive_Trail=0;
CommDevice[PortID].CommSend_Head=0;
CommDevice[PortID].CommSend_Trail=0;
CommDevice[PortID].Comm_Stu=SERIAL_STU_FREE;

if(PortID==0)	EX0 = false;						// 关外部中断0(通道1中断)
if(PortID==1)	EX1 = false;						// 关外部中断1(通道2中断)
if(PortID==2)	EX2 = false;						// 关外部中断2(通道3中断)
if(PortID==3)	EX3 = false;						// 关外部中断3(通道4中断)
}*/
//--------------------------------------------------------------------------------------------------
  //功  能:从串口中接收数据
  //返回值:从串口中接收到的数据个数
  //参  数:
  //        Buffer:接收数的缓冲区
  //        Count: 想从串口缓冲区中接收数据个数
//--------------------------------------------------------------------------------------------------
/*int Port_Receive(uchar Port,register void *Buffer,int Count)
{
Uchar Size=0;

if(Port>PortNumber-1)  return Size;

while((Size<Count)&&(ReadPortRecBuf(Port,Buffer)))
     {
	   Size++;
	   Buffer=Buffer+1;
	 };//end while 
return Size;
}*/
//--------------------------------------------------------------------------------------------------
  //功  能:往串口发送数据
  //返回值:已发送的数据个数
  //参  数:
  //        Buffer:发送数据的缓冲区
  //        Count: 想从串口发送数据的个数
//--------------------------------------------------------------------------------------------------
int Port_Send(uchar Port,register void *Buffer,int Count)
{
uchar  			i=0;
Uchar  			Size=0;
uchar xdata 	*ptr;

if(Port>PortNumber-1)  return Size;

ptr = CommDevice[Port].RAMAddress_Map;																			// 取端口基地址

while(Size<Count)
     {
		if(WritePortSendBuf(Port,*((Uchar *)Buffer)))
		  {
	 		Size=Size+1;
	   		Buffer=Buffer+1;
		  };//end if
		if(CommDevice[Port].Comm_Stu==SERIAL_STU_FREE)
		  {
			for(i=0;(i<FIFO_SIZE)&&(CommDevice[Port].CommSend_Head!=CommDevice[Port].CommSend_Trail);i++)
				{	
				  CommDevice[Port].CommSend_Trail=(CommDevice[Port].CommSend_Trail+1)%CommMaxSendBuffer;
				  *(ptr+THR) = CommDevice[Port].CommSendBuffer[CommDevice[Port].CommSend_Trail];	     		// 发送数据
				};//end for
			CommDevice[Port].Comm_Stu = SERIAL_STU_BUSY;
		  };//end if
	 };//end while
return Size;
}
//----------------------------------------------------------------------------------------------------



//----------------------------------------------------------------------------------------------------
//私有函数
//----------------------------------------------------------------------------------------------------
  //功  能:从串口接收缓冲区中取得数据 
  //返回值:

⌨️ 快捷键说明

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