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

51单片机简单控制180度舵机

代码:

链接:https://pan.baidu.com/s/1K9dg2NwRhy49db_O_hqv-g?pwd=1234 


提取码:1234

一、路线

        我在了解这个舵机之前最像想看到的是一个完全的路径。

比如我想学习b站上那个智能门锁,那就得每个模块的基本代码都会才能结合各个部分。那你第一步就是准备好硬件和软件环境,如果你备赛过蓝桥杯杯比赛的话,软件和基本代码知识这些不用说,硬件的话

1.去购物软件搜一下SG90舵机,一大堆,你想买哪个就买哪个;

2.找商家要资料,里面有参考代码,这对于快速上手很有帮助;

3.结合之前蓝桥杯比赛的代码知识,然后在csdn上搜原理是什么,笔者没附上原理讲解是因为别人写好的文章真的可以碾压我,适应别人的写法,然后自己重新默写一遍;

4.最最有意思的一步就是将你的智能门锁加上这个功能,门锁的第一步就是通过按键输入密码开门,你可以加上密码成功输入后就让舵机转过特定角度来开门。 

路径就是这么个路径,其中笔者感觉难在你要复习之前的知识,不过很快上手就是了。

二、代码上的一些分享

新建工程

调用江科大写好的代码

LCD1602.c

#include <REGX52.H>//引脚配置:
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
#define LCD_DataPort P0//函数定义:
/*** @brief  LCD1602延时函数,12MHz调用可延时1ms* @param  无* @retval 无*/
void LCD_Delay()
{unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);
}/*** @brief  LCD1602写命令* @param  Command 要写入的命令* @retval 无*/
void LCD_WriteCommand(unsigned char Command)
{LCD_RS=0;LCD_RW=0;LCD_DataPort=Command;LCD_EN=1;LCD_Delay();LCD_EN=0;LCD_Delay();
}/*** @brief  LCD1602写数据* @param  Data 要写入的数据* @retval 无*/
void LCD_WriteData(unsigned char Data)
{LCD_RS=1;LCD_RW=0;LCD_DataPort=Data;LCD_EN=1;LCD_Delay();LCD_EN=0;LCD_Delay();
}/*** @brief  LCD1602设置光标位置* @param  Line 行位置,范围:1~2* @param  Column 列位置,范围:1~16* @retval 无*/
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{if(Line==1){LCD_WriteCommand(0x80|(Column-1));}else if(Line==2){LCD_WriteCommand(0x80|(Column-1+0x40));}
}/*** @brief  LCD1602初始化函数* @param  无* @retval 无*/
void LCD_Init()
{LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动LCD_WriteCommand(0x01);//光标复位,清屏
}/*** @brief  在LCD1602指定位置上显示一个字符* @param  Line 行位置,范围:1~2* @param  Column 列位置,范围:1~16* @param  Char 要显示的字符* @retval 无*/
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
{LCD_SetCursor(Line,Column);LCD_WriteData(Char);
}/*** @brief  在LCD1602指定位置开始显示所给字符串* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  String 要显示的字符串* @retval 无*/
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=0;String[i]!='\0';i++){LCD_WriteData(String[i]);}
}/*** @brief  返回值=X的Y次方*/
int LCD_Pow(int X,int Y)
{unsigned char i;int Result=1;for(i=0;i<Y;i++){Result*=X;}return Result;
}/*** @brief  在LCD1602指定位置开始显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~65535* @param  Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');}
}/*** @brief  在LCD1602指定位置开始以有符号十进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:-32768~32767* @param  Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{unsigned char i;unsigned int Number1;LCD_SetCursor(Line,Column);if(Number>=0){LCD_WriteData('+');Number1=Number;}else{LCD_WriteData('-');Number1=-Number;}for(i=Length;i>0;i--){LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');}
}/*** @brief  在LCD1602指定位置开始以十六进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~0xFFFF* @param  Length 要显示数字的长度,范围:1~4* @retval 无*/
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i,SingleNumber;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){SingleNumber=Number/LCD_Pow(16,i-1)%16;if(SingleNumber<10){LCD_WriteData(SingleNumber+'0');}else{LCD_WriteData(SingleNumber-10+'A');}}
}/*** @brief  在LCD1602指定位置开始以二进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~1111 1111 1111 1111* @param  Length 要显示数字的长度,范围:1~16* @retval 无*/
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');}
}

