proteus实现简易DS18B20温度计(stm32)

一、新建proteus工程

具体看前面文章

二、搭建电路

需要配置供电网络以及寻找元器件,细节看前面文章,下面给出电路图

电路包含了五个部分:

1、DS18B20:数据引脚记得上拉

2、stm32电路

3、串口电路(右下角那个器件):记得不用交叉连接,需要搭配虚拟串口才能使用

4、LCD显示屏

5、LED

三、主要程序编写

1、DS18B20.c

#include "ds18b20.h"
#include "stm32f10x.h"
#include "Delay.h"/*************************************************************************************** 描  述 : 配置DS18B20用到的I/O口* 入  参 : 无* 返回值 : 无**************************************************************************************/
void Delay_DS18B20(int num)
{while(num--) ;
}void Delay_DS18B20_1us(int num)
{while(num--) ;
}//复位DS18B20
void DS18B20_Rst(void)	   
{                 DS18B20_IO_OUT(); 	//SET PG11 OUTPUTDS18B20_DQ_OUT=0; 	//拉低DQDelay_DS18B20_1us(750);    	//拉低750usDS18B20_DQ_OUT=1; 	//DQ=1 
Delay_DS18B20_1us(15);    	//15US
}
//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
u8 DS18B20_Check(void) 	   
{   u8 retry=0;DS18B20_IO_IN();	//SET PG11 INPUT	 while (DS18B20_DQ_IN&&retry<200){retry++;Delay_DS18B20_1us(1);};	 if(retry>=200)return 1;else retry=0;while (!DS18B20_DQ_IN&&retry<240){retry++;Delay_DS18B20_1us(1);};if(retry>=240)return 1;	    return 0;
}
//从DS18B20读取一个位
//返回值:1/0
u8 DS18B20_Read_Bit(void) 	 
{u8 data;DS18B20_IO_OUT();	//SET PG11 OUTPUTDS18B20_DQ_OUT=0; Delay_DS18B20_1us(2);DS18B20_DQ_OUT=1; DS18B20_IO_IN();	//SET PG11 INPUTDelay_DS18B20_1us(12);if(DS18B20_DQ_IN)data=1;else data=0;	 Delay_DS18B20_1us(50);           return data;
}
//从DS18B20读取一个字节
//返回值:读到的数据
u8 DS18B20_Read_Byte(void)     
{        u8 i,j,dat;dat=0;for (i=1;i<=8;i++) {j=DS18B20_Read_Bit();dat=(j<<7)|(dat>>1);}						    return dat;
}
//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(u8 dat)     {             u8 j;u8 testb;DS18B20_IO_OUT();	//SET PG11 OUTPUT;for (j=1;j<=8;j++) {testb=dat&0x01;dat=dat>>1;if (testb) {DS18B20_DQ_OUT=0;	// Write 1Delay_DS18B20_1us(2);                            DS18B20_DQ_OUT=1;Delay_DS18B20_1us(60);            }else {DS18B20_DQ_OUT=0;	// Write 0Delay_DS18B20_1us(60);             DS18B20_DQ_OUT=1;Delay_DS18B20_1us(2);                          }}
}
//开始温度转换
void DS18B20_Start(void) 
{   						               DS18B20_Rst();	   DS18B20_Check();	 DS18B20_Write_Byte(0xcc);	// skip romDS18B20_Write_Byte(0x44);	// convert
} //初始化DS18B20的IO口 DQ 同时检测DS的存在   	 
void DS18B20_Init(void)
{uint8_t t=0;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef g;g.GPIO_Mode = GPIO_Mode_Out_PP;g.GPIO_Speed = GPIO_Speed_10MHz;g.GPIO_Pin = GPIO_Pin_8  ;GPIO_Init(GPIOB,&g);GPIO_SetBits(GPIOB,GPIO_Pin_8);    //输出1t=DS18B20_DQ_IN;while(t){DS18B20_IO_OUT(); 	//SET PG11 OUTPUTDS18B20_DQ_OUT=0; 	//拉低DQDelay_DS18B20(750);     	//拉低750usDS18B20_DQ_OUT=1; 	//DQ=1 Delay_DS18B20(15);     	//15USDS18B20_IO_IN();	//SET PG11 INPUT	 Delay_DS18B20(100);t=DS18B20_DQ_IN;}
}  
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250) 
short DS18B20_Get_Temp(void)
{u8 temp;u8 TL,TH;short tem;DS18B20_Start ();  			// ds1820 start convertDS18B20_Rst();DS18B20_Check();	 DS18B20_Write_Byte(0xcc);	// skip romDS18B20_Write_Byte(0xbe);	// convert	    TL=DS18B20_Read_Byte(); 	// LSB   TH=DS18B20_Read_Byte(); 	// MSB  if(TH>7){TH=~TH;TL=~TL; temp=0;					//温度为负  }else temp=1;				//温度为正	  	  tem=TH; 					//获得高八位tem<<=8;    tem+=TL;					//获得底八位tem=(float)tem*0.625;		//转换     if(temp)return tem; 		//返回温度值else return -tem;    
}

2、DS18B20.h

#ifndef __DS18B20_H
#define	__DS18B20_H#include "stm32f10x.h"
#include "Delay.h"#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C 
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C #define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808 
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08 #define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  ////IO方向设置
#define DS18B20_IO_IN()  {GPIOB->CRH&=0XFFFFFFF0;GPIOB->CRH|=8<<0;}
#define DS18B20_IO_OUT() {GPIOB->CRH&=0XFFFFFFF0;GPIOB->CRH|=3<<0;}
////IO操作函数											   
#define	DS18B20_DQ_OUT PBout(8) //数据端口	PA0 
#define	DS18B20_DQ_IN  PBin(8)  //数据端口	PA0 void Delay_DS18B20(int num);
void DS18B20_Init(void);//初始化DS18B20
short DS18B20_Get_Temp(void);//获取温度
void DS18B20_Start(void);//开始温度转换
void DS18B20_Write_Byte(u8 dat);//写入一个字节
u8 DS18B20_Read_Byte(void);//读出一个字节
u8 DS18B20_Read_Bit(void);//读出一个位
u8 DS18B20_Check(void);//检测是否存在DS18B20
void DS18B20_Rst(void);//复位DS18B20    
#endif /* __DS18B20_H */

3、main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
#include "LCD1602.h"
#include "stdint.h"
#include "stdio.h"
#include "stm32f10x_conf.h"
#include "Serial.h"
#include "DS18B20.h"/****全局变量******************************************/
uint8_t lcd_dat1[20];//液晶第一行
uint8_t lcd_dat2[20];//液晶第二行float T=0;
uint8_t t=0;
short tem,tem1;int main(void)
{RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);LCD_init();    //LCD1602初始化LCD_clr();//LCD清屏幕	Serial_Init();Serial_Printf("Begin Init\r\n");DS18B20_Init();tem=DS18B20_Get_Temp();Delay_DS18B20(1000000);while(1){	tem=DS18B20_Get_Temp();sprintf(lcd_dat1,"t:%d",tem/10);LCD_prints(0,0,lcd_dat1);//液晶显示第一行Serial_Printf("%d\r\n",(int)tem);Delay_DS18B20(100000);}}

其中串口和lcd的代码可以看之前的文章

四、视频展示

proteus实现简易DS18B20温度计(stm32)

五、工程开源

http://通过网盘分享的文件:11 DS18B20.rar 链接: https://pan.baidu.com/s/1cEv4xdaepkTQiyUgJQjm-g?pwd=kw6p 提取码: kw6p

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93095.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Autoppt-AI驱动的演示文稿生成工具

本文转载自&#xff1a;Autoppt-AI驱动的演示文稿生成工具 - Hello123工具导航 ** 一、 Autoppt&#xff1a;AI 驱动的智能演示文稿生成工具 Autoppt 是一款基于人工智能的在线演示文稿生成平台&#xff0c;通过输入主题或上传文档&#xff08;Word/PDF/ 图片等&#xff09;&…

Flink on YARN启动全流程深度解析

Flink on YARN 模式启动流程及核心组件协作详解整个过程分为三个主要阶段&#xff1a;​​JobManager 启动​​&#xff08;作业提交与 AM 初始化&#xff09;​​TaskManager 资源分配与启动​​​​任务部署与执行​​第一阶段&#xff1a;作业提交与 JobManager (AM) 启动​…

安卓开发者自学鸿蒙开发1基础入门

1.基础 声明式UI&#xff1a;​​ ​​核心&#xff1a;​​ 你​​声明​​你想要UI是什么样子&#xff08;在build()方法里描述&#xff09;&#xff0c;而不是一步步命令式地创建和操作View对象&#xff08;findViewById, setText, setOnClickListener&#xff09;。 模块化…

弹性扩展新范式:分布式LLM计算的FastMCP解决方案

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。如果你想系统学习AI大模型应用开发&#xff0c;挑战AI高薪岗位&#xff0c;可在文章底部联系。在现代大语言模型&#xff08;LLM&#xff09;应用架构中…

springboot项目不同平台项目通过http接口AES加密传输

前言&#xff1a; 在公司协作开发的过程中&#xff0c;自己的项目是公共调用平台&#xff0c;也可以说是中转平台&#xff0c;供公司其他团队的项目进行接口调用。因为是不同团队项目之间的相互调用&#xff0c;所以不能通过openFeign远程调用。只能通过http远程调用&#xff…

推荐5个网页模板资源网

1. 企业模板官方网站&#xff1a; http://www.qimoban.com介绍&#xff1a;企业模板(qimoban.com )是一个专注于提供丰富多样的企业模板的优质平台&#xff0c;致力于为企业和个人打造高效、专业、个性化的模板获取渠道。该平台提供海量的企业模板资源&#xff0c;涵盖企业官网…

Redis持久化机制(RDB AOF)

1. RDB RDB 持久化是把当前进程数据生成快照保存到硬盘的过程&#xff0c;触发 RDB 持久化过程分为手动触发和 自动触发&#xff0c;存储的是二进制数据。 1.1 手动触发 使用 save 和 bgsave 命令触发&#xff1a; save&#xff1a;Redis服务主进程阻塞式执行持久化操作&…

【css】让浏览器支持小于12px的文字

【css】让浏览器支持小于12px的文字.demo {display: inline-block;/** 使用Webkit引擎的变换属性&#xff08;主要针对旧版Safari/Chrome&#xff09; **/-webkit-transform: scale(0.8); }注意&#xff1a;display: inline-block; 一定要加上&#xff01;1.transform: scale(…

机器学习-基础入门:从概念到核心方法论

在人工智能飞速发展的今天&#xff0c;机器学习作为其核心技术&#xff0c;正深刻改变着我们的生活与工作。从 AlphaGo 战胜围棋世界冠军&#xff0c;到日常的智能推荐、人脸识别&#xff0c;机器学习的应用无处不在。本文将从基础概念出发&#xff0c;带你系统了解机器学习的核…

《Leetcode》-面试题-hot100-动态规划

题目列表 70. 爬楼梯 简单难度 leetcode链接 118. 杨辉三角 简单难度 leetcode链接 198. 打家劫舍 中等难度 leetcode链接 279.完全平方数 中等难度 leetcode链接 322.零钱兑换 中等难度 leetcode链接 139.单词拆分 中等难度 leetcode链接 300.最长递增子序列 中等难度 l…

数巅中标中建科技AI知识库项目,开启建筑业数智化新篇章

