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

📄 d_485.lst

📁 485多机通信+lcd液晶显示
💻 LST
字号:
C51 COMPILER V7.50   D_485                                                                 04/27/2009 15:18:14 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE D_485
OBJECT MODULE PLACED IN d_485.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE d_485.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*************************************************************************************************
   2          * 文 件 名:485.c
   3          * 功    能:485主机通信模块
   4          * 硬件条件: 1.CPU型号:ATMEL2051
   5          *            2.晶振:11.0592
   6          * 作    者:zwb
   7          * 日    期:2009年04月24号
   8          *************************************************************************************************/
   9          //-----------------------函数声明,变量定义--------------------------------------------------------
  10          #include <reg51.h>
  11          #include <INTRINS.h>
  12          #include <string.h>
  13          #define  unchar  unsigned char
  14          #define COUNT 10          // 定义接收缓冲区大小 
  15          unsigned char   Receive_buffer[COUNT]; //定义接收缓冲区
  16          unsigned char   Rateflow_buffer[COUNT];//瞬时流量缓冲区
  17          unsigned char   Veloflow_buffer[COUNT];//瞬时流速缓冲区
  18          unsigned char   Percentageflow_buffer[COUNT];//流量百分比缓冲区
  19          unsigned char   Resistanceflow_buffer[COUNT];//流体电阻值缓冲区
  20          unsigned char   Positive_buffer[COUNT];//正向总量缓冲区
  21          unsigned char   Opposite_buffer[COUNT];//反向总量缓冲区
  22          unsigned char   Alarm_buffer[COUNT];//报警状态缓冲区
  23          unsigned char   Diameter_buffer[COUNT];//管道直径缓冲区
  24          unsigned char   Set_buffer[COUNT];//参数设置缓冲区
  25          unsigned char     point;    //定义接收数据个数指示变量
  26          unsigned char   COM_dzdata[2];//定义主机发送地址和命令
  27          
  28          
  29          //============================================================================
  30          //函数功能;延时子程序
  31          // ===========================================================================
  32          void delay(void)
  33          {
  34   1              unchar i=124;
  35   1              while(i--);
  36   1      }
  37          //--------------------------------------------------------------------------------------------------
  38          // 函数名称: UART_init()串口初始化函数
  39          // 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s
  40          //            串口接收中断允许,发送中断禁止
  41          //--------------------------------------------------------------------------------------------------
  42          void UART_init(void)
  43          {
  44   1                           //初始化串行口和波特率发生器 
  45   1              SCON =0x98;          //选择串口工作方式2,打开接收允许
  46   1              TMOD =0x40;          //定时器1工作在方式2
  47   1              PCON = 0x80;
  48   1              TH1 =0xfa;           //实现波特率9600(系统时钟11.0592MHZ)
  49   1              TR1 =1;              //启动定时器T1
  50   1              ET1 =0; 
  51   1              PS=1;                //设计串行口中断优先级
  52   1              EA =1;               //单片机中断允许
  53   1              ES=0;               //禁止串行口中断
  54   1      }
  55          //--------------------------------------------------------------------------------------------------
C51 COMPILER V7.50   D_485                                                                 04/27/2009 15:18:14 PAGE 2   

  56          // 函数名称: com_longerrup()串口接收中断处理函数
  57          // 函数功能: 接收包括起始位'S'在内的十位数据到数据缓冲区
  58          //--------------------------------------------------------------------------------------------------
  59          com_interrupt(void) interrupt 4 using 3
  60          {
  61   1        unchar RECEIVR_buffer;
  62   1        if(RI)                                //处理接收中断
  63   1              {
  64   2              RI=0;                                //清除中断标志位
  65   2              RECEIVR_buffer=SBUF;            //接收串口数据
  66   2              if(  point==0)       //如果还没有接收到起始位
  67   2                      { if(point>0&&point<10)     //判断是否接收够十位数据
  68   3                       Receive_buffer[point++]=RECEIVR_buffer;//不够,把接收到的数据放入接收缓存区
  69   3                      }
  70   2              else point=0;                   //缓冲区已满,清除缓存区内数据重新接收
  71   2              } 
  72   1       if(TI)                                  //处理发送中断
  73   1              {TI=0;}
  74   1      }
  75          
  76          //--------------------------------------------------------------------------------------------------
  77          // 函数名称: CLU_checkdata()计算校验位函数
  78          // 输入变量: 无
  79          // 输出变量: checkdata,包括起始位在内的前九位数据的校验和
  80          // 函数功能: 计算校验和
  81          //--------------------------------------------------------------------------------------------------
  82          unsigned char CLU_checkdata(void)
  83          {           //计算校验位
  84   1              unchar point,checkdata=0;
  85   1              for(point=2;point<7,TI=1;point++)
  86   1               {
  87   2                      checkdata=checkdata^Receive_buffer[point];
  88   2               }
  89   1         return(checkdata);
  90   1       }
  91          //====================================================================
  92          //函数名称:SurveyData(void)
  93          //输入变量:测量数据
  94          //输出变量:无
  95          //函数功能:存放从机发来的测量数据
  96          //====================================================================
  97          
  98          void SurveyData(void)
  99          {   
 100   1              unchar i;
 101   1              i=COM_dzdata[1];
 102   1              switch(i)
 103   1                      {
 104   2                      case 0x00:memcpy(Rateflow_buffer,Receive_buffer,10); break;
 105   2                  case 0x01:memcpy(Veloflow_buffer,Receive_buffer,10); break;
 106   2                      case 0x02:memcpy(Percentageflow_buffer,Receive_buffer,10); break;
 107   2                      case 0x03:memcpy(Resistanceflow_buffer,Receive_buffer,10); break;
 108   2                      case 0x04:memcpy(Positive_buffer,Receive_buffer,10); break;
 109   2                      case 0x05:memcpy(Opposite_buffer,Receive_buffer,10); break;
 110   2                      case 0x06:memcpy(Alarm_buffer,Receive_buffer,10); break;
 111   2                      case 0x07:memcpy(Diameter_buffer,Receive_buffer,10); break;
 112   2      
 113   2                      default:break;}
 114   1      }
 115          
 116          //- - - - - - - - - - - - - -  ------------------------------------------------------------------ --------
 117          //函数名称:发送命令
