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

📄 main_sub.lst

📁 一个温度采集系统的单片机程序与WINDOWS 串口通信程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.00  MAIN_SUB                                                               06/14/2005 17:21:11 PAGE 1   


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

stmt level    source

   1          //#pragma src
   2          ///////////////////////////////////////////////
   3          //EEPROM存储区安排:
   4          //0000H~01FFH   512byte DS18B20 ID
   5          //0200H~027FH   128byte 温度数据
   6          //0280H~03FFH   384byte 配置参数<温度报警上下限值,温度转换精度>
   7          #include<reg51.h>
   8          #include<intrins.h>
   9          #include<rount3.h>
  10          #include<rount5.h>
  11          #include<rount6.h>
  12          
  13          #define collect 67                                      //C ASCII 码为67
  14          #define transmit        84
  15          #define init    73
  16          #define shedule 83
  17          #define dat             68
  18          #define ack             65
  19          
  20          sbit    led             =0x92;
  21          sbit    rst_rf  =0xb3;
  22          
  23          // GLOBAL VARIABLES
  24          unsigned char data receive_data[16];            //串行通信变量,设为全局变量确保快速响应
  25          unsigned char data command;
  26          unsigned char byt_count =0;                     //串行中断接收字节计数
  27          
  28          bit     data collect_tmp_flg    =0;                     //是否开始温度采集标志
  29          bit     data receive_en =1;                             //命令是否处理标志
  30          
  31          unsigned int data t1_count0     =900;                   //定时间隔参数
  32          unsigned int data t1_count1     =80;
  33          //PC命令修改下列两个参数值,可以改变温度采样时间间隔
  34          unsigned int data t1_data0      =900;
  35          unsigned int data t1_data1      =80;
  36          
  37          ////////////////////////////
  38          //名称:延迟程序
  39          //功能:根据参数延迟
  40          ////////////////////////////
  41          void delay_time(unsigned int us)                //29us/40us/52us/64us
  42          {  
  43   1      unsigned int data i;    
  44   1              for(i=0;i<=us;i++) 
  45   1              _nop_();
  46   1      }
  47                  
  48          void delay_time_1s  (void)                      //实际模拟仿真测试 /0.9s
  49          {
  50   1      unsigned char data i;
  51   1            while(i<4)
  52   1            {
  53   2                delay_time(8000);
  54   2              _nop_();
  55   2              delay_time(8000);
C51 COMPILER V7.00  MAIN_SUB                                                               06/14/2005 17:21:11 PAGE 2   

  56   2              i++;
  57   2            }
  58   1      } 
  59          
  60          
  61          //////////////////////////////
  62          //名称:定时器0 ISR
  63          //功能:DS18B20定时温度采集,存储
  64          //////////////////////////////
  65          void timer0(void) interrupt 1 using 3      
  66          {
  67   1      ET0     =0;
  68   1      TH0     =0x4C;
  69   1      TL0     =0x00;
  70   1              if( (--t1_count0)==0 )
  71   1            {
  72   2                      if( (--t1_count1)==0 )
  73   2                      {
  74   3      //                      collect_ds_tmp();               //此处可以调用温度采集程序<必须为再入函数>
  75   3                              if(collect_tmp_flg==1)                  //设置开始温度采集标志
  76   3                              _nop_();
  77   3                              else
  78   3                              collect_tmp_flg =1;
  79   3                              
  80   3                              t1_count1       =t1_data1;
  81   3                      }               
  82   2                      t1_count0       =t1_data0;
  83   2              }
  84   1      TF0     =0;     
  85   1      ET0     =1;
  86   1      EA      =1;                                                     //(十进制,两位整数,两位小数,
  87   1      }                                                                       //小数在低地址),存入EEPROM
  88          
  89          /////////////////////////////
  90          //名称:串口 ISR
  91          //功能:接收PC主机命令
  92          ////////////////////////////
  93          void    serial_isr(void) interrupt 4 
  94          {
  95   1        if(TI==1)
  96   1        TI    =0;
  97   1        else if(RI==1&&(receive_en==1))
  98   1              {
  99   2              RI      =0;
 100   2              receive_data[byt_count++]=SBUF;
 101   2                      if(byt_count>16)
 102   2                      {
 103   3                      byt_count       =0;
 104   3                      receive_en      =0;
 105   3                      }
 106   2              }
 107   1        else
 108   1        RI    =0;
 109   1      }
 110          
 111          ///////////////////////////////////////////////////////
 112          //名称:测试程序
 113          //功能:检测配置DS18B20是否成功
 114          /////////////////////////////////////////////////////
 115          /*
 116          void verify_config(void)
 117          {
C51 COMPILER V7.00  MAIN_SUB                                                               06/14/2005 17:21:11 PAGE 3   

 118          bit     data flag;
 119          bit     data page_ch_flg;
 120          unsigned char i,j;
 121          unsigned char id_count  =0;
 122          unsigned char init_adr0,sla_adr;
 123          unsigned char config_data[9];
 124          unsigned char id_rom[8];
 125          
 126          i       =0;     
 127          j       =0;
 128          sla_adr =0xA0;                                          //DS18B20 ID在EEPROM中存放首地址
 129          init_adr0       =0x00;                                                                                                  
 130          id_count        =0;
 131          page_ch_flg     =0;
 132          
 133          flag    =OWReset();
 134                  if(!flag)
 135                  {
 136                     do
 137                     {    
 138                          if(page_ch_flg==1)
 139                          {
 140                                  sla_adr =0xA2;
 141                                  rdnbyt(&id_rom[0],sla_adr,8);
 142                                  goto next;
 143                          }                       
 144                          if(id_count==0xf8)
 145                          page_ch_flg     =1;
 146                          
 147                          if(j==0)
 148                          rdadr(&id_rom[0],sla_adr,init_adr0,8);
 149                          else
 150                          rdnbyt(&id_rom[0],sla_adr,8);
 151                          
 152          next:           id_count+=8;            
 153                          OWReset();
 154                          OWWriteByte(0x55);                                      //发匹配ID命令
 155                          for(i=0;i<8;i++)
 156                          {
 157                                  OWWriteByte(id_rom[i]);
 158                          }
 159                          OWWriteByte(0xBE);                                      //送出Read ScatchPad命令   
 160                          for(i=0;i<9;i++)
 161                          {
 162                                  config_data[i]  =OWReadByte();
 163                      }
 164                          
 165                          j++;
 166                   }while(!OWReset()&&(j<64) );                           // 读取64个DS18B20 ID    
 167                 }   
 168          _nop_();         
 169          }
 170          */
 171          
 172          ////////////////////////////////////////////////////////////
 173          //名称:确认信号帧回复
 174          //功能:接收到正确的PC命令帧,回复确认信号帧
 175          ///////////////////////////////////////////////////////////
 176          unsigned char code index_rom[2] ={0x01,0x01};                           //仓库号,列号
 177          
 178          void    send_ack(void)
 179          {
C51 COMPILER V7.00  MAIN_SUB                                                               06/14/2005 17:21:11 PAGE 4   

 180   1            ES        =0;
 181   1            send_syn_pc();
 182   1              send_byte_pc(65);                                                               //发送标识符A<ASCII>    
 183   1              send_pbyt_pc(&index_rom[0]);
 184   1              send_end_pc();
 185   1              ES      =1;
 186   1      }
 187          
 188          ////////////////////////////////////////////
 189          //名称:串口查询方式接收程序
 190          //功能:中断后,关中断使能,以查询方式接收PC命令字节,
 191          //      并对命令进行解析,返回命令值 
 192          /////////////////////////////////////////////
 193          unsigned char pc_cmd_data[4];   
 194          #define         identity        1
 195          #define         columne 1
 196          
 197          unsigned char receive_cmd(us)
 198          unsigned char *us;
 199          {
 200   1      unsigned char i,k;
 201   1      unsigned char data_tmp[8];
 202   1      unsigned char crc_result;
 203   1      bit     crc_flg;
 204   1      crc_result      =0;
 205   1      //data_tmp[0]   =*(us+1);
 206   1      //unsigned char data_chk[15]={0xff,0x55,0x55,0xFF,0xAA,0x01,0x01,84};                   //为观察指针变量引入测试变量
 207   1      //unsigned char data *us=&data_chk[0];
 208   1        
 209   1            for(i=0;i<16;)
 210   1              {
 211   2      //              data_tmp[0]     =*us;                                                                           //set for test varibles
 212   2      //              data_tmp[1]     =*(us+1);
 213   2                      if( (*(us+i)==0xFF)&&( *(us+i+1)==0xAA )&&(*(us+i+2)==0x44) )           //识别帧同步字节        
 214   2                      {
 215   3                              for(k=0;k<8;k++)
 216   3                              {
 217   4                                      data_tmp[k]     =*(us+i+3+k);                                           // 此处采用for语句得不到正确值?
 218   4                                      if(k==0)                                                        //初始化CRC码
 219   4                                      crc_flg =1;
 220   4                                      else 
 221   4                                      crc_flg =0;
 222   4                                      
 223   4                                      crc_result      =OWCrc_c(data_tmp[k],crc_flg);
 224   4                              }                       
 225   3                              if(crc_result)                                                  //CRC校验正确,往下判断是否呼叫本仓库
 226   3                              goto    error;
 227   3                              else            
 228   3                              goto next;
 229   3                      }

⌨️ 快捷键说明

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