LCD1602.h

#ifndef __LCD1602_H__
#define __LCD1602_H__//用户调用函数:
void LCD_Init();
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);#endif

实验现象:

按键部分

        也可以直接使用江科大的代码,毕竟对按键没有时间上的精确需求。所以用while卡死的方法来操作的话确实是会卡死,看看后面会不会有好方法来解决吧。

 key.c

#include "key.h"unsigned char key_read(void)
{unsigned char key_val=17;P1=0xff;P1_3=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);key_val=1;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);key_val=5;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);key_val=9;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);key_val=13;}P1=0xff;P1_2=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);key_val=2;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);key_val=6;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);key_val=10;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);key_val=14;}P1=0xff;P1_1=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);key_val=3;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);key_val=7;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);key_val=11;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);key_val=15;}P1=0xff;P1_0=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);key_val=4;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);key_val=8;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);key_val=12;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);key_val=16;}return key_val;
}

key.h 

#include <REGX52.H>
#include "tim.h"unsigned char key_read(void);

舵机部分

这部分的原理和代码原理可以直接在csdn上搜到很详细的讲解,笔者就不在原理讲解上献丑了,商家也会给参考代码。注释乱码想看的话从百度网盘下笔者的来看吧

sg90.c

#include "sg90.h"
//ÏëҪдÕâÑùµÄÒ»¸öº¯Êý
//ûÓзµ»ØÖµ ²ÎÊýÊǽǶȣ¬Ö´ÐÐÖ®ºó¶æ»úת¶¯µ½ÒªÇóµÄ½Ç¶È£¬
//´ó¸Å¹ý¸öÒ»ÃëÖ®ºó£¬»Øµ½Áã¶Èsbit motor_pin=P2^0;unsigned char pwm_count;
unsigned char pwm_vol;void Timer0_Isr(void) interrupt 1
{TL0 = (65526-100)%256;TH0 = (65526-100)/256;//100΢ÃîÒç³öÒ»´Îpwm_count++;if(pwm_count>=100)pwm_count=0;if(pwm_count<=pwm_vol)motor_pin=1;elsemotor_pin=0;
}void sg90_init(void)//³õʼ»¯£¬Èöæ»ú¸´Î»
{motor_pin=0;Timer0_Init();pwm_vol=4;Delay(600);
}void sg90_proc(unsigned char angle)//angle>=0&&angle<=180
{//pwm_vol=5 45//pwm_vol=10 90//pwm_vol=15 135//pwm_vol=20 180if(angle!=180)pwm_vol=angle/9+1;//ÓÐÎó²îËùÒÔ¼Ó¸ö1elsepwm_vol=18;//µ«Êǵ½180¶ÈµÄ»°²»Äܳ¬¹ý20£¬¾­¹ýµ÷ÊÔ18£¬¸Õ¸ÕºÃDelay(1000);pwm_vol=4;//¸´Î»Delay(600);
}

sg90.h

#include <REGX52.H>
#include "tim.h"void sg90_proc(unsigned char angle);
void sg90_init(void);

tim.c

现在定时器配置好像都是直接用手动重装载来得方便。定时器1留给你们自己玩,目前是用不到的。

#include "tim.h"void Delay(unsigned int xms)	//@12.000MHz 1ms
{unsigned char data i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}void Timer1_Init(void)		//1??@12.000MHz
{TMOD &= 0x0F;			//???????TL1 = 0x18;				//???????TH1 = 0xFC;				//???????TF1 = 0;				//??TF1??TR1 = 1;				//???1????ET1 = 1;				//?????1??EA  = 1;
}void Timer0_Init(void)		//100??@12.000MHz
{TMOD &= 0xF0;			//???????TMOD |= 0x01;TL0 = (65526-100)%256;TH0 = (65526-100)/256;TF0 = 0;				//??TF0??TR0 = 1;				//???0????ET0 = 1;				//?????0??EA  = 1;
}

 tim.h

#include <REGX52.H>void Delay(unsigned int xms);
void Timer1_Init(void);
void Timer0_Init(void);

main文件部分

main.c

