
文章目录
前言
文章参考官方各类书籍,以及网络知识,如有侵权,请联系我立马删帖道歉!!!谢谢各位的关注,大家的关注才是我不断更新的动力!
一、DS18B20是什么?
实物引脚图:


DS18B20是一种单总线数字温度传感器,测试温度范围-55℃-125℃,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。
特点(参考官方数据手册):
- 1-Wire总线接口仅需要一个引脚来通信。
- 设备的内部ROM上都烧写了一个独一无二的64位序列号。
- 多路采集能力使得分布式温度采集应用更加简单。
- 能够采用数据线供电;供电范围为3.0V至5.5V。
- 温度可测量范围为:-55℃至+125℃(-67℉至+257℉)。
- 温度范围超过-10℃至85℃之外时具有+-0.5℃的精度。
- 内部温度采集精度可以由用户自定义为9-Bits至12-Bits
以上讲解了DS18B20一些基础的知识,具体的知识大家可以参考官方的数据手册,认真研究一下,我这里就不在展开!
二、开发代码
1.代码
DS18B20.c如下:
#include "ds18b20.h"
#include "ls1b_gpio.h"
#include "bsp.h"
#include "ls1b.h"
#include "tick.h"
void DS18B20_DQ_OUT(int a)
{
gpio_write(DS8B20_IO,a);
}
//单总线设置为输入
void DS18B20_IO_IN(void)
{
gpio_enable(DS8B20_IO,DIR_IN);
}
//单总线设置为输出
void DS18B20_IO_OUT(void)
{
gpio_enable(DS8B20_IO,DIR_OUT);
}
//复位DS18B20
void DS18B20_Rst(void)
{
DS18B20_IO_OUT(); //SET PA0 OUTPUT
DS18B20_DQ_OUT(0); //DQ=0
delay_us(480); //DS1820,拉低最高600us,最低351us
DS18B20_DQ_OUT(1); //DQ=1
delay_us(15); //15US
}
//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
unsigned char DS18B20_Check(void)
{
unsigned char retry=0;
DS18B20_IO_IN();//SET PA0 INPUT
while (gpio_read(DS8B20_IO)&&retry<200)
{
retry++;
delay_us(1);
};
if(retry>=200)return 1;
else retry=0;
while (!gpio_read(DS8B20_IO)&&retry<240)
{
retry++;
delay_us(1);
};
if(retry>=240)
return 1;
return 0;
}
//从DS18B20读取一个位
//返回值:1/0
unsigned char DS18B20_Read_Bit(void) // read one bit
{
unsigned char data;
DS18B20_IO_OUT();//SET PA0 OUTPUT
DS18B20_DQ_OUT(0);
delay_us(2);
DS18B20_DQ_OUT(1);
DS18B20_IO_IN();//SET PA0 INPUT
delay_us(11);
if(gpio_read(DS8B20_IO)&0x01)
data=1;
else
data=0;
delay_us(50);
return data;
}
//从DS18B20读取一个字节
//返回值:读到的数据
unsigned char DS18B20_Read_Byte(void) // read one byte
{
unsigned char i,j,dat;
dat=0;
for (i=1;i<=8;i++)
{
j=DS18B20_Read_Bit();
dat=(j<<7)|(dat>>1);
}
return dat;
}
//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(unsigned char dat)
{
unsigned char j;
unsigned char testb;
DS18B20_IO_OUT();//SET PA0 OUTPUT;
DS18B20_DQ_OUT(1);
for (j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if (testb)
{
DS18B20_DQ_OUT(0);// Write 1
delay_us(2);
DS18B20_DQ_OUT(1);
delay_us(60);
}
else
{
DS18B20_DQ_OUT(0);// Write 0
delay_us(60);
DS18B20_DQ_OUT(1);
delay_us(2);
}
}
}
//开始温度转换
void DS18B20_Start(void)// ds1820 start convert
{
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);// skip rom
DS18B20_Write_Byte(0x44);// convert
}
//初始化DS18B20的IO口 DQ 同时检测DS的存在
//返回1:不存在
//返回0:存在
unsigned char DS18B20_Init(void)
{
DS18B20_IO_OUT();
DS18B20_DQ_OUT(1);
DS18B20_Rst();
return DS18B20_Check();
}
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250)
float DS18B20_Get_Temp(void)
{
unsigned char temp;
unsigned char TL,TH;
short tem;
float tempreal;
DS18B20_Start (); // ds1820 start convert
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);// skip rom
DS18B20_Write_Byte(0xbe);// convert
TL=DS18B20_Read_Byte(); // LSB
TH=DS18B20_Read_Byte(); // MSB
if(TH>7)
{
TH=~TH;
TL=~TL;
temp=0;//温度为负
}
else
temp=1;//温度为正
tem=TH; //获得高八位
tem<<=8;
tem+=TL;//获得低八位
tempreal=(float)tem*0.0625f;//转换
if(temp)return tempreal; //返回温度值
else return -tempreal;
}
main.c如下:
int main(void)
{
float temp = 0;
char print_buf[]={""};
printk("\r\nmain() function.\r\n");
ls1x_drv_init(); /* Initialize device drivers */
install_3th_libraries(); /* Install 3th libraies */
DS18B20_Init();
//打开显示
fb_open();
delay_ms(200);
fb_textout(50, 30, "DS18b20温度传感器测量");
fb_textout(50, 50, "温度传感器");
fb_textout(50, 70, "当前温度: ");
fb_drawline(50,120,50,450,cidxRED);
fb_drawline(50,450,500,450,cidxRED);
fb_drawpixel(100,100,cidxRED);
fb_drawpoint(150,150,6,cidxGREEN);
/*
* 裸机主循环
*/
while (1)
{
delay_ms(1000);
fb_fillrect(160, 70, 480, 106, cidxBLACK);
temp=DS18B20_Get_Temp(); //读取温度数据
sprintf(print_buf,"%6.2f ℃",temp);
fb_textout(160, 70, print_buf);
}
return 0;
}
2.例图
总结
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/73665.html