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

[实训] 实验1-SPI数据传输基础实验(上)

目  录​​​​​​​

一、实验目的

二、实验仪器及器件

三、实验内容及原理

四、实验步骤​​​​​​​

五、实验测试数据表格记录

六、实验数据分析及处理

七、实验结论与感悟


一、实验目的

使用FPGA/ARM实现SPI数据传输实验;实现数据传输程序的编写、下载、传输验证、传输波形测量,发送的数据及其数据传送过程须通过示波器测量波形验证正确性。

基本要求:

1、掌握SPI数据传输的理论基础;

2、掌握数据传输程序的编写方法;

3、掌握数据传输程序的下载与验证方法;

4、掌握示波器测量波形的正确方法;

5、掌握示波器波形的分析方法。

二、实验仪器及器件

  1. 电脑(Windows 10)
  2. PSI-STP-ST-STM32F103实验箱(ARM)
  3. 示波器

三、实验内容及原理

实验内容:基于SPIDS1302实时时钟显示实验

使用ARM实验箱实现SPI数据传输实验;实现数据传输程序的编写、仿真、下载、传输验证;传输波形测量,发送的数据及其数据传送过程须通过示波器测量波形验证正确性。

说明:DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、星期、日、月和年。

   要求:

  (1)实现DS1302控制输出时钟,并将其用数码管显示时钟时间,精确到秒;

  (2)掌握示波器测量方法,利用示波器测量波形,要求测量出SPI控制时序图。

图3.1  STM32F103实验箱

实验原理:

DS1302 是美国 DALLAS 公司推出的一种高性能、低功耗的实时时钟芯片,附加 31 字节静态 RAM,采用 SPI 三线接口与 CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和 RAM 数据。实时时钟可提供秒、分、时、星期、日、月和年,一个月小与 31 天时可以自动调整,且具有闰年补偿功能。工作电压宽达 2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。DS1302 的外部引脚分配如下图所示。DS1302 用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。

图3.2  DS1302引脚图

四、实验步骤

  1. 建立工程,新建文件夹命名为“基于SPI的DS1302实时时钟显示实验”,核心处理器芯片是 STM32F103ZC。
  2. 添加库文件,在工程文件夹中新建 4 个文件夹为 CORE、OBJ、STM32F10X_FELIB,SYSTEM,并在官方固件库包中相关的库包复制进去。

     

    图4.1  工程目录浏览

  3. 配置工程。
  4. 编写相关程序。

  5. 编译程序,如果有报错,逐错修改直至没有错误。
  6. 在线下载调试,代码烧写完成后按下复位键(RESET),可以看到数码管从初始化好的时钟时间,精确到秒显示(初始化时间为2023年5月1日19点59分49秒,星期一):

 

图4.4  实验现象数码管显示时钟(21时12分05秒)

        7.利用示波器测量波形,测量出SPI控制时序图。

 

图4.5  试验箱DS1302@SPI

                a.时钟数据的读写地址

图4.2  时钟数据的读写地址

如上图,为DS1302芯片的时钟数据的读和写的地址,也就是说要实现对芯片控制,就是往这些地址上写入或读出数据。其中:

读地址为0x81(秒), 0x83(分), 0x85(时), 0x87(日), 0x89(月), 0x8b(星期), 0x8d(年);

写地址为0x80(秒), 0x82(分), 0x84(时), 0x86(日), 0x88(月), 0x8a(星期), 0x8c(年)。

DS1302控制软件最基本的操作为写函数和读函数,其次就是实现初始化函数

读写时序

 

图 单字节读操作时序图

 

图  单字节写操作时序图

 ds1302.c关键代码段1:读取一个地址的数据

// 从ds1302的内部寄存器addr读出一个值,作为返回值
u8 DS1302_Read_Byte(u8 addr)
{u8 i,temp;DS1302_RST = 0;         //停止DS1302总线delay_us(10);DS1302_RST = 1;         //启动DS1302总线                        addr = addr | 0x01;    //读数据DS1302_IO_OUT();  for(i = 0; i < 8; i ++)  //写地址{if (addr & 0x01)          // 从低位开始传输的DS1302_DATA_OUT = 1;elseDS1302_DATA_OUT = 0;		DS1302_SCK = 1;          delay_us(10);           DS1302_SCK = 0;          delay_us(10);addr = addr>>1;           // 把addr右移一位}DS1302_IO_IN();for (i = 0; i < 8; i ++) //读数据{temp = temp >> 1;if(DS1302_DATA_IN)   // 读出来的数值是低位在前的temp |= 0x80;elsetemp &= 0x7F;	DS1302_SCK = 1;delay_us(10);DS1302_SCK = 0; delay_us(10);}  DS1302_RST = 0;         // RST拉低意味着一个大周期的结束return temp;
}

