Keil uVision2 C51版详解:从安装配置到工程实战与报错排查
简介:嵌入式开发中,单片机工具链的选择直接影响开发效率。Keil C51作为8051内核单片机的主流集成开发环境,其经典版本uVision2凭借轻量、快速、稳定的特点,至今仍在教学和工业场景中广泛使用。本文从工具链的基本概念出发,讲解uVision2与MDK的区别、环境搭建的兼容性设置、工程创建与编译流程,并结合LED控制、数码管显示、printf串口重定向等典型示例,演示从编写代码到生成HEX文件、烧录下载的完整链路。同时梳理C51编译过程中的常见报错与调试技巧,帮助初学者快速定位问题。最后探讨从C51向MDK迁移的思路,以及如何与现代编辑器协同工作。无论是刚接触51单片机的新手,还是希望梳理工具链知识的开发者,都能从中获得实用的工程经验。 如果你手头正好躺着一个名为“Keil uVision2 C51版编程软件.rar”的压缩包,那大概率是刚从师兄师姐那里拷来的“祖传工具”,或者是自己刚从某个下载站里扒下来的。这个包里的东西,承载了无数电子类专业学生的第一块开发板记忆——8051单片机,也就是我们常说的51单片机。今天这篇东西,就是围绕这个标题里的工具链,把它的安装、配置、建工程、编译下载、报错排查,以及从C51向MDK迁移这些事,一次性讲透。
我知道看到这个老掉牙的界面,很多人第一反应是“这什么年代了还用这个”。但你不得不承认,很多高校的实验室、老旧的开发板资料、甚至一些量产的小家电方案,到现在还在用C51这一套工具链。而且,理解uVision2的工程结构和编译逻辑,对你后面用uVision5、用MDK、用VSCode插件,都会有很大帮助。这篇文章适合刚接触51单片机的新手,也适合那些装了工具但跑不通、报错不知道去哪查的初学者,甚至对一些想从C51过渡到STM32的嵌入式入门者,也有参考价值。
1. 项目核心拆解:uVision2 C51版到底是个什么东西
1.1 为什么是“C51版”,和MDK、Arm版有什么区别
先把这个最容易混淆的问题说清楚。Keil这个名字下面,其实有好几套不同的工具链,最常用的是两大分支:
- Keil C51:专门用来开发8051内核的单片机,比如AT89C52、STC89C52、STC12系列、N76E003等等。编译器是C51.exe,输出的是HEX或BIN文件,烧写到单片机的Flash里。
- Keil MDK-ARM:专门用来开发ARM内核的单片机,比如STM32、NXP的LPC系列、GD32等等。编译器是armcc(老版本)或armclang(新版本)。
它们都叫“Keil”,也共用uVision这个IDE外壳,但内部完全是两套编译器、两套库函数、两套调试协议。这也是为什么你会在网上看到大量“keil5兼容c51和stm32安装”的教程——因为uVision5能同时装C51和MDK两个版本,但需要分别安装、分别破解、分别管理Pack包。
而标题里的“uVision2”,指的是Keil在2000年前后发布的IDE版本号。它比后来的uVision4、uVision5老很多,界面就是那种灰底蓝框的经典Windows风格。当时它主要就是给C51用的,但也有一些老版本的C166、C251工具链。这个版本在今天还有存在感,核心原因是:很多老开发板附带的资料光盘里,用的就是uVision2;某些芯片厂商的旧例程、旧库文件也是基于uVision2工程格式(.uv2)写的;再加上它体积小、安装快、对电脑配置要求极低,所以至今仍有一些人坚持用它。
1.2 rar压缩包里通常装了些什么
一个标题为“Keil uVision2 C51版编程软件.rar”的压缩包,解压之后通常会看到这些东西:
- SETUP.EXE:安装主程序,老版本都是这个命名。
- Crack文件夹:里面往往是注册机、license生成工具。这个东西我后面会专门说,尽量别用。
- 补丁或汉化包:有些版本会把汉化文件一起塞进去,安装后界面是中文的。
- 说明.txt:通常是“安装步骤”和“注册码使用说明”,来源不明的包里面,这个txt质量参差不齐,很多是复制粘贴的。
这里要插一句我自己的经验:从网上下载的这类rar包,尤其是带Crack字样的,杀毒软件几乎百分之百会报毒。这不一定代表包有问题,因为注册机本身就会被很多杀毒引擎标记为“风险工具”。但我强烈建议,能用官方渠道下载的,就不要用不明来源的包。Keil官网能下载评估版,很多学校实验室也有正版授权,根本没必要在这上面赌电脑的安全。
1.3 解压前先做这几件事,能省你半天折腾时间
别急着双击解压。根据我这些年帮人装工具踩过的坑,解压前先做三件事:
- 验证压缩包完整性:右键属性看大小,和网页上标注的大小对比一下。很多下载站的文件是损坏的,解压到一半报错,浪费时间。
- 查杀毒:先解压到单独的文件夹,比如
D:\keil_u2,然后对这个文件夹做一次全盘扫描。 - 准备安装位置:安装路径不要带中文,不要带空格,最好直接用默认的
C:\Keil,或者简单一点的D:\Keil。老版本工具对中文路径的兼容性极差,经常出现“编译通过但无法生成HEX”这种怪问题,排查半天发现是路径里有个“新建文件夹”四个字。
2. 环境搭建与安装实操,老版本工具的系统兼容性问题
2.1 安装过程与Win10/11下的兼容性设置
uVision2本身是给Windows 98/2000/XP时代设计的,你在Win10或Win11上安装,大概率会遇到兼容性问题,但也不要慌,基本都能解决。
安装步骤很简单,无非是运行SETUP.EXE,一路Next。有两个地方要注意:
- 安装类型的选项:老版本会让你选择“Eval Version”(评估版)还是“Full Version”(完整版)。如果直接选Full,后面会让你填License;选Eval虽然能用,但有代码大小限制。我一般会先装成Eval,装完再用正版License激活,或者用学校提供的授权文件。
- 完成安装后不要立刻运行:先到安装目录下,找到
UV2.exe,右键 → 属性 → 兼容性 → 勾选“以兼容模式运行这个程序”,下拉选择“Windows XP (Service Pack 3)”,再把“以管理员身份运行此程序”也勾上。Win10/11下不这么做,经常会出现界面显示不全、连不上仿真器、无法识别USB转串口这类问题。
安装完成后,首次启动会让你填License。这时候输入你的License ID,然后通过正版方式获取激活码。如果你看到ID一栏是空的,说明安装的是评估版,此时可以正常打开,但代码超过2KB后编译会报错,提示“LIMIT OF 2K BYTES EXCEEDED”——这其实是老版本评估版的硬限制,不是你的代码写错了。要解决这个问题,唯一正规的做法是获取正版License,比如购买正版、使用学校的授权、或去Keil官网申请评估版License。至于网上流传的注册机,我劝你谨慎,它虽然能跳过限制,但代价是杀毒软件天天报警,还可能带后门。为了省那点事,不值得。
2.2 首次启动配置:芯片选型与工程输出设置
安装完成后,第一次打开uVision2,界面可能很陌生,尤其是用惯了VS Code的人会觉得“这UI也太古董了”。但它其实是很多老工程师的青春。进入正题,打开后的第一件事,是配置目标芯片。
点击菜单栏的Project→Select Device for Target 'Target 1'。在弹出的对话框里,左侧的树形目录里能找到Atmel、STC、NXP等各家厂商的45系列和52系列芯片。如果你用的是STC89C52RC这种STC芯片,直接选Atmel下的AT89C52也可以,因为内核寄存器基本兼容。选完之后,IDE会自动帮你加载对应的启动文件和寄存器定义,这一步很关键,如果跳过了,后面写代码时很多SFR(特殊功能寄存器)都会提示未定义。
接下来,右键点击左侧工程窗口里的Target 1,选择Options for Target 'Target 1',或者直接按快捷键Alt + F7,打开配置面板。这里有几个选项卡需要设置:
- Output选项卡:勾选“Create HEX File”。这是最基本的,不勾选的话,编译完只生成OBJ文件,没有HEX,没法烧录。另外建议勾上“Browse Information”,这样调试的时候才能用鼠标悬停查看变量值。
- Debug选项卡:在这里选择仿真器类型。如果是用开发板自带的USB转串口下载,不涉及在线调试就无所谓;如果是用ST-Link或者C51仿真器,需要在这里选对应的驱动。老版本uVision2对ST-Link的支持并不好,它支持的通常是Keil自家的Monitor-51,或者一些早期的第三方仿真器。所以大部分51用户其实是“编译 → 生成HEX → 用STC-ISP烧录”这个流程,在线调试用得少。
- Utilities选项卡:这里配置烧录工具,一般保持默认就行。
注意:老版本uVision2的配置面板里没有Pack安装器这种东西,也不需要你单独下载芯片支持包。这是它和uVision5最大的区别——uVision5必须要安装对应的Pack包才能识别芯片型号,而uVision2是安装时就内置了那个年代的主流芯片型号。这也是很多老工程师喜欢uVision2的原因之一,精简、快速、不折腾。
2.3 为什么网上还有那么多人找uVision2,而不是用新版
我在各种帖子里看到过很多人问“现在都uVision5了,为什么还要用uVision2”。其实原因很现实:
- 很多高校的微机原理与接口技术课程、单片机原理课程,教材配套的例程文件还是
.uv2工程格式。uVision5虽然能打开旧工程,但偶尔会有兼容性警告,而uVision2打开旧工程,简直是无缝衔接。 - 老版本占用系统资源极少,安装包也就几十兆,装完不到200M。对一台配置很差的旧电脑来说,开uVision2就像开记事本一样流畅。uVision5配合各种Pack包,动辄几个G,启动还慢。
- 有些特殊芯片的老旧库函数、插件只支持uVision2,在新版上编译会报错。比如某些LCD屏的驱动库、某些传感器厂家提供的例程,年代比较久远,拿到新版上根本编译不过。
所以,如果你手头的入门资料都是基于uVision2的,那就老老实实用它。工具只是工具,能把代码烧进芯片跑起来,才是目的。
3. 第一个C51工程实战,从建工程到点亮LED
3.1 新建工程与基础代码框架
配置好环境之后,我们来走一遍完整的工程流程。打开uVision2,菜单栏选Project→New Project,起个名字比如LED_Test,保存到之前准备好的英文路径下。
保存后,会让你选择芯片型号。我一般用STC89C52RC,但前面说了,列表里没有STC的直接选项,选Atmel的AT89C52即可。这一步选完,IDE会在左侧工程窗口生成一个Target 1,下面有一个Source Group 1。
接下来,右键点击Source Group 1,选择Add Files to Group 'Source Group 1'。如果当前没有文件,可以在弹出的窗口里直接输入文件名,注意要把文件类型选为“C Source file (*.c)”。我习惯先在硬盘上建好一个空白的main.c,再添加进来。
下面是一份最经典的LED闪烁代码,几乎每个51学习者都敲过:
#include <reg52.h> #include <intrins.h> sbit LED = P1^0; void delay_ms(unsigned int ms) { unsigned int i, j; for (i = ms; i > 0; i--) for (j = 120; j > 0; j--); } void main() { while (1) { LED = 0; // 低电平点亮 delay_ms(500); LED = 1; // 高电平熄灭 delay_ms(500); } }这段代码逻辑很简单,但有几个细节新手容易忽视:
#include <reg52.h>不能漏,它包含了52系列的特殊功能寄存器地址定义。有人喜欢用reg51.h,在多数情况下也能跑,但如果你用到了52才有的定时器2,就必须用reg52.h。sbit这个关键字,是用来定义某个引脚位地址的,C51编译器扩展的。如果这里报错,说明你的编译模式选错了,或者头文件没包含。delay_ms里的循环次数,跟晶振频率强相关。我上面给的120,是按12MHz晶振、优化级别默认来估算的,实际跑起来大概1毫秒左右,但不是精确的。如果手头开发板是11.0592MHz晶振,这个延时函数要调整循环次数。
3.2 编译、生成HEX、烧录下载的完整链路
写完代码,按F7编译。如果一切正常,底部Output窗口会出现0 Error(s), 0 Warning(s)。如果出现警告,比如WARNING C206: 'LED': missing function-prototype,通常是声明和定义顺序的问题,虽然不影响运行,但建议养成零警告的习惯。
编译通过后,到工程目录下的Output文件夹里,能看到生成的.HEX文件。这个文件是Intel Hex格式的纯文本文件,记录了烧写地址和数据。如果你需要的是BIN文件,uVision2默认不直接生成,需要用外部工具把HEX转成BIN,或者在命令行里用OH51工具转换,这个后面第五节再说。
烧录这一步,51圈最常用的就是STC-ISP软件。STC系列单片机上电时默认从串口引导程序启动,所以在STC-ISP里选择芯片型号、串口号、打开刚才生成的HEX文件,点“下载/编程”,然后给开发板上电,就能看到下载进度条走完。注意,多数STC开发板需要“冷启动”——也就是先点下载按钮,再给板子通电,顺序反了会一直卡在“正在检测目标单片机”。
如果是AT89C52这类老芯片,则需要用编程器烧录,现在用的人很少了,不再展开。
3.3 数码管动态显示,一个必练的场景
热词里出现了“c51数码管代码”,这里也顺便说说。数码管驱动是51单片机入门绕不开的项目,分静态显示和动态显示两种。
静态显示最简单:
#include <reg52.h> #define uchar unsigned char uchar code table[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; // 共阴数码管0~9的段码 void main() { while (1) { P2 = table[1]; // 显示数字1 } }这里的table[]数组前面加code关键字,表示把数据放到程序存储空间(Flash),而不是运行时再复制到RAM里。这是C51特有的优化方式。如果忘了加code,数组会占用宝贵的内部RAM——51单片机内部RAM总共才256字节,很容易就爆了,报错ERROR C249: 'DATA': SEGMENT TOO LARGE,就是这个原因。
动态显示则利用了人眼视觉暂留,逐位快速扫描。比如4位数码管,先让第一位显示数字,延时2毫秒,再切到第二位,轮询完一遍再循环。这种方式节省IO口和驱动芯片,但代码量稍大,这里不展开写,理解原理即可。
3.4 重定向printf到串口的小技巧
热词里还有“c51重定向printf”。这个问题我先说结论:C51的printf默认是向串口输出的,不像PC端C语言默认向屏幕输出。但uVision2的模拟仿真环境里,printf的输出去向和实际单片机上的行为不一样,需要特别处理。
在实际单片机里,想要printf输出到串口,你需要重写putchar函数。Keil C51的printf底层会调用putchar来逐个发送字符,默认的putchar实现是往串口发送的,但前提是你把串口初始化对。
#include <reg52.h> void UART_Init() { SCON = 0x50; // 模式1, 8位UART, 允许接收 TMOD = 0x20; // 定时器1工作在模式2(8位自动重装) TH1 = 0xFD; // 波特率9600(11.0592MHz晶振) TL1 = 0xFD; TR1 = 1; // 启动定时器1 } char putchar(char c) { SBUF = c; while (TI == 0); TI = 0; return c; } void main() { UART_Init(); printf("Hello, 51!\n"); while (1); }注意,定时器1的初值TH1 = 0xFD是按11.0592MHz晶振、波特率9600来算的。如果你的板子是12MHz晶振,算出的初值会有偏差,串口通信会出现乱码。这也是很多人问“printf重定向后串口显示乱码”的常见原因。
另外,如果在uVision2的模拟器里直接跑上面的代码,你会发现printf没任何输出。因为模拟器没有真正的串口硬件,它需要通过IDE里的View → Serial Window #1来观察输出。前提是你得在Options for Target的Debug选项卡里勾选了Use Simulator,这样才能在软件模拟环境里看到串口窗口里的字符串。这个功能在老版本里其实很好用,不需要真实开发板,就能验证串口逻辑。
4. 高频报错与调试实录,这些问题我都遇到过
4.1 编译类错误:C217、C206、L6050U
C51编译器报错信息不多,但每个都很要命。我把这些年帮人排查过的高频错误整理成了一张速查表:
| 报错信息 | 出错原因 | 解决办法 |
|---|---|---|
ERROR C217: INDIRECTION TO NON-POINTER | 试图对非指针变量使用解引用* | 检查变量声明是否在函数内部,是否被code、data等关键字搞混 |
ERROR C206: 'xxx': UNDEFINED IDENTIFIER | 变量或函数未声明 | 检查是否漏了头文件,或变量名拼写不一致 |
ERROR C249: 'DATA': SEGMENT TOO LARGE | 内部RAM溢出 | 将大数组声明为code类型,或改用xdata定义到外部RAM |
WARNING C206: 'xxx': missing function-prototype | 函数使用前没有声明原型 | 在文件顶部或头文件里补充函数原型声明 |
L6050U: MODULE NOT FOUND | 找不到指定的库文件或OBJ文件 | 检查工程里是否引用了不存在的库文件,或库搜索路径配置错误 |
*** FATAL ERROR L210: I/O ERROR ON INPUT FILE | 文件被占用或路径不存在 | 关闭杀毒软件,重建工程到纯英文路径 |
这里面L6050U是最让人头疼的。它不像C217那样能一眼看出是代码问题,而是链接器层面的报错。常见场景是你从网上下载了一个老工程,打开后编译就报这个错。原因往往是工程里引用了某个.LIB库文件,但这个库文件在源压缩包里被遗漏了,或者路径写死了。解决办法是,在工程窗口里展开Source Group,看有没有带.lib后缀的文件,右键把它移除,再重新编译看看。如果库是必须的(比如你用了某个协议栈),那得确保库文件在工程目录下,并且名称一致。
4.2 调试类问题:断点、变量查看、Flash Download
先回答热词里一个特别具体的问题:“keil中打断点所在行会执行吗”。答案是:断点触发时,程序停在断点所在行,但该行的代码还没有执行。黄色箭头指向的,是“即将执行”的指令,而不是“已经执行”的指令。这个逻辑和很多人的直觉相反,但确实是Keil调试器的行为。如果你在断点处查看变量值,看到的是该行执行前的状态。想要看执行后的效果,需要再单步执行一次。
调试时查看局部变量,最常用的方法是:在断点停下后,在左侧窗口里找到Watch选项卡,手动添加要观察的变量名。或者更简便的方法,把鼠标悬停在代码里的变量名上,稍等一秒就会出现当前值。
另一个高频问题是“Flash Download”报错。如果你用的是uVision5的MDK调STM32,这个错误几乎每天都能见到。报错信息里通常会有“No Flash Device Selected”或“Flash Download failed - Cortex-M3”。引起这个问题的原因有几种:
- 没有在Debug选项卡里选对调试器:ST-Link、J-Link、DAP-Link,协议不一样,不能混用。
- 没有配置Flash编程算法:需要在
Utilities选项卡里点Settings,在Flash Download页面添加对应芯片的算法文件,比如STM32F103C8需要STM32F10x High-density Flash。 - 芯片读保护:如果芯片之前被设了读保护,下载时会报错。需要在烧录工具里执行“全片擦除(Mass Erase)”解除保护。
这个问题在C51环境下相对少见,因为51基本用的是串口下载,不走调试器。但如果你用第三方仿真器,比如T2仿真器,调试时也会遇到类似的算法配置问题。
4.3 链接受限问题:超过32K或8K限制的真相
看到网上有很多人在搜“32k限制补丁”之类的东西,这里必须说清楚。Keil的评估版/未授权版本,在不同版本里有不同的代码容量限制:
- 老款C51评估版,限制是2KB,编译稍微大点的程序就会报“LIMIT OF 2K BYTES EXCEEDED”。
- 有些破解不完全的版本,编译时会在某段代码后卡住,提示“C51 LIMIT OF ... EXCEEDED”,这时很多人会误以为是芯片Flash不够,其实不是芯片不够,是编译器在限制你。
解决这个问题的正确姿势,不是去下载什么补丁,而是:
- 确认你用的是正版授权。C51的授权费用并不算高,很多公司和个人都能承受;学生可以找导师或实验室要授权,很多高校购买了正版Keil。
- 如果你用STC系列单片机,STC官方提供的STC-ISP工具里,有些版本附带了免费的SDCC编译器方案,或者推荐使用SDCC开源编译器。SDCC支持51内核,虽然IDE体验不如Keil,但能完美绕开Keil的授权限制。
注意:千万不要因为限制而去网上乱找所谓的“破解补丁”。这类文件是重灾区,携带木马的概率极高。这里用正版、用学校授权、或者换用开源工具链,都是安心的路,没必要为了一个编译器冒险。
5. 从C51向MDK迁移,以及与现代工具链的配合
5.1 C51和MDK-ARM共存安装,解决Keil5兼容问题
热词里出现得很多的问题是“keil5兼容c51和stm32安装”。这个话题如果展开,可以单独写一篇文章,我这里把核心逻辑讲清楚。
uVision5是一个壳,它允许你同时安装C51和MDK两个工具链。安装顺序没有强制性要求,但为了少出问题,我习惯先装C51,再装MDK。两个工具链分别安装到不同的目录,比如C51装到C:\Keil_v5\C51,MDK装到C:\Keil_v5\ARM,这是IDE默认分配的目录,不需要手动改。
装完之后,用uVision5打开一个C51工程时,IDE会自动选择C51编译器;打开一个STM32的MDK工程时,会自动选择ARM编译器。如果遇到打开某个工程后,编译按钮是灰色,或者提示“Target not created”,一般是工程类型和已安装的工具链不匹配,或者缺少芯片Pack包。
MDK必须安装芯片支持包(Pack)。在Pack Installer里,按你用的芯片型号搜索,比如STM32F103C8,点击Install安装对应DFP包。这一步不完成,新建STM32工程时根本找不到芯片型号。这块和C51差别很大,C51是内置型号,MDK则是靠Pack扩展。
5.2 用VSCode写代码,用Keil编译调试的混合工作流
这几年很多人问“keil与vscode结合”。说实在的,uVision的编辑器确实不怎么样,代码补全和主题都停留在十几年前的水准。如果你写C51或者STM32的工程,不想抛弃Keil的编译和调试功能,又想用VSCode的现代编辑器,可以这样组一套混合工作流:
- 安装VSCode,装好
C/C++扩展和EIDE扩展。 - 用EIDE新建一个项目,项目类型选Keil C51或Keil MDK。
- 在EIDE里设置好Keil的安装路径,以及芯片型号、编译器路径。
- 这样就可以在VSCode里写代码、查看定义、自动补全,然后点编译按钮直接调用Keil的编译器进行编译。烧录和调试还是在Keil里进行。
不过这套工作流对新手来说,配置门槛有点高。尤其是EIDE对C51工程的支持,不如对MDK工程那么成熟。如果是纯新手,我建议先把uVision2或uVision5本身用熟练,再考虑这种进阶玩法。工具是辅助,先把单片机本身搞明白才是正事。
5.3 从HEX导出BIN,以及老工程的移植思路
热词里还有“keil c51怎么导出bin”。前面说了,uVision2默认生成的是HEX文件,但有些场合,比如做IAP升级、或用某些烧录器时,必须要BIN文件。你可以这样转:
- 用
hex2bin这个小工具,命令行执行hex2bin LED_Test.hex,就能在同目录生成LED_Test.bin。这是最简单的方式。 - 在uVision2里,其实也可以间接生成BIN,但需要配置
User选项卡的命令行调用,本质上还是调外部工具,不如直接转。
另外,如果你手上有一个老uVision2工程,想拿到uVision5里编译,一般直接双击.uv2文件,或者从uVision5里打开,IDE会提示“工程格式将被升级”,确认即可。但风险在于,有些老工程用到了旧版本编译器特有的语法或库文件,升级到新编译器会报错。这时候,如果只是学习参考,建议对比着原代码,新建一个工程,手动把源文件添加进去,反而比直接升级更干净。
6. 写在最后的几点个人心得
关于“Keil uVision2 C51版编程软件.rar”这个压缩包的话题,绕来绕去,其实又回到了很多技术人最熟悉的那句话:工具只是工具,关键是理解工具背后的逻辑。
我用uVision2很多年了,说实话,它的界面放到今天确实毫无美感,代码编辑器连个像样的自动补全都没有,但在调试简单51程序时,它的轻量和稳定反而成了不可替代的优势。很多同学一上来就追求最新版的uVision5,装上之后发现光是Pack包、和C51/MDK共存的问题就折腾了三天,最后代码一行没写。而用uVision2,从安装到点亮第一个LED,半小时足够了。
最后再分享一个我自己的习惯:不管用什么版本的Keil,只要新建工程,第一件事就是把输出目录设置好,工程路径里永远只允许字母和数字。这一个小小的习惯,能避开一堆难排查的怪问题。做单片机开发,很多时候让人崩溃的并不是芯片本身,而是那些环境层面的小坑。希望这篇东西能帮你少踩一些雷,把精力真正花在写代码和调电路上。
本文还有配套的精品资源,点击获取
