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

📄 uart.lst

📁 8052串口驱动--(包括波特率计算,以及几个内存查看的shell命令)
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V4.01,  UART                                                                  06/10/05  11:07:07  PAGE 1   


DOS C51 COMPILER V4.01, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN UART.OBJ
COMPILER INVOKED BY: C:\TOPICE52\BIN\C51.EXE UART.C NOREGPARMS OE OT(0) DB PR RB(0) LARGE OJ(UART.OBJ) 

stmt level    source

   1          #include <reg51.h>
   2          #include <stdio.h>
   3          
   4          #define		SYSCLK 	 	12000000
   5          #define 	BAUDRATE 	4800 
   6          
   7          //收发缓冲区长度
   8          #define LenTxBuf        1024    //不要太小
   9          #define LenRxBuf        32
  10          #define MaxLenStr       80     //buf[MaxLenStr+1]为 '\0'
  11          #define	TABNum          4      //TAB键移动长度
  12          
  13          unsigned char RxBuf[LenRxBuf], TxBuf[LenTxBuf];		//收发缓冲区实体
  14          unsigned char *rRxBuf, *wRxBuf, *rTxBuf, *wTxBuf;	//收发缓冲区读写指针
  15          unsigned char Cmd[16];	//分析处理后的命令
  16          bit TIflag = 1;		//发送标志
  17          bit RIflag = 0;		//接收标志
  18          
  19          
  20          /****************************************************************************************
  21          *   功能: 串口初始化,缓冲区初始化
  22          *   参数: 无
  23          ****************************************************************************************/
  24          void uartInit(void)
  25          {
  26   1      	SCON	 = 0x50;	//方式1
  27   1      	PCON	 = 0x80;    //SMOD=1;
  28   1      	
  29   1      	TMOD	 = 0x20;	//定时器1为自动重装载的8 位计数器/定时器
  30   1      	TH1		 = 256 - (SYSCLK/12/16/BAUDRATE);
  31   1      	TL1 	 = TH1;
  32   1      	TR1		 = 1;		//启动定时器1
  33   1      	
  34   1      	rTxBuf = TxBuf;		//串口缓冲区初始化
  35   1      	wTxBuf = TxBuf;
  36   1      	rRxBuf = RxBuf;
  37   1      	wRxBuf = RxBuf;
  38   1      	
  39   1      	EA = 1;
  40   1      	ES = 1;
  41   1      }
  42          
  43          
  44          /****************************************************************************************
  45          *   功能: 串口中断服务程序
  46          *   参数: 无
  47          ****************************************************************************************/
  48          void uartISR(void) interrupt 4
  49          {
  50   1      	unsigned char *t;
  51   1      	
  52   1      	if (TI)
  53   1      	{
  54   2      		TI = 0;
  55   2      		if (rTxBuf == wTxBuf) //TxBuf Empty
  56   2      		{
  57   3      			TIflag = 1;
  58   3      			return;
  59   3      		}
C51 COMPILER V4.01,  UART                                                                  06/10/05  11:07:07  PAGE 2   

  60   2      		SBUF = *rTxBuf; 
  61   2      		rTxBuf++;
  62   2      		if (rTxBuf == TxBuf + LenTxBuf) 
  63   2      			rTxBuf = TxBuf;	
  64   2      	}
  65   1      	if (RI)
  66   1      	{
  67   2      		RI = 0;
  68   2      		t = wRxBuf;
  69   2      		t++;
  70   2      		if (t == RxBuf + LenRxBuf) 
  71   2      			t = RxBuf;
  72   2      		if (t == rRxBuf)   //RxBuf Full
  73   2      		{
  74   3      			RIflag = 1;
  75   3      			return; 
  76   3      		}              
  77   2      		*wRxBuf = SBUF;
  78   2      		if (*(wRxBuf - 1) == '\r')	// 判断接收到回车否
  79   2      		{
  80   3      			RIflag = 1;
  81   3      			return;
  82   3      		}
  83   2      		else
  84   2      		{
  85   3      			wRxBuf = t;		
  86   3      		}
  87   2      	}
  88   1      }
  89          
  90          
  91          /****************************************************************************************
  92          *   功能: 显示单个字符
  93          *   参数: 单个字符
  94          ****************************************************************************************/
  95          void PrintChar(unsigned char ch)
  96          {
  97   1      	unsigned char *t;
  98   1      	
  99   1      	ES = 0;
 100   1      	if (TIflag)
 101   1      	{		
 102   2      		TIflag = 0;
 103   2      		TI = 1;
 104   2      	}
 105   1      	t = wTxBuf;
 106   1      	t++;
 107   1      	if (t == TxBuf + LenTxBuf) 
 108   1      		t = TxBuf;
 109   1      	if (t == rTxBuf)  //TxBuf Full
 110   1      	{
 111   2      		ES = 1;	
 112   2              return;
 113   2          }                 
 114   1      	*wTxBuf = ch;
 115   1      	wTxBuf = t;
 116   1      	ES = 1;
 117   1      }
 118          
 119          
 120          /****************************************************************************************
 121          *   功能: 显示字符串
 122          *   参数: 字符串指针
 123          ****************************************************************************************/
 124          void PrintStr(unsigned char *str)
 125          {
C51 COMPILER V4.01,  UART                                                                  06/10/05  11:07:07  PAGE 3   

 126   1      	int i;
 127   1      	unsigned char j;
 128   1      	unsigned char ch;
 129   1      	
 130   1      	EA = 0;
 131   1      	for (i=0; i<MaxLenStr; i++)
 132   1      	{
 133   2      		ch = *(str + i);
 134   2      		if (ch == '\0') 
 135   2      			break;
 136   2      		else
 137   2      			if (ch == '\n')
 138   2      			{
 139   3      				PrintChar(10);
 140   3      				PrintChar(13);
 141   3      			}
 142   2      			else 
 143   2      				if (ch == '\t')
 144   2      				{
 145   3      					for (j=0; j<TABNum; j++)
 146   3      						PrintChar(' ');
 147   3      				}
 148   2      				else 
 149   2      					PrintChar(ch);
 150   2      	}
 151   1      	EA=1;
 152   1      }
 153          
 154          
 155          /****************************************************************************************
 156          *   功能: 从串口缓冲区读一个字节数据
 157          *   参数: 单个字符指针
 158          ****************************************************************************************/
 159          bit mygetch(unsigned char *ch)
 160          {
 161   1      	ES = 0;        
 162   1      	if (rRxBuf == wRxBuf) //RxBuf Empty
 163   1      	{
 164   2      		ES = 1;
 165   2      		return 0;
 166   2      	}
 167   1      	
 168   1      	*ch = *rRxBuf;  
 169   1      	rRxBuf++;
 170   1      	if (rRxBuf == RxBuf + LenRxBuf) 
 171   1              rRxBuf = RxBuf;
 172   1      	ES = 1;        
 173   1      	return 1;
 174   1      }
 175          
 176          
 177          /****************************************************************************************
 178          *   功能: 读取串口缓冲区的数据
 179          *   参数: 字符串指针
 180          ****************************************************************************************/
 181          bit readRxBuf(unsigned char *str)	
 182          {
 183   1      	unsigned char ch, i;
 184   1      	
 185   1      	EA = 0;
 186   1      	if (RIflag)
 187   1      	{
 188   2      		RIflag = 0;
 189   2      	}
 190   1      	if (rRxBuf == wRxBuf)	//RxBuf Empty
 191   1      	{
C51 COMPILER V4.01,  UART                                                                  06/10/05  11:07:07  PAGE 4   

 192   2      		EA = 1;
 193   2      		return 0;
 194   2      	}
 195   1      	
 196   1      	for (i=0; i<LenRxBuf; i++)
 197   1      	{
 198   2      		if (mygetch(&ch))
 199   2      		{
 200   3      			if (ch == '\r')
 201   3      			{
 202   4      				*str = '\0';
 203   4      				break;
 204   4      			}
 205   3      			else
 206   3      			{
 207   4      				*str = ch;
 208   4      				str++;
 209   4      			}
 210   3      		}
 211   2      		else
 212   2      		{
 213   3      			return 0;
 214   3      		}
 215   2      	}
 216   1      
 217   1      	rRxBuf = RxBuf;
 218   1      	wRxBuf = RxBuf;
 219   1      	EA = 1;	
 220   1      	return 1;
 221   1      }
 222          
 223          
 224          /****************************************************************************************
 225          *   功能: 去除接收缓冲区字符串ComBuf中的空格,并处理退格,形成命令字符串cmd
 226          *   参数: ComBuf--串口缓冲区字符串指针
 227          *         cmd--命令字符串指针
 228          ****************************************************************************************/
 229          void parse(unsigned char *ComBuf, unsigned char *cmd)
 230          {
 231   1      	int i, j;
 232   1      	
 233   1      	for (i=0, j=0; 1; i++)
 234   1      	{
 235   2      		if (ComBuf[i] == '\0')	//End
 236   2      		{
 237   3      			cmd[j] = '\0';
 238   3      			break;
 239   3      		}
 240   2      		
 241   2      		if (ComBuf[i] == ' ')	//Blank
 242   2      		{
 243   3      			continue;
 244   3      		}
 245   2      		else
 246   2      			if (ComBuf[i] == 0x08)	//Back Space
 247   2      			{
 248   3      				j--;
 249   3      			}
 250   2      			else
 251   2      			{
 252   3      				cmd[j++] = ComBuf[i];
 253   3      			}		
 254   2      	}
 255   1      }
 256          
 257          
