嵌入式入门教学——C51
一、前期准备
1、硬件设备
2、软件设备
二、预备知识
1、什么是单片机?
- 在一片集成电路芯片上集成微处理器、存储器、IO接口电路,从而构成了单芯片微型计算机,及单片机。
- STC89C52单片机:
- STC:公司
- 89:所属系列
- C:工作电压(5.5V~3.8V)
- 52:程序空间及RAM空间大小(8KB程序空间及512B的RAM空间)
2、电平特性
- 定义单片机为TTL电平:高+5v、低0v
- RS232电平(计算机的串口):高-12v、低+12v
- 故计算机与单片机之间通讯时需要加电平转换芯片max232
3、二进制数的逻辑关系
- 与:&
- 或:+
- 非:!
- 异或:⊕(相同为0,不同为1)
4、80C51系列介绍
- 以8051为基核开发出的CMOS工艺单片机产品统称为80C51系列。
- STC(公司名)89(系列)C(CMOS)52(2为内部存储空间大小2*4=8k)RC
- 40(晶振频率)C(商业级-温度)-PDIP(封装格式)
- 0721(07年21周)CV4336
5、80C51引脚封装
- 总线型:四组,每组8位。
- 非总线型
6、C-51数据类型扩充定义
- sfr:特殊功能寄存器声明。
- sfr16:sfr16位数据声明。
- sbit:特殊功能位声明。
- bit:位变量声明。
7、C-51包含的头文件
- reg51.h:定义特殊功能寄存器和位寄存器。
- math.h:定义常用数学运算。
8、C-51的运算符
- >>:位右移
- <<:位左移
- &:按位与
- |:按位或
- ^:按位异或
- ~:按位取反
9、单片机主要掌握一下几点
- 最小系统能够运行起来的必要条件:电源、晶振、复位电路(程序从头执行)。
- 对单片机任意IO口的随意操作:输出控制电平高低、输出检测电平高低。
- 定时器:重点掌握最常用的方式2。
- 中断:外部中断、定时器中断、串口中断。
- 串口通信:单片机之间、单片机与计算机间。
10、电路图符号表示
- 电阻:R
- 电容:C
- 电感:L
- 集成块/芯片:U
- 地:GND
- 电源:VCC、AVDD、DVDD
三、LED模块
1、点亮一个LED
1.1、LED的位置
1.2、新建一个工程
- 新建一个工程。
- 选择存放位置,新建一个文件夹用于存放该工程。
- 进入文件夹,输入文件名,即工程名。
- 选择单片机的型号。选择Atmel下的AT89C52。(本单片机使用的是STC89C52)
- 新建一个c语言程序文件。
1.3、LED原理图
- 下图红框区域相连接。
- LED右端接的是电源,为高电平,故左端为低电平即可导通。(单片机默认输出高电平)
-
1.4、单片机如何控制LED
- P2寄存器的8位决定了LED的高低电平。1为高电平,0为低电平。
- 当为低电平时,低于外部电压,有电流通过,点亮led。
- 【注】51单片机所有IO口上电后默认全是高电平。
- 例如:控制第一个灯亮,p2寄存器应为:1111 1110。
1.5、进制转换
- c语言中,不能识别二进制,应该转换为十六进制。
- 例如:
- p2=1111 1110; // 错误
- p2=0xFE; // 正确,前面0x表示十六进制。
1.6、编写代码
#include <REGX52.H> // 头文件,定义特殊功能寄存器和位寄存器
void main(){P2=0xFE; // 1111 1110while(1); // 让程序停止在这,不让main重复执行
}
1.7、设置生成.hex下载文件
- 设置完后,编译程序,生成.hex文件。
1.8、将.hex文件下载到单片机中
- 将单片机连接电脑串口。
- 打开STC-ISP程序,选择hex文件,点击下载。
- 重启单片机,成功点亮第一个led。
2、LED闪烁
- 新建工程和c语言程序文件,与前相同。
- 尝试点亮一个led再熄灭它。
-
#include<REGX52.H> void main(){while(1){P2=0xFE; // 亮P2=0xFF; // 灭} }
- 结果led常亮,并未闪烁。原因是led闪烁的频率过快,人的肉眼无法捕捉。
- 使用STC-ISP生成延时函数。设置要与使用的单片机一致。
-
- 添加延时函数。
-
#include<REGX52.H> #inlcude<INTRINS.H> // 引入nop函数 void Delay500ms() // 500ms延时函数 {unsigned char i, j, k;_nop_();i = 4;j = 205;k = 187;do{do{while (--k);} while (--j);} while (--i); } void main(){while(1){P2=0xFE; // 亮Delay500ms(); // 延时500msP2=0xFF; // 灭Delay500ms();} }
- 编译后下载程序到单片机,LED灯以500ms的时间间隔闪烁。
3、LED流水灯
- 新建工程和c语言程序文件,设置生成hex文件。
- 编辑代码:
-
#include<regx52.h> #inlcude<intrins.h> // 引入nop函数 void Delay500ms() //500ms延时函数 {unsigned char i, j, k;_nop_();i = 4;j = 205;k = 187;do{do{while (--k);} while (--j);} while (--i); } void main(){while(1){P2=0xFE; // 1111 1110Delay500ms(); // 延时500msP2=0xFD; // 1111 1101Delay500ms();P2=0xFB; // 1111 1011Delay500ms();P2=0xF7; // 1111 0111Delay500ms();P2=0xEF; // 1110 1111Delay500ms();P2=0xDF; // 1101 1111Delay500ms();P2=0xBF; // 1011 1111Delay500ms();P2=0x7F; // 0111 1111Delay500ms();} }
- 编译后下载程序到单片机,LED灯以500ms的时间间隔流动。
- 原延时函数不方便,不能随时更改延时时间,重新编辑延时函数。先使用STC-ISP生成一个延时1ms的函数。
- C51数据类型
- 为延时函数添加一个参数,控制延时时间。
-
#include<regx52.h> void Delay(unsigned int xms) //带参延时函数 {unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);} } void main(){while(1){P2=0xFE; // 1111 1110Delay(500); // 延时500msP2=0xFD; // 1111 1101Delay(500);P2=0xFB; // 1111 1011Delay(500);P2=0xF7; // 1111 0111Delay(500);P2=0xEF; // 1110 1111Delay(500);P2=0xDF; // 1101 1111Delay(500);P2=0xBF; // 1011 1111Delay(500);P2=0x7F; // 0111 1111Delay(500);} }
- 带参数的延时函数更加灵活。
四、独立按键
1、独立按键控制LED亮灭
1.1、独立按键
- 相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。
1.2、独立按键原理图
- 下图红框区域相连接。
1.3、编写代码
- 由原理图知,K1由P3.1控制。
-
#include<regx52.h> void main(){//P2=0xFE;while(1){if(P3_1==0){ // K1按下P2_0=0; // 按位操作,在regx52.h头文件中有声明}else{ // K1松开P2_0=1;}} }
- K1按下,LED亮;K1松开,LED灭。
2、独立按键控制LED状态
2.1、按键的抖动
- 对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。
- 抖动会使对按键的判断产生一些误操作,可以通过代码解决。
2.2、解决抖动并控制LED状态
-
#include<regx52.h> void Delay(unsigned int xms) //带参延时函数 {unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);} } void main(){while(1){if(P3_1==0){ // K1按下// 防抖Delay(20);while(P3_1==0);Delay(20);P2_0=~p2_0; // 取反}} }
- 按下K1,没反应,松开K1,灯亮;按下K1,无反应,松开K1,灯灭。
3、独立按键控制LED显示二进制
-
#include<regx52.h> void Delay(unsigned int xms) {unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);} } void main(){unsigned char Led_Num=0; // 8位,相当于寄存器的8位while(1){if(P3_1==0){ // K1按下// 防抖Delay(20);while(P3_1==0);Delay(20);Led_Num++;P2=~Led_Num; // 取反}} }
- 每按一次按键,8个LED显示对应的二进制。
- 如:
,表示0000 0111。
4、独立按键控制LED移位
-
#include<regx52.h> void Delay(unsigned int xms) // 延时函数 {unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);} } void main(){unsigned char Led_Num=0;P2=~0x01; // 初始化while(1){// K1按键,左移if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);Led_Num++;if(Led_Num>=8) // 越界判断Led_Num=0;P2=~(0x01<<Led_Num);}// K2按键,右移if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);if(Led_Num==0)Led_Num=7;else Led_Num--;P2=~(0x01<<Led_Num);}} }
- 按下K1,LED左移一个;按下K2,LED右移一个。
五、数码管
1、静态数码管显示
1.1、数码管介绍
- 数码管是一种简单、廉价的显示器,是由多个发光极管封装在一起组成“8”字型的器件。
1.1.1、一位数码管
- 段的名称、引脚序号
- 共阴极连接、共阳极连接
- 例如,让共阴极数码管显示6。
,应该让A、C、D、E、F、G点亮。
- 首先需要将3,8引脚接地,即位选(让某个数码管亮)。
,控制7、4、2、1、9、10输出高电平,即段选(让数码管输出6)。
1.1.2、四位一体数码管
- 引脚序号
- 连接方式
- 例如,让共阴极数码管第3位显示1。
,需要如下图所示。
- 【注】同一时刻,只能有一个位被选中显示数字,或者4个位都显示相同的数字。(静态)
1.2、数码管原理图
- 上图左边74HC573为双向数据缓冲器,来提高驱动能力。
- 138译码器用来控制位选(3位输入,8位输出),原理如下表。
-
1.3、编写代码
- 让第三位数码管显示6。
-
#include<regx52.h>void main(){// 位选P2_4=1;P2_3=0;P2_2=1;// 段选P0=0x7D; // 0111 1101while(1); }
1.4、引入函数
-
#include<regx52.h> //段选 unsigned char NixieTable[]={0x3F, 0x06, 0x5B, 0x4F,0x66, 0x6D, 0x7D, 0x07,0x7F, 0x6F, 0x77, 0x7C,0x39, 0x5E, 0x79, 0x71, 0x00 } // 数码管显示函数 void Nixie(unsigned char Location, int Number){switch(Location){case 1: P2_4=1; P2_3=1; P2_2=1; break;case 2: P2_4=1; P2_3=1; P2_2=0; break;case 3: P2_4=1; P2_3=0; P2_2=1; break;case 4: P2_4=1; P2_3=0; P2_2=0; break;case 5: P2_4=0; P2_3=1; P2_2=1; break;case 6: P2_4=0; P2_3=1; P2_2=0; break;case 7: P2_4=0; P2_3=0; P2_2=1; break;case 8: P2_4=0; P2_3=0; P2_2=0; break;}P0=NixieTable[Number]; } void main(){Nixie(7,2);while(1); }
2、动态数码管显示
2.1、数码管消影
- 现象:数码管数字显示的位置错乱。
- 动态数码管显示过程:
- 位选 -> 段选 -> 位选 -> 段选。。。
- 原因:速度太快,数据串位。
- 解决方法:
- 位选 -> 段选 -> 清零 -> 位选 -> 段选。。。
2.2、编写代码
-
#include<regx52.h> // 延时函数 void Delay(unsigned int xms) {unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);} } //段选 unsigned char NixieTable[]={0x3F, 0x06, 0x5B, 0x4F,0x66, 0x6D, 0x7D, 0x07,0x7F, 0x6F, 0x77, 0x7C,0x39, 0x5E, 0x79, 0x71, 0x00 } // 数码管显示函数 void Nixie(unsigned char Location, int Number){switch(Location){case 1: P2_4=1; P2_3=1; P2_2=1; break;case 2: P2_4=1; P2_3=1; P2_2=0; break;case 3: P2_4=1; P2_3=0; P2_2=1; break;case 4: P2_4=1; P2_3=0; P2_2=0; break;case 5: P2_4=0; P2_3=1; P2_2=1; break;case 6: P2_4=0; P2_3=1; P2_2=0; break;case 7: P2_4=0; P2_3=0; P2_2=1; break;case 8: P2_4=0; P2_3=0; P2_2=0; break;}P0=NixieTable[Number];// 消影Delay(1);P0=0x00; } void main(){while(1){Nixie(1,1);//Delay(20);Nixie(2,2);//Delay(20);Nixie(3,3);//Delay(20);} }
2.3、数码管驱动方式
- 单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间(如上代码)。
- 专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉它显示什么即可。(TM1640芯片)
六、模块化编程及LCD1602调试工具
1、模块化编程
- 把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include "xxx.h"文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等。
1.1、案例
- Delay.h
-
#ifndef __DELAY_H__ #define __DELAY_H__void Delay(unsigned int xms);#endif
- 开头两句和最后一句代码是为了防止重复定义。(在头文件中都有)
- #ifndef __XX_H__:如果没有定义__XX_H__,执行下列语句。
- #define __XX_H__:定义__XX_H__。
- #endif:与#ifndef匹配,组成“括号”。
-
- Delay.c
-
void Delay(unsigned int xms) {unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);} }
-
- main.c
-
#include "Delay.h"void main(){Delay(20); }
-
1.2、注意事项
- .c文件:函数、变量的定义。
- .h文件:可被外部调用的函数、变量的声明。
- 任何自定义的变量、函数在调用前必须有定义或声明(同一个.c)。
- 使用到的自定义函数的.c文件必须添加到工程参与编译。
- 使用到的.h文件必须要放在编译器可寻找到的地方(工程文件夹根目录、安装目录、自定义)。
2、LCD1602调试工具
- 使用LCD1602液晶屏作为调试窗口,提供类似printf函数的功能,可实时观察单片机内部数据的变换情况,便于调试和演示。
函数 | 作用 |
LCD_Init(); | 初始化 |
LCD_ShowChar(1,1,A'); | 显示一个字符 |
LCD_ShowString(1,3,"Hello"); | 显示字符串 |
LCD_ShowNum(1,9,123,3); | 显示十进制数字 |
LCD_ShowSignedNum(1,13,-66,2); | 显示有符号十进制数宇 |
LCD_ShowHexNum(2,1,0xA8,2); | 显示十六进制数字 |
LCD_ShowBinNum(2,4,0xAA,8); | 显示二进制数宇 |
待续。。。
相关文章:

嵌入式入门教学——C51
一、前期准备 1、硬件设备 2、软件设备 二、预备知识 1、什么是单片机? 在一片集成电路芯片上集成微处理器、存储器、IO接口电路,从而构成了单芯片微型计算机,及单片机。STC89C52单片机: STC:公司89:所属…...
2023-08-03力扣每日一题
链接: 722. 删除注释 题意: 如题,特殊规则见链接 解: 字符串处理,嗯写就完事了,主要是判断指针位置和特殊规则 实际代码: #include<bits/stdc.h> using namespace std; vector<string> …...

【蓝桥杯备考资料】如何进入国赛?
目录 写在前面注意事项数组、字符串处理BigInteger日期问题DFS 2013年真题Java B组世纪末的星期马虎的算式振兴中华黄金连分数有理数类(填空题)三部排序(填空题)错误票据幸运数字带分数连号区间数 2014年真题蓝桥杯Java B组03猜字…...

QtWebApp开发https服务器,完成客户端与服务器基于ssl的双向认证
引言:所谓http协议,本质上也是基于TCP/IP上服务器与客户端请求和应答的标准,web开发中常用的http server有apache和nginx。Qt程序作为http client可以使用QNetworkAccessManager很方便的进行http相关的操作。Qt本身并没有http server相关的库…...
动态IP代理的优势展现与应用场景
在当今数字化时代,网络安全和隐私保护变得愈发重要。作为一家动态IP代理产品供应商,我们深知在保护个人隐私和提高网络安全性方面的重要性。本文将会分享动态IP代理的优势及其在不同应用场景下的实际应用案例,帮助更好地了解和应用动态IP代理…...

ad+硬件每日学习十个知识点(22)23.8.2(LDO datasheet手册解读)
文章目录 1.LDO的概述、features2.LDO的绝对参数(功率升温和结温)3.LDO的引脚功能4.LDO的电气特性5.LDO的典型电路(电容不能真用1uF,虽然按比例取输出值,但是R2的取值要考虑释放电流)6.LDO的开关速度和线性…...

这可是全网最全的网络工程师零基础实战视频整理,最新版分享
互联网中每一项傍身的技能都是需要从如何入门开始的,网络技术也是如此! 网络技术区别其他互联网技能的一点是学习需要从设备开始,只有认识了解了路由器、交换机、防火墙这些网络设备,才开始从网络通信原理开始,这使得网…...

笔记本WIFI连接无网络【实测有效解决方案,不用重启电脑】
笔记本Wifi连接无网络实测有效解决方案 问题描述: 笔记本买来一段时间后,WIFI网络连接开机一段时间还正常连接,但是过一段时间显示网络连接不上解决方案: 1.编写网络重启bat脚本,将以下内容写到文本文件,把…...
js 正则表达式配合replace进行过滤html字符串遇到的性能问题
问题场景复现: 博主要实现一个邮箱列表,其中列表中的每一封邮件都有一个摘要,但是摘要是要自己从后端提供的content内容区自己过滤掉所有,只留下纯文本内容的前面几行作为摘要。 性能问题 当我测试到一个邮箱,其中的…...
2022牛客寒假算法基础集训营1
B题 炸鸡块君与FIFA22 题目大意: 给出胜负序列,每次询问区间 (l,r,s) ,回答在经历 (l-r) 之后积分是多少,初始积分为 (s) 胜 (1) 积分,平 (0) 积分,败的时候如果此时积分为 (3) 的倍数则 (-0) ,…...
API对接:构建连接不同系统的技术桥梁
API(Application Programming Interface)是一种用于不同软件系统之间进行通信和数据交换的技术。本文将介绍API对接的基本概念和原理,并通过代码示例演示如何使用API对接不同系统,解决数据传输与通信的难题。 在当今数字化时代&a…...

【MySQL】仓储--维护出入库流水、库存,去重数量逻辑修正
系列文章 C#底层库–MySQLBuilder脚本构建类(select、insert、update、in、带条件的SQL自动生成) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/129179216 C#底层库–MySQL数据库操作辅助类(推荐阅读࿰…...

用Log4j 2记录日志
说明 maven工程中增加对Log4j 2的依赖 下面代码示例的maven工程中的pom.xml文件中需要增加对Log4j 2的依赖: <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.20.0&…...
【Java面试】Paxos和Raft协议的区别?
面试官:你简历上说了解Paxos和Raft协议,说一下你对这两个协议的了解? 我:Paxos算法和Raft算法都是用于实现分布式系统中的一致性的算法,确保不同节点之间的数据一致。 我:Paxos算法它的目标是使多个节点能…...

手机浏览器H5打开微信小程序支付,自定义传参
微信官方提供的开放文档如下: 静态网站 H5 跳小程序 | 微信开放文档 想必大家都能看懂官网提供的文档,但实战时却遇到很多问题,博主总结一下遇到的坑,如果您也有遇到,希望可以帮到您。 1.小程序已经发布上线了&…...

Aligning Large Language Models with Human: A Survey
本文也是LLM相关的综述文章,针对《Aligning Large Language Models with Human: A Survey》的翻译。 对齐人类与大语言模型:综述 摘要1 引言2 对齐数据收集2.1 来自人类的指令2.1.1 NLP基准2.1.2 人工构造指令 2.2 来自强大LLM的指令2.2.1 自指令2.2.2 …...

windows图标白了,刷新图标
1.进入C盘,user(用户文件夹),进入当前用户文件夹,再进入隐藏文件夹(AppDada),最后进入Local 2.删除Local文件夹里的IconCache.db文件 3.重启资源管理器 -------------------------------------------- 或者创建bat文件…...

C++ 左值和右值
C 左值和右值 左值、右值左值引用、右值引用std::move()std::move()的实现引用折叠 完美转发forward()的实现函数返回值是左值还是右值如何判断一个值是左值还是右值 左值、右值 在C11中所有的值必属于左值、右值两者之一,右值又可以细分为纯右值、将亡值。在C11中…...

c++学习(智能指针)[29]
RALL RALL(Resource Acquisition Is Initialization)是一种 C 的编程技术,用于管理资源的获取和释放。它的基本思想是在对象的构造函数中获取资源,在对象的析构函数中释放资源,从而确保资源的正确获取和释放。 RALL 的…...
B站高播放又涨粉的带货UP主怎么做?
飞瓜数据(B站版)上线新功能【带货达人榜】,由榜单显示,B站7月带货达人中,平均播放量最高的是UP主下个月一定中100万。 带货视频仅1支,播放量已经高达679万,值得一提的是,6月他也是带…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...