C51 COMPILER V7.50   D_485                                                                 04/27/2009 15:18:14 PAGE 3   

 118          //函数功能:主机发送通信命令
 119          // --------------------------------------------------------------------------------------------------
 120          void send_COM (void)
 121          {       
 122   1              unchar i;
 123   1              for(i=0;i<2;i++)
 124   1                      {
 125   2                              SBUF=COM_dzdata[i];
 126   2                              _nop_();
 127   2                              _nop_();
 128   2                              _nop_();
 129   2                              _nop_();
 130   2                              _nop_();                        
 131   2                      }
 132   1              ES=1;                //允许串行口中断
 133   1              
 134   1      }
 135          //=====================================================================
 136          //函数名称:Converse_data
 137          //函数功能:转换数据类型
 138          //输入函数:字符型接收到的数据
 139          //输出函数:长整形数据
 140          //==================================================================
 141          void    Converse_data(void)
 142          {     unchar i;
 143   1            i=COM_dzdata[1];
 144   1              switch(i)
 145   1                      {
 146   2                      case 0:  Rateflow_buffer[2]=(Rateflow_buffer[2]>>4)*10+(Rateflow_buffer[2]&0x0f);
 147   2                                       Rateflow_buffer[3]=(Rateflow_buffer[3]>>4)*10+(Rateflow_buffer[3]&0x0f);
 148   2                                       Rateflow_buffer[4]=(Rateflow_buffer[4]>>4)*10+(Rateflow_buffer[4]&0x0f);break;
 149   2                      case 1:  Veloflow_buffer[2]=(Veloflow_buffer[2]>>4)*10+(Veloflow_buffer[2]&0x0f);
 150   2                                       Veloflow_buffer[3]=(Veloflow_buffer[3]>>4)*10+(Veloflow_buffer[3]&0x0f);
 151   2                                       Veloflow_buffer[4]=(Veloflow_buffer[4]>>4)*10+(Veloflow_buffer[4]&0x0f);break;
 152   2                      case 2:  Percentageflow_buffer[2]=(Percentageflow_buffer[2]>>4)*10+(Percentageflow_buffer[2]&0x0f);
 153   2                                       Percentageflow_buffer[3]=(Percentageflow_buffer[3]>>4)*10+(Percentageflow_buffer[3]&0x0f);break;
 154   2                      case 3:  Resistanceflow_buffer[2]=(Resistanceflow_buffer[2]>>4)*10+(Resistanceflow_buffer[2]&0x0f);
 155   2                                       Resistanceflow_buffer[3]=(Resistanceflow_buffer[3]>>4)*10+(Resistanceflow_buffer[3]&0x0f);break;       
 156   2                      case 4:  Positive_buffer[2]=(Positive_buffer[2]>>4)*10+(Positive_buffer[2]&0x0f);
 157   2                                       Positive_buffer[3]=(Positive_buffer[3]>>4)*10+(Positive_buffer[3]&0x0f);
 158   2                                       Positive_buffer[4]=(Positive_buffer[4]>>4)*10+(Positive_buffer[4]&0x0f);
 159   2                                       Positive_buffer[5]=(Positive_buffer[5]>>4)*10+(Positive_buffer[5]&0x0f);
 160   2                                       Positive_buffer[6]=(Positive_buffer[6]>>4)*10+(Positive_buffer[6]&0x0f);break;
 161   2                      case 5:  Opposite_buffer[2]=(Opposite_buffer[2]>>4)*10+(Opposite_buffer[2]&0x0f);
 162   2                                       Opposite_buffer[3]=(Opposite_buffer[3]>>4)*10+(Opposite_buffer[3]&0x0f);
 163   2                                       Opposite_buffer[4]=(Opposite_buffer[4]>>4)*10+(Opposite_buffer[4]&0x0f);
 164   2                                       Opposite_buffer[5]=(Opposite_buffer[5]>>4)*10+(Opposite_buffer[5]&0x0f);
 165   2                                      Opposite_buffer[6]=(Opposite_buffer[6]>>4)*10+(Opposite_buffer[6]&0x0f);break;
 166   2              default:break;}
 167   1                      
 168   1      }
 169          //--------------------------------------------------------------------------------------------------
 170          // 函数名称: 主函数
 171          // 函数功能: 调度个子函数,完成通信过程
 172          //--------------------------------------------------------------------------------------------------
 173           void main(void)
 174           {
 175   1        unchar checkdata;
 176   1       do
 177   1       {
 178   2                UART_init();       //初始化串口
 179   2                send_COM ();
C51 COMPILER V7.50   D_485                                                                 04/27/2009 15:18:14 PAGE 4   

 180   2                if(point==9)       //判断数据是否接收完成
 181   2                {
 182   3                      checkdata=CLU_checkdata();    //调用求校验和函数
 183   3                      if(checkdata==Receive_buffer[8])        //判断校验和是否正确
 184   3                      {       
 185   4                      point=0;
 186   4                      SurveyData();
 187   4                      Converse_data();
 188   4                      }
 189   3                }
 190   2        }
 191   1        while(1);
 192   1       }
 193          
 194          
 195          
 196          
 197          
 198          
 199           


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    642    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =    103    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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