[嵌入式软件][启蒙篇][仿真平台] STM32F103实现串口输出输入、ADC采集
上一篇:[嵌入式软件][启蒙篇][仿真平台] STM32F103实现LED、按键
 
文章目录
- 一、串口输出
 - (1) 简介
 - (2) 示例代码
 - (3) 仿真效果
 
- 二、串口输入
 - (1) 简介
 - (2) 示例代码
 - (3) 仿真效果
 
- 三、ADC采集
 - (1) 简介
 - (2) 采集电压
 - (3) 示例代码(电压)
 - (4) 仿真效果 (电压)
 - (5) 采集光敏
 - (6) 示例代码(光敏)
 - (6) 仿真效果 (光敏)
 - (7) 内部温度
 - (8) 示例代码(内部温度)
 - (9) 仿真效果 (内部温度)
 
一、串口输出
(1) 简介
- 学C语言时,使用的printf()函数,就是通过串口打印出来的。
 - 跟外部器件通信,比如GPS模块、蓝牙模块、wifi模块;
 - 两个开发板之间通信,制定私有协议。
 - PC电脑通信,使用上位机显示数据或控制下位机。
 
(2) 示例代码
#include <stdint.h>
#include <stdio.h>
#include "sys.h"
#include "stm32f10x_conf.h"#include "delay.h"
#include "led.h"
#include "key.h"
#include "usart.h"int main() {// LED初始化LED_Init();// 按键初始化KEY_Init();//串口初始化uart_init(115200);// 由于LED接了VCC, 引脚高电平,无法导通电路,所以低电平点亮,即VCC(火线)-->GND(地线/零线)while(1) {if (Key_Scan(GPIOA, GPIO_Pin_1)) { // 检测按键整个过程。按下->松开LED = !LED;  // 每次按下,切换开关。低电平点亮 高电平熄灭printf("key pressed. led state:%u\n", LED);}}
}
 
(3) 仿真效果
- 操作:打开串口–按下按键
 

 
 
二、串口输入
(1) 简介
- 跟外部器件通信,比如GPS模块、蓝牙模块、wifi模块;
 - 两个开发板之间通信,制定私有协议。
 - PC电脑通信,使用上位机输入参数或控制下位机。
 
(2) 示例代码
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "sys.h"
#include "stm32f10x_conf.h"#include "delay.h"
#include "led.h"
#include "key.h"
#include "usart.h"int main() {// LED初始化LED_Init();// 按键初始化KEY_Init();//串口初始化uart_init(115200);// 由于LED接了VCC, 引脚高电平,无法导通电路,所以低电平点亮,即VCC(火线)-->GND(地线/零线)while(1) {if (Key_Scan(GPIOA, GPIO_Pin_1)) { // 检测按键整个过程。按下->松开LED = !LED;  // 每次按下,切换开关。低电平点亮 高电平熄灭printf("key pressed. led state:%u\n", LED);}if ((USART_RX_STA & 0x8000) == 0x8000) { // 接收完成printf("rx:%s\r\n", USART_RX_BUF); // 打印刚刚接收的数据USART_RX_STA = 0; // 继续接收数据memset(USART_RX_BUF, 0, USART_REC_LEN); // 将刚刚接收到的数据清空}}
} 
重点:还有一个地方需要小修改(平台没有实现,我们这里替换下就行),有兴趣可以研究下功能的实现

void USART1_IRQHandler(void) { //串口1中断服务程序uint16_t Res;// 接收中断(接收到的数据必须是0x0d 0x0a结尾, 就是换行符\r\n)if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {Res = USART_ReceiveData(USART1); //读取接收到的数据if ((USART_RX_STA & 0x8000) == 0) { //接收未完成if (USART_RX_STA & 0x4000) { //接收到了0x0dif (Res != 0x0a)USART_RX_STA = 0; //接收错误,重新开始elseUSART_RX_STA |= 0x8000; //接收完成了} else { //还没收到0X0Dif (Res == 0x0d)USART_RX_STA |= 0x4000;else {USART_RX_BUF[USART_RX_STA & 0X3FFF] = Res;USART_RX_STA++;if (USART_RX_STA > (USART_REC_LEN - 1))USART_RX_STA = 0; //接收数据错误,重新开始接收}}}}
}
 
