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

📄 serial.lst

📁 LCD及键盘、RS232通信控制源代码、采用keil c51环境编译
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V6.14  SERIAL                                                                 07/15/2005 09:38:51 PAGE 1   


C51 COMPILER V6.14, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN .\Serial.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\Serial.C DEBUG OBJECTEXTEND

stmt level    source

   1          /*********************************************************************************
   2          *                                                                                *
   3          *	FileName:	Serial.c                                                         *
   4          *	Function:	serial port functions                                            *
   5          *	SystemName:	NDS18000-BSC                                                     *
   6          *	CPU:		ATMEL AT89C52                                                    *
   7          *	Startup:	14/Oct/2002                                                      *
   8          *	Author:		XuYiBo                                                           *
   9          *                                                                                *
  10          *********************************************************************************/
  11          #include <AT89X52.H>
  12          #include <intrins.h>
  13          
  14          #include "NDSBSCUI.H"
  15          #include "Serial.h"
  16          #include "General.h"
  17          
  18          #include "display.h"
  19          unsigned char idata UART_TransBuffer[UARTBUFFERLEN_TX];				//串口发送缓冲区(存放要求收发信机应答的数据幀)
  20          unsigned char idata UART_RcvBuffer[UARTBUFFERLEN_RX];
  21          
  22          unsigned char idata *UARTTransHead;
  23          unsigned char idata *UARTTransTail;
  24          unsigned char idata *UARTTransFrame;
  25          unsigned char idata *UARTRcvHead;
  26          unsigned char idata *UARTRcvTail;
  27          unsigned char idata *UARTRcvFrame;
  28          
  29          unsigned char data ucAckTimeout;	//应答计时器
  30          unsigned char data ucRcvLen;		//幀长度,不包括STX和ETX
  31          unsigned char data ucRcvCheckSum;	//用于计算接收到的数据幀的校验和
  32          
  33          unsigned char data ucNoAckCount;	//重发次数
  34          
  35          unsigned char bdata SerialFlag;
  36          sbit STXRcvFlag = SerialFlag^0;		//TRUE->已经接收到STX,允许降数据放入接收缓冲区
  37          sbit EnableTran = SerialFlag^1;		//TRUE->允许发送数据
  38          sbit StopTran	= SerialFlag^2;		//TRUE->已经停止发送数据
  39          sbit ConnectFlag= SerialFlag^3;		//TRUE->和收发信机连接成功,FALSE->和收发信机连接失败;
  40          
  41          extern UISema	xdata UISemaphore;	//define in NDSBSCUI.C
  42          extern UIMemory	xdata UIDataArea;	//define in NDSBSCUI.C
  43          
  44          unsigned char code ucACK[]=		{STX,ACK_FRAME,ETX,0};
  45          unsigned char code ucNAK[]=		{STX,NAK_FRAME,ETX,0};
  46          unsigned char code ucREQ[]=		{STX,REQ_FRAME,ETX,0};
  47          unsigned char code ucUpfreq[]=	{STX,COMM_FRAME,UPFREQ_COMM,0};
  48          unsigned char code ucDwnfreq[]=	{STX,COMM_FRAME,DWNFREQ_COMM,0};
  49          /******************************************************************************
  50          *                                                                             *
  51          *	Initialize serial receive&transfer function                               *
  52          *                                                                             *
  53          ******************************************************************************/
  54          void InitSerial(void)
  55          {
C51 COMPILER V6.14  SERIAL                                                                 07/15/2005 09:38:51 PAGE 2   

  56   1      	UARTTransHead	= UART_TransBuffer;
  57   1      	UARTTransTail	= UART_TransBuffer;
  58   1      	UARTTransFrame	= UART_TransBuffer;
  59   1      	UARTRcvHead		= UART_RcvBuffer;
  60   1      	UARTRcvTail		= UART_RcvBuffer;
  61   1      	UARTRcvFrame	= UART_RcvBuffer;
  62   1      
  63   1      	ucAckTimeout	= 0;
  64   1      	ucRcvLen		= 0;
  65   1      	ucRcvCheckSum	= 0;
  66   1      	ucNoAckCount	= 0;
  67   1      
  68   1      	STXRcvFlag		= FALSE;
  69   1      	EnableTran		= TRUE;
  70   1      	StopTran		= TRUE;
  71   1      	ConnectFlag		= FALSE;
  72   1      }
  73          
  74          /******************************************************************************
  75          *                                                                             *
  76          *	serial port interrupt handle                                              *
  77          *                                                                             *
  78          ******************************************************************************/
  79          void UART(void) interrupt UARTINT using 1
  80          {
  81   1      unsigned char ucByte;
  82   1      unsigned char idata *TmpPtr;
  83   1      
  84   1      	if(RI)
  85   1      	{
  86   2      		ucByte = SBUF;
  87   2      		RI = 0;
  88   2      		if( ucByte == STX)
  89   2      		{
  90   3      			STXRcvFlag	= TRUE;
  91   3      			UARTRcvFrame = UARTRcvTail;
  92   3      			*(UARTRcvTail++) = ucByte;
  93   3      			if(UARTRcvTail == UART_RcvBuffer+UARTBUFFERLEN_RX)
  94   3      			{
  95   4      				UARTRcvTail = UART_RcvBuffer;
  96   4      			}
  97   3      		}
  98   2      		else if( STXRcvFlag == TRUE)
  99   2      		{//已经收到STX
 100   3      			*(UARTRcvTail++) = ucByte;
 101   3      			if(UARTRcvTail == UART_RcvBuffer+UARTBUFFERLEN_RX)
 102   3      			{
 103   4      				UARTRcvTail = UART_RcvBuffer;
 104   4      			}
 105   3      			if(ucByte==ETX)
 106   3      			{//收完一个幀
 107   4      				STXRcvFlag	= FALSE;		//重新搜索STX
 108   4      			}
 109   3      		}
 110   2      	}
 111   1      	if(TI)
 112   1      	{
 113   2      		TI = 0;
 114   2      		if(EnableTran==TRUE)
 115   2      		{
 116   3      			if(UARTTransHead != UARTTransTail)
 117   3      			{
C51 COMPILER V6.14  SERIAL                                                                 07/15/2005 09:38:51 PAGE 3   

 118   4      				SBUF = *UARTTransHead;
 119   4      				if( *UARTTransHead == STX)
 120   4      				{
 121   5      					UARTTransFrame = UARTTransHead;
 122   5      				}
 123   4      				else if( *UARTTransHead == ETX)
 124   4      				{
 125   5      					TmpPtr = UARTTransFrame;
 126   5      					if(++TmpPtr == UART_TransBuffer+UARTBUFFERLEN_TX)
 127   5      					{
 128   6      						TmpPtr = UART_TransBuffer;
 129   6      					}
 130   5      					if( (*TmpPtr == COMM_FRAME) || (*TmpPtr == REQ_FRAME) )
 131   5      					{//等待收发信机应答.除命令幀(COMM_FRAME)和REQ帧要求收发信机应答外,其它帧不要求收发信机应答
 132   6      						EnableTran	= FALSE;
 133   6      						StopTran	= TRUE;
 134   6      						ucAckTimeout= 30;
 135   6      					}
 136   5      				}
 137   4      				if(++UARTTransHead == UART_TransBuffer+UARTBUFFERLEN_TX)
 138   4      				{
 139   5      					UARTTransHead = UART_TransBuffer;
 140   5      				}
 141   4      			}
 142   3      			else
 143   3      			{//transfer buffer empty
 144   4      				StopTran = TRUE;
 145   4      			}
 146   3      		}
 147   2      	}
 148   1      }
 149          
 150          /******************************************************************************
 151          *                                                                             *
 152          *	write data to transfer buffer                                             *
 153          *                                                                             *
 154          ******************************************************************************/
 155          
 156          void WriteSerial(unsigned char code *pstr_Sour,unsigned char uclen)
 157          {
 158   1      unsigned char ucCanWrite;
 159   1      unsigned char idata *TransPtr;
 160   1      
 161   1      	if(uclen==0) return;
 162   1      
 163   1      	TransPtr = UARTTransTail;
 164   1      	if( UARTTransFrame > TransPtr)
 165   1      	{
 166   2      		ucCanWrite = UARTTransFrame - TransPtr;
 167   2      	}
 168   1      	else
 169   1      	{
 170   2      		ucCanWrite = UARTBUFFERLEN_TX - (TransPtr - UARTTransFrame);
 171   2      	}
 172   1      
 173   1      	if( ucCanWrite != 0)
 174   1      	{
 175   2      		if(ucCanWrite > uclen)
 176   2      		{
 177   3      			ucCanWrite = uclen;
 178   3      		}
 179   2      		if(TransPtr + ucCanWrite > UART_TransBuffer + UARTBUFFERLEN_TX)
C51 COMPILER V6.14  SERIAL                                                                 07/15/2005 09:38:51 PAGE 4   

 180   2      		{
 181   3      			while( TransPtr != UART_TransBuffer + UARTBUFFERLEN_TX)
 182   3      			{
 183   4      				*(TransPtr++) = *(pstr_Sour++);
 184   4      				ucCanWrite--;
 185   4      			}
 186   3      			TransPtr = UART_TransBuffer;
 187   3      			for(;ucCanWrite!=0;ucCanWrite--)
 188   3      			{
 189   4      				*(TransPtr++) = *(pstr_Sour++);
 190   4      			}
 191   3      		}
 192   2      		else
 193   2      		{
 194   3      			for(;ucCanWrite!=0;ucCanWrite--)
 195   3      			{
 196   4      				*(TransPtr++) = *(pstr_Sour++);
 197   4      			}
 198   3      		}
 199   2      		if(TransPtr == UART_TransBuffer+UARTBUFFERLEN_TX)
 200   2      		{
 201   3      			TransPtr = UART_TransBuffer;
 202   3      		}
 203   2      		UARTTransTail = TransPtr;
 204   2      	}
 205   1      }
 206          
 207          /******************************************************************************
 208          *                                                                             *
 209          *	write a byte to transfer buffer                                           *
 210          *                                                                             *
 211          ******************************************************************************/
 212          
 213          void WriteSerialByte(unsigned char ucByte)
 214          {
 215   1      unsigned char idata *TransPtr;
 216   1      	TransPtr = UARTTransTail;
 217   1      	*TransPtr = ucByte;
 218   1      	if(++TransPtr == UART_TransBuffer+UARTBUFFERLEN_TX)
 219   1      	{
 220   2      		TransPtr = UART_TransBuffer;
 221   2      	}
 222   1      	UARTTransTail = TransPtr;
 223   1      }
 224          /******************************************************************************
 225          *                                                                             *
 226          *	timer2 interrupt handle                                                   *
 227          *                                                                             *
 228          ******************************************************************************/
 229          void Timer2(void) interrupt TIMER2INT using 1
 230          {
 231   1      unsigned char data ucTmp;
 232   1      	if( ucAckTimeout != 0)
 233   1      	{
 234   2      		if( --ucAckTimeout ==0 )
 235   2      		{//timeout
 236   3      			EnableTran	= TRUE;
 237   3      			if( ++ucNoAckCount < MAX_REP)
 238   3      			{
 239   4      				UARTTransHead	= UARTTransFrame;
 240   4      				StopTran		= FALSE;
 241   4      				TI = 1;
C51 COMPILER V6.14  SERIAL                                                                 07/15/2005 09:38:51 PAGE 5   

 242   4      			}
 243   3      			else
 244   3      			{//重发次数超过“最大允许重发次数”
 245   4      				ucTmp = 255;
 246   4      				while( --ucTmp )
 247   4      				{
 248   5      					UISemaphore.ucExamAreaSem = 0x00;				//request semaphore
 249   5      					if( UISemaphore.ucExamAreaSem == 0x00)
 250   5      					{
 251   6      						UIDataArea.Exam_Buffer.ConnectFlag		= FALSE;

⌨️ 快捷键说明

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