您的位置 首页 分销

根据DS18B20数字温度计规划

单片机除了可以测量电信号外,还可以用与温度、湿度等非电信号的测量,能独立工作的单片机温度检测、温度控制系统已经广泛的应用于很多领域…

单片机除了能够丈量电信号外,还能够用与温度、湿度等非电信号的丈量,能独立作业的单片机温度检测、温度操控系统现已广泛的应用于许多范畴。单片机的接口信号是数字信号,要想用单片机作区温度这类非电信号,就要运用温度传感器将温度信息转化为电流或许电压信号输出,假如转化的信号是模拟信号,还需求进行A/D转化,以满意单片机接口的需求。

本实验结合温度传感器DS18B20及单线技能完成数字温度计的规划。

首要器材:

1、AT89C52单片机芯片,操控温度传感器和数据处理。

2、单线数字温度传感器DS18B20。

实验流程图:

实验电路图:

实验程序代码:

//DigThermo.h程序

#ifndef_DIGTHERMO_H//避免DigThermo.h被重复引证

#define_DIGTHERMO_H

#include //引证规范库的头文件

#include

#include

#include

#define uchar unsigned char

#define uint unsigned int

uchar tplsb,tpmsb;//温度值低位、高位字节

sbit DQ = P3^5;//数据通信线DQ

#endif

//DigThermo.c程序

#include “DigThermo.h”

/*延时t毫秒*/

void delay(uint t)

{

uint i;

while(t–)

{

/*关于11.0592M时钟,约延时1ms */

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

{}

}

}

/*发生复位脉冲初始化DS18B20 */

void TxReset(void)

{

uint i;

DQ = 0;

/*拉低约900us */

i = 100;

while (i>0)i–;

DQ = 1;//发生上升沿

i = 4;

while (i>0)i–;

}

/*等候应对脉冲*/

void RxWait(void)

{

uint i;

while(DQ);

while(~DQ);//检测到应对脉冲

i = 4;

while (i>0)i–;

}

/*读取数据的一位,满意读时隙要求*/

bit RdBit(void)

{

uint i;

bit b;

DQ = 0;

i++;

DQ = 1;

i++;i++;//延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有用

b = DQ;

i = 8;

while(i>0) i–;

return (b);

}

/*读取数据的一个字节*/

uchar RdByte(void)

{

uchar i,j,b;

b = 0;

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

{

j = RdBit();

b = (j<<7)|(b>>1);

}

return(b);

}

/*写数据的一个字节,满意写1和写0的时隙要求*/

void WrByte(uchar b)

{

uint i;

uchar j;

bit btmp;

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

{

btmp = b&0x01;

b = b>>1;//取下一位(由低位向高位)

if (btmp)

{

/*写1 */

DQ = 0;

i++;i++;//延时,使得15us以内拉高

DQ = 1;

i = 8;

while(i>0) i–;//整个写1时隙不低于60us

}

else

{

/*写0 */

DQ = 0;

i = 8;

while(i>0) i–;//坚持低在60us到120us之间

DQ = 1;

i++;

i++;

}

}

}

/*发动温度转化*/

void convert(void)

{

TxReset();//发生复位脉冲,初始化DS18B20

RxWait();//等候DS18B20给出应对脉冲

delay(1);//延时

WrByte(0xcc);// skip rom指令

WrByte(0x44);// convert T指令

}

/*读取温度值*/

void RdTemp(void)

{

TxReset();//发生复位脉冲,初始化DS18B20

RxWait();//等候DS18B20给出应对脉冲

delay(1);//延时

WrByte(0xcc);// skip rom指令

WrByte(0xbe);// read scratchpad指令

tplsb = RdByte();//温度值低位字节(其中低4位为二进制的“小数”部分)

tpmsb = RdByte();//高位值高位字节(其中高5位为符号位)

}

/*主程序,读取的温度值终究存放在tplsb和tpmsb变量中。

tplsb其中低4位为二进制的“小数”部分;tpmsb其中高

5位为符号位。真实经过数码管输出时,需求进行到十进

制有符号实数(包含小数部分)的转化。*/

void main(void)

{

do

{

delay(1);//延时1ms

convert();//发动温度转化,需求750ms

delay(1000);//延时1s

RdTemp();//读取温度

}

while(1);

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/fenxiao/267041.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部