ds1302.c关键代码段2:向DS1302命令(地址+数据)

//向DS1302写入一个字节数据
void DS1302_Write_Byte(u8 addr, u8 data)
{u8 i;DS1302_RST = 0;      //停止DS1302总线delay_us(10);DS1302_RST = 1;      //启动DS1302总线addr = addr & 0xFE;  DS1302_IO_OUT();//写地址addrfor(i = 0; i < 8; i ++)  {if (addr & 0x01)        // 从低位开始传输的DS1302_DATA_OUT = 1;elseDS1302_DATA_OUT = 0;		DS1302_SCK = 1;         // 制造上升沿delay_us(10); DS1302_SCK = 0;         // 把SCLK拉低delay_us(10); addr = addr>>1;         // 把addr右移一位}// 写数据datafor (i = 0; i < 8; i ++) {if(data & 0x01)         //SPI是从低位开始传输的DS1302_DATA_OUT = 1;elseDS1302_DATA_OUT = 0;DS1302_SCK = 1;          // 制造上升沿delay_us(10);            DS1302_SCK = 0;          delay_us(10); data = data>>1;          // 把addr右移一位}DS1302_RST = 0;             // RST拉低
}

ds1302.c关键代码段3:初始化时钟

//初始时间         20  23年 5月  1日  19点 59分49秒,星期1
u8 time_buf[8] = {0x20,0x23,0x05,0x01,0x11,0x08,0x56,0x01}; 
//向DS1302写入时间数据
void DS1302_Write_Time(void)
{DS1302_Write_Byte(ds1302_control_add, 0x00);      //关闭写保护
//  DS1302_Write_Byte(ds1302_sec_add, 0x80);          //暂停时钟//DS1302_Write_Byte(ds1302_charger_add, 0xA9);      //涓流充电DS1302_Write_Byte(ds1302_year_add,time_buf[1]);		//年 DS1302_Write_Byte(ds1302_month_add,time_buf[2]);	//月 DS1302_Write_Byte(ds1302_date_add,time_buf[3]);		//日 DS1302_Write_Byte(ds1302_hr_add,time_buf[4]);		  //时 DS1302_Write_Byte(ds1302_min_add,time_buf[5]);		//分DS1302_Write_Byte(ds1302_sec_add,time_buf[6]);		//秒DS1302_Write_Byte(ds1302_day_add,time_buf[7]);		//周 DS1302_Write_Byte(ds1302_control_add,0x80);		    //打开写保护 
}

 seg.c关键代码段:

void show(u8 pl)
{BitAction sum[8];u8 i;for(i=0;i<8;i++){if((data[pl]>>i)&0x01 == 0x1)	sum[i] = Bit_SET;else	sum[i] = Bit_RESET;}GPIO_WriteBit(GPIOG,GPIO_Pin_8,sum[7]);GPIO_WriteBit(GPIOC,GPIO_Pin_6,sum[6]);GPIO_WriteBit(GPIOC,GPIO_Pin_7,sum[5]);GPIO_WriteBit(GPIOA,GPIO_Pin_8,sum[4]);GPIO_WriteBit(GPIOG,GPIO_Pin_4,sum[3]);GPIO_WriteBit(GPIOG,GPIO_Pin_5,sum[2]);GPIO_WriteBit(GPIOG,GPIO_Pin_6,sum[1]);GPIO_WriteBit(GPIOG,GPIO_Pin_7,sum[0]);
}

main.c关键代码

