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

📄 asyn_422.c

📁 这是一个C51写的异步串行口的驱动
💻 C
字号:
//------------------------------------------------------------------------------
#include   "Asyn_422.H"

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


//------------------------------------------------------------------------------
  //Comm Public:公有通用函数与成员
//------------------------------------------------------------------------------
    int    CommReceive(void *Buffer,int Count);
    int    CommSend(void *Buffer,int Count);
    bit    CommOpen(int Baud,Uchar DataBitNum,Uchar Parit,Uchar Stop,Uchar Crystal);   
    bit    CommClose(void);
//------------------------------------------------------------------------------
  //Comm Private:私有函数和成员
//------------------------------------------------------------------------------
    void    SetCommBaud(Uchar TMOD_in,Uchar PCON_in,Uchar TH1_in,Uchar TL1_in);
	bool	ReadReceiveBuf(Uchar *Byte);
	bool	WriteSendBuf(Uchar Byte);

	xdata  Uchar  CommReceiveBuffer[CommMaxReceiveBuffer];
	xdata  Uchar  CommSendBuffer[CommMaxSendBuffer];
	Uchar  CommReceive_Head;
	Uchar  CommReceive_Trail;
	Uchar  CommSend_Head;
	Uchar  CommSend_Trail;
	bool   TXDIsWorked;
//------------------------------------------------------------------------------
  //函数实现部分
//------------------------------------------------------------------------------
  //功  能:串口中断入口函数
  //返回值:
  //参  数: 
//------------------------------------------------------------------------------
void CommEvent(void) interrupt 4 //using 3                             
{
if(RI)
  {
	RI=0;
    CommReceiveBuffer[CommReceive_Head]=SBUF;
	if(((CommReceive_Head+1)%CommMaxReceiveBuffer)!=CommReceive_Trail)
       CommReceive_Head=(CommReceive_Head+1)%CommMaxReceiveBuffer;
   return;
  };//end if
if(TI)
  {
    TI=0;
	if(CommSend_Trail==CommSend_Head)
		{
	      _nop_();
	      _nop_();
	      _nop_();
          MAX498_DE=false; //Comm Send Data Disable 
	      _nop_();
	      _nop_();
	      _nop_();
		  TXDIsWorked=false;
          return; 
	    };//end if
	CommSend_Trail=(CommSend_Trail+1)%CommMaxSendBuffer;
	SBUF=CommSendBuffer[CommSend_Trail];
	TXDIsWorked=true;
  };//end if
}
//------------------------------------------------------------------------------
  //功  能:从串口接收缓冲区中取得数据 
  //返回值:
  //         true:   从缓冲区中成功取得数据
  //         false:  从缓冲区中无法取得数据
  //参  数: *Byte:从缓冲区中取得数据返回
//------------------------------------------------------------------------------
bool ReadReceiveBuf(Uchar *Byte)
{
if(CommReceive_Trail==CommReceive_Head)  return false;

*Byte=CommReceiveBuffer[CommReceive_Trail];
CommReceive_Trail=(CommReceive_Trail+1)%CommMaxReceiveBuffer;

return true;
}
//------------------------------------------------------------------------------
  //功  能:往串口发送缓冲区中写数据 
  //返回值:
  //         true:   往缓冲区中写数据成功
  //         false:  从缓冲区中写数据失败
  //参  数: Byte:  往缓冲区中写入的数据
//------------------------------------------------------------------------------
bool WriteSendBuf(Uchar Byte)
{
if((CommSend_Head+1)%CommMaxSendBuffer==CommSend_Trail) return false;

CommSend_Head=(CommSend_Head+1)%CommMaxSendBuffer;
CommSendBuffer[CommSend_Head]=Byte;

return true;
}
//------------------------------------------------------------------------------
  //功  能:设置串口波特率
  //返回值:
  //参  数: 
  //       TMOD_in:定时器模式输入;
  //       PCON_in:电源状态控制字输入;
  //       TH1_in: 定时计数器高位;
  //       TL1_in: 定时计数器低位;
//------------------------------------------------------------------------------
void SetCommBaud(Uchar TMOD_in,Uchar PCON_in,Uchar TH1_in,Uchar TL1_in)
{
TMOD_Map=(TMOD_Map&Time0_MOD)|TMOD_in;
SetTMOD(TMOD_Map);
PCON=PCON_in;
TH1=TH1_in;
TL1=TL1_in;
}
//------------------------------------------------------------------------------
  //功  能:打开串口
  //返回值:
  //参  数: 
  //       Baud:      串口波特率;(50,110,600,1200,2400,4800,9600,19200,38400)
  //       DataBitNum:数据位数;  (7,8,9,10)
  //       Parit:     奇偶校验位;(EvenParity,OddParity)
  //       Stop:      停止位;    (1,2)
  //       Crystal:    晶振频率;  (Cry6M,Cry12M)
