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

📄 main.lst

📁 实验3 RS-485双机通信 实验3 RS-485双机通信 实验3 RS-485双机通信
💻 LST
字号:
C51 COMPILER V7.06   MAIN                                                                  10/14/2006 09:00:28 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN Main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Main.C BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*******************************************************************************
   2          程序名称:串行口接收测试
   3          *******************************************************************************/
   4          
   5          
   6          #include <reg51.h>
   7          #include <absacc.h>
   8          #include <intrins.h>
   9          
  10          
  11          //定义I/O接口
  12          sbit LE_DIG = P1^2;
  13          sbit LE_SEG = P1^3;
  14          sbit LE_LED = P1^4;
  15          sbit RS485_RE = P1^5;
  16          
  17          
  18          //宏函数:向数码管位选寄存器(74HC573)加载数据
  19          #define DIGLD(dat)\
  20          {\
  21                  P0 = (dat);\
  22                  LE_DIG = 1;\
  23                  _nop_();\
  24                  LE_DIG = 0;\
  25          }
  26          
  27          
  28          //宏函数:向数码管段选寄存器(74HC573)加载数据
  29          #define SEGLD(dat)\
  30          {\
  31                  P0 = (dat);\
  32                  LE_SEG = 1;\
  33                  _nop_();\
  34                  LE_SEG = 0;\
  35          }
  36          
  37          
  38          //定义显示缓冲区(由定时中断程序自动扫描)
  39          unsigned char DispBuf[8];
  40          
  41          
  42          /*******************************************************************************
  43          函数:DispClear()
  44          功能:清除显示
  45          *******************************************************************************/
  46          void DispClear()
  47          {
  48   1              unsigned char i;
  49   1              for ( i=0; i<8; i++ )
  50   1              {
  51   2                      DispBuf[i] = 0x00;
  52   2              }
  53   1              DIGLD(0x00);
  54   1              SEGLD(0x00);
  55   1      }