(3) 仿真效果
- 操作:打开串口–发送消息:123456\r\n

 
三、ADC采集
这个实验需要添加电路,如下图:
- 将按钮移除

 - 添加电压调节器

 
(1) 简介
- ADC是一个专门采集模拟量转为为数字信号的外设。
 - ADC一般采集电压、电流、光敏(光亮度)、温度、湿度、压力、声音等等。
 
(2) 采集电压
本实验使用STM32采样ADC模拟输入器的数据,开启仿真后,串口助手将ADC数值与转换出的电压值一并打印。
(3) 示例代码(电压)
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "sys.h"
#include "stm32f10x_conf.h"#include "delay.h"
#include "led.h"
#include "adc.h"
#include "usart.h"uint32_t adc_value = 0;
float voltage_value = 0;        //用于保存转换计算后的电压值int main() {// LED初始化LED_Init();// ADC1通道1初始化Adc_Init();//串口初始化uart_init(115200);while(1) {// 通过ADC_GetConversionValue函数查询ADC的DR寄存器获取ADC转换结果值adc_value = Get_Adc(1);// 计算出模拟输入的电压值voltage_value=(float)adc_value*(3.3/4095);           // 打印ADC转换结果值printf("AD value is %d\n", adc_value);//打印计算出的电压值printf("voltage value is %f V\n", voltage_value);LED = !LED;delay_ms(50);}
}
 
(4) 仿真效果 (电压)
- 操作: 打开串口–调整电压

 
(5) 采集光敏
- 光敏电阻的特性:光线越亮,阻值越小。
 - 一般用于走廊,白天不亮,晚上亮,做到省电的效果。
 - 按下图搭建电路

 
(6) 示例代码(光敏)
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "sys.h"
#include "stm32f10x_conf.h"#include "delay.h"
#include "led.h"
#include "adc.h"
#include "usart.h"//设定基于ADC信号的模拟光强阈值
#define lux 2200
uint32_t adc_value = 0;int main() {// LED初始化LED_Init();// ADC1通道1初始化Adc_Init();//串口初始化uart_init(115200);while(1) {// 通过ADC_GetConversionValue函数查询ADC的DR寄存器获取ADC转换结果值adc_value = Get_Adc(1);// 打印ADC转换结果值printf("AD value is %d\n", adc_value);if (adc_value > lux) {LED = 0; // 点亮} else {LED = 1; // 熄灭}delay_ms(50);}
} 
(6) 仿真效果 (光敏)
- 操作:打开串口–调节光敏电阻–从0-100%调整–当阻值>2000,点亮;阻值<2000,熄灭。

 
(7) 内部温度
- 芯片内部温度,目的:让电阻计算更佳准确,因为温度会影响阻值。 (一般用不上,不精确)
 - 测量CPU以及周围的温度,测量范围为-40~125度,误差为±1.5度
 - 内部温度传感器更适合于检测温度的变化,需要测量精确温度的情况下,应使用外置传感器。
 - 温度传感器模拟输入推荐采样时间是 17.1us。
 - 温度的计算公式如下:
