极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12009|回复: 2

发一个18b20的程序

[复制链接]
发表于 2016-7-1 22:56:51 | 显示全部楼层 |阅读模式
找了好长时间的库,奈何各种不能用。于是自己手撸了一个。代码丑,逻辑差。可它能用!易读!易修改!



代码如下:


#define PIN A1

#define OUT(x) pinMode(x,OUTPUT)
#define IN(x) pinMode(x,INPUT_PULLUP)
#define DHIGH(x) digitalWrite(x,HIGH)
#define DLOW(x) digitalWrite(x,LOW)
#define DREAD(x) digitalRead(x)
#define DELAYM(x) delayMicroseconds(x)
#define DPRINT(x) Serial.print(x)
#define DPRINTN(x) Serial.println(x)
void setup() {
  Serial.begin(9600);
  dsRst();
}

void loop() {
//delay(500);
DPRINTN("**************************");
transTem();
delay(1000);
float temc=0;
temc=getTem();
DPRINT("tem is:");
DPRINTN(temc);  
}

void dsRst(){ //初始化函数
  OUT(PIN);
  DHIGH(PIN);
  DELAYM(2);
  DLOW(PIN);  //拉低
  DELAYM(495);   //延时
  DHIGH(PIN); //拉高
  DELAYM(75); //延时
  IN(PIN);  //改为输入模式,准备读取
  int data; //总线值
  data=DREAD(PIN); //读总线值
  //测试代码
//  DPRINT("The dsRst's data is:");
//  DPRINTN(data);
  //结束
  if(data==0 ){    //读到LOW,说明初始化完成
//    DPRINTN("ok: DS18B32  initialization is complete");  
  }
  else if(data==1){  //  HIGH,初始化失败
    DPRINTN("err: DS18B32 initialization is failing");
  }
  DELAYM(500);  //延时,等待18b32释放总线
  //测试代码
//  DPRINT("This is bus of ender the dsRst:"); //测验位置NO.1
//  DPRINTN(DREAD(PIN));
//  DPRINTN();
  //结束   
}

void dsWrite(unsigned char data){ //写一个字节,通过调用dsWrite()实现
  //测试代码
//  DPRINT("The dsWrite()'s data is BIN:");
//  Serial.println(data,BIN);
//  DPRINT("sizeof(data):");
//  DPRINTN(sizeof(data));
  //结束
  for(int i=0;i<8;i++){ //每次写入一位
    //测试代码
//    DPRINT("NO.");
//    DPRINT(i);
//    DPRINTN(" for-i of The dsWrite()");
    //结束
    dsWriteBit(bitRead(data,i));   //调用
  }
  //
//  DPRINTN();
  //
}

void dsWriteBit(byte data_bit){ //写一位函数  //改过char--byte
  OUT(PIN);
  DHIGH(PIN);
  DELAYM(2);
  DLOW(PIN);
  DELAYM(10);
  digitalWrite(PIN,data_bit);
  DELAYM(60);
  DHIGH(PIN);
  DELAYM(2);
  //测试代码
//  DPRINT("The dsWreitBit()'s data_bit is:");
//  Serial.println(data_bit,BIN);
  //结束
}

unsigned char dsRead(){ //读一字节,通过调用dsReadBit()实现
  unsigned char data=0;
  for(int i=0; i<8; i++){
    //测试代码
//    DPRINT("NO.");
//    DPRINT(i);
//    DPRINTN(" dsRead's for-i :");
    //结束
    //bitWrite(data,bitRead(dsReadBit(),0),i); //调用
    data|=dsReadBit()<<i;
    //测试代码
//    DPRINT("  data is:");
//    Serial.println(data,BIN);
    //完毕
  }
//  DPRINT("dsRead's data is:");
//  Serial.println(data,BIN);
//  DPRINTN();
  return data;
}

unsigned char dsReadBit(){ //读一位
  OUT(PIN);
  unsigned char data=0;
  DHIGH(PIN);
  DELAYM(2);
  DLOW(PIN);
  DELAYM(2);
  DHIGH(PIN);
  DELAYM(5);
  IN(PIN);
  data=DREAD(PIN);
  //测试代码
//  DPRINT("dsREadBit()'s data is:");
//  Serial.println(data,BIN);
  //完毕
  DELAYM(60);
  return data;
}