C51 COMPILER V7.06   MAIN                                                                  10/14/2006 09:00:28 PAGE 2   

  56          
  57          
  58          /*******************************************************************************
  59          函数:T0_ISR()
  60          功能:定时器T0中断服务程序,定时扫描显示数码管
  61          *******************************************************************************/
  62          void T0_ISR() interrupt 1
  63          {
  64   1              code unsigned char com[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  65   1              static unsigned char n = 0;
  66   1              TR0 = 0;                //暂停T0(重新定时前应当暂停)
  67   1              TH0 = 0xFC;             //重新定时1ms
  68   1              TL0 = 0x66;
  69   1              TR0 = 1;                //重启T0
  70   1              SEGLD(0xFF);    //暂停显示(重要操作)
  71   1              DIGLD(com[n]);  //更新位选信号
  72   1              SEGLD(~DispBuf[n]);     //更新段选数据
  73   1              n++;
  74   1              n &= 0x07;
  75   1      }
  76          
  77          
  78          /*
  79          函数:DispChar()
  80          功能:在数码管上显示字符
  81          参数:
  82                  x:数码管的坐标位置(0~7)
  83                  c:要显示的字符(仅限十进制数字和减号)
  84          */
  85          void DispChar(unsigned char x, unsigned char c)
  86          {
  87   1              //0123456789的数码管字型数据
  88   1              code unsigned char Tab[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  89   1              x &= 0x07;
  90   1              x = 7 - x;
  91   1              if ( c == '-' )
  92   1              {
  93   2                      DispBuf[x] = 0x40;
  94   2              }
  95   1              else if ( ( c >= '0' ) && ( c <= '9' ) )
  96   1              {
  97   2                      DispBuf[x] = Tab[c-'0'];
  98   2              }
  99   1      }
 100          
 101          
 102          /*
 103          函数:DispStr()
 104          功能:在数码管上显示字符串
 105          参数:
 106                  x:数码管的坐标位置(0~7)
 107                  *s:要显示的字符串(字符仅限十进制数字和减号)
 108          */
 109          void DispStr(unsigned char x, unsigned char *s)
 110          {
 111   1              unsigned char c;
 112   1              for (;;)
 113   1              {
 114   2                      c = *s;
 115   2                      if ( c == '\0' ) break;
 116   2                      s++;
 117   2                      DispChar(x,c);
C51 COMPILER V7.06   MAIN                                                                  10/14/2006 09:00:28 PAGE 3   

 118   2                      x++;
 119   2              }
 120   1      }
 121          
 122          
 123          //定义波特率(取值1200、2400、4800、9600、19200等)
 124          #define BaudRate        9600L
 125          
 126          
 127          /*******************************************************************************
 128          函数:UartInit()
 129          功能:串行口初始化
 130          *******************************************************************************/
 131          void UartInit()
 132          {
 133   1              SCON = 0x50;    //串口方式1(8位UART),允许接收
 134   1              PCON |= 0x80;   //波特率加倍
 135   1              TMOD &= 0x0F;   //设置T1为8位自动重装定时器,用于产生波特率
 136   1              TMOD |= 0x20;
 137   1              TH1 = TL1 = 256 - (11059200L / 12) / (16 * BaudRate);   //设置T1初值
 138   1              TR1 = 1;                //启动T1
 139   1              ES = 1;
 140   1      }
 141          
 142          
 143          //定义接收标志
 144          bit ReceiveFlag = 0;
 145          
 146          //定义接收缓冲区
 147          unsigned char UartBuf[4];
 148          
 149          
 150          /*******************************************************************************
 151          函数:Uart_ISR()
 152          功能:串行口中断服务函数
 153          *******************************************************************************/
 154          void Uart_ISR() interrupt 4
 155          {
 156   1              static unsigned char p = 0;
 157   1              unsigned char c;
 158   1              if ( RI )               //如果收到数据
 159   1              {
 160   2                      RI = 0;         //清除接收标志
 161   2                      c = SBUF;       //读取收到的数据
 162   2                      if ( (c >= '0') && (c <= '9') )         //如果是数字
 163   2                      {
 164   3                              if ( p < 4 ) UartBuf[p++] = c;  //保存到缓冲区
 165   3                      }
 166   2                      else if ( c == '\n' )   //如果接收完一行
 167   2                      {
 168   3                              UartBuf[p] = '\0';
 169   3                              p = 0;
 170   3                              ReceiveFlag = 1;
 171   3                      }
 172   2                      else
 173   2                      {
 174   3                              //对其它字符不予理睬
 175   3                      }
 176   2              }
 177   1              if ( TI )
 178   1              {
 179   2                      TI = 0;
C51 COMPILER V7.06   MAIN                                                                  10/14/2006 09:00:28 PAGE 4   

 180   2              }
 181   1      }
 182          
 183          
 184          /*******************************************************************************
 185          函数:SysInit()
 186          功能:系统初始化
 187          *******************************************************************************/
 188          void SysInit()
 189          {
 190   1              LE_DIG = 0;
 191   1              LE_SEG = 0;
 192   1              LE_LED = 0;
 193   1              DispClear();    //清除显示
 194   1              UartInit();
 195   1              TMOD &= 0xF0;
 196   1              TMOD |= 0x01;
 197   1              TH0 = 0xFC;             //定时1ms
 198   1              TL0 = 0x66;
 199   1              ET0 = 1;                //使能T0定时中断
 200   1              TR0 = 1;                //启动定时器T0
 201   1              EA = 1;                 //使能总中断
 202   1      }
 203          
 204          
 205          //主函数
 206          void main()
 207          {
 208   1              SysInit();
 209   1              DispStr(0,"--------");
 210   1              RS485_RE = 0;
 211   1              for (;;)
 212   1              {
 213   2                      PCON |= 0x01;
 214   2                      if ( ReceiveFlag )
 215   2                      {
 216   3                              ReceiveFlag = 0;
 217   3                              DispClear();
 218   3                              DispStr(0,UartBuf);
 219   3                      }
 220   2              }
 221   1      }
 222          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    344    ----
   CONSTANT SIZE    =     27    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     14       1
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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