DS18B20+NRF24L01(程序不多)

合集下载

基于nRF24L01的多点温度采集系统设计

基于nRF24L01的多点温度采集系统设计

随着信息领域各种技术的发展,我们在数据采集方面的技术也取得了很大的进步,采集数据的信息化是目前社会的主要发展方向。

各种领域都用到了数据采集,比如石油勘探、地震数据采集领域。

随着工农业生产对温湿度的要求越来越高,准确测量温度变得非常重要。

本课题提出一种基于单片机的无线多点温度采集电路设计,该方案是利用单片机控制DS18B20温度传感器采集温度,温度采集成功后由nRF24L01无线通信模块进行数据的无线传输,在接收板上也有一块无线通信模块与它配对。

数据成功接收后由单片机去控制LCD1602液晶实时显示温度。

本系统还设定了一个温度报警,当温度超过这个界限就由蜂鸣器发出警报,当温度下降至报警温度以下时,警报自动停止。

本系统做的是多点温度采集,包括两块无线发送模块和一块无线接收模块,采集到的温度并排显示在同一个LCD1602上。

用到的主要器件是AT89S52单片机、数字温度传感器DS18B20和无线芯片nRF24L01,测量结果用LCD1602液晶显示。

关键词:单片机;多点温度采集;无线通信模块;温度报警。

Along with the development of the technology of information field, we had also made a lot of progress in data collection technology, the data gathering information is the main development direction of the society. Various fields also use the data collection, such as petroleum exploration, seismic data acquisition field. Along with increasingly demanding of the industry and agriculture production to the temperature and humidity,more accurate measurement temperature becomes very important.This topic is wireless acquisition multipoint temperature acquisition and transmission circuit design base on SCM, the project is using SCM to control the temperature sensorDS18B20 to collection temperature, use nRF24L01wireless communication module to transmit if receive temperature successfully, there is a wireless communication module pairing with it in eing SCM to control LCD1602 liquid crystal to display temperatureafter receiving temperature successfully.The system also set a warning temperature, when the temperature over the line ,the buzzer will call, when the temperature belowthe alarm temperature below, alarm will stop. This system realizes multipoint temperature gathering,including twowireless transmission module and one wireless receiving module.The temperature will show on the same LCD1602.This system’s main components is AT89S52 SCM and digital temperature sensor DS18B20 and wireless chip nRF24L01, the measured result is displaying by LCD1602.Key words:SCM; multipoint temperature gathering; wireless communication module;temperature warning.目录引言 (1)1 课题方案设计 (2)2 硬件设计 (3)2.1 电源电路 (3)2.2 温度传感器电路 (3)2.3 无线传输电路 (4)2.4 显示电路 (6) (7)2.5 单片机系统 (8) (8) (8)2.6 警报电路 (11)3 软件设计 (12)3.1 系统概述 (12)3.2 程序设计流程图 (12)3.3 DS18B20程序设计 (13)3.4 nRF24L01程序设计 (16)3.5 字符型液晶显示模块程序设计 (17)4 调试及结果 (20)5 结论 (22)谢辞 (23)参考文献 (24)附录 (25)引言21世纪的今天,科学技术的发展日新月异,科学技术的进步同时也带动了测量技术的发展,现代控制设备不同于以前,它们在性能和结构发生了翻天覆地的变化。

基于nRF24L01的无线智能温度监测系统

基于nRF24L01的无线智能温度监测系统

数据输出 00FA 0032 0001 0000 FFFF FFCE FF92
微处理模块将监测到的温度和电压以及监测时间等数据 打包处理,通过 nRF24L01 无线收发模块发送至数据集中器; 键 盘可查询各记录值和设置各种工作参数,如设定和修改温度和 电压的报警界限,当监测值超出设定界限时,蜂鸣器发声,当然 各种设置也可通过计算机管理系统的控制命令来完成; 时钟电 路用于记录监测时间。存储模块用于存储多个时刻监测的温 度、电压和时间值,方便历史查询; 数码管显示器用于显示当前 温度和当前电池电压,以及显示人机交互等信息。 2. 2 数据集中器硬件设计
201chnique and Sensor
2011 No. 12
基于 nRF24L01 的无线智能温度监测系统
李 闪,黄小莉,胡 兵,刘希军
( 西华大学电气信息学院,四川成都 610039)
摘要: 提出了一种以无线传输模块 nRF24L01 和数字温度传感器 DS18B20 相结合的无线智能温度监测系统的设计方
( 2) 温度采集器管理。通过采集器管理功能模块,系统管 理软件可完成对采集器报警电压和报警温度的设置以满足不 同监测点对温度监测报警标准的需求。采集方式可设置不同 的方式,如定时采集、连续采集、实时采集等; 采集器数据查询 可对采集器保存的历史数据读取,当数据库数据毁坏时可通过 此方式查询到前一段时期的数据; 采集时钟校正可将各采集器 的工作时间与系统时间同步。
0 引言 目前温度数据的采集方式可分为有线方式和无线方式[1]。
有线方式主要通过 RS - 232、RS - 422、RS - 485、CAN 总线等来 实现采集器的控制和温度数据的传输。这种方式在现场组网 应用中不仅布线 繁 琐,费 用 较 高,且 出 现 问 题 时 不 易 排 查。 无 线方式可通过 GPRS、CDMA 等远距离无线传输。此种方式数 据传输稳定可靠,但是成本过高。

DS18B20的报告(附带程序)..

DS18B20的报告(附带程序)..

DS18B20温度传感器数字温度传感器DS18B20是由Dallas半导体公司生产的,它具有耐磨耐碰,体积小,使用方便,封装形式多样(如图1.1.1),适用于各种狭小空间设备数字测温和控制领域。

图1.1.1引脚说明:GND为接地引脚;DQ为数据输入输出脚。

用于单线操作,漏极开路;VCC接电源正;单总线通常要求接一个约4.7K左右的上拉电阻,这样,当总线空闲时,其状态为高电平。

如图1.1.2是温度传感器DS18B20的接线图图1.1.2温度传感器DS18B20的参数:●适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电●温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃●可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温●在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快●被测温度用符号扩展的16位数字量方式串行输出●有两种供电方式既可以直接加 3.0~5.5V的电源,也可以采用寄生电源方式由数据线供电DS18B20内部结构及功能:DS18B20的内部结构如图1.1.3所示。

主要包括:寄生电源,温度传感器,64位ROM和单总线接口,存放中间数据的高速暂存器RAM,用于存储用户设定温度上下限值的TH和TL触发器,存储与控制逻辑,8位循环冗余校验码(CRC)发生器等7部分。

开始8位是产品类型的编号,接着共有48 位是DS18B20 唯一的序列号。

最后8位是前面56 位的CRC 检验码,这也是多个DS18B20 可以采用一线进行通信的原因。

高速暂存存储器:高速暂存存储器由9个字节组成,其分配如图所示。

高速暂存存储器字节0~1 温度寄存器当DS18B20接收到温度转换命令后,开始启动转换。

转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1,2字节。

ds18b20详解及程序

ds18b20详解及程序

d s18b20详解及程序(总1页) -CAL-FENGHAI.-(YICAI)-Company One1
-CAL-本页仅作为文档封面,使用请直接删除
最近都在学习和写单片机的程序, 今天有空又模仿DS18B20温度测量显示实验写了一个与DS18B20基于单总线通信的程序.
DS18B20 数字温度传感器(参考:智能温度传感器DS18B20的原理与应用)是DALLAS 公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。

因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计。

DS18B20 产品的特点:
(1)、只要求一个I/O 口即可实现通信。

(2)、在DS18B20 中的每个器件上都有独一无二的序列号。

(3)、实际应用中不需要外部任何元器件即可实现测温。

(4)、测量温度范围在-55 到+125℃之间; 在-10 ~ +85℃范围内误差为
±5℃;
(5)、数字温度计的分辨率用户可以从9 位到12 位选择。

