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

📄 subpro_ds.lst

📁 一个温度采集系统的单片机程序与WINDOWS 串口通信程序
💻 LST
字号:
C51 COMPILER V7.00  SUBPRO_DS                                                              03/17/2005 19:51:15 PAGE 1   


C51 COMPILER V7.00, COMPILATION OF MODULE SUBPRO_DS
OBJECT MODULE PLACED IN SubPro_ds.OBJ
COMPILER INVOKED BY: C:\PROGRA~1\Keil\C51\BIN\c51.exe SubPro_ds.c DB OE SMALL ROM(LARGE)

stmt level    source

   1          //修改程序中<DS18B20 ID>,<温度超限DS18B20 ID>,<温度数据值在EEPROM中的存放首地址>  
   2          
   3          extern unsigned char sla_adr0;
   4          extern unsigned char pc_config_data[3];
   5          extern unsigned int data t1_data0;
   6          extern unsigned int data t1_data1;
   7          extern unsigned char data receive_data[5];      //串行通信变量,设为全局变量确保快速响应
   8          
   9          extern void delay_time_1s(void);             //Mutiple call to segment ?
  10          extern void send_tmp_pc(void);
  11          extern void read_all_tmp(void);
  12          extern void send_ack_byt(void); 
  13          
  14          extern bit      data receive_en;
  15          #include<transmit_data_h.h>
  16          #include<intrins.h>
  17          
  18          #define identity        0x01       //仓库号
  19          #define columne 0x01       //列号
  20          
  21          sbit    DQ      =0x97;
  22          unsigned char data pc_cmd_data[4];                              //接收到的4byte PC数据字节
  23          
  24          ///////////////////////////////////////////
  25          //名称:测温程序
  26          //功能:命令64个DS18B20读取温度数据。存入EEPROM中
  27          void collect_ds(void)
  28          {
  29   1      read_all_tmp();
  30   1      }
  31          
  32          /////////////////////////////////////////////
  33          //名称:定时参数设置程序
  34          //功能:修改定时采样时间间隔
  35          /////////////////////////////////////////////
  36          void    change_time(void)       
  37          {
  38   1      unsigned int data time_tmp;
  39   1      time_tmp        =time_tmp|pc_cmd_data[0];
  40   1      time_tmp        =(time_tmp<<8)&0xff00;
  41   1      t1_data0        =time_tmp|pc_cmd_data[1];
  42   1      
  43   1      time_tmp        =time_tmp|pc_cmd_data[2];
  44   1      time_tmp        =(time_tmp<<8)&0xff00;
  45   1      t1_data1        =time_tmp|pc_cmd_data[3];
  46   1      
  47   1      }
  48          ///////////////////////////////////////////////////
  49          //名称:温度采集
  50          //功能:定时命令DS18B20采集温度数据,存入EEPROM中
  51          //////////////////////////////////////////////////
  52          void collect_ds_tmp(void)
  53          {
  54   1              if(!OWReset())          //命令DS18B20温度转
  55   1              {
C51 COMPILER V7.00  SUBPRO_DS                                                              03/17/2005 19:51:15 PAGE 2   

  56   2                      OWWriteByte(0xCC);      
  57   2                      OWWriteByte(0x44);
  58   2            }
  59   1      delay_time_1s();
  60   1      _nop_();
  61   1      delay_time_1s();
  62   1      collect_ds();                   //读取温度转换数据,存入EEPROM中
  63   1      }
  64          
  65          /////////////////////////////////////////
  66            //名称:温度采集程序
  67          //功能:命令64个DS18B20同时开始温度采集
  68          ////////////////////////////////////////
  69          void send_ds_cmd(void) 
  70          {
  71   1      //unsigned char i;
  72   1      //unsigned char data_rom[9];
  73   1      
  74   1              if(!OWReset())
  75   1              {
  76   2                      OWWriteByte(0xCC);
  77   2                      OWWriteByte(0x44);      
  78   2                      delay_time_1s();
  79   2                      
  80   2      //              OWReset();
  81   2      //              OWWriteByte(0xCC);
  82   2      //              OWWriteByte(0xBE);
  83   2      //              for(i=0;i<9;i++)
  84   2      //              data_rom[i]     =OWReadByte();
  85   2                      _nop_();
  86   2                      
  87   2                      
  88   2            }
  89   1      
  90   1      }
  91          
  92          
  93          ///////////////////////////////////////////////////////////
  94          //名称:确认信号解析
  95          //功能:对接收到的PC确认信号进行解析,判断本次传送操作是否成功?
  96          //////////////////////////////////////////////////////////
  97          ////////////////////////////////////////////
  98          bit receive_ack(us)
  99          unsigned char *us;
 100          {
 101   1      unsigned char i;
 102   1      unsigned char data_tmp[2]       ={0x00,0x00};
 103   1      //data_tmp[0]   =*(us+1);
 104   1      //unsigned char data_chk[15]={0xff,0x55,0x55,0xFF,0xAA,0x01,0x01,84}; //为观察指针变量引入测试变量
 105   1      //unsigned char data *us=&data_chk[0];
 106   1        
 107   1            for(i=0;i<15;)
 108   1              {
 109   2                      if( (*(us+i)==0x44)&&(*(us+i+1)==0xFF)&&( *(us+i+2)==0xAA ) )     //识别帧同步字节      
 110   2                      {
 111   3                              data_tmp[0]     =*(us+i+3);
 112   3                              data_tmp[1]     =*(us+i+4);
 113   3                              goto next;
 114   3                      }
 115   2                      i++;
 116   2            }     
 117   1       
C51 COMPILER V7.00  SUBPRO_DS                                                              03/17/2005 19:51:15 PAGE 3   

 118   1      next:   if( (data_tmp[0]==identity)&(data_tmp[1]==columne) )      //判断是否为对本2051系统                  
             -                          
 119   1              return 1;                                   
 120   1              else
 121   1              return 0;                                       
 122   1      }
 123          
 124          
 125          
 126          ////////////////////////////////////////
 127          //名称:数据无线传输
 128          //功能:2051取RAM单元数据封装成数据帧发送给PC
 129          ///////////////////////////////////////
 130          
 131          //传送数据帧 
 132          void send_data_pc(void)
 133          {
 134   1      //2051取RAM 数据包发送给PC
 135   1      //      send_syn_pc();
 136   1      repeat_s:send_tmp_pc();
 137   1              while(receive_en==1);                   //等待PC确认信号
 138   1              if(!receive_ack(&receive_data[0]) )
 139   1              goto    repeat_s;
 140   1              else
 141   1              receive_en      =1;
 142   1      //      send_end_pc();
 143   1      }
 144                                  
 145          
 146          ////////////////////////////////////////
 147          //名称:出错处理
 148          //功能:接收到PC非法命令,作显示提示
 149          ////////////////////////////////////////
 150          void error_set(void)
 151          {
 152   1      //printf("Command Error!\n");
 153   1              _nop_();
 154   1              _nop_();        
 155   1      }
 156          
 157          ////////////////////////////////////////
 158          //名称:配置DS18B20
 159          //功能:配置DS18B20 采样精度,告警上下限
 160          ///////////////////////////////////////
 161          void configure_ds(void)
 162          {
 163   1      bit data flag;
 164   1      unsigned char i,j;
 165   1      unsigned char id_count  =0;
 166   1      unsigned char id_rom[8];
 167   1      bit     page_flg        =0;
 168   1      
 169   1      i       =0;     
 170   1      j       =0;
 171   1              for(i=0;i<3;i++)
 172   1              {
 173   2                      pc_config_data[i]       =pc_cmd_data[i];
 174   2              }
 175   1      
 176   1      sla_adr0        =0xA0;                                  //24C08硬件地址
 177   1      init_adr        =0x00;                                  //DS18B20 ID在EEPROM中存放首地址
 178   1      flag    =OWReset();
C51 COMPILER V7.00  SUBPRO_DS                                                              03/17/2005 19:51:15 PAGE 4   

 179   1              if(!flag)
 180   1              {
 181   2                 do
 182   2                 {    
 183   3                      if(page_flg==1)
 184   3                      {       sla_adr0|=pagel;
 185   4                              page_flg        =0;
 186   4                              rdnbyt(&id_rom[0],sla_adr0,8);
 187   4                              goto next;
 188   4                      }
 189   3                      if(id_count==0xf8)
 190   3                      page_flg        =1;
 191   3                      
 192   3                      if(j==0)
 193   3                      rdadr(&id_rom[0],sla_adr0,init_adr,8);
 194   3                      else
 195   3                      rdnbyt(&id_rom[0],sla_adr0,8);                  //读取下一个DS18B20 ID  
 196   3                      
 197   3      next:           OWReset();
 198   3                      OWWriteByte(0x55);                      //发匹配ID命令
 199   3                      for(i=0;i<8;i++)
 200   3                      {
 201   4                              OWWriteByte(id_rom[i]);
 202   4                      }
 203   3                      OWWriteByte(0x4E);                      //送出Write ScatchPad命令   
 204   3                      for(i=0;i<3;i++)
 205   3                      {
 206   4                              OWWriteByte(pc_config_data[i]);
 207   4                      }
 208   3                      
 209   3                      flag    =OWReset();
 210   3                      if(!flag)
 211   3                      {
 212   4                              for(i=0;i<8;i++)
 213   4                              {
 214   5                                      OWWriteByte(id_rom[i]); //发匹配ID命令
 215   5                              }
 216   4                        OWWriteByte(0x48);            //发COPY ROM命令
 217   4                              DQ      =1;
 218   4                              delay_time_1s();
 219   4                  }
 220   3                                                              
 221   3                      id_count+=8;
 222   3                      j++;
 223   3               }while(!OWReset()|(j<64) );            //配置64个DS18B20  
 224   2        
 225   2             }     
 226   1      }
 227          
 228          
 229          ////////////////////////////////////////////////////////////
 230          //名称:确认信号帧回复
 231          //功能:接收到正确的PC命令帧,回复确认信号帧
 232          ///////////////////////////////////////////////////////////
 233          void    send_ack(void)
 234          {
 235   1              send_ack_byt(); 
 236   1      }
 237          
 238          
 239          
 240          ////////////////////////////////////////////
