18b20中文资料_引脚图_程序

18b20的样子和三极管一模一样,但它是一个数字芯片。(所以看芯片和看人一样,不能只看外表)它长着3个脚,内部还有寄存器,它的3个脚:一地、一火、一信号。它与单片机通信,属于单总线方式。所以,只要你的单片机系统中,留一个单片机引脚,就可以把测量温度的功能加进去。

18b20引脚图

 

程序:

  1. //=============================//
  2. // DS18B20复位函数 //
  3. //=====================================//
  4. bit ds18b20_reset(void)
  5. {
  6. bit bitbuf;
  7. ds18b20=1;
  8. //10us
  9. TH0=0xff;
  10. TL0=0xf6;
  11. TF0=0;
  12. while(!TF0);
  13. ds18b20=0;
  14. //设置1-wire总线为低电平(占领总线)
  15. //延迟480us-960us,尽可能选小值(480us)
  16. //这里我们选490us
  17. TH0=0xfe;
  18. TL0=0x3c;
  19. TF0=0;
  20. while(!TF0);
  21. ds18b20=1;
  22. //设置1-wire总线为高电平(释放总线)
  23. //最佳时间: 60us+7.5us
  24. //这里我们选68us
  25. TH0=0xff;
  26. TL0=0xc1;
  27. TF0=0;
  28. while(!TF0);
  29. ds18b20=1;
  30. // 探测总线上是否有器件
  31. if(ds18b20==1) bitbuf=1; //没有器件在线
  32. else bitbuf=0; //有器件在线
  33. //保证DS18B20释放总线的时间
  34. //490-68=422us
  35. TH0=0xfe;
  36. TL0=0x7b;
  37. TF0=0;
  38. while(!TF0);
  39. return(bitbuf);
  40. }
  41. //==============================//
  42. // DS18B20写字节函数 //
  43. //===============================//
  44. void ds18b20_write(unsigned char val)
  45. {
  46. unsigned char i;
  47. for (i=0;i<8;i++) // { ds18b20=0; // 设置1-wire总线为低电平 //2us TH0=0xff; TL0=0xfe; TF0=0; while(!TF0); ds18b20=val&0x01; //最低位移出 val=val>>1; //右移一位
  48. //60us~120us(实际不能到120us, 因为其它语句也用时间了!)
  49. //这里我们选62us
  50. TH0=0xff;
  51. TL0=0xc6;
  52. TF0=0;
  53. while(!TF0);
  54. ds18b20=1;
  55. }
  56. }
  57. //========================================//
  58. // DS18B20读字节函数 //
  59. //===================================//
  60. unsigned char ds18b20_read(void)
  61. {
  62. unsigned char i;
  63. unsigned char value = 0;
  64. for (i=0;i<8;i++) { //从总线拉低到读总线状态,不能大于15us! ds18b20=0; //2us TH0=0xff; TL0=0xfe; TF0=0; while(!TF0); ds18b20=1; //4us TH0=0xff; TL0=0xfc; TF0=0; while(!TF0); value>>=1;
  65. if(ds18b20) value|=0x80;
  66. //62us,必须大于60us
  67. TH0=0xff;
  68. TL0=0xc6;
  69. TF0=0;
  70. while(!TF0);
  71. }
  72. ds18b20=1;
  73. return(value);
  74. }
  75. //====================================================//
  76. // 启动DS18B20温度转换函数 //
  77. //===============================================//
  78. void convert_T(void)
  79. {
  80. if(ds18b20_reset()==0) // 如果复位成功
  81. {
  82. ds18b20_write(0xcc); // 跳过多器件识别
  83. ds18b20_write(0x44); // 启动温度转换
  84. }
  85. }
  86. //================================//
  87. // 读DS18B20温度函数
  88. //=======================================//
  89. void read_T(void)
  90. {
  91. unsigned char Lsb,Msb;
  92. if(ds18b20_reset()==0) // 如果复位成功
  93. {
  94. ds18b20_write(0xcc); // 跳过多器件识别
  95. ds18b20_write(0xbe); // 读暂存器
  96. Lsb=ds18b20_read(); // 低字节
  97. Msb=ds18b20_read(); // 高字节
  98. temp2=Lsb&0x0f;
  99. temp1=(Lsb>>4)|(Msb<<4);
  100. }
  101. }