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

📄 ds1820.lst

📁 51单片机开发与应用技术详解(珍藏版)PPT及源码
💻 LST
📖 第 1 页 / 共 2 页
字号:
 184   1      else                                                            //搜索成功
 185   1      {                                                                       
 186   2      LastData = discrepMarker;                       //置位LastData, lastOne和nxt
 187   2      EndFlag = (LastData==0);
 188   2      nxt = TRUE;                                             //表示总线上还有其它器件,搜索未结束
 189   2      }
 190   1      return nxt;
 191   1      }
 192          
 193          
 194          uchar FindFirstDevice(void) 
 195          {
 196   1      LastData = 0; 
 197   1      EndFlag = FALSE;
 198   1      return SearchDevice();                                  //搜索器件函数SearchDevice
 199   1      }
 200          
 201          
 202          
 203          void ReadData(void) 
 204          {
 205   1      int j;
 206   1      char pad[10];
 207   1      printf("\nReading ScratchPad Data\n");
 208   1      WriteByte(0xBE);                                                //读暂存器命令(代码为BEH)
 209   1      for (j=0;j<9;j++)                                                       //循环读取暂存器中9个字节的数据
 210   1      {
 211   2      pad[j]=ReadByte();                                              //字节读取函数
 212   2      }
 213   1      printf("\n ScratchPAD DATA =%X%X%X%X%X%X\n",
 214   1      pad[8],pad[7],pad[6],pad[5],pad[4],pad[3],pad[2],pad[1],pad[0]);
 215   1      }
 216          
 217          
 218          void FindDevices(void) 
 219          {
 220   1      uchar m;
 221   1        if(!Reset())                                                  //复位总线
 222   1      {                                                                       //如果存在器件则开始处理
 223   2              if(FindFirstDevice())                                   //调用FindFirstDevice函数
 224   2      {
 225   3                      numROMs=0;
 226   3                      do                                                      //循环
 227   3      {
 228   4                              numROMs++;
 229   4                              for(m=0;m<8;m++) 
 230   4      {                                               //识别ROM代码
 231   5                                      ROMFound[numROMs][m]=DS18S20ROM[m]; 
 232   5                              }
 233   4                       printf("\nDS18S20 ROM CODE =%02X%02X%02X%02X\n",
 234   4                       ROMFound[5][7],ROMFound[5][6],ROMFound[5][5],ROMFound[5][4],
 235   4                       ROMFound[5][3],ROMFound[5][2],ROMFound[5][1],ROMFound[5][0]);
 236   4                       }while (SearchDevice()&&(numROMs<10)); //直到没有发现其它器件
 237   3              }
 238   2        }
 239   1      }
 240          
 241          
