❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋。 专栏目标:实现从零基础入门51单片机和STM32单片机,力求在玩好单片机的同时,能够了解一些计算机的基本概念,了解电路及其元器件的基本理论等。

⭐️ 专栏主要内容: 主要学习51单片机的功能、各个模块、单片机的外设、驱动等,最终玩好单片机和单片机的外设,全程手敲代码,实现我们所要实现的功能。  专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。 专栏主页:http://t.csdn.cn/HCD8v

本学习过程参考:https://space.bilibili.com/383400717

单片机安装软件、各种资料以及源码的路径: https://pan.baidu.com/s/1vDTN2o8ffvczzNQGfyjHng 提取码:gdzf

本节主要介绍学习DS18B20温度传感器的相关知识,包括DS18B20温度传感器基础知识介绍、本节目标等;并利用两个小实验来写程序进行练习,分别是DS18B20温度读取以及DS18B20温度报警器,最后附上相关代码。

文章目录

一、DS18B20温度传感器和本节目标1.1 DS18B20温度传感器基础知识1.2 本节目标

二、DS18B20温度读取二、DS18B20温度报警器

一、DS18B20温度传感器和本节目标

1.1 DS18B20温度传感器基础知识

DS18B02温度传感器在开发板上的位置如下图所示:

DS18B02介绍

引脚及应用电路

内部结构框图

存储结构

单总线电路规范

单总线时序结构

1.2 本节目标

目标1:DS18B20温度读取

实时读取并显示当前温度

目标2:DS18B20温度报警器

显示实时温度、温度上限和温度下限,不在上限和下限范围内则进行报警。

使用按键K1和K2可以对上限下限进行调节。

温度不在上下限范围内时,如果超过上限,显示OV:H;低于下限时,显示OV:L;如下图:

且设置的温度上限和下限值是可以存在AT24C02的;保证了掉电不丢失;

二、DS18B20温度读取

代码路径:51单片机入门教程资料\课件及程序源码\程序源码\KeilProject\13-1 DS18B20温度读取 具体代码:

#include

#include "LCD1602.h"

#include "DS18B20.h"

#include "Delay.h"

float T;

void main()

{

DS18B20_ConvertT(); //上电先转换一次温度,防止第一次读数据错误

Delay(1000); //等待转换完成

LCD_Init();

LCD_ShowString(1,1,"Temperature:");

while(1)

{

DS18B20_ConvertT(); //转换温度

T=DS18B20_ReadT(); //读取温度

if(T<0) //如果温度小于0

{

LCD_ShowChar(2,1,'-'); //显示负号

T=-T; //将温度变为正数

}

else //如果温度大于等于0

{

LCD_ShowChar(2,1,'+'); //显示正号

}

LCD_ShowNum(2,2,T,3); //显示温度整数部分

LCD_ShowChar(2,5,'.'); //显示小数点

LCD_ShowNum(2,6,(unsigned long)(T*10000)%10000,4);//显示温度小数部分

}

}

DS18B20.c:

#include

#include "OneWire.h"

//DS18B20指令

#define DS18B20_SKIP_ROM 0xCC

#define DS18B20_CONVERT_T 0x44

#define DS18B20_READ_SCRATCHPAD 0xBE

/**

* @brief DS18B20开始温度变换

* @param 无

* @retval 无

*/

void DS18B20_ConvertT(void)

{

OneWire_Init();

OneWire_SendByte(DS18B20_SKIP_ROM);

OneWire_SendByte(DS18B20_CONVERT_T);

}

/**

* @brief DS18B20读取温度

* @param 无

* @retval 温度数值

*/

float DS18B20_ReadT(void)

{

unsigned char TLSB,TMSB;

int Temp;

float T;

OneWire_Init();

OneWire_SendByte(DS18B20_SKIP_ROM);

OneWire_SendByte(DS18B20_READ_SCRATCHPAD);

TLSB=OneWire_ReceiveByte();

TMSB=OneWire_ReceiveByte();

Temp=(TMSB<<8)|TLSB;

T=Temp/16.0;

return T;

}

OneWire.c:

#include

//引脚定义

sbit OneWire_DQ=P3^7;

/**

* @brief 单总线初始化

* @param 无

* @retval 从机响应位,0为响应,1为未响应

*/

unsigned char OneWire_Init(void)

{

unsigned char i;

unsigned char AckBit;

OneWire_DQ=1;

OneWire_DQ=0;

i = 247;while (--i); //Delay 500us

OneWire_DQ=1;

i = 32;while (--i); //Delay 70us

AckBit=OneWire_DQ;

i = 247;while (--i); //Delay 500us

return AckBit;

}

/**

* @brief 单总线发送一位

* @param Bit 要发送的位

* @retval 无

*/

void OneWire_SendBit(unsigned char Bit)

{

unsigned char i;

OneWire_DQ=0;

i = 4;while (--i); //Delay 10us

OneWire_DQ=Bit;

i = 24;while (--i); //Delay 50us

OneWire_DQ=1;

}

/**

* @brief 单总线接收一位

* @param 无

* @retval 读取的位

*/

unsigned char OneWire_ReceiveBit(void)

{

unsigned char i;

unsigned char Bit;

OneWire_DQ=0;

i = 2;while (--i); //Delay 5us

OneWire_DQ=1;

i = 2;while (--i); //Delay 5us

Bit=OneWire_DQ;

i = 24;while (--i); //Delay 50us

return Bit;

}

/**

* @brief 单总线发送一个字节

* @param Byte 要发送的字节

* @retval 无

*/

void OneWire_SendByte(unsigned char Byte)

{

unsigned char i;

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

{

OneWire_SendBit(Byte&(0x01<

}

}

/**

* @brief 单总线接收一个字节

* @param 无

* @retval 接收的一个字节

*/

unsigned char OneWire_ReceiveByte(void)

{

unsigned char i;

unsigned char Byte=0x00;

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

{

if(OneWire_ReceiveBit()){Byte|=(0x01<

}

return Byte;

}

二、DS18B20温度报警器

代码路径:51单片机入门教程资料\课件及程序源码\程序源码\KeilProject\13-2 DS18B20温度报警器 具体代码:

#include

#include "LCD1602.h"

#include "DS18B20.h"

#include "Delay.h"

#include "AT24C02.h"

#include "Key.h"

#include "Timer0.h"

float T,TShow;

char TLow,THigh;

unsigned char KeyNum;

void main()

{

DS18B20_ConvertT(); //上电先转换一次温度,防止第一次读数据错误

Delay(1000); //等待转换完成

THigh=AT24C02_ReadByte(0); //读取温度阈值数据

TLow=AT24C02_ReadByte(1);

if(THigh>125 || TLow<-55 || THigh<=TLow)

{

THigh=20; //如果阈值非法,则设为默认值

TLow=15;

}

LCD_Init();

LCD_ShowString(1,1,"T:");

LCD_ShowString(2,1,"TH:");

LCD_ShowString(2,9,"TL:");

LCD_ShowSignedNum(2,4,THigh,3);

LCD_ShowSignedNum(2,12,TLow,3);

Timer0_Init();

while(1)

{

KeyNum=Key();

/*温度读取及显示*/

DS18B20_ConvertT(); //转换温度

T=DS18B20_ReadT(); //读取温度

if(T<0) //如果温度小于0

{

LCD_ShowChar(1,3,'-'); //显示负号

TShow=-T; //将温度变为正数

}

else //如果温度大于等于0

{

LCD_ShowChar(1,3,'+'); //显示正号

TShow=T;

}

LCD_ShowNum(1,4,TShow,3); //显示温度整数部分

LCD_ShowChar(1,7,'.'); //显示小数点

LCD_ShowNum(1,8,(unsigned long)(TShow*100)%100,2);//显示温度小数部分

/*阈值判断及显示*/

if(KeyNum)

{

if(KeyNum==1) //K1按键,THigh自增

{

THigh++;

if(THigh>125){THigh=125;}

}

if(KeyNum==2) //K2按键,THigh自减

{

THigh--;

if(THigh<=TLow){THigh++;}

}

if(KeyNum==3) //K3按键,TLow自增

{

TLow++;

if(TLow>=THigh){TLow--;}

}

if(KeyNum==4) //K4按键,TLow自减

{

TLow--;

if(TLow<-55){TLow=-55;}

}

LCD_ShowSignedNum(2,4,THigh,3); //显示阈值数据

LCD_ShowSignedNum(2,12,TLow,3);

AT24C02_WriteByte(0,THigh); //写入到At24C02中保存

Delay(5);

AT24C02_WriteByte(1,TLow);

Delay(5);

}

if(T>THigh) //越界判断

{

LCD_ShowString(1,13,"OV:H");

}

else if(T

{

LCD_ShowString(1,13,"OV:L");

}

else

{

LCD_ShowString(1,13," ");

}

}

}

void Timer0_Routine() interrupt 1

{

static unsigned int T0Count;

TL0 = 0x18; //设置定时初值

TH0 = 0xFC; //设置定时初值

T0Count++;

if(T0Count>=20)

{

T0Count=0;

Key_Loop(); //每20ms调用一次按键驱动函数

}

}

好文阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: