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

📄 main_sub.lst

📁 一个温度采集系统的单片机程序与WINDOWS 串口通信程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 230   2                      i++;
 231   2            }     
 232   1       
 233   1      next:   if( (data_tmp[0]==identity)&(data_tmp[1]==columne) )                    //判断是否为对本2051系统                
             -                            
 234   1              {
 235   2                      for(k=0;k<4;k++)  
 236   2                      pc_cmd_data[k]  =data_tmp[k+3];                                 // 提取命令帧中的数据字节        
 237   2                      send_ack();                                                                     //发送确认信号帧
 238   2                      return (data_tmp[2]);                                                   //返回控制指令
 239   2              }                                           
 240   1              else
C51 COMPILER V7.00  MAIN_SUB                                                               06/14/2005 17:21:11 PAGE 5   

 241   1      error:return (0x00);                                       
 242   1      }
 243          
 244          ////////////////////////////////////////////
 245          //名称:温度数据传输程序
 246          //功能:将温度数据打包传送给PC,加入CRC校验和前向纠错
 247          //////////////////////////////////////////
 248          //unsigned char code index_rom[2]       ={0x01,0x01};                                   //仓库号,列号
 249          
 250          void send_tmp_pc(void)
 251          {
 252   1      unsigned char data  i,k;
 253   1      unsigned char data  crc_result;
 254   1      unsigned char data id_count=0;
 255   1      unsigned char sla_adr;
 256   1      unsigned char init_adr;
 257   1      unsigned char data tmp_data[8];
 258   1      
 259   1      i       =0;
 260   1      sla_adr =0xA4;                                                  //24C08硬件地址
 261   1      init_adr        =0x00;                                                  //温度数据在EEPROM存放首地址
 262   1      
 263   1      ES      =0;                                                                     //串行口采用查询方式发送数据
 264   1              
 265   1              for(k=0;k<2;k++)                                                        //计算仓库号,列号 CRC码
 266   1              OWCrc(index_rom[k]);    
 267   1              do
 268   1              { 
 269   2                if(i==0)
 270   2                {
 271   3                      rdadr(&tmp_data[0],sla_adr,init_adr,8);                 //从EEPROM读出8个字节 
 272   3                      send_syn_pc();
 273   3                      send_byte_pc(68);                                               //发送标识符D<ASCII>    
 274   3                      send_pbyt_pc(&index_rom[0]);                    //发送仓库号,列号
 275   3                      send_nbyt_pc(&tmp_data[0]);                             //发送8个字节->>PC      
 276   3                      for(k=0;k<8;k++)                                                //测试计算CRC码时间
 277   3                      OWCrc(tmp_data[k]);
 278   3                }
 279   2                else  
 280   2                {
 281   3                      rdnbyt(&tmp_data[0],sla_adr,8);
 282   3                      send_nbyt_pc(&tmp_data[0]);
 283   3                      for(k=0;k<8;k++)
 284   3                      crc_result      =OWCrc(tmp_data[k]);
 285   3                }
 286   2                i++;
 287   2           }while( i<4);                                                      //?????容量为16个DS18B20
 288   1      
 289   1      send_byte_pc(crc_result);                                               //发送CRC校验码
 290   1      send_end_pc();                                                          //发送结束字符
 291   1      
 292   1      ES      =1;                                                                     //允许串行口中断,接收命令字节
 293   1      }
 294          
 295          ///////////////////////////////////////////////////////////
 296          //名称:确认信号解析
 297          //功能:对接收到的PC确认信号进行解析,判断本次传送操作是否成功?
 298          //////////////////////////////////////////////////////////
 299          ////////////////////////////////////////////
 300          bit receive_ack(us)
 301          unsigned char *us;
 302          {
C51 COMPILER V7.00  MAIN_SUB                                                               06/14/2005 17:21:11 PAGE 6   

 303   1      unsigned char i;
 304   1      unsigned char data_tmp[2]       ={0x00,0x00};
 305   1      //data_tmp[0]   =*(us+1);
 306   1      //unsigned char data_chk[15]={0xff,0x55,0x55,0xFF,0xAA,0x01,0x01,84};           //为观察指针变量引入测试变量
 307   1      //unsigned char data *us=&data_chk[0];
 308   1        
 309   1            for(i=0;i<16;)
 310   1              {
 311   2                      if( (*(us+i)==0xFF)&&( *(us+i+1)==0xAA )&&(*(us+i+2)==0x41) )     //识别帧同步字节      
 312   2                      {
 313   3                              data_tmp[0]     =*(us+i+3);
 314   3                              data_tmp[1]     =*(us+i+4);
 315   3                              goto next;
 316   3                      }
 317   2                      i++;
 318   2            }     
 319   1       
 320   1      next:   if( (data_tmp[0]==identity)&(data_tmp[1]==columne) )                            //判断是否为对本2051系统               
             -                             
 321   1              return 1;                                   
 322   1              else
 323   1              return 0;                                       
 324   1      }
 325          
 326          
 327          
 328          ////////////////////////////////////////
 329          //名称:数据无线传输
 330          //功能:2051取RAM单元数据封装成数据帧发送给PC
 331          ///////////////////////////////////////
 332          void send_data_pc(void)
 333          {
 334   1      unsigned int data i,j;
 335   1      
 336   1      send_nxt:
 337   1      i       =100;
 338   1      j       =1000;
 339   1      
 340   1      repeat_s:send_tmp_pc();
 341   1              while(i>1)
 342   1              {
 343   2                 while(j>1)
 344   2                 {    
 345   3                      if(receive_en==0)
 346   3                      {       receive_en      =1;                                                             //等待PC确认信号,启动定时器0,设置时限 1.4s
 347   4              
 348   4                              if(!receive_ack(&receive_data[0]) )                      //此处问题待解决
 349   4                              goto send_nxt;
 350   4                              else
 351   4                              return;
 352   4                      }
 353   3                      
 354   3                      j--;
 355   3                 }
 356   2                 j    =1000;
 357   2                 i--;
 358   2              }
 359   1              
 360   1      }
