51单片机~DS18B20温度传感器

发布者:JoyfulSpirit5最新更新时间:2022-09-23 来源: csdn关键字:51单片机  DS18B20  温度传感器 手机看文章 扫描二维码
随时随地手机看文章

(一)简介说明:

在这里插入图片描述
在这里插入图片描述

(二)接线:

在这里插入图片描述

1. 内部结构:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

正温度前五位是0.

负温度前五位是1.

在这里插入图片描述

由LS,MS组成的四位十六进制数,和16位二进制数。(先MS后LS)

结合上下图直到温度计算:1乘2 ^ 6 + 0乘2 ^ 5 +1乘2^ 4 +0乘2^ 3 +……2^0 ==85

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(二)使用流程,按照时序图编写程序(判断应用):

粗黑线是总线控制的电平

灰线表示DS18B20控制的;

电阻上拉是由于上图接线有一个上拉电阻

在这里插入图片描述

读时重复七次直到读完为止

在这里插入图片描述
在这里插入图片描述

测试温度代码:

temp.h


#ifndef __TEMP_H_

#define __TEMP_H_


#include

//---重定义关键词---//

#ifndef uchar

#define uchar unsigned char

#endif


#ifndef uint 

#define uint unsigned int

#endif


//--定义使用的IO口--//

sbit DSPORT=P3^7;


//--声明全局函数--//

void Delay1ms(uint );

uchar Ds18b20Init();

void Ds18b20WriteByte(uchar com);

uchar Ds18b20ReadByte();

void  Ds18b20ChangTemp();

void  Ds18b20ReadTempCom();

int Ds18b20ReadTemp();


#endif


main.c


/*************************************************************************************


*

实验现象:下载程序后,在温度传感器接口处,按照丝印方向插好温度传感器,数码管就会显示

检测的温度值

  

接线说明: (具体接线图可见开发攻略对应实验的“实验现象”章节)

 

注意事项:


  

**************************************************************************************


*/


#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器

#include"temp.h"


typedef unsigned int u16;   //对数据类型进行声明定义

typedef unsigned char u8;


sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;



char num=0;

u8 DisplayData[8];

u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};


/*******************************************************************************

* 函 数 名         : delay

* 函数功能    : 延时函数,i=1时,大约延时10us

*******************************************************************************/

void delay(u16 i)

{

while(i--);

}



/*******************************************************************************

* 函 数 名         : datapros()

* 函数功能    : 温度读取处理转换函数

* 输    入         : temp

* 输    出         : 无

*******************************************************************************/


void datapros(int temp)  

{

    float tp;  

if(temp< 0) //当温度值为负数

  {

DisplayData[0] = 0x40;   //   -

//因为读取的温度是实际温度的补码,所以减1,再取反求出原码

temp=temp-1;

temp=~temp;

tp=temp;

temp=tp*0.0625*100+0.5;

//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就

//算加上0.5,还是在小数点后面。

 

  }

  else

  {

DisplayData[0] = 0x00;

tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量

//如果温度是正的那么,那么正数的原码就是补码它本身

temp=tp*0.0625*100+0.5;

//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就

//算加上0.5,还是在小数点后面。

}

DisplayData[1] = smgduan[temp % 10000 / 1000];

DisplayData[2] = smgduan[temp % 1000 / 100];

DisplayData[3] = smgduan[temp %  100 / 10];

DisplayData[4] = smgduan[temp %  10 / 1];


}



/*******************************************************************************

* 函数名         :DigDisplay()

* 函数功能 :数码管显示函数

* 输入           : 无

* 输出          : 无

*******************************************************************************/

void DigDisplay()

{

u8 i;

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

{

switch(i) //位选,选择点亮的数码管,

{

case(0):

LSA=1;LSB=1;LSC=1; break;//显示第0位

case(1):

LSA=0;LSB=1;LSC=1; break;//显示第1位

case(2):

LSA=1;LSB=0;LSC=1; break;//显示第2位

case(3):

LSA=0;LSB=0;LSC=1; break;//显示第3位

case(4):

LSA=1;LSB=1;LSC=0; break;//显示第4位

case(5):

LSA=0;LSB=1;LSC=0; break;//显示第5位

}

P0=DisplayData[i];//发送数据

delay(100); //间隔一段时间扫描

P0=0x00;//消隐

}

}


/*******************************************************************************

* 函 数 名       : main

* 函数功能 : 主函数

* 输    入       : 无

* 输    出    : 无

*******************************************************************************/

void main()

{

while(1)

{

datapros(Ds18b20ReadTemp()); //数据处理函数

DigDisplay();//数码管显示函数

}

}