将12位的温度值转换为数字量所需时间不超过750ms;(6)、内部有温度上、下限告警设置。

DS18B20引脚分布图
DS18B20 详细引脚功能描述:
1、GND 地信号;
2、DQ数据输入出引脚。

开漏单总线接口引脚。

当被用在寄生电源下,此引脚可以向器件提供电源;漏极开路, 常太下高电平. 通常要求外接一个约5kΩ的上拉电阻.
3、VDD可选择的VDD 引脚。

电压范围:3~5.5V; 当工作于寄生电源时,此引脚必须接地。

DS18B20存储器结构图
暂存储器的头两个字节为测得温度信息的低位和高位字节;。

基于nRf24E1和DS18B20温度传感器的无线测温系统

基于nRf24E1和DS18B20温度传感器的无线测温系统

所设计的无线数传模块由单片射频收发芯片NRF401、AT89C52微控制器和MAX3316接口芯片构成,工作在433.92/434.33MHz频段;可方便地嵌入在各种测量和控制系统中进行无线数据传输,在车辆监控、无线抄表、无线232数据通信、计算机遥控遥测系统中应用。

nRF401是北欧集成电路公司(NORDIC)的产品,是一个为433MHz ISM频段设计的真正单片UHF无线收发芯片,满足欧洲电信工业标准(ETSI)EN300 200-1 V1.2.1。

它采用FSK调制解调技术,最高工作速率可以达到20K,发射功率可以调整,最大发射功率是+10dBm。

nRF401的天线接口设计为差分天线,以便于使用低成本的PCB天线。

它要求非常少的外围元件(约10个),无需声表滤波器、变容管等昂贵的元件,只需要便宜且易于获得的4MHz晶体,收发天线合一。

无需进行初始化和配置,不需要对数据进行曼彻斯特编码,有两个工作频宽(433.92/434.33MHz),工作电压范围可以从2.7-5V,还具有待机模式,可以更省电和高效。

nRF401无线收发芯片的结构框图如图1所示:内部结构可分为发射电路、接收电路、模式和低功耗控制逻辑电路及串行接口几部分。

发射电路包含有:射频功率放大器、锁相环(PLL),压控振荡器(VCO),频率合成器等电路。

基准振荡器采用外接晶体振荡器,产生电路所需的基准频率。

其主要特性如下:工作频率为国际通用的数传频段FSK调制,抗干扰能力强,特别适合工业控制场合;采用PLL频率合成技术,频率稳定性极好;灵敏度高,达到-105dBm(nRF401);功耗小,接收状态250 A,待机状态仅为8 A(nRF401);最大发射功率达+10dBm ;低工作电压(2.7V),可满足低功耗设备的要求;具有多个频道,可方便地切换工作频率;工作速率最高可达20Kbit/s(RF401);仅外接一个晶体和几个阻容、电感元件,基本无需调试;因采用了低发射功率、高接收灵敏度的设计,使用无需申请许可证,开阔地的使用距离最远可达1000米(与具体使用环境及元件参数有关)。

(完整版)NRF24l01无线温度传感_毕业设计

(完整版)NRF24l01无线温度传感_毕业设计

A Dissertation Submitted toNanjing Institute of TechnologyFor the Academic Degree of Bachelor of ScienceBysupervised byCollege of Communication EngineeringNanjing Institute of TechnologyJune 2010NRF24l01无线温度传感摘要随着工农业生产对温度的要求越来越高,准确测量温度变得至关重要。

本系统的设计主要是针对恶劣环境下的工业现场以及高科技大范围的农业现场,布线困难,浪费资源,占用空间,可操作性差等问题做出的一个解决方案。

本文对上述问题提出一种无线解决方案,即基于SoC无线温度采集系统的设计。

该系统采用低功耗、高性能单片机及单总线数字式测温器件DS18B20构成测温系统,并且通过无线收发,最后在PC机上完成配置、显示和报警的功能。

在这次的设计中采用的单片机STC89C52RC的内核和MCS-51系列单片机一样,引脚也相同。

但是STC89C52RC可以通过STC_ISP软件下载进行烧录。

无线数据通信收发芯片NRF24L01是一款工业级内置硬件链路层协议的低成本无线收发器,工作于2.4 GHz全球开放ISM频段。

此外,温度传感器DS18B20以"一线总线"的数字方式传输,可大大提高系统的抗干扰性。

关键词:SoC;STC89C52RC;NRF24L01;温度传感器DS18B20;无线AbstractWith the industrial and agricultural production the temperature, accurate temperature measurement becomes critical.This system is a solution designed for wiring difficulties, wasting resources,taking up the space and poor maneuverability of the above mentioned problems is proposed, which is based on wireless solutions of SoC design of wireless temperature gathering system. This system USES low power consumption, PC complete configuration, display and alarm function.Used in the design of the microcontroller STC89C52RC and MCS-51 MCU core . But STC_ISP through STC89C52RC can burn to download software.Wireless data communication transceiver chip is an industrial grade NRF24L01 the 2.4 GHz band global open ISM. In addition, the temperature sensor DS18B20 to "bus line" digital mode transmission, greatly improves the power system.Key words:SoC,STC89C52RC,NRF24L01,Temperature sensor DS18B20,Wireless目录第一章绪论 (1)1.1概述 (1)1.2系统设计任务分析 (2)第二章总体方案设计与选择的论证 (2)2.1单片机最小系统 (2)2.1.1单片机的说明 (2)2.1.2单片机的应用 (2)2.1.3单片机的结构特点 (4)2.1.4单片机引脚配置 (4)2.2无线收发模块介绍 (6)2.2.1nRF24L01概述 (6)2.2.2 引脚功能及描述 (7)2.2.3工作模式 (7)2.2.4工作原理 (8)2.2.5配置字 (9)2.2.6nRF24L01应用原理框图 (10)2.3数码管温度显示和运行指示灯电路 (10)2.3.1LED数码管的基本结构 (10)2.3.2数码管动态显示的工作原理 (11)2.3.3运行指示灯说明 (12)2.4温度采集电路 (12)2.4.1 DS18B20概述 (12)2.4.2 DS18B20的管脚配置和内部结构 (13)2.4.3单总线介绍 (14)2.4.4DS18B20的工作原理 (14)2.5声报警电路设计 (20)2.6无线温度采集软件界面(MFC) (20)第三章软件设计报告 (24)3.1单片机软件设计 (24)3.1.1发送部分软件设计 (24)3.1.1.1温度传感DS18B20 (24)3.1.1.2 LED数码管显示 (29)3.1.1.3无线模块NRF24L01(发送) (29)3.1.2接收部分软件设计 (30)3.1.2.1无线模块NRF24L01(接收) (30)3.1.2.2 LED数码管显示 (30)3.1.2.3串口通信 (30)3.1.3无线温度采集软件设计 (32)3.1.3.1串口设置 (32)3.1.3.2温度上下限设置 (33)3.1.3.3曲线显示 (34)3.2流程图设计 (34)3.2.1发送部分流程图 (34)3.2.2接收部分流程图 (34)3.2.3 MFC程序流程图 (34)3.3操作说明(附图) (34)第四章总结与展望 (36)致谢 (38)参考文献 (39)附录 (40)第一章绪论1.1概述随着社会的进步和生产的需要,利用无线通信进行温度数据采集的方式应用已经渗透到生活各个方面。

DS2431 DS18B20读写程序

DS2431 DS18B20读写程序
voiddelay_us(unsignedchartime)
{//delayms=1usof20Mhzosc//不准确1us
while(time--);
}
/*********************************************
CRC校验
*********************************************/
unsignedcharcrccheck(unsignedchar*p,unsignedcharlen)
{
unsignedcharbit0,cbit,r,temp,i,j,byte;
temp=0;
for(j=0;j<len;j++)
{
byte=p[j];
for(i=0;i<8;i++)
{
cbit=temp&0x01;
OneWire_write(tem8h);//发送地址高位
for(i=0;i<8;i++)
{
data=*p_data;
p_data++;
OneWire_write(data);
}
delay_us(25);
if(OneWire_ack())return;
OneWire_write(0xcc);//跳过ROM匹配
bit0=byte&0x01;
temp=temp>>1;
r=cbit^bit0;
if(r==1)
temp=temp^0x8c;
byte=byte>>1;
}
}
returntemp;
}

