0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

DS18B20的组成以及工作过程

ss 来源:李天生博客园、CSDN_朱坚强 作者:李天生博客园、 2021-07-08 09:18 次阅读

DS18B20一般都是由64位ROM温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器组成。ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。

DS18B20的工作过程:

1.复位操作

2.执行ROM操作的5条指令之一:1)读ROM,2)匹配ROM,3)搜索ROM,4)跳过ROM,5)报警搜索。

3.存储器操作命令:温度转换、读取温度、设定上下限温度值等指令

4.读取温度数据:主机读取温度数据后进行数据处理。

应用实例

数字电子温度计

功能:显示当前温度值,可显示正和负温度值

程序:

#include《reg52.h》

/*------SEG PORT-----*/

#define LEDADDR P2

#define LED_port P0

/*------DS18B20 PORT-----*/

sbit DB_B20=P0^0;

/*-----COMMON FUNCTION----*/

void delay_us(unsigned int time);

/*-----SEG FUNCTION-------*/

unsigned char seg_val[6];

unsigned char ledcode[12] = {0XC0,0XF9,0XA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xbf,0xff};//共阳极数码管0,1,2,3,4,5,6,7,8,9,-,null

unsigned char currled=0;

unsigned char led_en=0x04;//

void display(void);

void display_tem(void);

/*--- DS18B20 FUNCTION-----*/

unsigned char tem_pnt;

unsigned char tem_num;

bit tem_sign;

bit reset_B20(void);

unsigned char read_b20_byte(void);

void write_b20_byte(unsigned char);

void convert_cmd_b20(void);

void read_cmd_b20(void);

void data_convert_b20(void);

/*--- TIME FUNCTION-----*/

unsigned char times;

void times_init(void);

/*-----------------------*/

main()

{

times_init();

while(1)

{

display_tem();

display();

}

}

/*-----COMMON FUNCTION----*/

void delay_us(unsigned int us)

{

while(us--);//for(;us》0;us--);//while(time--);

}

/*-----SEG FUNCTION-------*/

void display(void)

{

LEDADDR=0xff;

LED_port=(LED_port&0x03)|led_en;

led_en《《=1;

if(currled==1)

LEDADDR=ledcode[seg_val[currled]]& 0x7f;

else

LEDADDR=ledcode[seg_val[currled]];

currled++;

if(currled==6)

{

currled=0;

led_en=0x04;

}

delay_us(300);

}

void display_tem(void)

{

unsigned char n;

unsigned char p;

if(tem_sign==0)

{

n=~(tem_num-1);

p=~(tem_pnt-1);

}

else

{

n=tem_num;

p=tem_pnt;

}

seg_val[5]=11;

seg_val[4]=11;

seg_val[3]=n/100;

n=n%100;

seg_val[2]=n/10;

if(seg_val[3]==0)

{

seg_val[3]=11;

if(seg_val[2]==0)

seg_val[2]=11;

}

seg_val[1]=n%10;

seg_val[0]=p;

if(seg_val[2]==11 && seg_val[3]==11 && tem_sign==0)

seg_val[2]=10;

else if(seg_val[3]==11 && tem_sign==0)

seg_val[3]=10;

else if(tem_sign==0)

seg_val[4]=10;

}

/*--- DS18B20 FUNCTION-----*/

bit reset_B20(void)

{

bit state;

DB_B20=0;

delay_us(29);//》480us 29

DB_B20=1;

delay_us(3);//15---60us 3

state=DB_B20;

delay_us(25);//480us 25

return state;

}

void write_b20_byte(unsigned char cmd)

{

unsigned char i;

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

{

DB_B20=0;

DB_B20=cmd&0x01;

delay_us(5);

DB_B20=1;

cmd》》=1; //6

}

delay_us(5);

}

unsigned char read_b20_byte(void)

{

unsigned char rbyte=0;

unsigned char i;

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

{

rbyte》》=1;

DB_B20=0;

DB_B20=1;

//delay_us(1);

if(DB_B20)

rbyte |= 0x80;

delay_us(6); //6

}

return rbyte;

}

void convert_cmd_b20(void)

{

reset_B20();

write_b20_byte(0xcc);

write_b20_byte(0x44);

}

void read_cmd_b20(void)

{

reset_B20();

write_b20_byte(0xcc);

write_b20_byte(0xbe);

}

void data_convert_b20(void)

