51单片机 - DS18B20实验1-读取温度

ops/2024/9/25 20:13:19/

上来一张图,明确思路,程序整体裤架如下,通过单总线,单独封装一个.c文件用于单总线的操作,其实,我们可以把点c文件看成一个类操作,其属性就是我们面向对象的函数,也叫方法,操作起来方便,通过DS18B20调用封装好的单总线,实现温度的读取(用LCD1602显示出读取的温度  ),总后通过主函数调用这些模块,这就是模块化的编程,两个模块,主函数直接调用,也方便移植。

作者:Whappy

时间:2024.9.14

DS18B20实验-温度测试

第一步:模块化单总线 :OneWire.c

一共五个函数

看时序写代码

unsigned char OneWire_Init(void)
{unsigned char AckBit;OneWire_DQ = 1; //保证拉低之前是高电平OneWire_DQ = 0; //拉低Delay1ms();//延时1ms ,至少480usOneWire_DQ = 1;  //释放Delay70us();AckBit = OneWire_DQ; //应答位:存在的从机会拉低总线60~240us以响应主机Delay1ms();//延时1ms ,至少480usreturn AckBit;}

void OneWire_SendBit(unsigned char Bit)
{OneWire_DQ = 0; //拉低Delay10us();OneWire_DQ = Bit; //10us 将数据放到总线上Delay50us();OneWire_DQ = 1;  //释放
}

//接收一位:即主机51读取一位:主机将总线拉低1~15us,然后释放总线,并在拉低后15us内读取总线电平(尽量贴近15us的末尾),
//读取为低电平则为接收0,读取为高电平则为接收1 ,整个时间片应大于60us
unsigned char OneWire_ReadBit(void)
{unsigned char Bit;OneWire_DQ = 0; //拉低Delay5us();OneWire_DQ = 1;  //释放Delay5us();Bit = OneWire_DQ;  //数据放到总线上,主机读Delay50us();return Bit;}

//发送一个字节:连续调用8次发送一位的时序,依次发送一个字节的8位(低位在前)
void OneWire_SendByte(unsigned char Byte)
{unsigned char i;for(i=0; i<8; i++){OneWire_SendBit(Byte & (0X01 << i));}
}//接收一个字节:连续调用8次接收一位的时序,依次接收一个字节的8位(低位在前)unsigned char OneWire_ReceiveByte(void)
{unsigned char i, Byte = 0X00;for(i=0; i<8; i++){if(OneWire_ReadBit()){Byte |= (0x01);}}return Byte;
}

第二步:模块化 DS18B20.c:DS18B20.c  :两个函数


//温度转换函数 :初始化→跳过ROM →开始温度变换void DS18B20_ConvertTemperature(void)
{OneWire_Init();OneWire_SendByte(SKIP_ROM); //跳过ROM,写入一个字节数据,说我要读取温度OneWire_SendByte(CONVERT_T); //发送一个字节,让DS18B20开始温度转化}//温度读取:初始化→跳过ROM →读暂存器→连续的读操作
float DS18B20_ReadTemperature(void)
{unsigned char TLSB, TMSB;int Temp;float T;OneWire_Init();//初始化OneWire_SendByte(READ_SCRATCHPAD); //跳过ROM,写入一个字节数据,说我要读取温度TLSB = OneWire_ReceiveByte();TMSB = OneWire_ReceiveByte();Temp = (TMSB<<8)| TLSB;T = Temp/16.0;return T;}

第三步:主函数调用 :main.c

#include <REGX52.H>
#include "LCD1602.h"
#include "DS18B20.h"
#include "Delay.h"float T;void main(void)
{DS18B20_ConvertTemperature();	//上电先转换一次温度,防止第一次读数据错误Delay_Any(1000);			//等待转换完成//初始化LCD_Init();LCD_ShowString(1,1,"Temperature:");while(1){	DS18B20_ConvertTemperature();T = DS18B20_ReadTemperature();if(T < 0){LCD_ShowChar(2,1,'-');T = -T;}elseLCD_ShowChar(2,1,'+');LCD_ShowNum(2,2,T,3);LCD_ShowChar(2,5,'.');LCD_ShowNum(2,6,(unsigned long)(T*10000)%10000,4);}
}//#include <REGX52.H>
//#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);//显示温度小数部分
//	}
//}

总代码:

OneWire.c

#include <REGX52.H>
#include "Delay.h"sbit OneWire_DQ = P3^7; //单总线的管脚定义//编写5个函数 初始化、写一位、读一位、写一个字节、读一个字节//初始化:主机将总线拉低至少480us,然后释放总线,等待15~60us后,存在的从机会拉低总线60~240us以响应主机,之后从机将释放总线unsigned char OneWire_Init(void)
{unsigned char AckBit;OneWire_DQ = 1; //保证拉低之前是高电平OneWire_DQ = 0; //拉低Delay1ms();//延时1ms ,至少480usOneWire_DQ = 1;  //释放Delay70us();AckBit = OneWire_DQ; //应答位:存在的从机会拉低总线60~240us以响应主机Delay1ms();//延时1ms ,至少480usreturn AckBit;}//写一位数据,即主机51发送一位:主机将总线拉低60~120us,然后释放总线,表示发送0;主机将总线拉低1~15us,
//然后释放总线,表示发送1。从机将在总线拉低30us后(典型值)读取电平,整个时间片应大于60usvoid OneWire_SendBit(unsigned char Bit)
{OneWire_DQ = 0; //拉低Delay10us();OneWire_DQ = Bit; //10us 将数据放到总线上,主机写,Delay50us();OneWire_DQ = 1;  //释放
}//接收一位:即主机51读取一位:主机将总线拉低1~15us,然后释放总线,并在拉低后15us内读取总线电平(尽量贴近15us的末尾),
//读取为低电平则为接收0,读取为高电平则为接收1 ,整个时间片应大于60us
unsigned char OneWire_ReadBit(void)
{unsigned char Bit;OneWire_DQ = 0; //拉低Delay5us();OneWire_DQ = 1;  //释放Delay5us();Bit = OneWire_DQ;  //数据放到总线上,主机读Delay50us();return Bit;}//发送一个字节:连续调用8次发送一位的时序,依次发送一个字节的8位(低位在前)
void OneWire_SendByte(unsigned char Byte)
{unsigned char i;for(i=0; i<8; i++){OneWire_SendBit(Byte & (0X01 << i));}
}//接收一个字节:连续调用8次接收一位的时序,依次接收一个字节的8位(低位在前)unsigned char OneWire_ReceiveByte(void)
{unsigned char i, Byte = 0X00;for(i=0; i<8; i++){if(OneWire_ReadBit()){Byte |= (0x01);}}return Byte;
}

DS18B20.c

#include <REGX52.H>
#include "OneWire.h"//DS18B20 程序使用的寄存器进行红宏定义
#define SKIP_ROM			0XCC	//ROM指令 跳过ROM ,相当于直接访问DS18B20
#define CONVERT_T			0X44   //功能指令 温度转换
#define READ_SCRATCHPAD		0XBE  //功能指令  暂存器//温度转换函数 :初始化→跳过ROM →开始温度变换void DS18B20_ConvertTemperature(void)
{OneWire_Init();OneWire_SendByte(SKIP_ROM); //跳过ROM,写入一个字节数据,说我要读取温度OneWire_SendByte(CONVERT_T); //发送一个字节,让DS18B20开始温度转化}//温度读取:初始化→跳过ROM →读暂存器→连续的读操作
float DS18B20_ReadTemperature(void)
{unsigned char TLSB, TMSB;int Temp;float T;OneWire_Init();//初始化OneWire_SendByte(SKIP_ROM);OneWire_SendByte(READ_SCRATCHPAD); //跳过ROM,写入一个字节数据,说我要读取温度TLSB = OneWire_ReceiveByte();TMSB = OneWire_ReceiveByte();Temp = (TMSB<<8) | TLSB;T = Temp/16.0;return T;}

Delay.c

#include <REGX52.H>
#include "intrins.h"void Delay1ms()		//@11.0592MHz
{unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);
}void Delay70us()		//@11.0592MHz
{unsigned char i;_nop_();i = 29;while (--i);
}void Delay_Any(unsigned int xms)		//@11.0592MHz
{unsigned char i, j;while(xms--){_nop_();i = 2;j = 199;do{while (--j);} while (--i);}
}void Delay10us()		//@11.0592MHz
{unsigned char i;i = 2;while (--i);
}void Delay50us()		//@11.0592MHz
{unsigned char i;_nop_();i = 20;while (--i);
}void Delay5us()		//@11.0592MHz
{
}

其余代码可参考(主页单片机>51单片机内容)


http://www.ppmy.cn/ops/115931.html

相关文章

电线杆上电气组件检测系统源码分享

电线杆上电气组件检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…

使用 Internet 共享 (ICS) 方式分配ip

设备A使用dhcp的情况下&#xff0c;通过设备B分配ip并共享网络的方法。 启用网络共享&#xff08;ICS&#xff09;并配置 NAT Windows 自带的 Internet Connection Sharing (ICS) 功能可以简化 NAT 设置&#xff0c;允许共享一个网络连接给其他设备。 打开网络设置&#xff1…

在虚幻引擎中创建毛发/头发

在虚幻引擎中创建毛发/头发 , 首先开启两个插件 Groom 和 Alembic Groom Importer 打开蒙皮缓存 导出人物模型 将人物导入Blender , 选择需要种植头发的点 指定并选择 点击毛发 这里变成爆炸头了 , 把数量和长度调一下 切换到梳子模式 调整发型 导出为abc , 文件路径不…

学习国语的时候需要用到什么翻译工具?《维汉翻译通》app现在已经支持国语拼音和维汉词典查单词功能

《维汉翻译通》App是一款免费的翻译工具&#xff0c;专为维吾尔语与中文之间的沟通设计。它不仅是一款翻译应用&#xff0c;也是新疆人学习中文的得力助手。 功能亮点 免费翻译服务&#xff1a;提供快速准确的短文本翻译&#xff0c;无论是日常用语还是专业术语。智能OCR技术&…

18 基于51单片机的心率体温监测报警系统(包括程序、仿真、原理图、流程图)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机 ds18B20读取温度&#xff0c; 设置初始心率65 设置温度阈值38 心率阈值60 100 如果超过阈值&#xff0c;蜂鸣器报警&#xff0c;led灯亮 二、硬件资源 基于KEIL5编写C代码&#xf…

Spring Boot 动态数据源的配置和使用——附实例教程

文章目录 1. 添加依赖2. 配置数据源3. 创建 DynamicDataSource 类4. 创建 DynamicDataSourceContextHolder5. 配置数据源切换 AOP6. 自定义注解 DataSource7. 使用示例8. 配置文件 application.yml9. 总结 在 Spring Boot 中&#xff0c;动态数据源的配置和使用可以通过 Abstra…

只需10分钟即可被绕过,Chrome浏览器最新cookie安全功能纸糊的一样?

最近&#xff0c;Infostealer恶意软件开发者发布更新&#xff0c;声称可以绕过谷歌Chrome浏览器最近推出的保护cookie等敏感数据的App-Bound Encryption功能。 App-Bound Encryption 是在 Chrome 浏览器 127 中引入的&#xff0c;旨在使用一个以系统权限运行的 Windows 服务对…

数据结构---二叉搜索树(二叉排序树)

什么是二叉排序树 二叉搜索树又是二叉排序树&#xff0c;当我们的是一颗空树或者具有以下性质时&#xff1a; 左子树不为空&#xff0c;左子树上的值都小于我们的根节点上的值。右子树不为空时&#xff0c;右子树上的值都大于我们的根节点上的值左右子树都是二叉搜索树&#…