当前位置: 首页 > news >正文

STM32+Proteus+DS18B20数码管仿真实验

1. 实验准备

  • 硬件方面
    • 了解 STM32 单片机的基本原理和使用方法,本实验可选用常见的 STM32F103 系列。
    • 熟悉 DS18B20 温度传感器的工作原理和通信协议(单总线协议)。
    • 数码管可选用共阴极或共阳极数码管,用于显示温度值。
  • 软件方面
    • 安装 Keil MDK 开发环境,用于编写和编译 STM32 的程序代码。
    • 安装 Proteus 仿真软件,用于搭建电路并进行仿真。

2. Proteus 电路搭建

  1. 打开 Proteus 软件:新建一个工程,在元件库中搜索并添加以下元件:
    • STM32F103R6:作为主控芯片。
    • DS18B20:温度传感器。
    • 7SEG-MPX4-CC:4 位共阴极数码管。
    • 电阻、电容等辅助元件。
  2. 连接电路
    • DS18B20 连接:将 DS18B20 的 VDD 引脚连接到 3.3V 电源,GND 引脚接地,DQ 引脚连接到 STM32 的一个 GPIO 引脚(例如 PA0)。
    • 数码管连接:将数码管的段选引脚(a - g、dp)连接到 STM32 的一组 GPIO 引脚(例如 PB0 - PB7),位选引脚(COM1 - COM4)连接到另一组 GPIO 引脚(例如 PC0 - PC3)。
    • 电源和地:将 STM32 的 VDD 和 VSS 引脚分别连接到 3.3V 电源和地。

3. Keil MDK 代码编写

以下是一个

#include "stm32f10x.h"
#include <stdio.h>// 定义 DS18B20 引脚
#define DS18B20_PORT GPIOA
#define DS18B20_PIN GPIO_Pin_0// 定义数码管段选和位选端口
#define SEG_PORT GPIOB
#define DIG_PORT GPIOC// 共阴极数码管段码表
const u8 SEG_CODE[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};// 延时函数
void Delay(__IO uint32_t nCount) {for (; nCount != 0; nCount--);
}// DS18B20 初始化
u8 DS18B20_Init(void) {u8 presence = 0;GPIO_InitTypeDef GPIO_InitStructure;// 配置 DS18B20 引脚为推挽输出RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);// 拉低总线 480 - 960usGPIO_ResetBits(DS18B20_PORT, DS18B20_PIN);Delay(500);// 释放总线GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);Delay(60);// 配置为浮空输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);// 检测存在脉冲if (!GPIO_ReadInputDataBit(DS18B20_PORT, DS18B20_PIN)) {presence = 1;}Delay(480);return presence;
}// 向 DS18B20 写一个字节
void DS18B20_WriteByte(u8 dat) {u8 i;GPIO_InitTypeDef GPIO_InitStructure;// 配置为推挽输出GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);for (i = 0; i < 8; i++) {GPIO_ResetBits(DS18B20_PORT, DS18B20_PIN);Delay(2);if (dat & 0x01) {GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);} else {GPIO_ResetBits(DS18B20_PORT, DS18B20_PIN);}Delay(60);GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);dat >>= 1;}
}// 从 DS18B20 读一个字节
u8 DS18B20_ReadByte(void) {u8 i, dat = 0;GPIO_InitTypeDef GPIO_InitStructure;for (i = 0; i < 8; i++) {// 配置为推挽输出GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);GPIO_ResetBits(DS18B20_PORT, DS18B20_PIN);Delay(2);GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);// 配置为浮空输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);if (GPIO_ReadInputDataBit(DS18B20_PORT, DS18B20_PIN)) {dat |= (0x01 << i);}Delay(60);}return dat;
}// 读取 DS18B20 温度值
float DS18B20_ReadTemp(void) {u8 LSB, MSB;short temp;float temperature;if (DS18B20_Init()) {DS18B20_WriteByte(0xCC); // 跳过 ROM 操作DS18B20_WriteByte(0x44); // 启动温度转换Delay(750000); // 等待转换完成DS18B20_Init();DS18B20_WriteByte(0xCC); // 跳过 ROM 操作DS18B20_WriteByte(0xBE); // 读取温度寄存器LSB = DS18B20_ReadByte();MSB = DS18B20_ReadByte();temp = (MSB << 8) | LSB;temperature = (float)temp / 16.0;} else {temperature = -1;}return temperature;
}// 数码管显示函数
void DisplayTemp(float temp) {u8 digit[4];u16 temp_int = (u16)(temp * 10);digit[0] = temp_int / 1000;digit[1] = (temp_int % 1000) / 100;digit[2] = (temp_int % 100) / 10;digit[3] = temp_int % 10;// 位选和段选for (int i = 0; i < 4; i++) {GPIO_ResetBits(DIG_PORT, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);GPIO_SetBits(DIG_PORT, GPIO_Pin_0 << i);GPIO_Write(SEG_PORT, SEG_CODE[digit[i]]);Delay(1000);}
}int main(void) {float temperature;GPIO_InitTypeDef GPIO_InitStructure;// 使能 GPIOB 和 GPIOC 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);// 配置数码管段选引脚为推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(SEG_PORT, &GPIO_InitStructure);// 配置数码管位选引脚为推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_Init(DIG_PORT, &GPIO_InitStructure);while (1) {temperature = DS18B20_ReadTemp();DisplayTemp(temperature);}
}

简单的示例代码,用于读取 DS18B20 的温度数据并显示在数码管上:

4. 代码编译

4. 代码编译和仿真

编译代码:在 Keil MDK 中,将上述代码保存为 .c 文件,进行编译,确保代码没有错误。

  1. 生成 hex 文件:在 Keil MDK 的项目选项中,配置生成 .hex 文件。
  2. 加载 hex 文件:在 Proteus 中,双击 STM32 芯片,在弹出的对话框中选择生成的 .hex 文件。
  3. 开始仿真:点击 Proteus 中的运行按钮,开始仿真。此时,数码管应该会显示 DS18B20 读取到的温度值。

5. 注意事项

  • 延时函数:在实际应用中,需要根据具体的系统时钟频率调整延时函数的参数,以确保 DS18B20 的通信正常。
  • 数码管驱动:数码管的驱动方式可以根据实际情况进行调整,例如使用动态扫描或静态显示。
  • 错误处理:在代码中添加适当的错误处理机制,以提高系统的稳定性。

相关文章:

STM32+Proteus+DS18B20数码管仿真实验

1. 实验准备 硬件方面&#xff1a; 了解 STM32 单片机的基本原理和使用方法&#xff0c;本实验可选用常见的 STM32F103 系列。熟悉 DS18B20 温度传感器的工作原理和通信协议&#xff08;单总线协议&#xff09;。数码管可选用共阴极或共阳极数码管&#xff0c;用于显示温度值。…...

Java自动生成api文档

在 Java 开发中&#xff0c;自动生成 API 文档是一项非常实用的功能&#xff0c;它能帮助开发者快速了解项目中的类、方法、参数等信息。以下为你介绍几种常见的 Java 自动生成 API 文档的方式&#xff1a; 1. 使用 Javadoc Javadoc 是 Java 自带的工具&#xff0c;它可以从 J…...

PHP的JIT编译器

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 PHP是一种广泛使用的脚本语言&#xff0c;被用于构建…...

Golang学习历程【第七篇 闭包type defer panic recover了解time包】

Golang学习历程【第七篇 闭包&type defer panic recover了解】 1. 闭包1.1 闭包的定义1.2 闭包的特点1.3 闭包的示例 2. 类型(type)2.1 自定义类型2.2 类型示例 3. 延迟执行&#xff08;Defer&#xff09;3.1 defer 的用法3.2 defer 示例 4. 恐慌&#xff08;Panic&#xf…...

oracle表分区--范围分区

文章目录 oracle表分区分区的原因分区的优势oracle表分区的作用oracle表分区类型一、范围分区二、 创建分区表和使用&#xff1a;1、按照数值范围划分2、按照时间范围3、MAXVALUE2. 向现有表添加新的分区3、 分区维护和重新组织&#xff08;合并/删除&#xff09; oracle表分区…...

使用亚马逊针对 PyTorch 和 MinIO 的 S3 连接器进行模型检查点处理

2023 年 11 月&#xff0c;Amazon 宣布推出适用于 PyTorch 的 S3 连接器。适用于 PyTorch 的 Amazon S3 连接器提供了专为 S3 对象存储构建的 PyTorch 数据集基元&#xff08;数据集和数据加载器&#xff09;的实现。它支持用于随机数据访问模式的地图样式数据集和用于流式处理…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_monotonic_time函数

声明 在 src\core\ngx_times.c 中&#xff1a; static ngx_msec_t ngx_monotonic_time(time_t sec, ngx_uint_t msec); 实现 在 src\core\ngx_times.c 中&#xff1a; static ngx_msec_t ngx_monotonic_time(time_t sec, ngx_uint_t msec) { #if (NGX_HAVE_CLOCK_MONOTONIC)st…...

业务开发 | 基础知识 | Maven 快速入门

Maven 快速入门 1.Maven 全面概述 Apache Maven 是一种软件项目管理和理解工具。基于项目对象模型的概念&#xff08;POM&#xff09;&#xff0c;Maven 可以从中央信息中管理项目的构建&#xff0c;报告和文档。 2.Maven 基本功能 因此实际上 Maven 的基本功能就是作为 Ja…...

基于 Python(Flask)、JavaScript、HTML 和 CSS 实现前后端交互的详细开发过程

以下是一个基于 Python&#xff08;Flask&#xff09;、JavaScript、HTML 和 CSS 实现前后端交互的详细开发过程&#xff1a; --- ### 一、技术选型 1. **后端**&#xff1a;Python Flask&#xff08;轻量级Web框架&#xff09; 2. **前端**&#xff1a;HTML/CSS JavaScript&…...

STM32 RCC功能说明 复位和时钟控制RCC

目录 背景 RCC配置时钟主要涉及两方面 程序 第1步、RCC默认初始化 第2步、等待HSE工作稳定 第3步、设置PLL时钟源以及倍频数 第4步、设置AHB总线时钟&#xff08;HCLK&#xff09; 第5步、设置PCLK1(APB1总线) 第6步、设置PCLK2(APB2总线) 第7步、FLASH存储器的配置 …...

Windows可以永久暂停更新了

最终效果图&#xff1a; 第一步&#xff1a; winR组合键打开运行对话框&#xff0c;输入“regedit”&#xff0c;点击“确定”或回车&#xff1a; 第二步&#xff1a; 注册表定位到“\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings”&#xff0c;新建DWO…...

高级 Python Web 开发:基于 FastAPI 构建高效实时聊天系统与并发控制

高级 Python Web 开发&#xff1a;基于 FastAPI 构建高效实时聊天系统与并发控制 目录 &#x1f310; WebSocket 实时通讯概述&#x1f4ac; FastAPI 中实现 WebSocket 聊天系统&#x1f527; WebSocket 并发控制与性能优化&#x1f512; WebSocket 安全性与认证机制&#x1…...

深入理解Java虚拟机(JVM)

JVM概述 JVM作用 java虚拟机负责装载字节码到其内部&#xff0c;解释/编译为对应平台上的机器码指令执行&#xff0c;通俗说就是将字节码转换为机器码 JVM内部构造 1、类加载部分&#xff1a;负责把硬盘上的字节码加载到内存中&#xff08;运行时数据区&#xff09; 2、运…...

笔试面试——逻辑题

1.n从1开始&#xff0c;每个操作可以选择对n加1或者对n加倍&#xff0c;若想获得整数2014&#xff0c;最少需要多少个操作。 2.一个池塘&#xff0c;养龙虾若干&#xff0c;请想一个办法尽量准确的估算其中有多少龙虾? 3. S先生&#xff0c;P先生&#xff0c;Q先生他们知道桌子…...

【深度学习入门实战】基于Keras的手写数字识别实战(附完整可视化分析)

​ 本人主页:机器学习司猫白 ok,话不多说,我们进入正题吧 项目概述 本案例使用经典的MNIST手写数字数据集,通过Keras构建全连接神经网络,实现0-9数字的分类识别。文章将包含: 关键概念图解完整实现代码训练过程可视化模型效果深度分析环境准备 import numpy as np impo…...

软考高级《系统架构设计师》知识点(一)

计算机硬件 校验码 码距&#xff1a;就单个编码A:00而言&#xff0c;其码距为1&#xff0c;因为其只需要改变一位就变成另一个编码。在两个编码中&#xff0c;从A码到B码转换所需要改变的位数称为码距&#xff0c;如A:00要转换为B:11&#xff0c;码距为2。一般来说&#xff0c;…...

用大模型学大模型01-制定学习计划

提示词&#xff1a;我想学习大模型&#xff0c;需要AI制定一个完整的学习计划&#xff0c;并给出学习路径和学习资料。以教科书目录的方式给出学习路线 第1章&#xff1a;数学与编程基础&#xff08;4-6周&#xff09; 1.1 数学基础 线性代数&#xff08;矩阵运算、特征值分…...

lvs的DR模式

基于Linux的负载均衡集群软件 LVS 全称为Linux Virtual Server,是一款开源的四层(传输层)负载均衡软件 Nginx 支持四层和七层(应用层)负载均衡 HAProxy 和Nginx一样,也可同时支持四层和七层(应用层)负载均衡 基于Linux的高可用集群软件 Keepalived Keepalived是Linux…...

mysql读写分离与proxysql的结合

上一篇文章介绍了mysql如何设置成主从复制模式&#xff0c;而主从复制的目的&#xff0c;是为了读写分离。 读写分离&#xff0c;拿spring boot项目来说&#xff0c;可以有2种方式&#xff1a; 1&#xff09;设置2个数据源&#xff0c;读和写分开使用 2&#xff09;使用中间件…...

【C++学习篇】C++11第二期学习

目录 1. 可变参数模板 1.1 基本语法及原理 1.2 包扩展 1.3empalce系列接⼝ 2. lamba 2.1 lambda的语法表达式 2.2 捕捉列表 2.3 lamba的原理 1. 可变参数模板 1.1 基本语法及原理 1. C11⽀持可变参数模板&#xff0c;也就是说⽀持可变数量参数的函数模板和类模板&…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...

深入解析 ReentrantLock:原理、公平锁与非公平锁的较量

ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。 ReentrantLock 实现原理 基本架构 ReentrantLo…...