{

unsigned char a;

unsigned char b;

int point;

a=read_b20_byte();

b=read_b20_byte();

point=(a & 0x0f)*625+500;

tem_pnt=point/1000;

tem_num=a》》4 | b《《4;

if(tem_num & 0x80)

tem_sign=0;

else

tem_sign=1;

}

/*--- TIME FUNCTION-----*/

void times_init(void)

{

times=29;

TMOD=0X01;

TH0=0X3C;

TL0=0XB0;

EA=1;

ET0=1;

TR0=1;

}

void time0(void) interrupt 1

{

if(times==19)

convert_cmd_b20();

else if(times==9)

read_cmd_b20();

else if(times==0)

{

data_convert_b20();

times=29;

}

times--;

TH0=0X3C;

TL0=0XB0;

}

/*---------------------*/

整合自:李天生博客园、CSDN_朱坚强

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • DS18B20
    +关注

    关注

    10

    文章

    765

    浏览量

    80090
收藏 人收藏

    评论

    相关推荐

    请问DS18B20测温C程序怎么写?

    DS18B20测温C程序怎么写?
    发表于 11-07 07:20

    请问ds18b20的分辨率是什么意思?

    ds18b20的分辨率是什么意思??
    发表于 11-03 07:42

    DS18B20可以实现并联测温吗?

    分别读取两个DS18B20的温度
    发表于 10-24 07:45

    DS18B20采样温度的精度可以达到多少?

    DS18B20采样温度的精度可以达到多少
    发表于 10-12 08:14

    在检测DS18B20是否存在期间,检测到始终没有释放总线是怎么回事?

    在检测DS18B20是否存在期间,检测到DS18B20拉低了总线,但始终没有释放总线,这是怎么回事,是不是DS18B20损坏了。
    发表于 09-25 07:42

    DS18B20 数字温度计特点

    一.DS18B20特点 DS18B20 数字温度计提供12位(二进制)温度读数的数字型传感器。传感器仅需要单总线接口与CPU连接,实现信号送入 DS18B20 或从 DS18B20
    的头像 发表于 09-11 11:19 1324次阅读
    <b class='flag-5'>DS18B20</b> 数字温度计特点

    如何使用Nano100来读DS18B20

    应用: 本代码使用 Nano100 来读 DS18B20 。 BSP 版本: Nano100B系列 BSP CMSIS v3.03.000 硬件
    发表于 08-30 08:07

    如何使用Mini51来读DS18B20

    应用程序: 本代码使用 Mini51 来读 DS18B20 。 BSP 版本: Mini51DE系列 BSP CMSIS v3.02.000 硬件: NuTiny-EVB-Mini51 v3.0
    发表于 08-29 07:08

    如何使用Nano100来读DS18B20

    应用: 本代码使用 Nano100 来读 DS18B20 。 BSP 版本: Nano100B系列 BSP CMSIS v3.03.000 硬件
    发表于 08-22 07:54

    使用Mini51来读DS18B20

    应用程序: 本代码使用 Mini51 来读 DS18B20 。 BSP 版本: Mini51DE系列 BSP CMSIS v3.02.000 硬件: NuTiny-EVB-Mini51 v3.0
    发表于 08-22 06:08

    ds18b20获取数据并使用mqtt通过互联网发送,未找到DS18b20是怎么回事?

    任务是从 ds18b20 获取数据并使用 mqtt 通过互联网发送。首先在 eclipse 中通过 C 尝试,ds18b20 被正确检测到,但我无法通过 te 互联网发布,只能在本地网络中发布。然后
    发表于 05-23 07:19

    DS18b20传感器读数问题如何解决?

    read_DS18B20_Temp(pin) 并从返回的传感器中获取读数。 看来这一定是可能的,但由于缺乏经验,我遇到了一些障碍。 有人可以告诉我哪里出错了,或者我是否正在尝试做一些 ds18b20 库的工作方式无法做到的事情
    发表于 04-27 07:04

    DS18B20能读数据但是一直显示28度

    void DS18B20_Rst(void)            {                          DS18B20_IO_OUT();   //将DS18B20的数据线DQ设置
    发表于 04-26 12:11

    ds18b20模块未加载是怎么回事?

    嗨,我尝试使用 ds18b20 模块将我的软件更新到版本 3.0.0.0 中的新 lua 模块,但是它不会加载: 代码:全选NodeMCU 3.0.0.0 built
    发表于 04-26 08:10

    DS18B20如何连接其他GPIO?

    你好。 我有自己的原型板 ,其中 DS18B20 连接到 gpio13。 我如何从这个 GPIO 读取温度?
    发表于 04-26 07:57