📄 at16c554.c
字号:
//------------------------------------------------------------------------
#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 + -