#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "12864.h"
#include "ds1302.h"
#include "seg.h"u8 time[15];int main(void)
{delay_init();	    	 //延时函数初始化	  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级DS1302_Init();delay_ms(10);DS1302_Write_Time();delay_ms(10);	Geg_GPIO_Configuration();while(1) {//DS1302_Get_Time(time);show(time[9]);//时GPIO_SetBits(GPIOF,GPIO_Pin_13);GPIO_ResetBits(GPIOG,GPIO_Pin_0);GPIO_ResetBits(GPIOE,GPIO_Pin_9); GPIO_ResetBits(GPIOF,GPIO_Pin_12);GPIO_ResetBits(GPIOE,GPIO_Pin_8);GPIO_ResetBits(GPIOE,GPIO_Pin_7);GPIO_ResetBits(GPIOE,GPIO_Pin_10);GPIO_ResetBits(GPIOF,GPIO_Pin_11);delay_ms(1);show(time[10]);//时GPIO_ResetBits(GPIOF,GPIO_Pin_13);GPIO_SetBits(GPIOG,GPIO_Pin_0);GPIO_ResetBits(GPIOE,GPIO_Pin_9); GPIO_ResetBits(GPIOF,GPIO_Pin_12);GPIO_ResetBits(GPIOE,GPIO_Pin_8);GPIO_ResetBits(GPIOE,GPIO_Pin_7);GPIO_ResetBits(GPIOE,GPIO_Pin_10);GPIO_ResetBits(GPIOF,GPIO_Pin_11);delay_ms(1);show_x();//-GPIO_ResetBits(GPIOF,GPIO_Pin_13);GPIO_ResetBits(GPIOG,GPIO_Pin_0);GPIO_SetBits(GPIOE,GPIO_Pin_9); GPIO_ResetBits(GPIOF,GPIO_Pin_12);GPIO_ResetBits(GPIOE,GPIO_Pin_8);GPIO_ResetBits(GPIOE,GPIO_Pin_7);GPIO_ResetBits(GPIOE,GPIO_Pin_10);GPIO_ResetBits(GPIOF,GPIO_Pin_11);delay_ms(1);show(time[11]);//minGPIO_ResetBits(GPIOF,GPIO_Pin_13);GPIO_ResetBits(GPIOG,GPIO_Pin_0);GPIO_ResetBits(GPIOE,GPIO_Pin_9); GPIO_SetBits(GPIOF,GPIO_Pin_12);GPIO_ResetBits(GPIOE,GPIO_Pin_8);GPIO_ResetBits(GPIOE,GPIO_Pin_7);GPIO_ResetBits(GPIOE,GPIO_Pin_10);GPIO_ResetBits(GPIOF,GPIO_Pin_11);delay_ms(1);show(time[12]);//minGPIO_ResetBits(GPIOF,GPIO_Pin_13);GPIO_ResetBits(GPIOG,GPIO_Pin_0);GPIO_ResetBits(GPIOE,GPIO_Pin_9); GPIO_ResetBits(GPIOF,GPIO_Pin_12);GPIO_SetBits(GPIOE,GPIO_Pin_8);GPIO_ResetBits(GPIOE,GPIO_Pin_7);GPIO_ResetBits(GPIOE,GPIO_Pin_10);GPIO_ResetBits(GPIOF,GPIO_Pin_11);delay_ms(1);show_x();//-GPIO_ResetBits(GPIOF,GPIO_Pin_13);GPIO_ResetBits(GPIOG,GPIO_Pin_0);GPIO_ResetBits(GPIOE,GPIO_Pin_9); GPIO_ResetBits(GPIOF,GPIO_Pin_12);GPIO_ResetBits(GPIOE,GPIO_Pin_8);GPIO_SetBits(GPIOE,GPIO_Pin_7);GPIO_ResetBits(GPIOE,GPIO_Pin_10);GPIO_ResetBits(GPIOF,GPIO_Pin_11);delay_ms(1);show(time[13]);//sGPIO_ResetBits(GPIOF,GPIO_Pin_13);GPIO_ResetBits(GPIOG,GPIO_Pin_0);GPIO_ResetBits(GPIOE,GPIO_Pin_9); GPIO_ResetBits(GPIOF,GPIO_Pin_12);GPIO_ResetBits(GPIOE,GPIO_Pin_8);GPIO_ResetBits(GPIOE,GPIO_Pin_7);GPIO_SetBits(GPIOE,GPIO_Pin_10);GPIO_ResetBits(GPIOF,GPIO_Pin_11);delay_ms(1);show(time[14]);//sGPIO_ResetBits(GPIOF,GPIO_Pin_13);GPIO_ResetBits(GPIOG,GPIO_Pin_0);GPIO_ResetBits(GPIOE,GPIO_Pin_9); GPIO_ResetBits(GPIOF,GPIO_Pin_12);GPIO_ResetBits(GPIOE,GPIO_Pin_8);GPIO_ResetBits(GPIOE,GPIO_Pin_7);GPIO_ResetBits(GPIOE,GPIO_Pin_10);GPIO_SetBits(GPIOF,GPIO_Pin_11);delay_ms(1);}	
}

 由于篇幅原因,五、六、七见下篇

