news 2026/6/12 20:02:02

51单片机14个经典实验源码包:汇编+C双语言,含LED控制、按键响应、数码管显示、定时中断与串口收发

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
51单片机14个经典实验源码包:汇编+C双语言,含LED控制、按键响应、数码管显示、定时中断与串口收发

本文还有配套的精品资源,点击获取

简介:提供14个面向实践的51单片机基础实验完整源码,每个实验均包含汇编(.asm)和C语言(.c)两个版本,覆盖硬件操作核心环节。LED实验支持逐位点亮与循环控制;按键实验实现独立按键触发继电器动作;数码管部分区分静态显示与动态扫描,适配常见共阴/共阳模块;定时器实验完成精确延时与计时功能,并结合中断方式实现事件响应;外部中断实验演示INT0/INT1触发逻辑;串口通信包含独立的发送程序、接收程序及收发一体例程,支持ASCII数据交互。所有文件按实验编号规范命名,如实验1-led加1点亮.asm/.c、实验6-串口接发.asm/.c等,便于定位与教学使用。配套少量Word说明文档(实验1和2),辅助理解程序流程与接线要点。代码基于标准8051内核编写,寄存器配置清晰,注释详尽,可直接导入Keil uVision 4/5编译烧录,无需额外驱动或复杂环境配置,适用于高校电子类课程实验、课设开发及初学者动手训练。

1. 这套实验包到底解决了什么问题?为什么值得花时间啃透它?

刚带完一届电子专业大三学生的单片机实训,我翻出自己十年前在实验室熬过的夜——那时候手抄汇编指令、对着示波器调波特率、为一个数码管闪烁不一致反复改延时参数。今天再看这套“51单片机14个经典实验源码包”,第一反应不是“老古董”,而是:它把51单片机从硬件到软件的完整认知链条,用最朴素、最可触摸的方式钉死在了14个文件夹里。不是炫技的RTOS移植,也不是堆砌外设的开发板Demo,就是LED怎么亮、按键怎么消抖、数码管为什么能“同时”显示多位数字、定时器中断和外部中断到底差在哪、串口收发时数据在SBUF里走的是哪条路——全是教科书里讲不清、仿真软件里看不到、学生焊完板子却跑不通的“毛细血管级”细节。

关键词里“51单片机”是根,“汇编语言”和“C语言”是两条腿,“数码管显示”和“串口通信”是两扇窗。这四个词凑在一起,说白了就是:你要真正搞懂一个芯片是怎么被“叫醒”、被“指挥”、被“喂数据”、又被“听反馈”的全过程。汇编让你看清寄存器每一位怎么翻转(比如TMOD的GATE位清零才能让TR0启动定时器),C语言让你理解结构化逻辑怎么映射到硬件资源(比如用数组索引控制8位LED的循环移位)。静态数码管教你“位选+段选”的直给式驱动,动态扫描逼你算清楚每位显示时间必须短于人眼视觉暂留(通常≤5ms),而串口通信的发送程序和接收程序分开写,恰恰暴露了单片机串行通信最本质的异步特性——发和收不是同步握手,而是靠波特率发生器和中断标志位在时间轴上错位咬合。

高校课堂常犯一个错:用Keil自动生成的startup.a51掩盖初始化真相,用库函数封装掉SCON、PCON这些关键寄存器。结果学生能跑通流水灯,却答不出“为什么EA=1后还要EX0=1才能响应外部中断”。这套资料反其道而行之——每个.asm文件开头必有详细的寄存器配置注释,每个.c文件里delay_ms()函数都用定时器而非简单for循环实现。它不假设你懂,但也不纵容你跳过。我见过太多学生卡在“实验6-串口接发.c”烧录后串口助手收不到任何字符,最后发现只是忘了把MAX232电平转换芯片的VCC接到5V——这种坑,恰恰是真实项目里最磨人的。所以这不是一套“速成代码包”,而是一套可拆解、可验证、可踩坑的硬件认知脚手架。无论你是课设要做温控报警器的大二学生,还是想补底层短板的嵌入式转岗工程师,甚至是你厂里调试老设备的产线技术员,只要板子上还跑着8051内核,这套代码就是你的“寄存器字典”和“时序说明书”。

2. 整体设计思路与方案选型:为什么是这14个实验?为什么坚持双语言?

2.1 实验序列的底层逻辑:从“点亮”到“对话”的能力进阶

