数字温度计设计
21ic 2024-12-12

单片机除了可以测量电信号外,还可以用与温度、湿度等非电信号的测量,能独立工作的单片机温度检测、温度控制系统已经广泛的应用于很多领域。单片机的接口信号是数字信号,要想用单片机作区温度这类非电信号,就要使用温度传感器将温度信息转换为电流或者电压信号输出,如果转化的信号是模拟信号,还需要进行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);

}

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • 模拟
  • 模电
  • 运放
  • 放大
  • BC846晶体管是一款双极性晶体管, BC846主要特点

    BC846晶体管是一款双极性晶体管, BC846主要特点:-通用晶体管-SMD塑料包-两种不同的增益选择BC846产品参数:集电极—发射极最大电压 VCEO: 65 V集电极—基极电压 VCBO: 80V发射极 - 基极电压 VEBO: 6 VPd-功率耗散: 250m...

    5小时前
  • MMBT4403晶体管是一款双极性晶体管, MMBT4403基本描述

    MMBT4403晶体管是一款双极性晶体管, MMBT4403基本描述:MMBT4403是为专门为通用集电极电流至500ma的放大器和开关等而设计的。 MMBT4403产品核心参数:直流电流增益 hFE 最大值:300集电极—发射极最大电压 VCEO:40 V  ...

    5小时前
  • LM393应用电路实例

        IC LM393具有两个内置的运算放大器,这些放大器在内部进行了频率补偿。这些IC专为使用单个电源执行其不同任务而设计。它也可以使用分离式电源正确执行其功能。电流消耗的电源不依赖于电源量。该IC最重要的特性之...

    5小时前
  • 三个使用ADG5462F的保护电路

    注意过电压和电源顺序图1:传感器输入和运算放大器连接图运算放大器的电源必须在输入信号被输入的同时或之前确立。否则,可能会出现过电压或闩锁问题。 作为外置传感器的输入电路使用运算放...

    12-09
  • 基于LT6118的电子断路器

    电子断路器的优点是什么?如果因电路故障或操作失误导致电源短路,则会产生过电流,不仅会导致电源二次故障,还可能因电路部件发热而引发火灾等事故。 因此,虽然很多电源都具有电流限制功...

    12-09
  • 自动重启48V电源电路断路器的电路

    具有输入过压保护的电子断路器的优点是什么?对于连接到供电端的受电电子设备电源,除了基于负载电路故障的电流限制保护之外,有时还需要基于电缆连接时产生的振铃或电涌的过电压保护。在这...

    12-09
  • 运放交越失真是怎么产生的?怎么解决交越失真问题?

    有工程师表示遇到过,用示波器采集运放的输出波形时,在某一输入电压处,原本很完美的正弦波出现了一点失真的情况,但不知是运放的原因还是其他外在原因。在了解工程师使用的运放类型之后,...

    12-05
  • 设计分享:用ADUX1020评价板搞一个手势传感器

    在这里我们用ADUX1020的评价板,实际试着运行一下。从测试板的准备到与PC的连接确认需要准备以下3项。ADUX1020评价板(ADUX1020-EVAL-SDP)评估软件(Rev. 1.5.1) (可从此网页下载: )Windo...

    11-29
  • 金手指的导电性与信号传输有何关系?

    对于80后来说,第一次见金手指的时候,可以追溯很早,不过那时候并不知道这是怎么一回事。

    11-27
  • 这是理解失调电压最正确的一次

    本文是杨建国《正确理解失调电压》视频课程的笔记

    11-25
下载排行榜
更多
评测报告
更多
广告