五、实验测试数据表格记录

六、实验数据分析及处理

七、实验结论与感悟

相关文章:

[实训] 实验1-SPI数据传输基础实验(上)

目 录​​​​​​​ 一、实验目的 二、实验仪器及器件 三、实验内容及原理 四、实验步骤​​​​​​​ 五、实验测试数据表格记录 六、实验数据分析及处理 七、实验结论与感悟 一、实验目的 使用FPGA/ARM实现SPI数据传输实验&#xff1b;实现数据传输程序的编写、下载…...

微软骚操作恶心Win10用户,上网得先看广告

IE 浏览器在几个月前被彻底禁用&#xff0c;预装了快30年的老古董也确实到了退役的时候。 而微软也早有准备&#xff0c;2015年随着 Win10 发布推出了 Microsoft Edge 浏览器。 2020年迁移到 Chromium 内核让其成为了主流浏览器之一。 和 Chromium 系其他浏览器一样支持扩展插…...

为了做低代码平台,这些年我们对.NET的DataGridView做的那些扩展

我们的低代码开发平台从一开始决定做的时候&#xff0c;就追求未来能够支持多种类型的客户端&#xff0c;目前支持Winform&#xff0c;Web&#xff0c;H5&#xff0c;FlutterAPP&#xff0c;当然了&#xff0c;未来也有可能会随着实际的需要淘汰掉一些客户端的。 为了系统更易…...

洛谷 子集积 题解

题目 P1 背包 子集积 > m >m >m 个数并不好求&#xff0c;考虑子集积 ≤ m \le m ≤m 的个数 x x x&#xff0c;答案即为 ( 2 n − x ) (2^n - x) (2n−x)。 对于子集积 ≤ m \le m ≤m 的个数&#xff0c;可以化为 0-1 背包问题做&#xff0c; f i , j f_{i,…...

Boost笔记 1:下载、编译、安装、测试

1. 下载 当前版本是1.82&#xff0c;下载链接&#xff1a; https://boostorg.jfrog.io/artifactory/main/release/1.82.0/source/ 2. 安装编译依赖库 本地环境是Ubuntu 22.04&#xff0c;需要安装以下依赖库&#xff0c;部分影响boost相关功能的开启&#xff0c;部分影响编译…...

tiechui_lesson01_入口函数和卸载函数

主要讲解入口函数和卸载函数。 #include <ntifs.h>VOID nothing(HANDLE ppid, HANDLE mypid, BOOLEAN bcreate) {UNREFERENCED_PARAMETER(ppid);UNREFERENCED_PARAMETER(mypid);UNREFERENCED_PARAMETER(bcreate);DbgPrint("processNotify\n"); }VOID DriverU…...

密码学【java】初探究加密方式之非对称加密

文章目录 非对称加密1 常见算法2 生成公钥和私钥3 私钥加密4 私钥加密 公钥解密5 公钥和私钥的保存和读取5.1 **保存公钥和私钥**5.2 读取公钥和私钥 非对称加密 非对称加密算法又称现代加密算法。非对称加密是计算机通信安全的基石&#xff0c;保证了加密数据不会被破解。与对…...

网络安全和黑客技能:15本必读书籍推荐

前言 网络安全和黑客技能紧密相连。想要有效地防范黑客攻击&#xff0c;了解黑客的技能和思维方式非常重要。而要想成为一名合格的白帽黑客&#xff0c;也需要深入理解网络安全的基本原理和最佳实践。本文将介绍15本网络安全和黑客书籍&#xff0c;既包括了防范黑客攻击的指南…...

电话号码的字母组合

题目&#xff1a;17. 电话号码的字母组合 - 力扣&#xff08;Leetcode&#xff09; 思路&#xff1a; 给定一个电话号码字符串 digits&#xff0c;须输出它所能表示的所有字母组合。我们可以先定义一个数字字符到字母表的映射表 numToStr&#xff0c;然后再用 Combine 函数递归…...