temp.c


#include"temp.h"

/*******************************************************************************

* 函 数 名         : Delay1ms

* 函数功能    : 延时函数

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/


void Delay1ms(uint y)

{

uint x;

for( ; y>0; y--)

{

for(x=110; x>0; x--);

}

}

/*******************************************************************************

* 函 数 名         : Ds18b20Init

* 函数功能    : 初始化

* 输    入         : 无

* 输    出         : 初始化成功返回1,失败返回0

*******************************************************************************/


uchar Ds18b20Init()

{

uchar i;

DSPORT = 0; //将总线拉低480us~960us

i = 70;

while(i--);//延时642us

DSPORT = 1; //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低

i = 0;

while(DSPORT) //等待DS18B20拉低总线

{

Delay1ms(1);

i++;

if(i>5)//等待>5MS

{

return 0;//初始化失败

}

}

return 1;//初始化成功

}


/*******************************************************************************

* 函 数 名         : Ds18b20WriteByte

* 函数功能    : 向18B20写入一个字节

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/


void Ds18b20WriteByte(uchar dat)

{

uint i, j;


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

{

DSPORT = 0;         //每写入一位数据之前先把总线拉低1us

i++;

DSPORT = dat & 0x01;  //然后写入一个数据,从最低位开始

i=6;

while(i--); //延时68us,持续时间最少60us

DSPORT = 1; //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值

dat >>= 1;

}

}

/*******************************************************************************

* 函 数 名         : Ds18b20ReadByte

* 函数功能    : 读取一个字节

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/



uchar Ds18b20ReadByte()

{

uchar byte, bi;

uint i, j;

for(j=8; j>0; j--)

{

DSPORT = 0;//先将总线拉低1us

i++;

DSPORT = 1;//然后释放总线

i++;

i++;//延时6us等待数据稳定

bi = DSPORT; //读取数据,从最低位开始读取

/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/

byte = (byte >> 1) | (bi << 7);   

i = 4; //读取完之后等待48us再接着读取下一个数

while(i--);

}

return byte;

}

/*******************************************************************************

* 函 数 名         : Ds18b20ChangTemp

* 函数功能    : 让18b20开始转换温度

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/


void  Ds18b20ChangTemp()

{

Ds18b20Init();

Delay1ms(1);

Ds18b20WriteByte(0xcc); //跳过ROM操作命令  

Ds18b20WriteByte(0x44);     //温度转换命令

//Delay1ms(100); //等待转换成功,而如果你是一直刷着的话,就不用这个延时了

   

}

/*******************************************************************************

* 函 数 名         : Ds18b20ReadTempCom

* 函数功能    : 发送读取温度命令

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/


void  Ds18b20ReadTempCom()

{


Ds18b20Init();

Delay1ms(1);

Ds18b20WriteByte(0xcc); //跳过ROM操作命令

Ds18b20WriteByte(0xbe); //发送读取温度命令

}

/*******************************************************************************

* 函 数 名         : Ds18b20ReadTemp

* 函数功能    : 读取温度

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/


int Ds18b20ReadTemp()

{

int temp = 0;

uchar tmh, tml;

Ds18b20ChangTemp(); //先写入转换命令

Ds18b20ReadTempCom(); //然后等待转换完后发送读取温度命令

tml = Ds18b20ReadByte(); //读取温度值共16位,先读低字节

tmh = Ds18b20ReadByte(); //再读高字节

temp=tmh; 

temp<<=8;    //将字符移位到高八位空出低八位

temp |= tml;  //将低八位组合  0000 0000 | tel=tel; 从而使高低八位结合

return temp;

}

关键字:51单片机  DS18B20  温度传感器 引用地址:51单片机~DS18B20温度传感器

上一篇:51单片机~DS1302时钟,SPI总线原理
下一篇:51单片机~EETROM ( I IC协议总线),AT24CXX存储器工作原理

推荐阅读最新更新时间:2024-11-10 20:27

51单片机——I2C总线驱动程序
为方便移植,采用多文件工程的方式。 void Delay10us()//延时10us { unsigned char a,b; for(b=1;b 0;b--) for(a=2;a 0;a--); } 起始信号:在SCL时钟信号在高电平期间SDA信号产生一个下降沿 void I2cStart()//为方便与其他函数衔接,起始之后SDA和SCL都为0,虽然这与I2C总线空闲状态不符,但并不影响程序运行 { SDA=1; Delay10us(); SCL=1; Delay10us();//建立时间是SDA保持时间 4.7us SDA=0; Delay10us();//保持时间是 4us SCL=0;
[单片机]
基于MCS51单片机的多路数据通信设计
1.引言 MCS51单片机标准构成只有一组全双工UART串行口,P3.0-RXD收、P3.1-TXD发,如果要完成多路串口收发,一般使用外部扩展芯片,例如:GM8123/25,完成一扩多路串口,但是,由于增加扩展芯片,造成硬件成本增加,PCB板面增大,抗干扰性下降等不良因素,因此能尽量使用现有串口,利用分时切换技术,完成串行口不同类型,不同端口的数据传送是优先选择。 2.硬件功能简述 本设计用于数据采集监控系统如图1所示。采用485串行口完成数据采集,和232串口输出打印功能,这样使得接口连线简单,可靠性高。 RS-485工作特征:发送端:逻辑“1″两线间的 电压 差为+2至6V表示;逻辑”0″以
[单片机]
基于MCS<font color='red'>51单片机</font>的多路数据通信设计
51单片机C语言延时函数怎么定义和使用
C语言定义延时函数主要通过无意义指令的执行来达到延时的目的。C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。   以某晶振为12MHz的单片机为例,晶振为12MHz即一个机器周期为1us。现在定义一个延时xms毫秒的延时函数。 void delay(unsigned int xms) // xms代表需要延时的毫秒   {   unsigned int x,y;   for(x=xms;x =0;x--)   for(y=110;y =0;y--);   }
[单片机]
从零开始51单片机教程 —— 12 单片机算术运算指令
不带进位位的单片机加法指令 ADD A,#DATA ;例:ADD A,#10H ADD A,direct ;例:ADD A,10H ADD A,Rn ;例:ADD A,R7 ADD A,@Ri ;例:ADD A,@R0 用途:将A中的值与其后面的值相加,最终结果否是回到A中。 例:MOV A,#30H ADD A,#10H 则执行完本条指令后,A中的值为40H。 下面的题目自行练习 MOV 34H,#10H MOV R0,#13H MOV A,34H ADD A,R0 MOV R1,#34H ADD A,@R1 带进位位的单片机加法指令 ADDC A,Rn ADDC A,direct ADDC
[单片机]
MCS-51单片机驱动步进电机的程序设计
  1.实验设计 定时器1于方式1,16位,10ms中断一次 40H 10ms计数单元 41H 秒计数单元 42H 分计数单元 43H 时计数单元 定时方式1为10MS:THX=0ECH,TLX=78H 方式0为10MS: THX=63H,TLX=18H 步进电机驱动实验 定时中断程序 正转后反转,显示计数值 步进电机按三相六拍的工作方式运动 X轴 C B A P1.2 P1.1 P1.0 用键盘上方的发光二极管(3FH)对应指示: D2 D1 D0 正转:A-AB-B-BC-C-CA-A 反转:A-CA-C-BC-B-
[单片机]
51单片机数码管详解
一.数码管基础知识 LED数码管是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。LED数码管常用的段数一般为7段,有的另加一个小数点 。LED数码管根据LED的接法不同,分为共阳和共阴两类 。 1.共阳极数码管 指八段数码管的八段发光二极管的阳极(正极)都连在一起,而阴极对应的各段可分别控制,如图a所示。 2.共阴极数码管 指八段数码管的八段发光二极管的阴极(负极)都连在一起,而阳极对应的各段分别控制,如图b所示。 二.静态数码管(以共阳极为例) 1.原理分析 LED 发光二极管的正极共同接在VCC上,这里以单片机P1口为例,当P1口对应引脚为0(即低电平)时数码
[单片机]
51单片机-存储
8051是传统的8位单片机,一般为256B 数据存储器RAM,4k程序存储器ROM (8052有384bytes的RAM,8K的ROM) 在51系列中可定义的数据类型有data,idata,xdata,pdata,bdata: data:指芯片内核中地址0x00-0x7F的128个字节RAM区域和4个分组的R1-R7寄存器区域,所占用的区域,汇编ACC访问,可以直接读写,速度最快,生成代码小。 idata:固定指前面0x00-0xFF的256个RAM,其中前128字节和data的128字节完全相同,但访问的方式不同。idata是用类似指针方式访问的。 xdata:外部扩展存储,一般指外部0x0000-0xFFFF地
[单片机]
51单片机串口通信介绍
这节我们主要讲单片机上串口的工作原理和如何通过程序来对串口进行设置,以及根据所给出的实例实现与PC 机通信。 一、原理简介 51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。 与之前一样,首先我们来了解单片机串口相关的寄存器。 SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接
[单片机]
<font color='red'>51单片机</font>串口通信介绍
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved