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 的通信正常。
  • 数码管驱动:数码管的驱动方式可以根据实际情况进行调整,例如使用动态扫描或静态显示。
  • 错误处理:在代码中添加适当的错误处理机制,以提高系统的稳定性。

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

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

相关文章

【银河麒麟高级服务器操作系统】服务器卡死后恢复系统日志丢失-分析及处理全过程

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://document.kylinos.cn 服务器环境以及配置 【机型】 处理器&#xff…

【linux】在 Linux 上部署 DeepSeek-r1:32/70b:解决下载中断问题

【linux】在 Linux 上部署 DeepSeek-r1:32/70b:解决下载中断问题 【承接商业广告,如需商业合作请+v17740568442】 文章目录 【linux】在 Linux 上部署 DeepSeek-r1:32/70b:解决下载中断问题问题描述:解决方法方法一:手动中断并重启下载方法二:使用 Bash 脚本自动化下载在…

Java(api中常用类,包括Object类,Arrays类,String类,基本数据类型包装类)

目录 一.api 1.api介绍: 二.Object类 1.toString方法 2.equals方法 1.什么是equals方法 2.Object类向我们提供的equals方法 ​编辑 3.equals方法与""的区别 三.Arrays类 1.toString方法 2.sort方法 3.copyOf方法 4.fill方法 5.binarySearch方法 四.基…

物联网行业通识:从入门到深度解析

物联网行业通识&#xff1a;从入门到深度解析 &#xff08;图1&#xff1a;物联网生态示意图&#xff09; 一、引言&#xff1a;万物互联时代的到来 根据IDC最新预测&#xff0c;到2025年全球物联网设备连接数将突破410亿&#xff0c;市场规模达1.1万亿美元。物联网&#xff…

python语言进阶之函数

目录 前言 函数的创建和调用 函数创建 调用函数 参数传递 形式参数和实际参数 位置参数 数量必须与定义时一致 位置必须与定义时一致 关键字参数 为参数设置默认值 可变参数 **parameter 返回值 变量的作用域 局部变量 全局变量 匿名函数 前言 提到函数&…

Qt信号槽调用出错:Qt: Dead lock detected while activating a BlockingQueuedConnection

目录 1.现象和原因分析 2. 总结 1.现象和原因分析 就在最近的开发过程中&#xff0c;程序一运行在控制台就打印&#xff1a; Qt: Dead lock detected while activating a BlockingQueuedConnection&#xff1a; 咋一看&#xff0c;怎么出现死锁了呢&#xff1f;仔细看下…

Linux安装Minio

1、下载rpm包 2、rpm 安装 rpm -ivh xx.rpm3、通过查看minion状态&#xff0c;查看其配置文件位置 systemctl start minio可以根据情况自定义修改配置文件内容&#xff0c;这里暂时不做修改 4、创建数据文件和日志文件&#xff0c;一般在/usr/local/ 5、编写启动脚本 #!/bi…

计算四个锚点TOA定位中GDOP的详细步骤和MATLAB例程

该MATLAB代码演示了在三维空间中,使用四个锚点的TOA(到达时间)定位技术计算几何精度衰减因子(GDOP)的过程。如需帮助,或有导航、定位滤波相关的代码定制需求,请联系作者 文章目录 DOP计算原理MATLAB例程运行结果示例关键点说明扩展方向另有文章: 多锚点Wi-Fi定位和基站…

基于Spring Boot+Vue的宠物服务管理系统(源码+文档)

项目简介 宠物服务管理系统实现了以下功能&#xff1a; 基于Spring BootVue的宠物服务管理系统的主要使用者分为用户管理模块&#xff0c;由于系统运行在互联网络中&#xff0c;一些游客或者病毒恶意进行注册&#xff0c;产生大量的垃圾用户信息&#xff0c;管理员可以对这些…

jenkins服务启动-排错

服务状态为active (exited) 且进程不在 查看/etc/rc.d/init.d/jenkins配置 获取配置参数 [rootfy-jenkins-prod jenkins]# cat /etc/rc.d/init.d/jenkins | grep -v #JENKINS_WAR"/usr/lib/jenkins/jenkins.war" test -r "$JENKINS_WAR" || { echo "…

