cheensunj 发表于 2016-7-1 22:56:51

发一个18b20的程序

找了好长时间的库,奈何各种不能用。于是自己手撸了一个。代码丑,逻辑差。可它能用!易读!易修改!



代码如下:


#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: DS18B32initialization 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;
}

cheensunj 发表于 2016-7-1 23:03: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: DS18B32initialization 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;
}

yhtjay 发表于 2016-7-3 19:41:11

cheensunj 发表于 2016-7-1 23:03 static/image/common/back.gif
没用代码窗,重发一下

谢楼主无私奉献,开源。我这样的初学者受益匪浅。你的define 用的很好,我学习啦,我之前都是长长的写完函数名。
页: [1]
查看完整版本: 发一个18b20的程序