nRF24L01 无线温度DS18B20测控系统

nRF24L01 无线温度DS18B20测控系统

nRF24L01+无线温度(DS18B20)测控系统//****************无线温度发射部分*******************api.h#ifndef _API_H_#define _API_H_#define uchar unsigned char#define uint unsigned int//*********************************************NR F24L01*************************************#define TX_ADR_WIDTH5// 5 uints TX address width#define RX_ADR_WIDTH5// 5 uints RX address width#define TX_PLOAD_WIDTH 20 // 20 uints TX payload #define RX_PLOAD_WIDTH 20 // 20 uints TX payload uchar const TX_ADDRESS[TX_ADR_WIDTH]={0x35,0x43,0x10,0x10,0x03}; //本地地址uchar const RX_ADDRESS[RX_ADR_WIDTH]={0x35,0x43,0x10,0x10,0x03};//接收地址//***************************************NRF24L01寄存器指令************************************************* ******#define READ_REG0x00 // 读寄存器指令#define WRITE_REG0x20 // 写寄存器指令#define RD_RX_PLOAD0x61 // 读取接收数据指令#define WR_TX_PLOAD0xA0 // 写待发数据指令#define FLUSH_TX0xE1 // 冲洗发送 FIFO指令#define FLUSH_RX0xE2 // 冲洗接收 FIFO指令#define REUSE_TX_PL0xE3 // 定义重复装载数据指令#define NOP0xFF // 保留//*************************************SPI(nRF24L 01)寄存器地址************************************************* ***#define CONFIG0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA0x01 // 自动应答功能设置#define EN_RXADDR0x02 // 可用信道设置#define SETUP_AW0x03 // 收发地址宽度设置#define SETUP_RETR0x04 // 自动重发功能设置#define RF_CH0x05 // 工作频率设置#define RF_SETUP0x06 // 发射速率、功耗功能设置#define STATUS0x07 // 状态寄存器#define OBSERVE_TX0x08 // 发送监测功能#define CD0x09 // 地址检测#define RX_ADDR_P00x0A // 频道0接收数据地址#define RX_ADDR_P10x0B // 频道1接收数据地址#define RX_ADDR_P20x0C // 频道2接收数据地址#define RX_ADDR_P30x0D // 频道3接收数据地址#define RX_ADDR_P40x0E // 频道4接收数据地址#define RX_ADDR_P50x0F // 频道5接收数据地址#define TX_ADDR0x10 // 发送地址寄存器#define RX_PW_P00x11 // 接收频道0接收数据长度#define RX_PW_P10x12 // 接收频道1接收数据长度#define RX_PW_P20x13 // 接收频道2接收数据长度#define RX_PW_P30x14 // 接收频道3接收数据长度#define RX_PW_P40x15 // 接收频道4接收数据长度#define RX_PW_P50x16 // 接收频道5接收数据长度#define FIFO_STATUS0x17 // FIFO栈入栈出状态寄存器设置#endifLCD1602display.h#include ;#include ;#define uchar unsigned char#define uint unsigned int//************************LCD引脚定义sbit LCM_RS=P3^4;sbit LCM_RW=P3^6;sbit LCM_E=P3^7;//**************************延时void delay();//**************************初始化void InitLCM();//****************************读状态uchar ReadStatusLCM();//******************************读数据uchar ResdDataLCM();//***************************写指令void WriteCommandLCM(uchar WCLCM, Busy);//***************************写数据void WriteDataLCM(uchar WDLCM);//******************************显示1个字符void DisplayOneChar(uchar X,uchar Y,uchar DData); //******************************显示字符串void DisplayListChar(uchar X,uchar Y,uchar code*DData);//********************延时void delay(uchar z){uchar i,j;for(i=z;i>;0;i--)for(j=110;j>;0;j--);}//**********************LCM初始化void InitLCM(){WriteCommandLCM(0x38,0);//三次显示模式设置,不检测忙信号delay(1);WriteCommandLCM(0x38,0);delay(1);WriteCommandLCM(0x38,0);delay(1);WriteCommandLCM(0x38,1);//显示模式设置:16&times;2显示,5&times;7点阵,8位数据接口WriteCommandLCM(0x0c,1);//显示模式设置:显示开,无光标WriteCommandLCM(0x06,1);//显示模式设置:光标右移,字符不移WriteCommandLCM(0x01,1);//清屏幕指令,将以前的显示内容清除}//*********************读状态uchar ReadStatusLCM(){P0 = 0x80;LCM_RS = 0;LCM_RW = 1;LCM_E = 1;while (P0 & 0x80); //检测忙信号return(0);}//***********************读数据/*uchar ResdDataLCM(){LCM_RS=1;LCM_RW=1;LCM_E=1;} *///**********************写指令void WriteCommandLCM(uchar WCLCM, Busy) {if(Busy) ReadStatusLCM();P0=WCLCM;LCM_RS=0;LCM_RW=0;LCM_E=0;LCM_E=1;}//***********************写数据void WriteDataLCM(uchar WDLCM){ReadStatusLCM();P0=WDLCM;LCM_RS=1;LCM_RW=0;LCM_E=0;LCM_E=1;}//*************************显示字符void DisplayOneChar(uchar X,uchar Y,uchar DData) {if(Y) X|=0X40;//Y=1显示第二行,Y=0显示第一行X|=0X80;WriteCommandLCM(X,1);//X用来选择哪一位,1是用来忙检测WriteDataLCM(DData);//DData用来写数据}//**************************显示字符串void DisplayListChar(uchar X,uchar Y,uchar code *DData){uchar ListLength;ListLength=0;while(DData[ListLength]!='\0'){if(X;0;n--)_nop_();}//*********************************************** *****************************************/*NRF24L01初始化//*********************************************** ****************************************/void init_NRF24L01(void){inerDelay_us(100);CE=0;// chip enableCSN=1;// Spi disableSCK=0;SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);// 写发射端地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P1,RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址SPI_RW_Reg(WRITE_REG + EN_AA, 0x03);// 频道1自动ACK应答允许SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x03); // 允许接收地址只有频道1,如果需要多频道可以参考Page21SPI_RW_Reg(WRITE_REG + RF_CH, 0);//设置信道工作为2.4GHZ,收发必须一致SPI_RW_Reg(WRITE_REG + RX_PW_P1, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);//设置发射速率为1MHZ,发射功率为最大值0dB }/************************************************ ************************************************* ***/*函数:uint SPI_RW(uint uchar)/*功能:NRF24L01的SPI写时序/************************************************ ************************************************* ***/uchar SPI_RW(uchar byte){uchar bit_ctr;for(bit_ctr=0;bit_ctr;#include ;#include &quot;LCD1602display.h&quot;uchar code range[]=&quot;===TEMPERTURE===&quot;; uchar code ASCII[]=&quot;0123456789.&quot;;uchar code table0[]=&quot;ROME TEMP:00.0C &quot;; uchar code table1[]=&quot;ERRO !!!&quot;;uchar temp[3]={0,0,0};sbit DQ=P2^0;//ds18b20uint wendu=0;uchar num,num1;uint temperature=0;//********************延时void delay1ms(uint z){uint x,y;for(x=z;x>;0;x--)for(y=114;y>;0;y--);}//*************************初始化bit init_DS18B20(){uchar num;bit flag;DQ=1;for(num=0;num;60uswaitflag=DQ;// 响应for(num=0;num;60uswaitbyte>;>;=1;DQ=1;//拉高_nop_();_nop_();}}//**********************************读出温度数据uchar DS18B20_RD_CHAR() //先读低位{uchar byte=0;for(num1=0;num1;>;=1;if(DQ==1)byte|=0x80;elsebyte|=0x00;DQ=1;//拉高_nop_();_nop_();for(num=0;num;60us}return byte;}//*********************************温度计算void DS18B20_WENDU(){uchar temperaturel=0,temperatureh=0;if(init_DS18B20()==0){DS18B20_WR_CHAR(0xcc);DS18B20_WR_CHAR(0x44);delay1ms(1000);if(init_DS18B20()==0){DS18B20_WR_CHAR(0xcc);DS18B20_WR_CHAR(0xBE);_nop_();temperaturel=DS18B20_RD_CHAR();temperatureh=DS18B20_RD_CHAR();wendu=(temperatureh*256+temperaturel)*0.625;init_DS18B20();}//return (temperature);}}//******************************温度显示void display_DS18B20(){temp[2]=wendu/100%10;temp[1]=wendu%100/10;temp[0]=wendu%10;DisplayListChar(0, 1, table0); DisplayOneChar(10, 1, ASCII[ temp[2] ] ); DisplayOneChar(11, 1, ASCII[ temp[1] ] ); DisplayOneChar(12, 1, ASCII[10] ); DisplayOneChar(13, 1, ASCII[ temp[0] ] ); }fa.c#include ;#include ;#include &quot;api.h&quot;#include &quot;nrf24l01+1.h&quot;#include &quot;ds18b20.h&quot;#define uchar unsigned char#define uint unsigned intsbit BELL=P1^6;//*******************************主函数main(){uchar TxBuf[20]={0};//wendu=0;InitLCM();DisplayListChar(0,0,range); DisplayListChar(0,1,table0);init_NRF24L01();delay1ms(1000);while(1){if( init_DS18B20()==0){DS18B20_WENDU();display_DS18B20();TxBuf[1] = wendu/256;TxBuf[2] = wendu%256;BELL=0;delay1ms(1);BELL=1;}nRF24L01_TxPacket(TxBuf);// Transmit Tx buffer dataTxBuf[1] = 0x00;TxBuf[2] = 0x00;delay1ms(1000);sta=SPI_Read(STATUS);SPI_RW_Reg(WRITE_REG+STATUS,sta);}}//****************无线温度接收部分************直接调用api.h和LCD1602display.hnrf24l01+2.h#define uchar unsigned char#define uint unsigned intuchar temp[3]={0,0,0};//********************************************************sbit MISO=P1^4;sbit MOSI=P1^3;sbitSCK=P1^2;sbitCE=P1^0;sbitCSN=P1^1;sbitIRQ=P1^5;//*********************************************** *****函数声明void inerDelay_us(uchar n);void init_NRF24L01(void);uchar SPI_RW(uchar byte);uchar SPI_Read(uchar reg);//void SetRX_Mode(void);uchar SPI_RW_Reg(uchar reg, uchar value);uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);uchar nRF24L01_RxPacket(uchar* rx_buf);//void nRF24L01_TxPacket(uchar * tx_buf);//*********************************************** ******************************************* uchar bdata sta;//状态标志sbitRX_DR=sta^6;sbitTX_DS=sta^5;sbitMAX_RT=sta^4;/************************************************ ******************************************/*延时函数/************************************************ ******************************************/void inerDelay_us(uchar n){for(;n>;0;n--)_nop_();}//*********************************************** *****************************************/*NRF24L01初始化//*********************************************** ****************************************/void init_NRF24L01(void){inerDelay_us(100);CE=0;// chip enableCSN=1;// Spi disableSCK=0;SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);// 写发射端地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P1,RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址SPI_RW_Reg(WRITE_REG + EN_AA, 0x03);// 频道1自动ACK应答允许SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x03); //允许频道1,2SPI_RW_Reg(WRITE_REG + RF_CH, 0);//设置信道工作为2.4GHZ,收发必须一致SPI_RW_Reg(WRITE_REG + RX_PW_P1, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);//设置发射速率为1MHZ,发射功率为最大值0dB }/************************************************ ************************************************* ***/*函数:uint SPI_RW(uint uchar)/*功能:NRF24L01的SPI写时序/************************************************ ************************************************* ***/uchar SPI_RW(uchar byte)uchar bit_ctr;for(bit_ctr=0;bit_ctr;#include ;#include &quot;api.h&quot;#include &quot;nrf24l01+2.h&quot;#include &quot;LCD1602display.h&quot;#define uchar unsigned char#define uint unsigned intuchar code range[]=&quot;===TEMPERTURE===&quot;; uchar code ASCII[]=&quot;0123456789.&quot;;uchar code table0[]=&quot;ROME TEMP:00.0C &quot;; uchar code table1[]=&quot;ERRO !!!&quot;;//******************************温度显示void display_DS18B20(){DisplayListChar(0, 1, table0);DisplayOneChar(10, 1, ASCII[ temp[2] ] );DisplayOneChar(11, 1, ASCII[ temp[1] ] ); DisplayOneChar(12, 1, ASCII[10] ); DisplayOneChar(13, 1, ASCII[ temp[0] ] ); }//*********************************主函数void main(){uchar RxBuf[20]={0};InitLCM();DisplayListChar(0,0,range);DisplayListChar(0,1,table0);init_NRF24L01();while(1){nRF24L01_RxPacket(RxBuf);display_DS18B20();RxBuf[1]=0x00;RxBuf[2]=0x00;}}。