vue3 分析总结响应式丢失问题原因(二)

上一篇文件理解了响应式对象应用原理了。公式&#xff1a; 响应式对象 代理 触发器。 但是实际使用结果和预期还是不一致。具体现象是数据修改了&#xff0c;但是并没有实现响应式更新界面。即出现了响应式丢失现象。 一、什么情况下对象的响应式会丢失&#xff1f; 一般网…

【网络】协议与网络版计算器

协议与网络版计算器 文章目录 1.协议的概念 1.1序列化与反序列化 2.网络版计算器 2.1封装套接字2.2协议定制 2.2.1Jsoncpp2.2.2报文处理 2.3会话层&#xff1a;TcpServer2.4应用层&#xff1a;Calculate2.5表示层&#xff1a;Service2.6应用层、表示层和会话层->应用层 …

C# 添加图标

一、前言 为应用程序添加图标是优化用户界面、提升应用辨识度的重要操作。合适的图标能帮助用户快速识别和区分不同应用&#xff0c;增强应用的易用性和专业性。 本指南旨在为你提供详细、易懂的步骤&#xff0c;教你如何为应用程序的窗体添加图标。从图标素材的获取到具体的…

使用新版本golang项目中goyacc依赖问题的处理

背景 最近项目使用中有用到go mod 和 goyacc工具。goyacc涉及到编译原理的词法分析&#xff0c;文法分析等功能&#xff0c;可以用来生成基于golang的语法分析文件。本期是记录一个使用中遇到的依赖相关的问题。因为用到goyacc&#xff0c;需要生成goyacc的可执行文件。 而项目…

WPS的AI助手进化跟踪(灵犀+插件)

Ver V0.0 250216: 如何给WPS安装插件用以支持其他大模型LLM V0.1 250217: WPS的灵犀AI现在是DeepSeek R1(可能是全参数671B) 前言 WPS也有内置的AI&#xff0c;叫灵犀&#xff0c;之前应是自已的LLM模型&#xff0c;只能说是属于“能用&#xff0c;有好过无”&#xff0c;所…

计算机视觉:卷积神经网络(CNN)基本概念(一)

第一章&#xff1a;计算机视觉中图像的基础认知 第二章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(一) 第三章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(二) 第四章&#xff1a;搭建一个经典的LeNet5神经网络 一、引言 卷积神经网络&…

rabbitmq详解

有需要的直接看狂神的视频&#xff0c;讲得很好 简介 RabbitMQ 是一个开源的 消息队列中间件&#xff0c;实现了 AMQP&#xff08;Advanced Message Queuing Protocol&#xff0c;先进消息队列协议&#xff09;。它允许 应用程序、服务、系统之间异步地传递消息&#xff0c;并…

moveable 一个可实现前端海报编辑器的 js 库

目录 缘由-胡扯本文实验环境通用流程1.基础移动1.1 基础代码1.1.1 data-* 解释 1.2 操作元素创建1.3 css 修饰1.4 cdn 引入1.5 js 实现元素可移动1.6 图片拖拽2.缩放3.旋转4.裁剪 懒得改文案了&#xff0c;海报编辑器换方案了&#xff0c;如果后面用别的再更。 缘由-胡扯 导火…

计算机视觉中图像的基础认知

第一章&#xff1a;计算机视觉中图像的基础认知 第二章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(一) 第三章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(二) 第四章&#xff1a;搭建一个经典的LeNet5神经网络 一、图像/视频的基本属性…

java八股文-mysql

1. 索引 1.1 什么是索引 索引(index)是帮助Mysql高效获取数据的数据结构(有序).提高数据的检索效率,降低数据库的IO成本(不需要全表扫描).通过索引列对数据进行排序,降低数据排序成本,降低了CPU的消耗. 1.2 mysql索引使用的B树? 1. 没有使用二叉树&#xff0c;最坏情况o&…