AI正以前所未有的迅猛态势渗透进建筑业的每一处脉络。在这场数智化转型浪潮中&#xff0c;AI技术如何与建筑业基因深度融合&#xff1f;如何充分释放数据价值&#xff1f;近日&#xff0c;数巅成功中标中建科技集团有限公司“企业AI知识库研发”项目&#xff0c;这一“大语言模…

想要PDF翻译保留格式?用对工具是关键

嘿&#xff0c;朋友&#xff01;最近有没有被PDF翻译的事儿搞得焦头烂额呀&#xff1f;尤其是碰到韩文PDF文件的时候&#xff0c;是不是更头疼了&#xff1f;别担心&#xff0c;我最近也遇到了类似的问题&#xff0c;试了不少软件&#xff0c;发现有五款软件在处理韩文PDF翻译时…

【MySQL✨】服务器安装 MySQL 及配置相关操作

1. 安装 MySQL 在安装 MySQL 时&#xff0c;如果使用官方 RPM 源&#xff0c;会遇到 GPG 密钥验证失败的错误&#xff0c;可以按照以下步骤解决&#xff1a; 解决 GPG 密钥验证失败的问题下载 MySQL 官方 GPG 密钥 使用以下命令下载并安装 MySQL 的官方 GPG 密钥&#xff1a; w…

大数据量返回方案(非分页)

一、普通方式返回100万条数据RestController RequestMapping("/bad") public class BadController {Autowiredprivate UserRepository userRepository;/*** 危险&#xff01;一次性加载 100 万条到内存*/GetMapping("/all-users")public List<User> …

基于Casbin的微服务细粒度权限控制方案对比与实践

基于Casbin的微服务细粒度权限控制方案对比与实践 随着微服务架构在互联网和企业级应用中的广泛应用&#xff0c;服务间的安全边界愈发重要。传统的集中式权限控制方式已难以满足微服务的高并发、动态扩展和多语言支持等需求。本文将从主流的三种微服务权限控制方案入手&#x…

5G毫米波现状概述(截止2025 年7月)

5G毫米波现状概述(截止2025 年7月&#xff09; 原创 modem协议笔记 2025年07月25日 06:01 广东 听全文 当你在体育馆看球赛时&#xff0c;想发段实时视频到朋友圈却总卡成PPT&#xff1b;当郊区的父母抱怨“光纤拉不到家&#xff0c;网速比蜗牛慢”—这些场景背后&#xff…

thymeleaf 日期格式化显示

在Thymeleaf中处理日期格式化显示主要有以下几种方式&#xff1a; 1. 使用#dates.format()方法进行基础格式化&#xff1a; <p th:text"${#dates.format(dateObj, yyyy-MM-dd HH:mm:ss)}"></p>这种方法支持自定义格式模式&#xff0c;如yyyy表示年份、MM…

【经验分享】如何在Vscode的Jupyter Notebook中设置默认显示行号

【经验分享】如何在Vscode的Jupyter Notebook中设置默认显示行号 打开设置&#xff0c;搜索&#xff1a;Notebook: Line Number&#xff0c;然后把这个设置为on

蓝桥杯STL stack

STL stack 概述栈&#xff08;stack&#xff09;是一种遵循**后进先出&#xff08;LIFO&#xff09;**原则的线性数据结构&#xff0c;仅允许在栈顶进行插入和删除操作。STL&#xff08;Standard Template Library&#xff09;中的 stack 是一个容器适配器&#xff0c;基于其他…

从0到1:飞算JavaAI如何用AI魔法重构MCP服务全生命周期?

摘要 本文详细介绍了如何利用飞算JavaAI技术实现MCP&#xff08;Model Context Protocol&#xff09;服务的创建及通过的全过程。首先阐述了飞算JavaAI的基本概念、特点和优势&#xff0c;接着对MCP服务的需求进行分析&#xff0c;然后按照软件开发流程&#xff0c;从系统设计、…