//Í·ÎļþÓÃÕâ¸ö¾Í¹»ÓÃÁ˸оõ£¬µ½Ê±²»¹»ÓÃÔÙÓÃÄǸöf2k60s2µÄÍ·Îļþ
#include <REGX52.H>
#include "LCD1602.h"
#include "key.h"
#include "sg90.h"
#include "tim.h"//º¯ÊýÉùÃ÷
void Proc(void);
void Lcd_proc(void);//±äÁ¿
unsigned char key_num;//¼üÂëÖµ
unsigned long password;//ÃÜÂëÖµ
unsigned char count;//λÊý³¬¹ýÁùλ×Ô¶¯ÖØÐÂÊäÈë
unsigned char mode;//ģʽ±äÁ¿
bit bit1=0;//Ö÷º¯Êý
void main(void)
{LCD_Init();LCD_ShowString(1,1,"Smart Home");LCD_ShowString(2,1,"S13-go to Input");sg90_init();while(1){Lcd_proc();Proc();}
}void Proc(void)
{key_num=key_read();if(key_num==13)//´ú±í'*'¼ü{mode=1;}if(mode==1){if(key_num<10){if(count<5)//ÃÜÂë²»³¬¹ýÎåλ{password*=10;//×óÒÆpassword+=key_num%10;count++;}else{LCD_ShowNum(2,1,password,5);//³¬¹ýÎåλ֮ºó¾ÍÒ»Ö±ÏÔʾÊäÈëºÃµÄÃÜÂë}}LCD_ShowNum(2,1,password,5);if(key_num==14)//´ú±í¡°È·ÈÏ¡±¼ü{	if(count==5&&password==12345)//ÃÜÂë׼ȷ{bit1=1;//±ê־λÖÃ1£¬count=password=0;//¸´Î»mode=2;//2ģʽLCD_ShowNum(2,1,password,5);//Ë¢ÐÂÃÜÂëÏÔʾ}else if(count==5&&password!=12345)//ÃÜÂë´íÎó{count=password=0;mode=3;LCD_ShowNum(2,1,password,5);//Ë¢ÐÂÃÜÂëÏÔʾ}}}
}//дÕâ¸öº¯ÊýÊǸúÀ¶Çű­±¸ÈüµÄģʽ±äÁ¿·¨½áºÏÆðÀ´£¬¸Ð¾õÏÔʾºÍÅж϶ÀÁ¢¿ªÀ´»¹ÊDZȽϺõÄ
void Lcd_proc(void)
{	switch(mode){case 0:LCD_ShowString(1,1,"Smart Home    ");LCD_ShowString(2,1,"S13-go to Input");break;case 1:LCD_ShowString(1,1,"Input Password");LCD_ShowString(2,6,"          ");//°Ñ֮ǰÏÔʾµÄÄÚÈÝÇåÆÁbreak;case 2:if(bit1==1)//Èç¹ûÃÜÂë׼ȷ{LCD_ShowString(1,1,"Input Right!  ");bit1=0;//¸´Î»sg90_proc(180);//¿ØÖƶæ»úת¶¯180¶È}LCD_ShowString(1,1,"Welcome Home!  ");Delay(1000);//ÔÚÏÔʾ»¶Ó­»Ø¼ÒÖ®ºó¾Í»Øµ½ÆÁ±£½çÃæÄ£Ê½mode=0;break;case 3:LCD_ShowString(1,1,"Input Error!  ");Delay(1000);//ÔÚÏÔʾ»¶Ó­»Ø¼ÒÖ®ºó¾Í»Øµ½ÆÁ±£½çÃæÄ£Ê½mode=0;break;}
}

总结 

简单说明一下实验现象:

1.上电之后默认处于屏保界面正常显示;

2.S13按下进入输密码模式,界面切换,第二行显示五个0表示五位密码;

3.1~9输入密码,五位输入完毕再输入无效,直到按下S14按键进行密码准确性判断;

4.如果密码正确,(密码默认为12345)LCD屏幕上先显示“Input Right!"再显示欢迎回家一秒后,回到屏保界面可以重新再次输入;

5.如果密码错误,也会在一秒之后返回屏保界面;

问题:舵机转动时会影响屏幕显示。

待开发的功能:

1.输入错误超过某个数值,让其处于屏保界面五秒后才能再次输入;

2.密码输入可以从屏幕左边开始输入,且不会显示五个0,而是输入一位就用一位数字覆盖空格,输入到哪一位,哪一位就有光标在闪烁;密码为六位;

3.屏保界面右上角显示温度值;

4.不同模式不同指示灯,正确指示灯常亮,错误闪烁;(蜂鸣器太吵了,虽说也可以);

5.加入其他模块;(ic卡,蓝牙。。。)

如若有代码更新,笔者会第一时间发出来。

相关文章:

51单片机简单控制180度舵机

代码&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1K9dg2NwRhy49db_O_hqv-g?pwd1234 提取码&#xff1a;1234 一、路线 我在了解这个舵机之前最像想看到的是一个完全的路径。 比如我想学习b站上那个智能门锁&#xff0c;那就得每个模块的基本代码都会才能结合各…...

PCL 常用小知识

文章目录 一、时间计算二、实现类似`pcl::PointCloud::Ptr`和`pcl::PointCloud`的两个类相互转换三、查找点云的x,y,z的极值四、知道需要保存点的索引,从原点云中拷贝点到新点云五、从点云里删除和添加点六、对点云进行全局或局部变换七、链接两个点云字段(两点云大小必须相…...

rbd块设备数据IO流程(client端)

一、rbd内核驱动写入流程 1&#xff09;初始化 首先是rbd驱动的初始化工作&#xff1a;包括验证libceph的兼容性&#xff0c;分配内存&#xff0c;在sysfs中创建块设备控制文件、创建工作队列rbd_wq并调用INIT_WORK初始化它 module_init(rbd_init); static int __init rbd_i…...

数据仓库、数据中台、大数据平台之间的关系

数据行业经常会出现数据仓库、数据中台、大数据平台等概念&#xff0c;容易产生疑问&#xff0c;它们中间是相等&#xff0c;还是包含的关系&#xff1f; 数据中台和数据仓库概念的关系 数据中台概念是包含数据仓库的&#xff0c;数据仓库是数据中台中的一部分&#xff0c;包含…...

python写页面自动截图

from selenium import webdriver def take_screenshot(url, file_path):driver webdriver.Chrome()driver.get(url)driver.save_screenshot(file_path)driver.quit() if __name__ __main__:take_screenshot(http://baidu.com, D:\桌面\wang.png)要安装selenium还要安装google…...

【Qt 学习笔记】Qt常用控件 | 布局管理器 | 空白项Spacer

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 布局管理器 | 添加空白Spacer 文章编号&#xff1a;Qt 学…...

es问题汇总--待完善

1. 查询某个索引库中数据总量 方式一&#xff1a; CountRequest 鄙人喜欢这种方式 public long getTotalNum(String indexName) throws IOException {CountRequest countRequest new CountRequest(indexName);// 如果需要&#xff0c;你可以在这里添加查询条件// countReques…...

新一代高性价比LTE Cat.1通信模组ML307R

...

python 线性回归模型

教材链接-3.2. 线性回归的从零开始实现 c实现 该博客仅用于记录一下自己的代码&#xff0c;可与c实现作为对照 from d2l import torch as d2l import torch import random # nn是神经网络的缩写 from torch import nn from torch.utils import data# 加载训练数据 # 加载训…...

pcl::transformPointCloud()用法及注意事项

函数用法 #include <pcl/common/transforms.h> pcl::transformPointCloud(const pcl::PointCloud<PointT> &cloud_in, pcl::PointCloud<PointT> &cloud_out, const Eigen::Matrix4f &transform) 其中cloud_in, cloud_out的类型为pcl::PointClo…...

图像超分辨率重建相关概念、评价指标、数据集、模型

1、图像超分辨率概念 1.1 基本定义 超分辨率&#xff08;Super-Resolution&#xff09;&#xff0c;简称超分&#xff08;SR&#xff09;。是指利用光学及其相关光学知识&#xff0c;根据已知图像信息恢复图像细节和其他数据信息的过程&#xff0c;简单来说就是增大图像的分辨…...

中移物联OneMO Cat.1模组推动联网POS规模应用

在第三方支付蓬勃发展和消费模式不断革新的时代背景下&#xff0c;新型联网POS终端以其智能化、便捷化的特点丰富人们生活便利度。在这一变革浪潮中&#xff0c;中移物联OneMO Cat.1模组ML307R凭借其卓越的性能和成本效益&#xff0c;成为推动联网POS规模应用的重要力量。 性能…...

二.常见算法--贪心算法

&#xff08;1&#xff09;单源点最短路径问题 问题描述&#xff1a; 给定一个图&#xff0c;任取其中一个节点为固定的起点&#xff0c;求从起点到任意节点的最短路径距离。 例如&#xff1a; 思路与关键点&#xff1a; 以下代码中涉及到宏INT_MAX,存在于<limits.h>中…...

LabVIEW高温往复摩擦测试系统中PID控制

在LabVIEW开发高温往复摩擦测试系统中实现PID控制&#xff0c;需要注意以下几个方面&#xff1a; 1. 系统建模与参数确定 物理模型建立: 首先&#xff0c;需要了解被控对象的物理特性&#xff0c;包括热惯性、摩擦系数等。这些特性决定了系统的响应速度和稳定性。实验数据获取…...

配置yum源

以下是在 Linux 系统中配置新的 yum 源的一般步骤和命令示例&#xff08;以 CentOS 系统为例&#xff09;&#xff1a; 备份原有 yum 源配置文件&#xff1a;mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 创建新的 yum 源配置文件&#xff08…...

深入理解数仓开发(二)数据技术篇之数据同步

1、数据同步 数据同步我们之前在数仓当中使用了多种工具&#xff0c;比如使用 Flume 将日志文件从服务器采集到 Kafka&#xff0c;再通过 Flume 将 Kafka 中的数据采集到 HDFS。使用 MaxWell 实时监听 MySQL 的 binlog 日志&#xff0c;并将采集到的变更日志&#xff08;json 格…...

C++语言学习(六)—— 类与对象(二)

目录 一、对象数组 二、对象指针 三、this 指针 四、类类型作为参数类型的三种形式 4.1 对象本身作为参数 4.2 对象指针作为参数 4.3 对象引用作为参数 五、静态成员 5.1 静态数据成员 5.2 静态成员函数 六、友元机制 6.1 友元函数 6.2 友元类 七、类的组合 八、…...

3d选择模型后不能旋转什么原因?怎么解决?---模大狮模型网

在3D建模和渲染的过程中&#xff0c;旋转模型是常见的操作。然而&#xff0c;有时在选择了模型后&#xff0c;却发现无法进行旋转&#xff0c;这可能会让许多用户感到困扰。本文将探讨3D选择模型后不能旋转的可能原因&#xff0c;并提供相应的解决方法。 一、3D选择模型后不能旋…...

从入门到精通:详解Linux环境基础开发工具的使用

前言 在这篇文章中&#xff0c;我将深入学习和理解Linux环境基础开发工具的使用。无论你是初学者还是有一定经验的开发者&#xff0c;相信这篇文章都会对你有所帮助。我们将详细讲解软件包管理器、编辑器、编译器、调试器、自动化构建工具以及版本控制工具的使用。 Linux软件…...

linux(centos 7)安装 node

linux&#xff08;centos 7&#xff09;安装 node 下载对应版本&安装解压配置环境变量使配置文件生效验证是否安装成功附加 目前node最新版本是 node-v22.0.0 官网下载地址&#xff1a;https://registry.npmmirror.com/binary.html?pathnode/latest-v22.x/node-v22.0.0-li…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]

报错信息&#xff1a;libc.so.6: cannot open shared object file: No such file or directory&#xff1a; #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...

【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录

#工作记录 构建过程记录 Microsoft Windows [Version 10.0.27871.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝…...

【题解-洛谷】P10480 可达性统计

题目&#xff1a;P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图&#xff0c;分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M&#xff0c;接下来 M M M 行每行两个整数 x , y x,y x,y&#xff0c;表示从 …...

【字节拥抱开源】字节团队开源视频模型 ContentV: 有限算力下的视频生成模型高效训练

本项目提出了ContentV框架&#xff0c;通过三项关键创新高效加速基于DiT的视频生成模型训练&#xff1a; 极简架构设计&#xff0c;最大化复用预训练图像生成模型进行视频合成系统化的多阶段训练策略&#xff0c;利用流匹配技术提升效率经济高效的人类反馈强化学习框架&#x…...