void transTem(){ //转化函数
  dsRst();
  dsWrite(0xcc);  //rom
  dsWrite(0x44);  //转化
}

float getTem(){ //获取温度
  dsRst();
  dsWrite(0xcc);
  dsWrite(0xbe);
  int tem1=0;
  tem1=dsRead(); //低八位
  //
//  DPRINT("getTem's tem1 is:");
//  Serial.println(tem1,BIN);
  //
  int tem2=0;
  tem2=dsRead();  //高八位
  //
//  DPRINT("getTem's tem2 is:");
//  Serial.println(tem2,BIN);
  //
   int tem=0;
  tem=tem1 | tem2<<8; //组合
  //tem|=(unsigned int(dsRead())<<8);
  //
//  DPRINT("getTem's tem is:");
//  Serial.println(tem,BIN);
  //
  float temc=0;
  //temc=tem & 0b10000111111111111;
  //Serial.println(temc,BIN);
  if((tem>>15)){
    tem=((~tem) & (int(1))<<15) + 1;
    temc=tem*0.0625;
  }
  else {
    temc=tem*0.0625;
  }
  return temc;
}

回复

使用道具 举报

 楼主| 发表于 2016-7-1 23:03:51 | 显示全部楼层
没用代码窗,重发一下
  1. #define PIN A1

  2. #define OUT(x) pinMode(x,OUTPUT)
  3. #define IN(x) pinMode(x,INPUT_PULLUP)
  4. #define DHIGH(x) digitalWrite(x,HIGH)
  5. #define DLOW(x) digitalWrite(x,LOW)
  6. #define DREAD(x) digitalRead(x)
  7. #define DELAYM(x) delayMicroseconds(x)
  8. #define DPRINT(x) Serial.print(x)
  9. #define DPRINTN(x) Serial.println(x)
  10. void setup() {
  11.   Serial.begin(9600);
  12.   dsRst();
  13. }

  14. void loop() {
  15. //delay(500);
  16. DPRINTN("**************************");
  17. transTem();
  18. delay(1000);
  19. float temc=0;
  20. temc=getTem();
  21. DPRINT("tem is:");
  22. DPRINTN(temc);  
  23. }

  24. void dsRst(){ //初始化函数
  25.   OUT(PIN);
  26.   DHIGH(PIN);
  27.   DELAYM(2);
  28.   DLOW(PIN);  //拉低
  29.   DELAYM(495);   //延时
  30.   DHIGH(PIN); //拉高
  31.   DELAYM(75); //延时
  32.   IN(PIN);  //改为输入模式,准备读取
  33.   int data; //总线值
  34.   data=DREAD(PIN); //读总线值
  35.   //测试代码
  36. //  DPRINT("The dsRst's data is:");
  37. //  DPRINTN(data);
  38.   //结束
  39.   if(data==0 ){    //读到LOW,说明初始化完成
  40. //    DPRINTN("ok: DS18B32  initialization is complete");  
  41.   }
  42.   else if(data==1){  //  HIGH,初始化失败
  43.     DPRINTN("err: DS18B32 initialization is failing");
  44.   }
  45.   DELAYM(500);  //延时,等待18b32释放总线
  46.   //测试代码
  47. //  DPRINT("This is bus of ender the dsRst:"); //测验位置NO.1
  48. //  DPRINTN(DREAD(PIN));
  49. //  DPRINTN();
  50.   //结束   
  51. }

  52. void dsWrite(unsigned char data){ //写一个字节,通过调用dsWrite()实现
  53.   //测试代码
  54. //  DPRINT("The dsWrite()'s data is BIN:");
  55. //  Serial.println(data,BIN);
  56. //  DPRINT("sizeof(data):");
  57. //  DPRINTN(sizeof(data));
  58.   //结束
  59.   for(int i=0;i<8;i++){ //每次写入一位
  60.     //测试代码
  61. //    DPRINT("NO.");
  62. //    DPRINT(i);
  63. //    DPRINTN(" for-i of The dsWrite()");
  64.     //结束
  65.     dsWriteBit(bitRead(data,i));   //调用
  66.   }
  67.   //
  68. //  DPRINTN();
  69.   //
  70. }

  71. void dsWriteBit(byte data_bit){ //写一位函数  //改过char--byte
  72.   OUT(PIN);
  73.   DHIGH(PIN);
  74.   DELAYM(2);
  75.   DLOW(PIN);
  76.   DELAYM(10);
  77.   digitalWrite(PIN,data_bit);
  78.   DELAYM(60);
  79.   DHIGH(PIN);
  80.   DELAYM(2);
  81.   //测试代码
  82. //  DPRINT("The dsWreitBit()'s data_bit is:");
  83. //  Serial.println(data_bit,BIN);
  84.   //结束
  85. }

  86. unsigned char dsRead(){ //读一字节,通过调用dsReadBit()实现
  87.   unsigned char data=0;
  88.   for(int i=0; i<8; i++){
  89.     //测试代码
  90. //    DPRINT("NO.");
  91. //    DPRINT(i);
  92. //    DPRINTN(" dsRead's for-i :");
  93.     //结束
  94.     //bitWrite(data,bitRead(dsReadBit(),0),i); //调用
  95.     data|=dsReadBit()<<i;
  96.     //测试代码
  97. //    DPRINT("  data is:");
  98. //    Serial.println(data,BIN);
  99.     //完毕
  100.   }
  101. //  DPRINT("dsRead's data is:");
  102. //  Serial.println(data,BIN);
  103. //  DPRINTN();
  104.   return data;
  105. }

  106. unsigned char dsReadBit(){ //读一位
  107.   OUT(PIN);
  108.   unsigned char data=0;
  109.   DHIGH(PIN);
  110.   DELAYM(2);
  111.   DLOW(PIN);
  112.   DELAYM(2);
  113.   DHIGH(PIN);
  114.   DELAYM(5);
  115.   IN(PIN);
  116.   data=DREAD(PIN);
  117.   //测试代码
  118. //  DPRINT("dsREadBit()'s data is:");
  119. //  Serial.println(data,BIN);
  120.   //完毕
  121.   DELAYM(60);
  122.   return data;
  123. }

  124. void transTem(){ //转化函数
  125.   dsRst();
  126.   dsWrite(0xcc);  //rom
  127.   dsWrite(0x44);  //转化
  128. }

  129. float getTem(){ //获取温度
  130.   dsRst();
  131.   dsWrite(0xcc);
  132.   dsWrite(0xbe);
  133.   int tem1=0;
  134.   tem1=dsRead(); //低八位
  135.   //
  136. //  DPRINT("getTem's tem1 is:");
  137. //  Serial.println(tem1,BIN);
  138.   //
  139.   int tem2=0;
  140.   tem2=dsRead();  //高八位
  141.   //
  142. //  DPRINT("getTem's tem2 is:");
  143. //  Serial.println(tem2,BIN);
  144.   //
  145.    int tem=0;
  146.   tem=tem1 | tem2<<8; //组合
  147.   //tem|=(unsigned int(dsRead())<<8);
  148.   //
  149. //  DPRINT("getTem's tem is:");
  150. //  Serial.println(tem,BIN);
  151.   //
  152.   float temc=0;
  153.   //temc=tem & 0b10000111111111111;
  154.   //Serial.println(temc,BIN);
  155.   if((tem>>15)){
  156.     tem=((~tem) & (int(1))<<15) + 1;
  157.     temc=tem*0.0625;
  158.   }
  159.   else {
  160.     temc=tem*0.0625;
  161.   }
  162.   return temc;
  163. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2016-7-3 19:41:11 | 显示全部楼层
cheensunj 发表于 2016-7-1 23:03
没用代码窗,重发一下

谢楼主无私奉献,开源。我这样的初学者受益匪浅。你的define 用的很好,我学习啦,我之前都是长长的写完函数名。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 23:09 , Processed in 0.060468 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表