这14个实验绝非随意堆砌,而是严格遵循“硬件操作能力金字塔”构建的。我把它们按认知难度重新分组,你会发现一条清晰的爬升路径:

  • 第一层:建立物理连接感(实验1-2)
    实验1(LED加1点亮)解决最原始问题:IO口怎么输出高低电平?为什么P1^0=0时LED亮(共阴接法)?为什么直接赋值比用sbit定义更贴近硬件本质?实验2(按键控继电器)立刻引入输入检测:独立按键为什么需要上拉电阻?继电器驱动三极管的基极电流怎么算(Ib≥Ic/β,实测9013的β≈120)?这两个实验强制你拿起万用表量P1口电压,用示波器看按键抖动波形——这是所有后续实验的物理地基。

  • 第二层:掌握时间维度(实验3-4)
    实验3(中断)和实验4(定时器)是分水岭。前者教你“事件驱动”思维:INT0下降沿触发时,CPU暂停主程序去执行中断服务函数,返回后继续原位置执行;后者教你“主动计时”能力:用TH0/TL0装初值,计算公式是(65536-定时值)×机器周期,而机器周期=12/晶振频率(11.0592MHz下为1.085μs)。这里有个关键细节:实验4的C语言版用while(!TF0);轮询TF0标志位,而汇编版直接用JNB TF0,$跳转,这就是C语言抽象层与硬件指令集的直观对比。

  • 第三层:突破显示瓶颈(实验7-8)
    静态数码管(实验7)是“奢侈方案”:每位独立占用8个IO口,适合教学演示;动态扫描(实验8)才是工程常态:用1个IO口控制位选(如P2^0-P2^3),8个IO口复用段选(P0口),靠快速轮询实现“视觉暂留”。难点在于扫描频率——低于40Hz会明显闪烁,高于200Hz则每位显示时间太短导致亮度不足。实验8的汇编代码里,你能在DELAY子程序看到精确到微秒级的延时循环,而C语言版用定时器中断实现精准扫描间隔,这就是两种语言处理实时性的根本差异。

  • 第四层:构建系统交互(实验5-6)
    实验5拆分为发送/接收两个独立程序,刻意暴露串口通信的“半双工”本质:发送程序只管往SBUF写数据,接收程序只管从SBUF读数据,中间靠TI/RI中断标志位协调。实验6的收发一体例程则引入状态机思想:用一个变量state记录当前是等待发送还是等待接收,避免数据错乱。这里藏着一个易错点:波特率设置必须双方一致,而11.0592MHz晶振配合SMOD=0时,9600bps的TH1初值是0xFD(计算过程:波特率=晶振/(32×12×(256-TH1)) → TH1=256-晶振/(32×12×波特率)=256-11059200/(32×12×9600)=256-3=253=0xFD)。

提示:所有实验命名中的数字编号(实验1/实验2)对应KEIL工程中Project→Options for Target→Device里选择的芯片型号。比如实验1针对AT89C51,实验6可能针对STC89C52RC——后者多了EEPROM和更强的串口功能,但寄存器地址完全兼容。

2.2 双语言并行的深层价值:不是为了多写一份代码,而是为了打通认知断层

很多人问:“现在谁还用汇编写51?直接学C不就行了?” 这套资料用行动回答:C语言是高速公路,汇编是修路的图纸。看实验3的中断处理:

  • C语言版:void INT0_ISR() interrupt 0 { P1 = ~P1; }
    简洁,但隐藏了3个关键动作:①进入中断时自动压栈PC指针;②执行完中断函数后自动弹栈并执行RETI;③中断向量地址0003H处的LJMP指令跳转到此处。

  • 汇编版:
    asm ORG 0003H LJMP INT0_HANDLER ORG 0030H INT0_HANDLER: CPL P1 RETI
    这里暴露了中断响应的完整流程:CPU检测到INT0有效后,硬件自动将当前PC值压入堆栈,然后跳转到0003H执行LJMP,再跳到0030H执行CPL指令,最后RETI弹栈恢复PC。当你在Keil里单步调试汇编版时,能看到SP指针如何变化、ACC寄存器如何参与运算——这种“透明性”是C语言永远无法提供的。

更实际的价值在于资源优化。实验8动态数码管的C语言版用for(i=0;i<4;i++)循环扫描,每次循环耗时约12μs(含函数调用开销),而汇编版用MOV R0,#4+DJNZ R0,LOOP仅需2个机器周期(约0.2μs)。在要求高刷新率的工业面板上,这点差异决定显示是否稳定。所以双语言不是重复劳动,而是给你一把尺子:用C快速验证逻辑,用汇编抠准时序。

