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

📄 serial.lst

📁 实现485、232信号到can信号的转换。根据需要调整即可。
💻 LST
字号:
C51 COMPILER V7.06   SERIAL                                                                12/12/2008 13:46:00 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN serial.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE serial.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          
   2          //基于中断的串口驱动程序
   3          //程序特点:
   4          //        1.基于中断,可并发执行
   5          //        2.参数可配置(收发缓冲区大小,最大字符串长度,TAB键移动距离)
   6          //**********************************************************************************
   7          //使用方法:(此范例自包含,独立于其他程序。)
   8          //        先配制收发缓冲区大小等可变参数(在serial.h中的宏定义)
   9          //        1.开头加入#include <reg51.h>语句,一定要有。
  10          //        2.初始化串口        InitSerial();//本例中为20MHz晶体,300波特率,模式2初始化
  11          //        3.初始化串口缓冲区  InitSerialBuffer();
  12          //        4.使用显示字节,字,长字,字符,字符串,清屏函数。
  13          //**********************************************************************************
  14          //波特率计算公式:
  15          //        TH1=256-(2^SMOD/32*Fosc/12*1/Bound)
  16          //    其中:SMOD=0,1;Fosc=晶体或晶振频率;Bound=波特率
  17          //**********************************************************************************
  18          
  19          
  20          #include <serial.h>
  21          #include <at89x52.h>
  22          
  23          unsigned char   TxBuf[LenTxBuf],RxBuf[LenRxBuf];          //串口0收发缓冲区实体   receiveflag:接收中断标志
  24          unsigned char   receiveflag=0;
  25          unsigned char *inTxBuf,*outTxBuf,*inRxBuf,*outRxBuf;     //串口0收发缓冲区读写指针
  26          
  27          
  28          bit TIflag=1;//Note:It must be 1.
  29          bit RIflag=1;
  30          
  31          void InitSerial()//串口初始化
  32          {
  33   1                      TMOD=0x21;             //方式1 T0 16 bit 
  34   1              TL1=0xFD;
  35   1                      TH1=0xFD;              //9600 , 11.0592MHz
  36   1              SCON=0x50;
  37   1                      PCON=0x80;        //SM0.SM1=01:可变波特率  REN=1,允许串行接收位    SCON:串行接口控制寄存器
  38   1                                          //PCON:首位是SMOD,SMOD=1,在串行接口方式1、2、3情况下,波特率提高一倍。
             -复位时,SMOD=0(波特率不加倍). 
  39   1              TR1=1;                      //T1运行控制位
  40   1                      ES=1;
  41   1      }
  42          
  43          void InitSerialBuffer(void)//串口缓冲区初始化
  44          {
  45   1              inTxBuf=TxBuf;outTxBuf=TxBuf;     //串口0缓冲区初始化     TxBuf[LenTxBuf],RxBuf[LenRxBuf];
  46   1              inRxBuf=RxBuf;outRxBuf=RxBuf;
  47   1              ES=1;                             //串行接口允许中断位
  48   1                      
  49   1                      }
  50          
  51          void serial(void)  interrupt 4 
  52          {    //中断在汇编中实现,去掉interrupt 4{//串口中断服务子程序
  53   1              unsigned char *t;
  54   1      
C51 COMPILER V7.06   SERIAL                                                                12/12/2008 13:46:00 PAGE 2   

  55   1              if(TI){                                    //TI发送中断标志
  56   2                      TI=0;
  57   2                      if(inTxBuf==outTxBuf) 
  58   2                         {
  59   3                           TIflag=1;return;             //TxBuf Empty
  60   3                          }                     
  61   2                      SBUF=*outTxBuf; outTxBuf++;
  62   2                      if(outTxBuf==TxBuf+LenTxBuf) outTxBuf=TxBuf;    
  63   2              }
  64   1              if(RI){                                    //RI接收中断标志
  65   2                      RI=0;
  66   2                      t=inRxBuf;t++;
  67   2                      if(t==RxBuf+LenRxBuf) t=RxBuf;
  68   2                      if(t==outRxBuf) {RIflag=1;return;}               //RxBuf Full
  69   2                      *inRxBuf=SBUF;
  70   2                      inRxBuf=t;
  71   2                                      receiveflag=1;
  72   2              }
  73   1                      
  74   1          }
  75          
  76          /*
  77          bit getbyte(unsigned char *ch)//从串口缓冲区读1字节数据
  78          
  79           ES=1;            ////串行接口允许中断位 
  80           */
  81          
  82          bit getbyte(unsigned char *ch) //从串口缓冲区读1字节数据
  83          {
  84   1                 if(inRxBuf==outRxBuf) {ES=1;return 0;}          //RxBuf Empty
  85   1                      *ch=*outRxBuf;  outRxBuf++;
  86   1                      if(outRxBuf==RxBuf+LenRxBuf) outRxBuf=RxBuf;
  87   1                      //ES=1;        
  88   1                      return 1;
  89   1              
  90   1      }
  91          
  92          bit putbytes(unsigned char *ch,unsigned char bytes)//串口发送数据
  93          {
  94   1              unsigned char *t;   
  95   1                      unsigned char i;      
  96   1              
  97   1                  for(i=0;i<bytes;i++)
  98   1                              {
  99   2                                      t=inTxBuf; t++;
 100   2                              if(t==TxBuf+LenTxBuf) t=TxBuf;
 101   2                              if(t==outTxBuf)
 102   2                                  {
 103   3                                      /*ES=1;*/
 104   3                                      return 0;
 105   3                                      }                  //TxBuf Full
 106   2                                      *inTxBuf=*ch;     //要发送的数据均是存放在ch空间里的
 107   2                                      inTxBuf=t;
 108   2                                      ch++;                   
 109   2                              }           
 110   1                      if(TIflag)
 111   1                              {               
 112   2                              TIflag=0;
 113   2                              TI=1;
 114   2                      }               
 115   1                                       
 116   1                      return 1;  
C51 COMPILER V7.06   SERIAL                                                                12/12/2008 13:46:00 PAGE 3   

 117   1                      
 118   1              
 119   1      }
 120          
 121          unsigned char ReceivedBytes(void)   //判断串口缓冲区是否为空,若为空返回0,否则返回缓冲区字节数    
 122          {
 123   1         char len;
 124   1         len=inRxBuf-outRxBuf;         
 125   1         if(len<0)
 126   1             len+=LenRxBuf;           
 127   1         return len;    
 128   1      }
 129          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    523    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     37      12
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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