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

📄 serial.lst

📁 这是一个关与LCD在嵌入式系统中应用的实例和程序
💻 LST
字号:
C51 COMPILER V6.12  SERIAL                                                                 02/27/2006 18:42:08 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN .\serial.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\serial.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          //本函数集来自51单片机世界,作者斑竹丁丁(聂小猛)。
   2          //主页地址http://www.mcu51.com
   3          //串口中断服务程序,仅需做简单调用即可完成串口输入输出的处理
   4          //出入均设有缓冲区,大小可任意设置。
   5          //可供使用的函数名:
   6          /*
   7          extern char getbyte(void);//从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
   8          extern putbyte(char c);//放入一个字节到发送缓冲区
   9          extern putstring(uchar  *puts);//发送一个定义在程序存储区的字符串到串口
  10          extern puthex(uchar c);//发送一个字节的hex码,分成两个字节发。
  11          extern  bit   inbufsign;
  12          #define CR putstring("\r\n")//发送一个回车换行
  13          extern void serial_init (void);
  14          */
  15          
  16          //*************************************************************************
  17          #pragma small
  18          
  19          #include <reg52.h>
  20          #define  uchar  unsigned char
  21          #define  uint   unsigned int
  22          
  23          #define  OLEN  8                    /* size of serial transmission buffer   */
  24          idata uchar  outbuf[OLEN];          /* storage for transmission buffer      */
  25          data uchar idata *outlast=outbuf;    //最后由中断传输出去的字节位置
  26          data uchar idata *putlast=outbuf;    //最后放入发送缓冲区的字节位置
  27          #define  ILEN  30 //32            /* size of serial receiving buffer      */
  28          idata uchar  inbuf[ILEN];
  29          data uchar idata *inlast=inbuf;  //最后由中断进入接收缓冲区的字节位置
  30          data uchar idata *getlast=inbuf;  //最后取走的字节位置
  31          bit   outbufsign0;     //最后一个数据覵BUF发完标志  发完=0
  32          bit   outbufsign;     //输出缓冲区非空标志   有=1
  33          bit   inbufsign;      //接收缓冲区非空标志   有=1
  34          bit   inbufful;       //输入缓冲区满标志  满=1
  35          #define CR putstring("\r\n")   //CR=回车换行
  36          
  37          
  38          //*****************************
  39          //放入一个字节到发送缓冲区
  40          putbyte(unsigned char c)
  41          {
  42   1      	ES=0;            /*暂停串行中断,以免数据比较时出错    */
  43   1      	while((((outlast-putlast)==2) && (outlast > putlast )) || ((outlast < putlast) && (OLEN-(putlast-outlast)
             -==2)))
  44   1      	{
  45   2      		ES=1;
  46   2      		c++;c--;
  47   2      		ES=0;
  48   2      	}
  49   1      	*putlast=c;            //放字节进入缓冲区
  50   1      	putlast++;          //发送缓冲区指针加一
  51   1      	if (putlast==outbuf+OLEN) putlast=outbuf;  //指针到了顶部换到底部
  52   1      	outbufsign=1;
  53   1      	if (!outbufsign0)
  54   1      	{
C51 COMPILER V6.12  SERIAL                                                                 02/27/2006 18:42:08 PAGE 2   

  55   2      		outbufsign0=1;
  56   2      		TI=1;
  57   2      	}   //缓冲区开始为空置为有,启动发送
  58   1      	ES=1;
  59   1      }
  60          
  61          //***************************************
  62          //发送字符串到串口
  63          putstring(uchar  *puts)
  64          {
  65   1      	for(;*puts!=0;puts++)   //遇到停止符0结束
  66   1      		putbyte(*puts);
  67   1      }
  68          //******************************
  69          //放一串数据到发送缓冲区,需要定义发送的字节数
  70          putbytes(uchar *outplace,uint j) 
  71          { 	int i;
  72   1      	for(i=0;i<j;i++)
  73   1      	{
  74   2      		putbyte(*outplace);
  75   2      		outplace++;
  76   2      	}
  77   1      }
  78          //*************************************
  79          //发送一个字节的hex码,分成两个字节发。
  80          uchar code hex_[]={"0123456789ABCDEF"};
  81          puthex(unsigned char c)
  82          {
  83   1      	int ch;
  84   1      	ch=(c>>4)&0x0f;
  85   1      	putbyte(hex_[ch]);
  86   1      	ch=c&0x0f;
  87   1      	putbyte(hex_[ch]);
  88   1      }
  89          //*************************************
  90          //从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
  91          uchar getbyte (void)
  92          {
  93   1      	char idata c ;
  94   1      	while (!inbufsign);     //缓冲区空等待
  95   1      	ES=0;
  96   1      	c= *getlast;            //取数据
  97   1      	getlast++;              //最后取走的数据位置加一
  98   1      	inbufful=0;            //输入缓冲区的满标志清零
  99   1      	if (getlast==inbuf+ILEN) getlast=inbuf; //地址到顶部回到底部
 100   1      	if (getlast==inlast) inbufsign=0;       //地址相等置接收缓冲区空空标志,再取数前要检该标志
 101   1      	ES=1;
 102   1      	return (c);        //取回数据
 103   1      }
 104          //*****************************************
 105          //串口中断处理
 106          
 107          serial () interrupt 4
 108          {
 109   1      	if (TI)
 110   1      	{
 111   2      		TI = 0;
 112   2      		if (outbufsign)
 113   2      		{
 114   3      			SBUF=*outlast; //未发送完继续发送
 115   3      			outlast++;            //最后传出去的字节位置加一
 116   3      			if (outlast==outbuf+OLEN) outlast=outbuf;//地址到顶部回到底部
C51 COMPILER V6.12  SERIAL                                                                 02/27/2006 18:42:08 PAGE 3   

 117   3      			if (putlast==outlast) outbufsign=0;   //数据发送完置发送缓冲区空标志
 118   3      		}
 119   2      		else
 120   2      		{
 121   3      			outbufsign0=0;
 122   3      		}
 123   2      
 124   2      	}
 125   1      	if (RI)
 126   1      	{
 127   2      		RI = 0;
 128   2      		if(!inbufful)
 129   2      		{
 130   3      			*inlast= SBUF;            //放入数据
 131   3      			inlast++;                    //最后放入的位置加一
 132   3      			inbufsign=1;
 133   3      			if (inlast==inbuf+ILEN) inlast=inbuf;//地址到顶部回到底部
 134   3      			if (inlast==getlast)	inbufful=1;  //接收缓冲区满置满标志
 135   3      		}
 136   2      	}
 137   1      }
 138          
 139          //*****************************
 140          //串口初始化                
 141          void serial_init (void)
 142          {
 143   1      	//用t1作波特率
 144   1      	SCON  = 0x50;                     // mode 1: 8-bit UART, enable receiver
 145   1      	TMOD |= 0x20;                      // timer 1 mode 2: 8-Bit reload
 146   1      	PCON |= 0x80; TH1 = 0xfa;          //baud*2    /* reload value 9600 baud -22118400HZ
 147   1      	TR1   = 1;                         // timer 1 run
 148   1      
 149   1      	ES = 1;
 150   1      	REN=1;
 151   1      	EA=1;
 152   1      
 153   1      }
 154          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    365    ----
   CONSTANT SIZE    =     17    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      4      12
   IDATA SIZE       =     38       1
   BIT SIZE         =      4    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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