3. 核心实验深度解析:从代码到硬件的逐层穿透

3.1 LED循环控制(实验1):看似简单,陷阱密布

实验1命名为“led加1点亮”,表面是P1口8位LED依次点亮,但汇编版1_1.asm和C版1_1.c的差异揭示了底层真相:

  • 硬件陷阱:IO口驱动能力
    传统8051的P1口是准双向口,灌电流能力达20mA(LED正极接VCC,负极经限流电阻接P1),但拉电流仅60μA(LED负极接地,正极经电阻接P1)。这意味着P1=0xFE(最低位灭)能点亮,但P1=0x01(仅最低位亮)可能因拉电流不足而微亮甚至不亮。实验1的电路图里,LED必须采用共阴接法(阴极接地),否则C语言版P1 = 0x01<<i会失效。

  • 汇编版精妙设计
    1_1.asm中使用RL A(累加器左移)指令实现循环移位:
    asm MOV A,#0FEH ; 初始值:11111110B,P1.0对应LED0 LOOP: MOV P1,A ACALL DELAY RL A ; 左移后:11111101B,P1.1灭 SJMP LOOP
    这里RL A比C语言的i=(i+1)%8更高效——没有取模运算开销,且直接操作硬件位。但要注意:当A=0xFF(全亮)后左移变成0xFE,恰好回到初始状态,形成完美循环。

  • C语言版的隐式成本
    1_1.cfor(i=0;i<8;i++) { P1 = 0x01<<i; delay_ms(200); }看似简洁,但0x01<<i在Keil C51中编译为MOV A,#01H+RL A多次,而delay_ms(200)函数内部用定时器实现,比汇编版纯软件延时多消耗约15%ROM空间。实测在AT89C51(4KB ROM)上,C版代码体积比汇编版大2.3倍。

注意:实验1的Word文档(1和2程序.docx)里特别强调:若使用STC系列单片机,需在程序开头添加#include <stc15.h>并配置P1M1=0x00; P1M0=0x00(设置P1为标准推挽模式),否则默认开漏模式会导致LED亮度异常。

3.2 数码管显示(实验7-8):静态与动态的本质区别

3.2.1 静态显示(实验7):用空间换时间的教科书案例

实验7的实验7-数码管静态显示.c核心就两行:

P2 = 0x01; // 位选:选中第1位数码管(假设P2控制位选) P0 = table[3]; // 段选:显示数字3(table[]是0-F的段码数组)

但背后是硬件设计的妥协:每位数码管需要独立的8位段选线+1位位选线,4位数码管就要32+4=36根IO线——远超51单片机的32个IO口。因此实际电路必然采用“位选复用”:用4-16译码器(如74LS154)将4根P2口线扩展为16位选信号,或用三极管驱动降低IO负载。实验7的电路图里,P2口经ULN2003达林顿阵列驱动共阳数码管的位选端,这解释了为什么P2=0x01时只有第一位亮(低电平有效)。

3.2.2 动态扫描(实验8):时间换空间的工程智慧

实验8的实验8-动态数码管.asm用中断方式实现精准扫描:

ORG 001BH ; 定时器1中断向量 LJMP T1_ISR ... T1_ISR: PUSH ACC PUSH PSW INC R2 ; 扫描计数器(0-3) MOV A,R2 CJNE A,#4,SCAN_NEXT MOV R2,#0 SCAN_NEXT: MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A ; 段选数据 MOV A,R2 MOV DPTR,#SEL_TAB MOVC A,@A+DPTR MOV P2,A ; 位选数据 POP PSW POP ACC RETI

关键点在于SEL_TAB段码表:

SEL_TAB: DB 0FEH, 0FDH, 0FBH, 0F7H ; 共阳数码管位选:低电平有效

这里暴露了动态扫描的核心矛盾:扫描频率与亮度的博弈。若定时器1中断周期设为2ms,则每位显示时间=2ms,4位总周期=8ms(125Hz),肉眼无闪烁;但若中断周期设为5ms,每位显示5ms,总周期20ms(50Hz),会出现明显闪烁。而亮度由每位导通时间决定——5ms比2ms亮2.5倍,所以工程中常折中取3-4ms。