//------------------------------------------------------------------------------
bit CommOpen(int Baud,Uchar DataBitNum,Uchar Parit,Uchar Stop,Uchar Crystal)
{
DataBitNum=NULL;
Stop=NULL;

SCON=0x50;

CommReceive_Head=0;
CommReceive_Trail=0;
CommSend_Head=0;
CommSend_Trail=0;
TXDIsWorked=false;
//set Comm Model
if(Parit==NoneParity) SCON=0x50;
if(Parit!=NoneParity) SCON=0xD0;

//Set Comm Baud
/*if(Crystal==Cry5_5296M)
  {
    if(Baud==   55) SetCommBaud(0x10,0x00,0xFE,0xEB);
    if(Baud==  110) SetCommBaud(0x20,0x00,0x7D,0x7D); 
    if(Baud==  600) SetCommBaud(0x20,0x00,0xE8,0xE8);
    if(Baud== 1200) SetCommBaud(0x20,0x00,0xF4,0xF4);
    if(Baud== 2400) SetCommBaud(0x20,0x00,0xFA,0xFA);
    if(Baud== 4800) SetCommBaud(0x20,0x00,0xFD,0xFD);    
    if(Baud== 9600) SetCommBaud(0x20,0x80,0xFD,0xFD);
    if(Baud==19200) SetCommBaud(0x20,0x80,0xFE,0xFE);
  };//end if 
//if(Crystal==Cry11_0592M)
//  {
//    if(Baud==   110) SetCommBaud(0x10,0x00,0xFE,0xEB);
//    if(Baud==   600) SetCommBaud(0x20,0x00,0xD0,0xD0); 
//    if(Baud==  1200) SetCommBaud(0x20,0x00,0xE8,0xE8);
//    if(Baud==  2400) SetCommBaud(0x20,0x00,0xF4,0xF4);
//    if(Baud==  4800) SetCommBaud(0x20,0x00,0xFA,0xFA);
//    if(Baud==  9600) SetCommBaud(0x20,0x00,0xFD,0xFD);  
//    if(Baud== 19200) SetCommBaud(0x20,0x80,0xFD,0xFD);
//    if(Baud== 38400) SetCommBaud(0x20,0x80,0xFE,0xFE);
//  };//end if 

if(Crystal==Cry22_1184M)
  {
    if(Baud==   220) SetCommBaud(0x10,0x00,0xFE,0xEB);
    if(Baud==   600) SetCommBaud(0x20,0x00,0xA0,0xA0);
    if(Baud==  1200) SetCommBaud(0x20,0x00,0xD0,0xD0);
    if(Baud==  2400) SetCommBaud(0x20,0x00,0xE8,0xE8);
    if(Baud==  4800) SetCommBaud(0x20,0x00,0xF4,0xF4);
    if(Baud==  9600) SetCommBaud(0x20,0x00,0xFA,0xFA);  
    if(Baud== 19200) SetCommBaud(0x20,0x00,0xFD,0xFD);
    if(Baud== 38400) SetCommBaud(0x20,0x80,0xFD,0xFD);
  };//end if*/

if(Crystal==Cry40M)
  {
    if(Baud==  9600) SetCommBaud(0x20,0x80,0xEA,0xEA);  
    if(Baud== 19200) SetCommBaud(0x20,0x80,0xF5,0xF5);
  };//end if
  //Open Comm
TR1 =1;
ES  =1;
MAX498_DE=false; //Comm Send Data Disable
return ES;
}
//------------------------------------------------------------------------------
  //功  能:关闭串口
  //返回值:
  //参  数: 
//------------------------------------------------------------------------------
/*bit CommClose(void)
{
ES=0; //Close Comm

CommReceive_Head=0;
CommReceive_Trail=0;
CommSend_Head=0;
CommSend_Trail=0;

return ES;
}*/
//------------------------------------------------------------------------------
  //功  能:从串口中接收数据
  //返回值:从串口中接收到的数据个数
  //参  数:
  //        Buffer:接收数的缓冲区
  //        Count: 想从串口缓冲区中接收数据个数
//------------------------------------------------------------------------------
int CommReceive(void *Buffer,int Count)
{
Uchar Size=0;
while((Size<Count)&&(ReadReceiveBuf(Buffer)))
     {
	   Size++;
	   Buffer=Buffer+1;
	 };//end while 
return Size;
}
//------------------------------------------------------------------------------
  //功  能:往串口发送数据
  //返回值:已发送的数据个数
  //参  数:
  //        Buffer:发送数据的缓冲区
  //        Count: 想从串口发送数据的个数
//------------------------------------------------------------------------------
int CommSend(void *Buffer,int Count)
{
Uchar Size=0;

while(Size<Count)
     {
		if(WriteSendBuf(*((Uchar *)Buffer)))
		  {
	 		Size=Size+1;
	   		Buffer=Buffer+1;
          };//end if
	    if(!TXDIsWorked)
          {
             CommSend_Trail=(CommSend_Trail+1)%CommMaxSendBuffer;
	         _nop_();
	         _nop_();
	         _nop_();
             MAX498_DE=true;  //Comm Send Data Enable
	         _nop_();
	         _nop_();
	         _nop_();
	         SBUF=CommSendBuffer[CommSend_Trail];
		     TXDIsWorked=true;
           };//end if
	 };//end while

return Size;
}
//------------------------------------------------------------------------------

⌨️ 快捷键说明

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