C51 COMPILER V4.01,  UART                                                                  06/10/05  11:07:07  PAGE 5   

 258          /****************************************************************************************
 259          *   功能: 显示的欢迎信息
 260          *   参数: 无
 261          ****************************************************************************************/
 262          void Welcome(void)
 263          {
 264   1      	PrintStr("\n\n\n\n");
 265   1      	PrintStr("\n/************************* 51 shell ***********************************/\n");
 266   1      	PrintStr("\n                  Welcome to the command mode!\n");
 267   1      	PrintStr("\n/**********************************************************************/\n");
 268   1      }
 269          
 270          
 271          /****************************************************************************************
 272          *   功能: 显示命令行提示符
 273          *   参数: 无
 274          ****************************************************************************************/
 275          void CmdLine(void)
 276          {
 277   1      	PrintStr("\n\n>");
 278   1      }
 279          
 280          
 281          /****************************************************************************************
 282          *   功能: 命令不匹配时的功能函数
 283          *   参数: 无
 284          ****************************************************************************************/
 285          void CmdError(void)
 286          {
 287   1      	PrintStr("Command error!\nPlease input 'help' or '?' to get for help.\n");
 288   1      }
 289          
 290          
 291          /****************************************************************************************
 292          *   功能: D命令功能函数,读memeory内容
 293          *		  CmdDI(): 读内部RAM
 294          *		  CmdDC(): 读程序存储器ROM
 295          *		  CmdDX(): 读外部RAM
 296          *   参数: 无
 297          ****************************************************************************************/
 298          void CmdDI(void);
 299          void CmdDC(void);
 300          void CmdDX(void);
 301          
 302          void CmdD(void)
 303          {
 304   1      	switch (Cmd[1])
 305   1      	{
 306   2      	case 'i' :
 307   2      		CmdDI();
 308   2      		break;
 309   2      	case 'c' :
 310   2      		CmdDC();
 311   2      		break;
 312   2      	case 'x' :
 313   2      		CmdDX();
 314   2      		break;
 315   2      	default :
 316   2      		CmdError();
 317   2      	}
 318   1      }
 319          
 320          
 321          void CmdDI(void)
 322          {
 323   1      	int i, j;
C51 COMPILER V4.01,  UART                                                                  06/10/05  11:07:07  PAGE 6   

 324   1      	unsigned char idata * pchar;         // memory access pointer
 325   1      	unsigned char ch;
 326   1      	unsigned char buffer[100];
 327   1      
 328   1      	if (Cmd[4] != '\0')
 329   1      	{
 330   2      		CmdError();
 331   2      		return;
 332   2      	}
 333   1      		
 334   1      	for (i=2; i<=3; i++)
 335   1      	{
 336   2      		if ((Cmd[i] >= '0' && Cmd[i] <='9') || (Cmd[i] >= 'a' && Cmd[i] <='f') 
 337   2      			|| (Cmd[i] >= 'A' && Cmd[i] <='F'))
 338   2      		{
 339   3      			if ((Cmd[i] >= 'a' && Cmd[i] <='f') || (Cmd[i] >= 'A' && Cmd[i] <='F'))
 340   3      				Cmd[i] += 9;
 341   3      		}

⌨️ 快捷键说明

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