PAT A1032 Sharing

1032 Sharing 分数 25 作者 CHEN, Yue 单位 浙江大学 To store English words, one method is to use linked lists and store a word letter by letter. To save some space, we may let the words share the same sublist if they share the same suffix. For example, l…...

Git常见问题汇总

问题&#xff1a;Your branch is ahead of ‘origin/master’ by 1 commit 原因&#xff1a;你的本地分支高于远程仓库一次提交, 同步更新下&#xff0c;执行命令&#xff1a; git push origin master问题&#xff1a;warning: LF will be replaced by CRLF in main.lua The …...

设计模式之代理模式(静态代理动态代理)

目录 1、什么是代理模式 2、代理模式的结构 3、代理模式的实现 3.1 静态代理和动态代理概念 3.2 静态代理 3.3 动态搭理 3.3.1 代码实现 3.3.2 Proxy类讲解 4、动态代理VS静态代理 5、代理模式优缺点 1、什么是代理模式 由于某些原因需要给某对象提供一个代理以控制对…...

Java并发编程基础知识概述

前言 在现代计算机系统和服务器中&#xff0c;多线程并行执行已经成为常态&#xff0c;而且并发编程能够充分利用系统资源&#xff0c;提高程序处理效率和质量。因此&#xff0c;Java并发编程是Java程序员必须掌握的重要技能之一。 线程和进程 在操作系统中&#xff0c;进程是…...

Redis超详细入门手册教程!还不快来看看?

地址&#xff1a; RedisRedis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker. Redis provides data structures …https://redis.io/ 1&#xff1a;NoSQL简介 1.1&#xff1a;数据库应用的演变历程 单…...

代码随想录算法训练营第四十九天| 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

文章目录 121. 买卖股票的最佳时机122.买卖股票的最佳时机II 121. 买卖股票的最佳时机 为什么定义dp数组为二维数组&#xff1f; dp数组定义&#xff0c;dp(i)[0] 表示第i天持有股票所得最多现金&#xff0c;dp(i)[1]表示第i天不持有股票的状态&#xff08;未必当前卖出&#x…...

零基础如何学习挖漏洞?看这篇就够了【网络安全】

前言 有不少阅读过我文章的伙伴都知道&#xff0c;我从事网络安全行业已经好几年&#xff0c;积累了丰富的经验和技能。在这段时间里&#xff0c;我参与了多个实际项目的规划和实施&#xff0c;成功防范了各种网络攻击和漏洞利用&#xff0c;提高了安全防护水平。 也有很多小…...

Twitter 推荐算法底有多牛? 已斩获11.7K star

点击上方“Github中文社区”&#xff0c;关注 看Github&#xff0c;每天提升第070期分享 &#xff0c;作者&#xff1a;Huber | Github中文社区 大家好&#xff0c;我是Huber。 在美国当地时间 3 月 31 日&#xff0c;马斯克履行当初的诺言&#xff0c;他宣布了 Twitter 算法的…...

看过这篇文章,读懂数据分析

一、为什么需要数据分析 数据分析的重要性不言而喻&#xff0c;没有数据&#xff0c;就是感性。数据不会被观点打败&#xff0c;数据只能被数据打败。我们现在妥妥地已经进入了数据时代。 量化IT投资成效&#xff0c;以数据驱动决策 站在公司或者决策者角度&#xff0c;数据最…...

[计算机图形学]光场,颜色与感知(前瞻预习/复习回顾)

一、Light Field / Lumigraph—光场 1.我们看到的是什么 我们的眼睛能够把3D世界转换为2D的成像信号被我们感知&#xff0c;如上面第一幅图&#xff0c;这就是我们看到整个世界的过程&#xff0c;那么如果我们把之前记录的光的信息都完美的放在一个幕布上&#xff0c;那么我们…...

L4公司进军辅助驾驶,放话无图也能跑遍中国

作者 | Amy 编辑 | 德新 高阶智能驾驶走向规模量产&#xff0c;高精地图成为关键的门槛之一。今年&#xff0c;多家车企和智驾公司都喊出「不依赖高精地图&#xff0c;快速大规模落地」的口号。 华为、小鹏、元戎以及毫末等&#xff0c;可能是最快在国内量产 无高精图智…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...