采集并显示实时环境温度,环境温度范围为 0°C-40°C,LED 显示 5 位。
一、DS18B20介绍
DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线(单总线)”接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。
DS18B20 温度传感器具有如下特点:
- 适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电。 独特的单线接口方式,DS18B20
- 在与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。
- DS18B20 支持多点组网功能,多个 DS18B20
- 可以并联在唯一的三线上,实现组网多点测温。 DS18B20
- 在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。
- 温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃ 可编程的分辨率为 9~12 位,对应的可分辨温度分别为
- 0.5℃、0.25℃、0.125℃ 和0.0625℃,可实现高精度测温。 在 9 位分辨率时最多在 93.75ms 内把温度转换为数字,12 位分辨率时最多在 750ms 内把温度值转换为数字,速度更快。
8.测量结果直接输出数字温度信号,以"一根总线"串行传送给 CPU,同时可传送 CRC 校验码,具有极强的抗干扰纠错能力。
9.负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
DS18B20 外观实物如下图所示:
实验代码:
main.c
#include "public.h"
#include "smg.h"
#include "ds18b20.h"
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{ u8 i=0;int temp_value;u8 temp_buf[5];ds18b20_init();//初始化DS18B20while(1){ i++;if(i%50==0)//间隔一段时间读取温度值,间隔时间要大于温度传感器转换温度时间temp_value=ds18b20_read_temperture()*100;//保留温度值小数后两位/*if(temp_value<0)//负温度{temp_value=-temp_value;temp_buf[0]=0x40;//显示负号 }*/elsetemp_buf[0]=gsmg_code[temp_value/10000];//百位temp_buf[1]=gsmg_code[temp_value/1000%10];//十位temp_buf[2]=gsmg_code[temp_value/100%10]|0x80;//个位+小数点temp_buf[3]=gsmg_code[temp_value/10%10];//小数点后一位temp_buf[4]=gsmg_code[temp_value%10];//小数点后两位smg_display(temp_buf,4);}
}
smg.c
#include "smg.h"
//共阴极数码管显示0~F的段码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/*******************************************************************************
* 函 数 名 : smg_display
* 函数功能 : 动态数码管显示
* 输 入 : dat:要显示的数据pos:从左开始第几个位置开始显示,范围1-8
* 输 出 : 无
*******************************************************************************/
void smg_display(u8 dat[],u8 pos)
{u8 i=0;u8 pos_temp=pos-1;for(i=pos_temp;i<8;i++){switch(7-i)//位选{case 0: LSC=1;LSB=1;LSA=1;break;case 1: LSC=1;LSB=1;LSA=0;break;case 2: LSC=1;LSB=0;LSA=1;break;case 3: LSC=1;LSB=0;LSA=0;break;case 4: LSC=0;LSB=1;LSA=1;break;case 5: LSC=0;LSB=1;LSA=0;break;case 6: LSC=0;LSB=0;LSA=1;break;case 7: LSC=0;LSB=0;LSA=0;break;}SMG_A_DP_PORT=dat[i-pos_temp];//传送段选数据delay_10us(100);//延时一段时间,等待显示稳定SMG_A_DP_PORT=0x00;//消音}
}
smg.h
#ifndef _smg_H
#define _smg_H#include "public.h"#define SMG_A_DP_PORT P0 //使用宏定义数码管段码口//定义数码管位选信号控制脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;extern u8 gsmg_code[17];void smg_display(u8 dat[],u8 pos);#endif
ds18b20.c
#include "ds18b20.h"
#include "intrins.h"
/*******************************************************************************
* 函 数 名 : ds18b20_reset
* 函数功能 : 复位DS18B20
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void ds18b20_reset(void)
{DS18B20_PORT=0; //拉低DQdelay_10us(75); //拉低750usDS18B20_PORT=1; //DQ=1delay_10us(2); //20US
}
/*******************************************************************************
* 函 数 名 : ds18b20_check
* 函数功能 : 检测DS18B20是否存在
* 输 入 : 无
* 输 出 : 1:未检测到DS18B20的存在,0:存在
*******************************************************************************/
u8 ds18b20_check(void)
{u8 time_temp=0;while(DS18B20_PORT&&time_temp<20) //等待DQ为低电平{time_temp++;delay_10us(1); }if(time_temp>=20)return 1; //如果超时则强制返回1else time_temp=0;while((!DS18B20_PORT)&&time_temp<20) //等待DQ为高电平{time_temp++;delay_10us(1);}if(time_temp>=20)return 1; //如果超时则强制返回1return 0;
}
/*******************************************************************************
* 函 数 名 : ds18b20_read_bit
* 函数功能 : 从DS18B20读取一个位
* 输 入 : 无
* 输 出 : 1/0
*******************************************************************************/
u8 ds18b20_read_bit(void)
{u8 dat=0;DS18B20_PORT=0;_nop_();_nop_();DS18B20_PORT=1; _nop_();_nop_(); //该段时间不能过长,必须在15us内读取数据if(DS18B20_PORT)dat=1; //如果总线上为1则数据dat为1,否则为0else dat=0;delay_10us(5);return dat;
}
/*******************************************************************************
* 函 数 名 : ds18b20_read_byte
* 函数功能 : 从DS18B20读取一个字节
* 输 入 : 无
* 输 出 : 一个字节数据
*******************************************************************************/
u8 ds18b20_read_byte(void)
{u8 i=0;u8 dat=0;u8 temp=0;for(i=0;i<8;i++)//循环8次,每次读取一位,且先读低位再读高位{temp=ds18b20_read_bit();dat=(temp<<7)|(dat>>1);}return dat;
}
/*******************************************************************************
* 函 数 名 : ds18b20_write_byte
* 函数功能 : 写一个字节到DS18B20
* 输 入 : dat:要写入的字节
* 输 出 : 无
*******************************************************************************/
void ds18b20_write_byte(u8 dat)
{u8 i=0;u8 temp=0;for(i=0;i<8;i++)//循环8次,每次写一位,且先写低位再写高位{temp=dat&0x01;//选择低位准备写入dat>>=1;//将次高位移到低位if(temp){DS18B20_PORT=0;_nop_();_nop_();DS18B20_PORT=1; delay_10us(6);}else{DS18B20_PORT=0;delay_10us(6);DS18B20_PORT=1;_nop_();_nop_(); } }
}
/*******************************************************************************
* 函 数 名 : ds18b20_start
* 函数功能 : 开始温度转换
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void ds18b20_start(void)
{ds18b20_reset();//复位ds18b20_check();//检查DS18B20ds18b20_write_byte(0xcc);//SKIP ROMds18b20_write_byte(0x44);//转换命令
}
/*******************************************************************************
* 函 数 名 : ds18b20_init
* 函数功能 : 初始化DS18B20的IO口 DQ 同时检测DS的存在
* 输 入 : 无
* 输 出 : 1:不存在,0:存在
*******************************************************************************/
u8 ds18b20_init(void)
{ds18b20_reset();return ds18b20_check();
}
/*******************************************************************************
* 函 数 名 : ds18b20_read_temperture
* 函数功能 : 从ds18b20得到温度值
* 输 入 : 无
* 输 出 : 温度数据
*******************************************************************************/
float ds18b20_read_temperture(void)
{float temp;u8 dath=0;u8 datl=0;u16 value=0;ds18b20_start();//开始转换ds18b20_reset();//复位ds18b20_check();ds18b20_write_byte(0xcc);//SKIP ROMds18b20_write_byte(0xbe);//读存储器datl=ds18b20_read_byte();//低字节dath=ds18b20_read_byte();//高字节value=(dath<<8)+datl;//合并为16位数据if((value&0xf800)==0xf800)//判断符号位,负温度{value=(~value)+1; //数据取反再加1temp=value*(-0.0625);//乘以精度 }else //正温度{temp=value*0.0625; }return temp;
}
ds18b20.h
#ifndef _ds18b20_H
#define _ds18b20_H#include "public.h"//管脚定义
sbit DS18B20_PORT=P3^7; //DS18B20数据口定义//函数声明
u8 ds18b20_init(void);
float ds18b20_read_temperture(void);#endif
public.c
#include "public.h"
/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1时,大约延时10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{while(ten_us--);
}
/*******************************************************************************
* 函 数 名 : delay_ms
* 函数功能 : ms延时函数,ms=1时,大约延时1ms
* 输 入 : ms:ms延时时间
* 输 出 : 无
*******************************************************************************/
void delay_ms(u16 ms)
{u16 i,j;for(i=ms;i>0;i--)for(j=110;j>0;j--);
}
public.h
#ifndef _public_H
#define _public_H#include "reg52.h"typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;void delay_10us(u16 ten_us);
void delay_ms(u16 ms);#endif
reg52.h
/*--------------------------------------------------------------------------
REG52.HHeader file for generic 80C52 and 80C32 microcontroller.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/#ifndef __REG52_H__
#define __REG52_H__/* BYTE Registers */
sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;
sfr PSW = 0xD0;
sfr ACC = 0xE0;
sfr B = 0xF0;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr IE = 0xA8;
sfr IP = 0xB8;
sfr SCON = 0x98;
sfr SBUF = 0x99;/* 8052 Extensions */
sfr T2CON = 0xC8;
sfr RCAP2L = 0xCA;
sfr RCAP2H = 0xCB;
sfr TL2 = 0xCC;
sfr TH2 = 0xCD;/* BIT Registers */
/* PSW */
sbit CY = PSW^7;
sbit AC = PSW^6;
sbit F0 = PSW^5;
sbit RS1 = PSW^4;
sbit RS0 = PSW^3;
sbit OV = PSW^2;
sbit P = PSW^0; //8052 only/* TCON */
sbit TF1 = TCON^7;
sbit TR1 = TCON^6;
sbit TF0 = TCON^5;
sbit TR0 = TCON^4;
sbit IE1 = TCON^3;
sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;/* IE */
sbit EA = IE^7;
sbit ET2 = IE^5; //8052 only
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;/* IP */
sbit PT2 = IP^5;
sbit PS = IP^4;
sbit PT1 = IP^3;
sbit PX1 = IP^2;
sbit PT0 = IP^1;
sbit PX0 = IP^0;/* P3 */
sbit RD = P3^7;
sbit WR = P3^6;
sbit T1 = P3^5;
sbit T0 = P3^4;
sbit INT1 = P3^3;
sbit INT0 = P3^2;
sbit TXD = P3^1;
sbit RXD = P3^0;/* SCON */
sbit SM0 = SCON^7;
sbit SM1 = SCON^6;
sbit SM2 = SCON^5;
sbit REN = SCON^4;
sbit TB8 = SCON^3;
sbit RB8 = SCON^2;
sbit TI = SCON^1;
sbit RI = SCON^0;/* P1 */
sbit T2EX = P1^1; // 8052 only
sbit T2 = P1^0; // 8052 only/* T2CON */
sbit TF2 = T2CON^7;
sbit EXF2 = T2CON^6;
sbit RCLK = T2CON^5;
sbit TCLK = T2CON^4;
sbit EXEN2 = T2CON^3;
sbit TR2 = T2CON^2;
sbit C_T2 = T2CON^1;
sbit CP_RL2 = T2CON^0;#endif
INTRINS.H
/*--------------------------------------------------------------------------
INTRINS.HIntrinsic functions for C51.
Copyright (c) 1988-2010 Keil Elektronik GmbH and ARM Germany GmbH
All rights reserved.
--------------------------------------------------------------------------*/#ifndef __INTRINS_H__
#define __INTRINS_H__#pragma SAVE#if defined (__CX2__)
#pragma FUNCTIONS(STATIC)
/* intrinsic functions are reentrant, but need static attribute */
#endifextern void _nop_ (void);
extern bit _testbit_ (bit);
extern unsigned char _cror_ (unsigned char, unsigned char);
extern unsigned int _iror_ (unsigned int, unsigned char);
extern unsigned long _lror_ (unsigned long, unsigned char);
extern unsigned char _crol_ (unsigned char, unsigned char);
extern unsigned int _irol_ (unsigned int, unsigned char);
extern unsigned long _lrol_ (unsigned long, unsigned char);
extern unsigned char _chkfloat_(float);
#if defined (__CX2__)
extern int abs (int);
extern void _illop_ (void);
#endif
#if !defined (__CX2__)
extern void _push_ (unsigned char _sfr);
extern void _pop_ (unsigned char _sfr);
#endif#pragma RESTORE#endif
硬件连接:
打叉那个不连,其他按对应颜色连接
实验结果:
采集并显示实时环境温度,环境温度范围为 0°C-40°C,LED 显示 5 位。相关推荐
- 黑苹果hidp显示不清楚_魔兽世界9.0:盟约指挥台不显示胜率?搞清楚机制,轻松收菜!...
自从魔兽世界6.0版本开放了要塞仆从任务(收菜)以来,后续的几个版本,包括最新开放的9.0版本都延续了这个玩法,只不过名字不同罢了,9.0版本的仆从任务改成了盟约大厅指挥台任务,本质都是安排精英NPC ...
- 点阵LED显示原理(转)
加个广告,我的淘宝网店,http://fengmm521.taobao.com 点阵LED显示原理(转2007年5月24日) 前几天看一个朋友做LED屏,就想自已试试看能不能做,在网上找到这个现在和大 ...
- 各种LED显示模组的技术分析
各种LED显示模组的技术分析-序言 此系列文字主要是工作总结,表述不求严谨,目的是给自己的以后的工作留下参考资料.也给从事相关工作的其他设计和工程人员一些参考.如有错误之处还请包涵并请留言指正.我看到 ...
- 百度地图开发-显示实时位置信息 04
在上一篇文章中,已经可以看到默认的百度地图,那就说明我们的操作是正确的,申请的密钥和引入地图SDK是没有问题的,接下来就是按照自己的业务需求来使用百度地图. 百度地图可以设置显示出不同的地图类型,有普 ...
- C# CRC16 在textbox中显示实时时间
PC环境win10,编译器visual studio2015 CRC16的源码 static int crc16(byte[] data, int size) {int crc = 0x0;byte ...
- STM32F103+DHT11模块+DS18B20模块 显示实时温湿度并高温高湿报警
目录 前言 代码下载: 功能介绍: 接线 DS18B20 DHT11 效果图 普通环境 普通版main.c 升级版 哈热气 普通版 升级版 搓手捂热 核心代码 普通版main.c 升级版main.c ...
- 思迈特软件Smartbi:数据大屏显示实时数据解决方案
大数据时代 ,数据 是有价值 的"黄金 ",但是 数据 是不会 告诉你 ,那里 存在 价值 ,我们可以通过 大屏显示来直观 的了解 数据 中隐含 的价值 . 大屏显示是什么?顾名 ...
- Linux 命令之 env -- 显示系统的环境变量,定义执行命令时的环境变量
文章目录 一.命令介绍 二.选项参数 三.命令示例 (一)显示系统的环境变量 (二)从当前环境中删除指定的变量 (三)定义指定的环境变量 (四)在一个修改后的环境下执行命令 一.命令介绍 env命令用 ...
- stm32数码管显示实时时间并有闹钟功能
stm32数码管显示实时时间并有闹钟功能 功能描述 数码管介绍 数码管芯片 段选与位选 驱动数码管显示代码 实验思路 完整代码 Led.h Led.c Key.h Key.c beep.h beep. ...
最新文章
- node 常用指令 node 扩展链接
- oracle修改c root,从新发现Oracle太美之root.sh
- #100天计划# 2013年10月14日
- CSS自定义消息提示
- Mysql 函数入门
- 计算机网络之网络概述:1、基本概念
- php基础编程教程 pdf,手把手教你编程打印出PDF_PHP教程
- Konomi与去中心化借贷协议bZx合作推动DeFi生态发展
- 北风设计模式课程---代理模式
- 将 PDF 转换为矢量图 emf
- 使用 SPDK 技术优化虚拟机本地存储的 IO 性能
- 领导让我接私活,怎么办
- Coremail-0day敏感文件泄露漏洞送附批量检测脚本
- 非线性微分方程的线性化
- mysql红黑联盟_MySQL在Centos的卸载和安装 - MySQL - 红黑联盟
- tp3.2简单的图片上传实现
- C++图书馆资料管理系统
- 前端框架React Js入门教程【转】
- 【Vue】Vue 项目搭建
- 数商云助您“乘风破浪”,倾力打造PCB行业采购管理平台解决方案
热门文章
- 3D点云处理:点云聚类--FEC: Fast Euclidean Clustering for Point Cloud Segmentation
- Autofac程序集注入
- 你应该知道的requestIdleCallback
- 双系统安装红旗linux,红旗LINUX怎么安装成双系统?
- 关于对技术群中群友积极参与问答的一点看法
- 97年Mekka ’97 4K Intro比赛的一等奖作品
- 幸运大转盘php逻辑判断,jQuery幸运大转盘_jQuery+PHP抽奖程序(上)
- Apache Drill Architecture Introduction
- 湖南科技大学Android课程设计之个人理财小助手APP
- 【升级为阿里云云效Codeup】