ds18b20工作原理

ds18b20工作原理

ds18b20工作原理DS18B20是一种数字温度传感器,它可以通过一根数据线进行温度的采集和传输。

DS18B20工作原理的核心是利用温度对半导体材料电阻的影响来实现温度的测量。

接下来,我们将详细介绍DS18B20的工作原理。

首先,DS18B20内部包含了一个温度传感器芯片,该芯片采用了数字信号输出的方式。

在DS18B20内部,有一个模拟-数字转换器(ADC),它可以将模拟信号转换为数字信号。

当DS18B20受到温度的影响时,芯片内部的电阻会发生变化,进而改变了电压信号的大小。

ADC会将这个模拟信号转换为数字信号,然后通过数据线输出给外部设备。

其次,DS18B20采用了一种叫做“单总线”(One Wire)的通信协议。

这意味着DS18B20只需要一根数据线就可以完成温度的采集和传输。

在通信过程中,DS18B20会将温度数据以数字信号的形式发送给外部设备。

外部设备可以通过读取数据线上的数字信号来获取温度信息。

此外,DS18B20还具有一些特殊的功能,比如温度的精度调节、温度报警功能等。

通过这些功能,DS18B20可以满足不同场景下的温度监测需求。

总的来说,DS18B20的工作原理是基于半导体材料电阻随温度变化的特性,利用ADC将模拟信号转换为数字信号,并通过单总线通信协议将温度数据传输给外部设备。

同时,DS18B20还具有一些特殊的功能,可以满足不同场景下的温度监测需求。

在实际应用中,DS18B20被广泛应用于各种温度监测系统中,比如智能家居、工业自动化等领域。

由于其简单、稳定、精准的特点,DS18B20在温度监测领域具有很高的性价比,受到了广泛的认可和应用。

综上所述,DS18B20是一种基于半导体材料电阻特性的数字温度传感器,其工作原理是通过ADC将模拟信号转换为数字信号,并通过单总线通信协议将温度数据传输给外部设备。

在实际应用中,DS18B20具有简单、稳定、精准的特点,被广泛应用于各种温度监测系统中。

DS18B20温度传感器详解带c程序

DS18B20温度传感器详解带c程序