C51 COMPILER V7.00  SUBPRO_DS                                                              03/17/2005 19:51:15 PAGE 5   

 241          //名称:串口查询方式接收程序
 242          //功能:中断后,关中断使能,以查询方式接收PC命令字节,
 243          //      并对命令进行解析,返回命令值 
 244          /////////////////////////////////////////////
 245          unsigned char receive_cmd(us)
 246          unsigned char *us;
 247          {
 248   1      unsigned char i,k;
 249   1      unsigned char data_tmp[7];
 250   1      unsigned char crc_result;
 251   1      //data_tmp[0]   =*(us+1);
 252   1      //unsigned char data_chk[15]={0xff,0x55,0x55,0xFF,0xAA,0x01,0x01,84}; //为观察指针变量引入测试变量
 253   1      //unsigned char data *us=&data_chk[0];
 254   1        
 255   1            for(i=0;i<15;)
 256   1              {
 257   2                      if( (*(us+i)==0x43)&&(*(us+i+1)==0xFF)&&( *(us+i+2)==0xAA ) )     //识别帧同步字节      
 258   2                      {
 259   3                              for(k=0;k<7;k++)
 260   3                              {
 261   4                                      data_tmp[k]     =*(us+i+3+k);               // 此处采用for语句得不到正确值?
 262   4                                      crc_result      =OWCrc(data_tmp[k]);
 263   4                              }                       
 264   3                              if(crc_result)
 265   3                              goto    error;
 266   3                              else            
 267   3                              goto next;
 268   3                      }
 269   2                      i++;
 270   2            }     
 271   1       
 272   1      next:   if( (data_tmp[0]==identity)&(data_tmp[1]==columne) )      //判断是否为对本2051系统                  
             -                          
 273   1              {
 274   2                      for(k=0;k<4;k++)  
 275   2                      pc_cmd_data[k]  =data_tmp[k+3];        // 提取命令帧中的数据字节         
 276   2                      send_ack();                                          //发送确认信号帧
 277   2                      return (data_tmp[2]);                        //返回控制指令
 278   2              }                                           
 279   1              else
 280   1      error:return (0x00);                                       
 281   1      }
 282          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    673    ----
   CONSTANT SIZE    =      2    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      4      29
   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 + -