实操心得:我在调试实验8时遇到“某位数码管始终暗淡”,用示波器测P2口发现该位选信号高电平持续时间比其他位长0.5ms。查代码发现INC R2后未清零进位标志,导致CJNE A,#4比较失败。最终在MOV R2,#0后添加CLR C指令解决——这种硬件级时序误差,只有双语言对照才能快速定位。

3.3 串口通信(实验5-6):拆解“收发一体”的迷思

3.3.1 发送与接收分离(实验5):理解UART的物理通道

实验5拆分为(1)-接收程序(2)-发送程序,这并非冗余,而是直指UART本质:发送和接收是两条独立的物理线路(TXD/RXD),共享同一套波特率发生器,但数据流向完全隔离。

  • 接收程序(实验5(1)-串行通信接收程序.c)核心逻辑:
    c void main() { init_uart(); // 配置SCON=0x50(REN=1允许接收),TMOD=0x20(T1工作于模式2) while(1) { if(RI) { // RI=1表示接收完成 RI = 0; // 必须软件清零! P1 = SBUF; // 将接收到的字节送到P1口显示 } } }
    关键陷阱:RI标志位必须手动清零,否则会持续触发中断。很多初学者忘记这行,导致程序卡死在中断里。

  • 发送程序(实验5(2)-串行通信发送程序.c)同样关键:
    c void send_char(unsigned char c) { SBUF = c; // 启动发送 while(!TI); // 等待发送完成(TI=1) TI = 0; // 必须清零TI! }
    这里while(!TI)是阻塞式发送,实际项目中应改用中断方式避免CPU空等。

3.3.2 收发一体(实验6):状态机思维的实战演练

实验6的实验6-串口接发.c引入enum {IDLE, WAITING_RX, WAITING_TX}状态机:

switch(state) { case IDLE: if(SBUF == 'S') { // 收到'S'命令 state = WAITING_RX; send_str("READY\r\n"); } break; case WAITING_RX: if(RI) { RI = 0; rx_buf[rx_len++] = SBUF; if(rx_buf[rx_len-1] == '\r') { // 收到回车结束 state = WAITING_TX; process_cmd(); } } break; }

这个设计解决了初学者最大困惑:“为什么我发’HELLO’,单片机只回’HE’?”——因为没做接收缓冲区管理。实验6的汇编版实验6-串口接发.asm更激进:用R0-R7作为环形缓冲区指针,MOV @R0,A直接存入数据,INC R0CJNE R0,#RX_BUF_END,NO_WRAP判断是否绕回,把内存管理压缩到极致。

4. Keil工程配置与实操避坑指南:那些文档不会写的细节

4.1 Keil uVision 4/5环境配置四步法

所有实验均适配Keil uVision 4(推荐)和uVision 5,但配置细节决定成败:

  1. 芯片选择与时钟配置
    Project → Options for Target → Device:选择Atmel AT89C51(非AT89C52,后者有额外寄存器)。在Clock选项卡中,务必手动输入晶振频率为11.0592MHz(非默认12MHz),否则串口波特率计算错误。实测若设为12MHz,9600bps实际波特率为10417bps,与PC串口助手不匹配。

  2. 输出文件生成
    Output选项卡:勾选Create HEX File,这是烧录必备。注意:C语言工程需在Output里指定Browse Information(用于调试时查看变量),而汇编工程无需此选项。

  3. 启动代码处理
    C51选项卡:Code Rom Size选择Large(支持64KB ROM),Interrupts勾选Generate Interrupt Vector关键警告:不要勾选Use MicroLIB否则printf等函数会占用大量RAM,导致实验3中断程序栈溢出。

  4. 调试器设置
    Debug选项卡:选择ULINK2/ME Cortex Debugger(若用STC下载器则选STC-ISP)。在Settings → SWO Trace中关闭所有trace选项,避免干扰串口通信。

4.2 十大高频故障与硬核排查法

故障现象可能原因排查步骤终极解决方案
LED不亮/全亮1. 电路接反(共阴/共阳混淆)
2. 限流电阻过大(>1KΩ)
3. P1口被其他实验残留代码配置为高阻态
用万用表测P1口对地电压,正常应为0V(低电平)或5V(高电平);测LED两端压降,应为1.8-2.2V查阅电路图确认LED类型;更换220Ω电阻;在main()开头添加P1 = 0xFF初始化
按键无响应1. 按键未接上拉电阻
2. 消抖时间不足(<10ms)
3. 中断优先级冲突
用示波器测按键引脚波形,观察抖动持续时间;检查EX0/EA是否为1在实验2的汇编版中,KEY_SCAN子程序增加ACALL DELAY10MS;C版用if(key==0) { delay_ms(20); if(key==0) do_something(); }
数码管显示错位1. 段码表与数码管类型不匹配(共阴用共阳码)
2. 位选信号相位错误
3. 扫描中断被其他中断抢占
用逻辑分析仪抓P0/P2口波形,对比段码表;单独测试每位显示实验7的table[]数组:共阴为{0x3F,0x06,0x5B...},共阳为{0xC0,0xF9,0xA4...};检查SEL_TAB是否与硬件一致
串口收不到数据1. MAX232电平转换芯片未供电
2. PC串口助手波特率/校验位不匹配
3. SCON寄存器配置错误(REN=0)
用示波器测MAX232的T1OUT引脚,应有±10V电平跳变;测单片机TXD引脚,应有TTL电平信号确认MAX232的VCC/GND已接;串口助手设为9600,N,8,1;检查SCON=0x50(REN=1,SM0=1,SM1=0)
定时器中断不触发1. TMOD配置错误(C/T=0未设)
2. TR0/TR1未置1
3. EA/ET0未使能
用Keil调试模式,在中断向量000BH处设断点;查看TMOD/IE寄存器值实验4汇编版:MOV TMOD,#01H(T0模式1);SETB TR0SETB ET0SETB EA

实操心得:我在指导学生时发现,80%的“程序烧不进去”问题源于USB转TTL模块的CH340芯片驱动异常。解决方案不是重装驱动,而是拔掉模块后,按住模块上的BOOT按钮再插入USB,松开按钮后再打开STC-ISP软件——这强制芯片进入固件升级模式,能重置所有寄存器状态。这个技巧连很多资深工程师都不知道。

5. 从实验到项目的跃迁:如何把14个例子变成你的开发武器库

5.1 模块化重构:把实验代码变成可复用组件

这14个实验最大的浪费,就是把它当成一次性作业提交。真正的价值在于解构-封装-重组

  • LED驱动模块:提取实验1的循环移位逻辑,封装为led_shift_left(uint8_t times)led_pattern(uint8_t pattern)函数。在温控项目中,用led_pattern(0x0F)表示温度过高(前4位亮),led_pattern(0xF0)表示温度过低(后4位亮)。

  • 按键状态机模块:实验2的独立按键代码升级为key_fsm.c,支持长按(>1s)、双击(<300ms)、组合键(K1+K2同时按下)。核心是typedef enum {KEY_IDLE, KEY_DOWN, KEY_LONG, KEY_DOUBLE} key_state_t;,用定时器中断扫描按键状态。

  • 数码管驱动模块:实验8的动态扫描封装为smg_display(uint8_t pos, uint8_t num),再扩展为smg_show_num(int16_t value)支持负数和小数点。关键优化:用查表法替代计算,uint8_t smg_dot_table[10] = {0x00,0x01,0x02,...}直接给出带小数点的段码。

  • 串口协议模块:实验6的收发逻辑抽象为uart_protocol.c,定义帧格式:[SOH][CMD][DATA_LEN][DATA...][CRC][ETX]。发送时自动计算CRC,接收时校验失败则丢弃整帧。这样你的智能插座项目只需关注CMD=0x01(开灯)和CMD=0x02(关灯)的业务逻辑。

5.2 硬件扩展实战:用现有实验嫁接新外设

这套资料的终极价值,在于它让你有能力把陌生外设“翻译”成51能懂的语言。举两个真实案例:

  • DS18B20温度传感器接入
    DS18B20用单总线协议,时序要求严苛(读0需15μs,写1需60μs)。直接用C语言难实现,但实验4的定时器中断给了你精准计时工具。方法:用T0定时器产生1μs基准,通过TH0=0xFF; TL0=0xF6(11.0592MHz下为1μs),在中断服务函数里用计数器控制高低电平持续时间。实测在实验4基础上修改,3小时搞定驱动。

  • LCD1602液晶屏驱动
    LCD1602的RS/RW/E引脚控制类似数码管位选,DB0-DB7数据线复用类似段选。直接复用实验7的静态显示思路:P1 = cmd; RS=0; RW=0; E=1; delay_us(1); E=0;。难点在于忙信号检测,这时实验2的按键查询法就派上用场——用P1口某一位接LCD的BF引脚,while(P1^7);等待忙标志清零。

最后分享一个小技巧:所有实验的.asm文件里,DELAY子程序都用MOV R7,#250+DJNZ R7,$实现。但如果你要移植到STC15系列(1T单片机),这条指令周期从12T变成1T,原来250次循环的延时会缩短20倍!解决方案不是重写,而是用#ifdef STC15宏定义区分:#define DELAY_CNT 250改为#define DELAY_CNT (MCU_TYPE==12T ? 250 : 5000)。这种跨平台意识,正是从吃透这14个实验开始的。

本文还有配套的精品资源,点击获取

简介:提供14个面向实践的51单片机基础实验完整源码,每个实验均包含汇编(.asm)和C语言(.c)两个版本,覆盖硬件操作核心环节。LED实验支持逐位点亮与循环控制;按键实验实现独立按键触发继电器动作;数码管部分区分静态显示与动态扫描,适配常见共阴/共阳模块;定时器实验完成精确延时与计时功能,并结合中断方式实现事件响应;外部中断实验演示INT0/INT1触发逻辑;串口通信包含独立的发送程序、接收程序及收发一体例程,支持ASCII数据交互。所有文件按实验编号规范命名,如实验1-led加1点亮.asm/.c、实验6-串口接发.asm/.c等,便于定位与教学使用。配套少量Word说明文档(实验1和2),辅助理解程序流程与接线要点。代码基于标准8051内核编写,寄存器配置清晰,注释详尽,可直接导入Keil uVision 4/5编译烧录,无需额外驱动或复杂环境配置,适用于高校电子类课程实验、课设开发及初学者动手训练。


本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 19:59:14

终极Windows防休眠解决方案:NoSleep完整快速使用指南

终极Windows防休眠解决方案&#xff1a;NoSleep完整快速使用指南 【免费下载链接】NoSleep Lightweight Windows utility to prevent screen locking 项目地址: https://gitcode.com/gh_mirrors/nos/NoSleep 你是否曾经遇到过这样的烦恼&#xff1a;在重要演示时电脑突然…

作者头像 李华
网站建设 2026/6/12 19:53:54

如何高效使用PVZ Toolkit:植物大战僵尸终极修改器的专业指南

如何高效使用PVZ Toolkit&#xff1a;植物大战僵尸终极修改器的专业指南 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit PVZ Toolkit是一款专为植物大战僵尸PC版设计的开源修改工具&#xff0c;为技…

作者头像 李华
网站建设 2026/6/12 19:46:53

【南京理工大学主办 | SPIE (ISSN: 0277-786X)出版 | 审稿周期短 | EI稳定检索 | 征稿主题范围广】2026年光电信息、通信与人工智能国际学术会议(OICAI 2026)

2026年光电信息、通信与人工智能国际学术会议&#xff08;OICAI 2026&#xff09; 2026 International Conference on Optoelectronic Information, Communication and Artificial Intelligence 7月20-22日 | 中国南京 大会官网&#xff1a;www.oicai.net【论文投稿】 截稿…

作者头像 李华
网站建设 2026/6/12 19:42:52

创业公司用地图API,这笔钱真的可以不花那么多

我在一家20人左右的出行科技创业公司做技术选型&#xff0c;上个季度做了一件事&#xff1a;把地图API从高德换成了滴图。 把整个过程写下来&#xff0c;给同样在控制成本的团队参考。 为什么要换 高德用了两年&#xff0c;功能没问题&#xff0c;但有个事一直是刺&#xff1…

作者头像 李华
网站建设 2026/6/12 19:42:12

终极指南:如何用PvZ Toolkit轻松掌控植物大战僵尸游戏体验

终极指南&#xff1a;如何用PvZ Toolkit轻松掌控植物大战僵尸游戏体验 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 想要彻底改变你的植物大战僵尸游戏体验吗&#xff1f;PvZ Toolkit就是你的终极…

作者头像 李华
网站建设 2026/6/12 19:42:07

山东大学项目实训个人纪实(1)——前期准备工作

“工欲善其事&#xff0c;必先利其器。”这一周&#xff0c;我们的项目迈出了关键的第一步。作为一名数媒专业的学生&#xff0c;面对技术开发&#xff0c;我的底子其实并不算厚实。在项目启动之初&#xff0c;除了Python稍微熟悉一些&#xff0c;像FastAPI、Redis、PostgreSQL…

作者头像 李华