×
嵌入式 > 技术百科 > 详情

CT107D蓝桥杯DS18B20使用

发布时间:2020-05-28 发布时间:
|

弄了一天的DS18B20,最后才发现是官方给的单总线驱动有问题


//单总线延时函数

void Delay_OneWire(unsigned int t)

{

  while(t--);

}



就是这个驱动里的延时函数,延时不够,所以一直没有成功。


这里应该要加一点延时,这样子就可以了,不知道官方是要干嘛,,,,,,,,


void Delay_OneWire(unsigned int t)

{

char  z;

  while(t--)

for(z=0;z<12;z++);

}



//有了驱动,我们直接写一个读温度函数就ok了


//DS18B20温度采集程序:整数

unsigned char read_wendu(void)

{

    unsigned char low,high;

  char temp;

  init_ds18b20();

  Write_DS18B20(0xCC);//跳过ROM指令

  Write_DS18B20(0x44); //启动温度转换

  Delay_OneWire(200);

  init_ds18b20();

  Write_DS18B20(0xCC);

  Write_DS18B20(0xBE); //读取寄存器

  low = Read_DS18B20(); //低字节

  high = Read_DS18B20(); //高字节

  temp = high<<4;

  temp |= (low>>4);

  return temp;

}



这个函数是读出2位正温度,下面这个是保留小数点后2位。


int read_wendu()

{

  unsigned char low,high;

int temp;

float t;

init_ds18b20();

Write_DS18B20(0xcc);

Write_DS18B20(0x44);

Delay_OneWire(200);

init_ds18b20();

Write_DS18B20(0xcc);

Write_DS18B20(0xbe);

low=Read_DS18B20();

high=Read_DS18B20();

temp=(high<<8)|low;

if(temp<0){

temp=~(temp-1);

}

t=temp*0.0625;

temp=t*100+0.5;

return temp;

}



下面附上单总线代码


sbit DQ = P1^4;

//单总线延时函数

void Delay_OneWire(unsigned int t)

{

char z;

  while(t--)

for(z=0;z<12;z++);

}

 

 

//DS18B20芯片初始化

bit Init_DS18B20(void)

{

bit initflag = 0;

DQ = 1;

Delay_OneWire(12);

DQ = 0;

Delay_OneWire(80); 

DQ = 1;

Delay_OneWire(10); 

initflag = DQ;    

Delay_OneWire(5);

  

return initflag;

}

 

 

//通过单总线向DS18B20写一个字节

void Write_DS18B20(unsigned char dat)

{

unsigned char i;

for(i=0;i<8;i++)

{

DQ = 0;

DQ = dat&0x01;

Delay_OneWire(5);

DQ = 1;

dat >>= 1;

}

Delay_OneWire(5);

}

 

 

//从DS18B20读取一个字节

unsigned char Read_DS18B20(void)

{

unsigned char i;

unsigned char dat;

  

for(i=0;i<8;i++)

{

DQ = 0;

dat >>= 1;

DQ = 1;

if(DQ)

{

dat |= 0x80;

}    

Delay_OneWire(5);

}

return dat;

}

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Keil5(MDK5)在调试(debug)过程中遇到的问题