00A2H
+0.5
0000 0000 0000 000
0000H
-0.5
1111 1111 1111 1000
FFF8H
-10.125
1111 1111 0110 1110
FF5EH
-25.0625
1111 1110 0110 1111
FF6FH
-55 执行序列与介绍 3.1 执行序列
duan=1; switch(i) {
case 0: if(zf==0) P1=numfh[zf];
else if(bai!=0) P1=numd[bai]; else if(shi!=0) P1=numd[shi]; else P1=numdg[ge]; break;
case 1: if(zf==0&&shi!=0) P1=numd[shi];
表 3.2 DS18B20 温度/数字对应关系表
温度(℃)
输出的二进制码
对应的十六进制码
+125
0000 0111 1101 0000
07D0H
+85
0000 0101 0101 0000
0550H
+25.0625
0000 0001 1001 0001
0191H
+10.125
0000 0000 1010 0010
uchar x,y; for(x=z;x>0;x--)
for(y=110;y>0;y--); } /******************15us 延时函数****************/ void delay(uint z) {
while(z--); } /******************初始化 DS18B20 函数****************/ void reset_ds18b20() {

基于nRF24L01的无线温度采集系统设计(1)概要

基于nRF24L01的无线温度采集系统设计(1)概要

1引言温度采集系统所采集的温度通常通过RS485、CAN 总线通信方式传输至上位机,但这种方式维护较困难,不利于工业现场生产;而无线通信GPRS 技术传输距离长,通信可靠稳定,但设计复杂、成本昂贵。

这里采用工业级内置硬件链路层协议的低成本单芯片nRF24L01型无线收发器件实现系统间的无线通信,完成无线信号的接收、显示及报警功能。

2nRF24L01简介nRF24L01是一款工业级内置硬件链路层协议的低成本无线收发器。

该器件工作于2.4GHz 全球开放ISM 频段,内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合增强型ShockBurst 技术,其输出功率和通信频道可通过程序配置。

拥有ShockBurst 和Enhanced ShockBurst 两种数据传输模式。

可直接与单片机I/O 连接,外接元件数目少。

nRF24L01功耗低,以-6dBm 的功率发射时,工作电流仅9mA ;接收时,工作电流仅12.3mA ,多种低功率工作模式[1](掉电和空闲模式更利于节能设计。

3系统硬件设计系统硬件设计主要由采集发送和接收显示两部分组成[2]。

图1为采集发送电路原理图,该电路主要由温度传感器DS18B20、单片机STC12LE5408和nRF24L01组成[3]。

STC12LE5408是增强型8051单片机,速度快,集成度高,电压范围宽(2.2~3.8V ,和MCS -51系列单片机指令系统完全兼容。

其内部还有8KB Flash 程序存储器,512字节RAM 、2KB EEPROM 、4路PWM 以及硬件看门狗(WDT 等资源,性价比高[4]。

DS18B20是DALLAS 公司生产的单总线数字1-Wire温度传感器[5],可把温度信号直接转换成串行数字信号供单片机处理,采用1-Wire 接口,DS18B20的数据端DQ 可通过4.7k Ω的上拉电阻接STC12LE5408。

nRF24L01的CE ,CSN ,SCK ,MOSI ,MISO ,IRQ 引脚则可接STC12LE5408的任意端口,但需在编程时注意,这里接至P1端口。

DS18B20的读写程序

DS18B20的读写程序

DS18B20的读写程序以下是我为宾馆智能控制器所做的温度探测器DS18B20的一个程序。

在网上看到很多朋友想要DS18B20的读写程序却苦于找不到这样的程序,我把它贡献出来和大家分享。

这个程序取到的温度值范围为0-70(一般应用足够了),如需大于此温度值可自行在TAB中添加。

测温精度为0.5度,没有加校正,需要的朋友可自行查一些资料。

; FLAG1: 标志位,为"1"时表示检测到DS18B20; DQ: DS18B20的数据总线接脚; TEMPER_NUM:保存读出的温度数据; 本程序仅适合单个DS18B20和51单片机的连接,晶振为12MHZ左右TEMPER_L EQU 36HTEMPER_H EQU 35HDQ BIT P1.7; DS18B20初始化程序;//*****************************************//INIT_1820:SETB DQNOPCLR DQMOV R0,#06BHTSR1:DJNZ R0,TSR1 ; 延时SETB DQMOV R0,#25HTSR2:JNB DQ,TSR3DJNZ R0,TSR2LJMP TSR4 ; 延时TSR3:SETB FLAG1 ; 置标志位,表示DS1820存在LJMP TSR5TSR4:CLR FLAG1 ; 清标志位,表示DS1820不存在LJMP TSR7TSR5:MOV R0,#06BHTSR6:DJNZ R0,TSR6 ; 延时TSR7:SETB DQRET;//*****************************************//; 重新写DS18B20暂存存储器设定值;//*****************************************//RE_CONFIG:JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1 RETRE_CONFIG1:MOV A,#0CCH ; 发SKIP ROM命令LCALL WRITE_1820MOV A,#4EH ; 发写暂存存储器命令LCALL WRITE_1820MOV A,#00H ; TH(报警上限)中写入00HLCALL WRITE_1820MOV A,#00H ; TL(报警下限)中写入00HLCALL WRITE_1820MOV A,#1FH ; 选择9位温度分辨率LCALL WRITE_1820RET;//*****************************************//; 读出转换后的温度值;//*****************************************//GET_TEMPER:SETB DQ ; 定时入口LCALL INIT_1820JB FLAG1,TSS2RET ; 若DS18B20不存在则返回TSS2:MOV A,#0CCH ; 跳过ROM匹配LCALL WRITE_1820MOV A,#44H ; 发出温度转换命令LCALL WRITE_1820LCALL INIT_1820MOV A,#0CCH ; 跳过ROM匹配LCALL WRITE_1820MOV A,#0BEH ; 发出读温度命令LCALL WRITE_1820LCALL READ_1820MOV TEMPER_NUM,A ; 将读出的温度数据保存;//*****************************************//; 读DS18B20的程序,从DS18B20中读出一个字节的数据;//*****************************************// READ_1820:MOV R2,#8RE1:CLR CSETB DQNOPNOPCLR DQNOPNOPNOPSETB DQMOV R3,#7DJNZ R3,$MOV C,DQMOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE1RET;//*****************************************//; 写DS18B20的程序;//*****************************************// WRITE_1820:MOV R2,#8CLR CWR1:CLR DQMOV R3,#6DJNZ R3,$RRC AMOV DQ,CMOV R3,#23DJNZ R3,$SETB DQNOPDJNZ R2,WR1SETB DQ;//*****************************************//; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据;//*****************************************//READ_18200:MOV R4,#2 ; 将温度高位和低位从DS18B20中读出MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H) RE00:MOV R2,#8RE01:CLR CSETB DQNOPNOPCLR DQNOPNOPNOPSETB DQMOV R3,#7DJNZ R3,$MOV C,DQMOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE01MOV @R1,ADEC R1DJNZ R4,RE00RET;//*****************************************//; 将从DS18B20中读出的温度数据进行转换;//*****************************************//TEMPER_COV:MOV A,#0F0HANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值SW AP AMOV TEMPER_NUM,AMOV A,TEMPER_LJNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值INC TEMPER_NUMTEMPER_COV1:MOV A,TEMPER_HANL A,#07HSW AP AORL A,TEMPER_NUMMOV TEMPER_NUM,A ; 保存变换后的温度数据LCALL BIN_BCDRET;//*****************************************//; 将16进制的温度数据转换成压缩BCD码;//*****************************************//BIN_BCD:MOV DPTR,#TEMP_TABMOV A,TEMPER_NUMMOVC A,@A+DPTRMOV TEMPER_NUM,ARETTEMP_TAB:DB 00H,01H,02H,03H,04H,05H,06H,07HDB 08H,09H,10H,11H,12H,13H,14H,15HDB 16H,17H,18H,19H,20H,21H,22H,23HDB 24H,25H,26H,27H,28H,29H,30H,31HDB 32H,33H,34H,35H,36H,37H,38H,39HDB 40H,41H,42H,43H,44H,45H,46H,47HDB 48H,49H,50H,51H,52H,53H,54H,55HDB 56H,57H,58H,59H,60H,61H,62H,63HDB 64H,65H,66H,67H,68H,69H,70H;//*****************************************//函数TEMPER_COV中的Bug所在:四舍五入进行得太早!当读入的温度是31.5度时,TEMPER_L中的数值为11111XXXTEMPER_H中的数值为00000001,按你的程序,在四舍五入完成时(INC TEMPER_NUM),TEMPER_NUM中为00010000,在后面和TEMPER_H中数据相或时,这个进位的1就给忽略了,造成转换结果是16度。

数字温度传感器DS18B20(含程序)

数字温度传感器DS18B20(含程序)

数字温度传感器DS18B20摘要DS-18B20 数字温度传感器具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。

应用范围广泛,适用于冷冻库,粮仓,储罐,电讯机房,电力机房,电缆线槽等测温和控制领域,轴瓦,缸体,纺机,空调,等狭小空间工业设备测温和控制和汽车空调、冰箱、冷柜、以及中低温干燥箱等。

一、引脚图DS18B20引脚定义:(1)DQ为数字信号输入/输出端;(2)GND为电源地;(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)二、DS18B20的主要特性1.1、电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电1.2、DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯1.3、多个DS18B20可以并联在唯一的三线上,实现组网多点测温1.4、DS18B20在使用中不需要任何外围元件1.5、温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃1.6、可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温1.7、在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快1.8、测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力1.9、负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。

三、DS18B20的外形和内部结构DS18B20内部结构主要由四部分组成:64位光刻ROM 、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。

DS18B20内部结构图四、DS18B20工作原理DS18B20的温度转换时的延时时间由2s 减为750ms。

DS18B20测温原理如图3所示。

NRF24l01无线温度传感 收发程序

NRF24l01无线温度传感 收发程序
void init_NRF24L01(void)
{
inerDelay_us(100);
CE=0; // chip enable
CSN=1; // Spi disable
SCK=0; // Spi clock line init high
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址
_nop_();
}
//****************************************************************************************
/*NRF24L01初始化
//***************************************************************************************/
uchar seg1[10]={0x40,0x4F,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
uchar data temp_data[2]={0x00,0x00}; //温度采集数据缓冲区
uchar dispaly[7]; //显示缓冲区
//***********************************数码管0-9编码***********************************************
uchar seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0~~9段码

数字温度传感器DS18B20报告

数字温度传感器DS18B20报告

DS18B20报告一、DS18B20介绍DS18B20为单总线全双工通信的数字是温度传感器,其温度可以直接转换为9、10、11或12位,具体的位数由使用者通过程序写入指令改变,芯片默认的位数为12位。

芯片的形状如图。

芯片在电路的连接如图:二、读写时序1、复位时序(1)、单片机拉低总线480us~950us,然后释放总线(拉高电平)(2)、这时DS18B20会拉低信号,大约60~240us表示应答(3)、DS18B20拉低电平的60~240us之间,单片机读取总线的电平,如果是低电平,表示复位成功,否则不成功(此时一般要重负操作,直到成功为止,编程是要进行判断)(4)、DS18B20拉低电平60~240us之后,会释放总线。

2.写数据操作(1)、单片机拉低电平大约10~15us.(2)、加入要写入的时高电平,要将电平拉高,否则拉低电平。

此时要维持20~45us的时间(3)、释放总线写‘1’操作时序写‘0’操作时序3、读操作时序(1)、单片机拉低电平大约1us(2)、单片机释放总线,然后读取总线电平(3)、这时候DS18B20如果相应位是’1’会拉高电平,反之会拉低电平(4)、读取电平过后延迟大约40~45us读‘1’操作时序读‘0’操作时序三、温度读取函数步骤DS18B20开始转换:1.DS18B20复位2.写入跳过ROM的字节命令,0XCC.3.写入开始转换的功能命令,0X44.4.延迟大约750~900毫秒DS18B20读暂存数据1.DS18B20复位。

2.写入跳过ROM的字节命令,0XCC.3.写入读暂存功能命令,0XBE.4.读入第0个字节LS Byte,转换结果的低八位。

5.读入第1个字节MS Byte,转换结果的高八位。

6.DS18B20复位,表示读取暂存结束。

程序流程图:。

基于nRF24L01的无线温度检测系统设计

基于nRF24L01的无线温度检测系统设计

摘要温度检测在日常生活、工作和工程实践中具有重要的应用。

随着生活水平的提高和科学技术的进步,无论是工业还是农业或者是日常生活中对温度检测的要求越来越高。

不仅要做到低耗,还要求进行一定距离的传输。

基于这点我们运用两片主控芯片,一个温度传感器,及数码管显示部分,解决了这个日常生活工作中的问题。

出于低功耗本设计我们选择了以低功耗见长的430单片机中的F149系列作为主控芯片,工作场所的温度采集用到了温度采集芯片DS18B20来达到一定的准确度和精确度,最后采用nRF24L01模块对采集到的温度数据进行无线传输,从而打破传统温度操作受到距离限制的缺陷。

在经过软硬件测试后,我们基本实现了用温度传感器采集温度,用nRF24L01进行一定距离传输后在接受端的数码管上显示出来的模型。

传输距离>30m,温度范围达到0至125摄氏度,精度1摄氏度。

关键词: msp430f149;nRF24L01;温度;无线传输ABSTRACTTemperature measurement have important applications in daily life,work and engineering practice.With the improvement of living standards and technological progress,whether industry,agriculture or daily life become increasingly demanding of temperature detection. Not only to achieve low power consumption,but also requires a certain distance transmission. For this reason we solved the problem of daily life and work using two control chips, a temperature sensor, and the led display part. For low-power design we have chosen the low-power microcontroller known for the F149 series of 430 as the master chip, temperature acquisition DS18B20 has used to achieve a certain accuracy and precision, Finally nRF24L01 module temperature data collected by wireless transmission, thus breaking the distance limitations of traditional temperature operation. After software and hardware testing, we basically realize our Initial target. Transmission distance>30m, temperature range 0 to 125 degrees, 1 degree accuracy.Keywords: msp430f149;nRF24L01;Temperature;Wireless目录第1章绪论 (1)1.1课题的简介 (1)1.2对设计任务的分析 ........................................................ 错误!未定义书签。

设计无线超温报警器教学反思与总结

设计无线超温报警器教学反思与总结

设计无线超温报警器教学反思与总结设计无线超温报警器教学一、前言随着科技的不断发展,人们对于生活品质的要求也越来越高。

在家庭生活中,电器的使用已经成为了必不可少的一部分。

但是,电器在使用过程中也会出现一些问题,比如说过热等情况。

因此,设计一个无线超温报警器就显得尤为重要。

二、材料准备1. Arduino UNO开发板2. 无线模块NRF24L013. 温度传感器DS18B204. 蜂鸣器5. LED灯6. 面包板和杜邦线等。

三、硬件连接1. 连接温度传感器DS18B20将DS18B20的GND引脚连接至Arduino开发板上的GND引脚,将VCC引脚连接至5V引脚,将数据引脚连接至数字接口2号引脚。

2. 连接LED将LED长针连接至数字接口13号引脚,短针连接至GND引脚。

3. 连接蜂鸣器将正极连接至数字接口8号引脚,负极连接至GND引脚。

4. 连接NRF24L01无线模块将NRF24L01的VCC引脚连接至5V引脚,GND引脚连接至GND 引脚,CE引脚连接至数字接口9号引脚,CSN引脚连接至数字接口10号引脚,MOSI、MISO、SCK分别连接至数字接口11、12、13号引脚。

四、软件编写1. 安装OneWire库在Arduino IDE中选择“工具”-“管理库”,搜索OneWire并进行安装。

2. 编写程序首先,需要定义温度传感器的地址:#include <OneWire.h>#include <DallasTemperature.h>#define ONE_WIRE_BUS 2OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire);DeviceAddress sensor1 = {0x28, 0xFF, 0x7F, 0x4C, 0x90, 0x16, 0x04, 0xD3};然后,在setup函数中初始化各个组件:void setup() {Serial.begin(9600);sensors.begin();pinMode(8, OUTPUT);pinMode(13, OUTPUT);}在loop函数中,读取温度值,并判断是否超过设定值:void loop() {sensors.requestTemperatures();float temperature = sensors.getTempC(sensor1);if (temperature > 30) {digitalWrite(8, HIGH);digitalWrite(13, HIGH);delay(500);digitalWrite(8, LOW);digitalWrite(13, LOW);delay(500);}Serial.print("Temperature: ");Serial.println(temperature);delay(1000);}最后,将数据通过无线模块发送至接收端:#include <SPI.h>#include <nRF24L01.h>#include <RF24.h>RF24 radio(9, 10);const uint64_t pipe = 0xE8E8F0F0E1LL;void setup() {radio.begin();radio.openWritingPipe(pipe);}void loop() {float temperature = 28.5;radio.write(&temperature, sizeof(float)); delay(1000);}五、总结与反思通过这次设计无线超温报警器的教学,我们掌握了Arduino的基本使用方法,了解了温度传感器和无线模块的使用方法,并且学会了如何将它们组合在一起实现报警功能。

DS2431 DS18B20读写程序 (2)

DS2431 DS18B20读写程序 (2)

D S2431D S18B20o n e w i r e读写程序最近公司有一个产品用到了DS2431,我就将先前一个DS18B20的程序中加入了DS2431的按规定函数。

先传给大家分享.大家可以使用,转载时请说明出处.此程序不够完善,希望能支持多节点设备连接。

单总线适用于单主机系统,能够控制一个或多个从机设备。

主机可以是微控制器,从机可以是单总线器件,它们之间的数据交换只通过一条信号线。

当只有一个从机设备时,系统可按单节点系统操作;当有多个从机设备时,系统则按多节点系统操作。

以下是程序:#include "system.h"#include "onewire.h"unsignedchara_DS2431[8];//codebylyxandRyanHsiung#defineDS_DQ_INPORTAbits.RA4#defineDS_DQ_TA4#defineDS_DQ_TRISDTRISAbits.TRISA4voiddelay_us(unsignedchartime){//delayms=1usof20Mhzosc//不准确1uswhile(time--);}/*********************************************CRC校验*********************************************/unsignedcharcrccheck(unsignedchar*p,unsignedcharlen){unsignedcharbit0,cbit,r,temp,i,j,byte;temp=0;for(j=0;j<len;j++){byte=p[j];for(i=0;i<8;i++){cbit=temp&0x01;bit0=byte&0x01;temp=temp>>1;r=cbit^bit0;if(r==1)temp=temp^0x8c;byte=byte>>1;}}returntemp;}/*********************************************检查DS1820是否存在:如果DS1820不存在返回1,否则返回0*********************************************/ unsignedcharOneWire_ack(void){unsignedcharack;DS_DQ_TRISD=0;//输出DS_DQ_OUT=0;//输出LOW//delay_us(500);delay_us(250);delay_us(250);delay_us(100);DS_DQ_OUT=1;//输出HIGHDS_DQ_TRISD=1;//RE2输入delay_us(40);//delay_us(45);if(DS_DQ_IN==1)ack=1;//elseack=0;////delay_us(500);delay_us(250);delay_us(250);delay_us(100);returnack;}/********************************************* 从DS1820读1字节数据*********************************************/ unsignedcharOneWire_read(void){unsignedchari,byte,temp;byte=0x00;for(i=0;i<8;i++){DS_DQ_TRISD=0;//RE2输出DS_DQ_OUT=0;//输出LOWdelay_us(1);//delay_us(3);DS_DQ_OUT=1;//输出HIGHDS_DQ_TRISD=1;//RE2输入delay_us(5);//delay_us(10);if(DS_DQ_IN)byte|=0x80;//读入if(i<7)byte=byte>>1;delay_us(120);//delay_us(100);DS_DQ_TRISD=0;//RE2输出delay_us(2);//delay_us(5);returnbyte;}/********************************************* 写ROM或存贮器命令到DS1820*********************************************/ voidOneWire_write(unsignedcharcmd){unsignedchari,j;DS_DQ_TRISD=0;//RE2输出for(j=0;j<=7;j++){i=cmd&0x01;if(i==0x01){DS_DQ_OUT=0;//输出LOWdelay_us(5);DS_DQ_OUT=1;//输出HIGHdelay_us(120);}else{DS_DQ_OUT=0;//输出LOWdelay_us(120);DS_DQ_OUT=1;//输出HIGHdelay_us(5);}cmd=cmd>>1;}}/********************************************* 匹配DS1820*********************************************/ voidOneWire_match(unsignedchar*p){unsignedchari;doi=OneWire_ack();while(i==0x01);OneWire_write(0x55);for(i=0;i<8;i++)OneWire_write(p[i]);}uint8DS2431_WriteOneByte(uint16address,uint8*p_data)uint8tem8h,tem8l,i,data,errors,temp8;tem8h=(unsignedchar)(address>>=4);tem8l=(unsignedchar)address;if(OneWire_ack())return;OneWire_write(0xcc); //跳过ROM匹配OneWire_write(0x0f); //发送写暂存器命令OneWire_write(tem8l); //发送地址低位OneWire_write(tem8h); //发送地址高位for(i=0;i<8;i++){data=*p_data;p_data++;OneWire_write(data);// ClrWDT();}delay_us(25);if(OneWire_ack())return;OneWire_write(0xcc); //跳过ROM匹配OneWire_write(0xAA);//复制暂存器数据到存储器中temp8=OneWire_read();temp8<<=8;temp8+=OneWire_read();errors=OneWire_read();if(errors!=0x07)return0;if(OneWire_ack())return;OneWire_write(0xcc); //跳过ROM匹配OneWire_write(0x55); //发出启动转换命令OneWire_write(tem8l); //发送地址低位OneWire_write(tem8h); //发送地址高位OneWire_write(errors);for(i=0;i<50;i++)delay_us(100);//等待写时序结束510usif(OneWire_read()!=0xAA)return0;return1;/*unsignedchari=1;if(OneWire_ack())return;OneWire_write(0xcc);//跳过ROM匹配OneWire_write(0x0f);//writescrachpadOneWire_write(0x20);//ta1OneWire_write(0x00);//ta2OneWire_write(data);//dataa_DS2431[0]=OneWire_read();a_DS2431[1]=OneWire_read();crccheck(a_DS2431,2);*/}uint8DS2431_WriteString(uint16address,uint8*p_data){uint8tem8h,tem8l,i,data,errors,temp8;tem8h=(unsignedchar)(address>>=4);tem8l=(unsignedchar)address;if(OneWire_ack())return;OneWire_write(0xcc); //跳过ROM匹配OneWire_write(0x0f); //发送写暂存器命令OneWire_write(tem8l); //发送地址低位OneWire_write(tem8h); //发送地址高位for(i=0;i<8;i++){data=*p_data;p_data++;OneWire_write(data);}delay_us(25);if(OneWire_ack())return;OneWire_write(0xcc); //跳过ROM匹配OneWire_write(0xAA);//复制暂存器数据到存储器中temp8=OneWire_read();temp8<<=8;temp8+=OneWire_read();errors=OneWire_read();if(errors!=0x07)return0;if(OneWire_ack())return;OneWire_write(0xcc); //跳过ROM匹配OneWire_write(0x55); //发出启动转换命令OneWire_write(tem8l); //发送地址低位OneWire_write(tem8h); //发送地址高位OneWire_write(errors);for(i=0;i<50;i++)delay_us(100);//等待写时序结束510usif(OneWire_read()!=0xAA)return0;return1;/*unsignedchari=1;if(OneWire_ack())return;OneWire_write(0xcc);//跳过ROM匹配OneWire_write(0x0f);//writescrachpadOneWire_write(0x20);//ta1OneWire_write(0x00);//ta2OneWire_write(data);//dataa_DS2431[0]=OneWire_read();a_DS2431[1]=OneWire_read();crccheck(a_DS2431,2);*/}uint8DS2431_ReadOneByte(uint16address){if(OneWire_ack())return;OneWire_write(0xcc);//跳过ROM匹配OneWire_write(0xf0);//发出读存储器命令OneWire_write(LS_BYTE(address));//地址低8位OneWire_write(HS_BYTE(address));//地址高8位a_DS2431[0]=OneWire_read();//readdatareturna_DS2431[0];/*unsignedchari=1;if(OneWire_ack())return;OneWire_write(0xcc);//跳过ROM匹配OneWire_write(0xaa);//a_DS2431[0]=OneWire_read();//readta1a_DS2431[1]=OneWire_read();//readta2a_DS2431[2]=OneWire_read();//readesa_DS2431[3]=OneWire_read();//readdataa_DS2431[4]=OneWire_read();//crca_DS2431[5]=OneWire_read();//CRCcrccheck(&a_DS2431[4],2);*/}uint8*DS2431_ReadString(uint16address){uint8i;if(OneWire_ack())return;OneWire_write(0xcc);//跳过ROM匹配OneWire_write(0xf0);//发出读存储器命令OneWire_write(LS_BYTE(address));//地址低8位OneWire_write(HS_BYTE(address));//地址高8位for(i=8;i>0;i--){a_DS2431[8-i]=OneWire_read();// ClrWDT();}returna_DS2431;}voidStart_convert_ds18b20(void){unsignedchari=1;if(OneWire_ack())return;OneWire_write(0xcc);//跳过ROM匹配OneWire_write(0x44);//启动DS1820转换}unsignedintRead_convert_ds18b20(unsignedcharflag_language){unsignedchari;unsignedcharOneWire[9];//存放从DS18B20读取的9字节数据unsignedintOneWire_temp;unsignedcharflag_temp=0;if(OneWire_ack())return0x5fff;OneWire_write(0xcc);//跳过ROM匹配OneWire_write(0xbe);//读转换后温度值for(i=0;i<9;i++){OneWire[i]=OneWire_read();}OneWire_temp=OneWire[1];OneWire_temp=OneWire_temp<<8;OneWire_temp+=OneWire[0];if((OneWire_temp&0xf800)!=0)//判断是否小于0度{OneWire_temp=~OneWire_temp;OneWire_temp++;flag_temp=1;}OneWire_temp+=8;//四舍五入8*0.0625=0.52k90717OneWire_temp>>=4;if(OneWire_temp>0)OneWire_temp--;if(flag_language!=0){OneWire_temp=OneWire_temp*9/5;if(flag_temp==1){if(OneWire_temp>=32)OneWire_temp=OneWire_temp-32;else{OneWire_temp=32-OneWire_temp;flag_temp=0;}}elseOneWire_temp=OneWire_temp+32;}OneWire_temp&=0x00ff;if(flag_temp==1)OneWire_temp|=0xff00;return(OneWire_temp);}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于nRF24L01的无线温度(DS18B20)采集系统设计
1 引言
温度采集系统所采集的温度通常通过RS485、CAN总线通信方式传输至上位机,但这种方式维护较困难,不利于工业现场生产;而无线通信GPRS技术传输距离长,通信可靠稳定,但设计复杂、成本昂贵。

这里采用工业级内置硬件链路层协议的低成本单芯片nRF24L01型无线收发器件实现系统间的无线通信,完成无线信号的接收、显示及报警功能。

2 nRF24L01简介
nRF24L01是一款工业级内置硬件链路层协议的低成本无线收发器。

该器件工作于2.4 GHz全球开放ISM频段,内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合增强型ShockBurst技术,其输出功率和通信频道可通过程序配置。

拥有ShockBurst 和Enhanced ShockBurst两种数据传输模式。

可直接与单片机I/O连接,外接元件数目少。

nRF24L01功耗低,以-6 dBm的功率发射时,工作电流仅9 mA;接收时,工作电流仅12.3 mA,多种低功率工作模式(掉电和空闲模式)更利于节能设计。

3 系统硬件设计
系统硬件设计主要由采集发送和接收显示两部分组成。

图1为采集发送电路原理图,该电路主要由温度传感器DS18B20、单片机STC12LE5408和nRF24L01组成。

STC12LE5408是增强型8051单片机,速度快,集成度高,电压范围宽(2.2~3.8 V),和MCS-51系列单片机指令系统完全兼容。

其内部还有8 KB Flash程序存储器,512字节RAM、2 KB EEPROM、4路PWM以及硬件看门狗(WDT)等资源.性价比高。

DSl8B20是DALLAS公司生产的单总线数字1-Wire温度传感器,可把温度信号直接转换成串行数字信号供单片机处理,采用1-Wire接口。

DSl8B20的数据端DQ可通过4.7 kΩ的上拉电阻接STC12LE5408。

nRF24L01的CE,CSN,SCK,MOSI,MISO,IRQ引脚则可接STC12LE5408的任意端口,但需在编程时注意,这里接至P1端口。

由于nRF24L01具有接收数据功能,所以接收显示电路由
单片机STC12LE5408、nRF24L01和显示电路组成。

所采集的数据也通过串口发送至PC机进行处理。

4 系统软件设计
4.1 nRF24L01的软件设置
由于STC12LE5408无标准的SPI总线接口,需采用软件模拟实现SPI总线。

因此应严格按照SPI的时序要求编写,否则导致对nRF24L01的操作失败。

nRF24L01的各种命令字都只有一个字节,分为读寄存器、写寄存器、读数据接收缓冲区、写发送数据缓冲区等。

在输入任意命令字的同时,MISO输出STATUS寄存器的内容。

对RF24L01的读写程序代码如下:
nRF24L01的ShockBurst和Enhanced ShockBurst两种数据模式的区别是:后者比前者多一个确认数据传输的信号,保证数据传输的可靠性。

按Enhanced ShockBurst模式初始化,重新发送等待时间为250μs,重新发送次数为10次,地址是RX_ADR_WIDTH,输出功率为0 dBm,速度为1 Mb/s。

nRF24L01处于POWER_UP状态。

函数中WRITE_REG为写命令基地址0x20。

其相关程序如下:
在接收端将nRF24L01配置为接收模式,地址是RX_AW,负载数据宽度是TX_PL_W,使能接收完数据中断,CRC校验位为2字节,nRF24L01处于POWER_UP状态,其相关程序代码如下:
4.2 数据采集发送子程序
数据采集发送部分上电后首先配置nRF24L01的相关寄存器.使其工作在发射状态,然后复位DSl8B20,向DSl8B20发送温度转换命令,读取已转换的温度值,然后由nRF24L01发送.其流程如图2所示。

这里需注意DS18B20是单总线器件.其硬件接口比较简单,这是以相对复杂的软件编程为代价的。

DS18B20与单片机的接口协议也是通过严格的时序来实现的。

虽然增加软件开销,但由于STC12LE5408运行速度快,可以满足系统要求。

另外,对DS18B20操作的程序必须按照初始化,ROM操作命令,存储器操作命令,执行/数据的先后顺序进行。

如果总线上只挂1个DS18B20,初始化后可执行跳过ROM命令,再发送温度转换命令。

温度转换完成后,将温度值暂存在发送缓冲区tx_buf中,然后通过nRF24L01发送,其相关程序代码如下:
4.3 数据接收显示子程序
nRF24L01在数据接收显示中为接收状态。

当nRF24L01模块配置为接收模式后,当接收到数据中断时,从接收FIFO读取数据。

然后将其存储到接收缓冲区rX_bur中。

其相关程序代码如下:
5 结束语
本文介绍了nRF24L01和STC12LE5408组成的无线温度采集系统。

采用高度集成的nRF24L01器件。

大大简化了系统硬件和软件设计,减小了体积,提高了系统工作的可靠性。

采用新一代增强型8051单片机STC12LE5408降低了系统成本,缩短了开发时间。

实践证明该系统设计简单,成本低廉,通信可靠,运行稳定,性能可靠,具有较高的实用价值。

相关文档
最新文档