T(℃)= {( V25-Vsense)/ Avg_Slope} + 25
上式中:V25=Vsense 在 25 度时的数值(典型值为: 1.43)。
Avg_Slope=温度与 Vsense 曲线的平均斜率(单位: mv/℃或 uv/℃)(典型值: 4.3mv/℃)。 
(8) 示例代码(内部温度)
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "sys.h"
#include "stm32f10x_conf.h"#include "delay.h"
#include "led.h"
#include "adc.h"
#include "usart.h"float temperate = 0;        //用于保存转换计算后的温度值
uint32_t adc_value = 0;int main() {// LED初始化LED_Init();// ADC1通道1初始化Adc_Init();//串口初始化uart_init(115200);while(1) {// 通过ADC_GetConversionValue函数查询ADC的DR寄存器获取ADC转换结果值adc_value = Get_Adc(1);// 打印ADC转换结果值printf("AD value is %d\n", adc_value);temperate = (float)adc_value * (3.3 / 4095); // 先转成电压值temperate = (1.43 - temperate) / 0.0043 + 25;  // 再转换为温度值//打印计算出的温度值printf("MCU temperature is %f C \n", temperate);LED = !LED;delay_ms(50);}
}
 
(9) 仿真效果 (内部温度)

下一篇:[嵌入式软件][启蒙篇][仿真平台]STM32F103实现定时器
相关文章:
[嵌入式软件][启蒙篇][仿真平台] STM32F103实现串口输出输入、ADC采集
上一篇:[嵌入式软件][启蒙篇][仿真平台] STM32F103实现LED、按键 文章目录 一、串口输出(1) 简介(2) 示例代码(3) 仿真效果 二、串口输入(1) 简介(2) 示例代码(3) 仿真效果 三、ADC采集(1) 简介(2) 采集电压(3) 示例代码(电压)(4) 仿真效果 …...
Deepin基本环境查看(四)【硬盘/分区、文件系统、硬连接/软连接】
Linux操作系统(Deepin、Ubuntu)操作系统中,硬盘分区的管理与Windows操作系统不同; 在Linux系统中维护着一个统一的文件目录体系,而硬盘和分区是以资源的形式由操作系统挂接和调度;此外Linux系统中连接(硬连…...
JS之打地鼠案例
需要素材的同学可以私信我 效果图: 上代码: <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title><style>* {margin: 0;padding: 0;}.box {position: relative;width: 320px;heigh…...
Kubernetes入门
k8s相关基础知识 文章目录 k8s相关基础知识1、Container2、PodPod 与 Container 的不同Pod 其它命令 3、Deployment扩容升级版本Rolling update(滚动更新)存活探针(livenessProb)就绪探针(readiness) 4、ServiceClusterIPNodePortLoadBalancer 5、Ingres…...
EtherNet/IP开发:C++搭建基础模块,EtherNet/IP源代码
这里是CIP资料的协议层级图,讲解协议构造。 ODVA(www.ODVA.org)成立于1995年,是一个全球性协会,其成员包括世界领先的自动化公司。结合其成员的支持,ODVA的使命是在工业自动化中推进开放、可互操作的信息和…...
Django(九)
1. 用户登录-Cookie和Session 什么是cookie和session? 发送HTTP请求或者HTTPS请求(无状态&短连接) http://127.0.0.1:8000/admin/list/ https://127.0.0.1:8000/admin/list/http无状态短连接:一次请求响应之后断开连接,再发请求重新连…...
解决Android Studio Unexpected tokens (use ; to separate expressions on the same line)
[TOC](Unexpected tokens (use ; to separate expressions on the same line)) 问题描述:Unexpected tokens (use ; to separate expressions on the same line) 原因:Android Studio 更新到最新的版本之后,gradle工程目录结构发生改变 问…...
【云原生】Docker网络模式和Cgroup资源限制
目录 一、Docker 网络实现原理 二、Docker 的网络模式 #网络模式详解: 第一种:host模式 第二种:bridge模式 第三种:container模式 第四种:none模式 第五种:自定义网络 三、Cgroup资源控制 第一种&a…...
实战:加密传输数据解密
前言 下面将分享一些实际的渗透测试经验,帮助你应对在测试中遇到的数据包内容加密的情况。我们将以实战为主,技巧为辅,进入逆向的大门。 技巧 开局先讲一下技巧,掌握好了技巧,方便逆向的时候可以更加快速的找到关键…...
前端开发提高效率的两大工具
一、浏览器中的开发者工具 怎么启动开发者工具? 在浏览器中按下F12或者鼠标右键点击检查 怎么利用(常用的几点)? 1、元素 点击标红的图标可以用于在页面选择元素,同时右侧会找到元素在前端代码中的位置 点击下方红…...
探索设计模式的魅力:深入理解面向对象设计的深层原则与思维
如何同时提高一个软件系统的可维护性 和 可复用性是面向对象对象要解决的核心问题。 通过学习和应用设计模式,可以更加深入地理解面向对象的设计理念,从而帮助设计师改善自己的系统设计。但是,设计模式并不能够提供具有普遍性的设计指导原则。…...
【Py/Java/C++三种语言详解】LeetCode每日一题240122【贪心】LeetCode670、最大交换
文章目录 题目链接题目描述解题思路为什么是贪心一个带图的例子 代码pythonjavacpp时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目链接 LeetCode670、最大交换 题目描述 给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k 个非空的连…...
Linux/Doctor
Enumeration nmap 已知目标开放了22,80,8089端口,扫描详细情况如下 可以看到对外开放了22,80,8089三个端口 TCP/80 SSTI 访问80端口,有一个infodoctors.htb的电子邮件,点击其他的也没有什么反应,猜测有可能需要域名访问 在/et…...
嵌入式linux学习之系统烧录
1.所需文件 1. 开发板为正点原子stm32mp157,文件可按照linux驱动教程编译,也可在正点原子文档->08、系统镜像\02、出厂系统镜像中找到: 2.烧录 1.拨码开关为000(usb启动),otg接口接入虚拟机,打开stm32cubeProgrammer: 2.页面…...
JVM-初始JVM
什么是JVM JVM 全称是 Java Virtual Machine,中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件。 Java源代码执行流程如下: JVM的功能 1 - 解释和运行 2 - 内存管理 3 - 即时编译 解释和运行 解释…...
EXCEL VBA网抓技巧-复制网页表格,不用遍历单元格
EXCEL VBA网抓技巧-复制网页表格,不用遍历单元格 对应表格复制 Sub tableTest()Set winhttp CreateObject("winhttp.WinHttpRequest.5.1")Set HTML CreateObject("htmlfile")Set oWindow HTML.ParentWindowUrl "https://www.taiwanlo…...
动态规划——炮兵回城【集训笔记】
题目描述 游戏盘面是一个m行n列的方格矩阵,将每个方格用坐标表示,行坐标从下到上依次递增,列坐标从左至右依次递增,左下角方格的坐标为(1,1),则右上角方格的坐标为(m,n)。 游戏结束盘上只剩下一枚炮兵没有回到城池中&a…...
低成本扫码点餐:1000元全包
在数字化时代,扫码点餐已经成为餐饮行业的标配。然而,对于许多小规模或初创的餐饮企业来说,开发一套完整的扫码点餐系统是一项成本高昂的任务。今天,我们将向您介绍一个低成本、高效的方法,让您用1000块钱轻松搞定一套…...
五款焊在电脑上的效率软件
在当今快节奏的商业环境中,提高工作效率成为了每个人都渴望实现的目标。尤其是在面对繁忙的工作日程、庞杂的任务清单和团队合作的压力时,我们需要一些可靠的工具来帮助我们更好地管理时间、组织工作和提高生产力。幸运的是,现在有许多高效的…...
小程序样例3:根据日历创建待办事项
基本功能 1、待办事项查看 选择不同的日期显示不同的待办: 2、选择日期后 新增事项: 3. 点击事项,查看详情 4、删除事项:删除事项3之后,剩余事项2 5、点击日期可以选择更多的月: 实现思路: 1、数据结构&a…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了  先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