*** WARNING C280 IN LINE 340 OF MAIN_SUB.C: 'repeat_s': unreferenced label
 361                  
 362          ////////////////////////////////////////////////
C51 COMPILER V7.00  MAIN_SUB                                                               06/14/2005 17:21:11 PAGE 7   

 363          //名称:命令解析
 364          //功能:对接收到的PC命令进行处理,执行相应操作:温度采集,数据传送,初始参数设置作
 365          ///////////////////////////////////////////////
 366          void do_pc_cmd(void) 
 367          {
 368   1      
 369   1      command=receive_cmd(&receive_data[0]);     //接收PC主机命令字节
 370   1      //命令处理
 371   1      if(command==collect)                            //温度采集命令
 372   1        {
 373   2              send_ds_cmd();                          //发温度采集命令给所有DS18B20
 374   2        }
 375   1      else if(command==transmit)                      //数据传送命令
 376   1        {
 377   2            send_data_pc();                           //EEPROM 数据包发送给PC
 378   2              //从PC端显示数据测试                    //set for test                  
 379   2        }
 380   1      
 381   1      else if(command==init)
 382   1        {
 383   2              configure_ds();
 384   2       //     verify_config();                                //set for test
 385   2        }
 386   1      else if(command==shedule)
 387   1        {
 388   2              change_time();
 389   2      //      读取t1_data0,t1_data1变量值             //set for test
 390   2        }               
 391   1      else                                            //非法命令
 392   1            error_set();                              //非法命令转出错处理
 393   1      
 394   1      
 395   1      }
 396          
 397          
 398          
 399          /////////////////////////////
 400          //名称:温度采集子系统主程序
 401          ////////////////////////////
 402          //extern void read_all_tmp(void);    
 403          
 404          main()
 405          {
 406   1      
 407   1      //初始化定时器0,定时器1
 408   1      SCON    =0x50;                                          //设置串行通信方式为1 
 409   1      TMOD    =0x21;
 410   1      
 411   1      TH0     =0x4C;                                          //50ms中断一次,初始值0x4C00  
 412   1      TL0     =0x00;
 413   1      TR0     =1;
 414   1      
 415   1      TH1     =0xE8;                                          //串行通信波特率为1200bps
 416   1      TL1     =0xE8;
 417   1      TR1     =1;
 418   1      
 419   1      //使能定时器中断,串行口中断,外部中断0
 420   1      ET0     =1;
 421   1      ET1     =0;                                                     //定时器1用于串行通信波特率发生器,禁止中断  
 422   1      ES      =1;
 423   1      
 424   1      EA      =1;                                                             //注意:任何一次子程序调用都会将EA置0 !!
C51 COMPILER V7.00  MAIN_SUB                                                               06/14/2005 17:21:11 PAGE 8   

 425   1      //read_all_tmp();       
 426   1      //无限循环,等待
 427   1      loop:while(receive_en==1&&collect_tmp_flg==0);          //查询是否接收到pc命令?
 428   1      //      EA      =0;                                                     //关总中断,避免冲突
 429   1      
 430   1              if(receive_en==0)                                       //串口中断服务程序
 431   1              {
 432   2                      receive_en      =1;                             //允许接收下一个命令
 433   2                      do_pc_cmd();                                    //处理命令                      
 434   2              }
 435   1              else if(collect_tmp_flg==1)                             //定时器0中断服务程序
 436   1              {
 437   2                      collect_ds_tmp();
 438   2                      collect_tmp_flg =0;                             //清允许温度采集标志
 439   2              }
 440   1              
 441   1              TF0     =0;                                                     //清定时器溢出标志
 442   1              RI      =0;                                                     //清除接收数据标志      
 443   1              EA      =1;                                             //命令处理完毕后EA被自动清零,
 444   1              goto loop;                                              //此处必须插入EA=1语句
 445   1      
 446   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    878    ----
   CONSTANT SIZE    =      4    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     30      37
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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