C51 COMPILER V8.08   DS1820                                                                07/04/2008 11:10:12 PAGE 5   

 242          
 243          void ReadTemperature(void) 
 244          {
 245   1      char get[10];
 246   1      char temp_lsb,temp_msb;
 247   1      int k;
 248   1      char Ftemperature,Ctemperature;
 249   1      Reset();                                                                //复位
 250   1      WriteByte(0xCC);                                                //跳过ROM序列号命令(代码为CCH)
 251   1      WriteByte(0x44);                                                //启动温度转换命令(代码为44H)
 252   1      Delay(5);
 253   1      Reset();
 254   1      WriteByte(0xCC);                                                //跳过ROM序列号命令(代码为CCH)
 255   1      WriteByte(0xBE);                                                //读暂存器命令(代码为BEH)
 256   1      for (k=0;k<9;k++)
 257   1      {
 258   2      get[k]=ReadByte();                                              //循环读取
 259   2      }
 260   1      printf("\n Scratch DATA = %X%X%X%X%X\n",
 261   1      get[8],get[7],get[6],get[5],get[4],get[3],get[2],get[1],get[0]);
 262   1      temp_msb = get[1];
 263   1      temp_lsb = get[0];
 264   1      if (temp_msb <= 0x80)
 265   1      {         
 266   2      temp_lsb = (temp_lsb/2);                                //移位,得到完整的温度值
 267   2      }                                                               
 268   1      temp_msb = temp_msb & 0x80;                     //屏蔽符号位之外的所有数据位
 269   1      if (temp_msb >= 0x80) 
 270   1      {
 271   2      temp_lsb = (~temp_lsb)+1;                               // temp_lsb取补
 272   2      } 
 273   1      if (temp_msb >= 0x80) 
 274   1      {
 275   2      temp_lsb = (temp_lsb/2);                                        //移位,得到完整的温度值
 276   2      }
 277   1      if (temp_msb >= 0x80) 
 278   1      {
 279   2      temp_lsb = ((-1)*temp_lsb);                             //符号位
 280   2      } 
 281   1      printf( "\nTempC= %d degrees C\n", (int)temp_lsb );//摄氏温度值输出
 282   1      Ctemperature = temp_lsb; 
 283   1      Ftemperature = (((int)Ctemperature)* 9)/5 + 32;
 284   1      printf( "\nTempF= %d degrees F\n", (int)Ftemperature );//华氏温度值输出
 285   1      }
 286          
 287          
 288          void main(void) 
 289          {
 290   1      uchar Select_Menu;                                      //功能选择
 291   1      
 292   1      SCON=0x50;                                                      //初始化串行口模式1
 293   1      TMOD=0x20;                                                      //初始化T1为定时功能,模式2
 294   1      PCON=0x80;                                                      //设置SMOD=1
 295   1      TL1=0xF4;                                                       //波特率4800bit/s,初值
 296   1      TH1=0xF4;                                                
 297   1      
 298   1        TR1 = 1;                                                      //启动T1
 299   1        TI = 1;                                                               //启动发送
 300   1      
 301   1        while(1)                                                              //主循环
 302   1      {                                               
 303   2        printf (" AT89S52 Control DS18S20\n");                //输出信息
C51 COMPILER V8.08   DS1820                                                                07/04/2008 11:10:12 PAGE 6   

 304   2        printf("\n*********************************************************\n");
 305   2        printf (" Select Control Menu Option\n");
 306   2        printf (" 1. Reset 1-Wire.\n");
 307   2        printf (" 2. Read DS18S20 ROM Code.\n");
 308   2        printf (" 3. Search DS18S20 ROM.\n");
 309   2        printf (" 4. Find All DS18S20.\n");
 310   2        printf (" 5. Read DS18S20 Scratch.\n");
 311   2        printf (" 6. Read DS18S20 Temperature.\n");
 312   2        printf (" 7. Exit.\n");
 313   2        printf (" Please Input Menu Option:\n");
 314   2      
 315   2              Select_Menu = _getkey();                        //从键盘输入选择数字
 316   2              switch(Select_Menu)
 317   2      {
 318   3                      case '1':                                               //复位1-Wire总线
 319   3                              printf ("\n You Select 1. Reset 1-Wire\n");
 320   3                              Reset();                                        //复位函数
 321   3                              break;
 322   3                      case '2':                                               //读DS18S20 ROM
 323   3                              printf ("\n You Select 2. Read DS18S20 ROM Code \n");
 324   3                              Reset();
 325   3                              ReadROMSerialNumber();  //读取ROM代码函数
 326   3                              break;
 327   3                      case '3':                                               //搜索DS18S20
 328   3                              printf("\n You Select 3. Search DS18S20 ROM \n");
 329   3                              Reset();
 330   3                              FindFirstDevice();                      //搜索第一个器件
 331   3                              printf("\nDS18S20 ROM CODE =%02X%02X%02X%02X\n",
 332   3                                ROMFound[5][7],ROMFound[5][6],ROMFound[5][5],ROMFound[5][4],
 333   3                                ROMFound[5][3],ROMFound[5][2],ROMFound[5][1],ROMFound[5][0]);
 334   3                              break;
 335   3                      case '4':                                               //搜索所有DS18S20
 336   3                              printf ("\n You Select 4. Find All DS18S20\n");
 337   3                              Reset();
 338   3                              FindDevices();                          //查找器件函数
 339   3                              break;
 340   3                      case '5':                                               //读取高速暂存器
 341   3                              printf ("\n You Select 5. Read DS18S20 Scratch \n");
 342   3                              Reset();
 343   3                              WriteByte(0xCC);                        //跳过ROM序列号命令(代码为CCH)
 344   3                              ReadData();                             //读取高速暂存器
 345   3                              break;
 346   3                      case '6':                                               //读取温度
 347   3                              printf ("\n You Select 6. Read DS18S20 Temperatur\n");
 348   3                              ReadTemperature();              //读取温度值
 349   3                              break;
 350   3                      case '7':                                               //退出程序
 351   3                              printf ("\n You Select 7. Exit\n");
 352   3                              goto Exit;                              //转向Exit标号处
 353   3                              break;
 354   3                      default: 
 355   3      printf ("\n Error: Please Select Right Menu Option\n");
 356   3                              break;
 357   3                      }; 
 358   2        }
 359   1      Exit: printf("Exit the program!");                              //退出
 360   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1237    ----
   CONSTANT SIZE    =   1089    ----
C51 COMPILER V8.08   DS1820                                                                07/04/2008 11:10:12 PAGE 7   

   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     52      37
   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 + -