手动编译C51程序

Keil C系列之编译器介绍(1) C编程语言是一种通用编程语言,它提供了代码效率、结构化编程元素和丰富的操作符集。C语言不是一门很大的语言,也不是为任何特定的应用领域而设计的。C语言的通用性和它的无限制相结合,使得C语言方便而有效地解决了各种各样的软件任务。与其他更专业的语言相比,使用c语言可以更容易、更有效地解决许多应用程序。Cx51优化C编译器是C语言美国国家标准协会(nSI)标准的完整实现。Cx51编译器不是一个适用于os目标的通用C编译器。它是一个基础实现,致力于为8051微处理器生成极其快速和紧凑的代码。 阅读详情

使用Keil写C51程序或汇编程序时,Keil软件存在两个严重问题,一是操作较为繁琐,其实这是所有大型IDE的共同问题,Keil和VS比起来也只能是小巫见大巫;二是Keil软件自带的编辑器委实功能有限,换行处理起来都显得很吃力,每次操作,都有一种又回到二十年前的感觉。

下面我们给出一个手动编译C51程序的方案,目标只有一个,用起来顺手,能给出一些基本的错误提示,过程极为简单,如果要进行调试等复杂操作,还是在Keil环境较为可靠。

一、准备

这里需要做两项准备工作,:

一是安装Keil软件;

二是安装你个人较为顺手的文本编辑器。

二、Keil是如何编译C51程序的

Keil软件是如何编译C51程序的呢,自不待言,编译过程和普通的C程序一样,同样包括编译和链接过程,但是最后不是生成可执行文件;二是由于一般51单片机中没有操作系统,需要生成一种绝对目标文件(.abs),由此生成可被单片机执行的hex文件。

需要得到这样的过程。

首先在某个目录下建立一个Keil工程,工程名为mcc(manual compile c51,手动编译C51的意思),芯片选择Atmel的at89c52,添加三个文件,分别为:main.c,func.h和func.c进行测试。内容如下:

/* main.c */
#include <reg52.h>
#include "func.h"

void main(void)
{
	display();

	while(1) {
	 	;
	}
}

及

/* func.h */
#ifndef FUNC_H
#define FUNC_H

void display();

#endif	// FUNC_H

和

/* func.c */
#include <reg52.h>
#include "func.h"

void display()
{
	P1 = 0x0f;
}

将其添加到Keil工程,执行,看看有没有错误和警告。

然后打开“Target Options…”对话框,如下图:

在弹出的Options for Target ‘Target 1’对话框中,选Output选项卡,勾选上“Creat HEX File”和“Create Batch File”两个选项,如下图:

然后点击OK,后再次执行,这个时候回到mcc工程目录下,能看到生成了hex文件,同时生成一个Target 1.BAT文件,这是个windows批处理脚本。用文本编辑器将其打开,内容如下:

SET C51INC=e:\Keil\C51\INC\Atmel\;e:\Keil\C51\INC\
SET C51LIB=e:\Keil\C51\LIB
SET CPU_TYPE=AT89C52
SET CPU_VENDOR=Atmel
SET UV2_TARGET=Target 1
SET CPU_XTAL=0x016E3600
"e:\Keil\C51\BIN\C51.EXE" @main.__i
"e:\Keil\C51\BIN\C51.EXE" @func.__i
"e:\Keil\C51\BIN\BL51.EXE" @mcc.lnp
"e:\Keil\C51\BIN\OH51.EXE" "mcc"

你可以看到一些信息:

C51INC变量是引入的标准头文件;

C51LIB变量引入标准链接库;

CPU_TYPE和CPU_VENDOR为引入的芯片类型;

UV2_TARGET为源文件分组;

CPU_XTALL为设定的晶振频率,调试时有用,0x016E3600为十进制的24M,这是生成Keil工程时默认的晶振频率。

上面这些变量对于今天的简单配置并没有什么用处,有用的是下面4行。

一个可执行的EXE后面跟一个@+纯文本文件,是一种批处理格式,意思是执行该文件中的内容。这里main.__i、func.__i和mcc.lnp看起来挺玄乎,其实就是纯文本文件,它们都在keil工程目录下。

用文本编辑器查看main.__i的内容为:

"main.c" BROWSE DEBUG OBJECTEXTEND

其后缀BROWSE DEBUG OBJECTEXTEND对于我们并没有什么用,Keil软件编译过程中用于附加一些调试信息。

同样,用文本编辑器查看func.__i的内容为:

"func.c" BROWSE DEBUG OBJECTEXTEND

这样,

"e:\Keil\C51\BIN\C51.EXE" @main.__i
"e:\Keil\C51\BIN\C51.EXE" @func.__i

两行代码,实际执行的是,

"e:\Keil\C51\BIN\C51.EXE"  main.c
"e:\Keil\C51\BIN\C51.EXE" func.c

这是编译过程,生成同名目标文件main.obj和func.obj。

再来查看mcc.lnp的内容:

"main.obj",
"func.obj" 
TO "mcc" 
RAMSIZE(256)

这里,最后的

RAMSIZE(256)

给出at89c52的RAM容量。于是,

"e:\Keil\C51\BIN\BL51.EXE" @mcc.lnp

执行的内容其实为:

"e:\Keil\C51\BIN\BL51.EXE"  "main.obj","func.obj"  TO  "mcc" 

这是链接过程,生成一个没有扩展名的文件mcc,这是绝对目标文件。最后:

"e:\Keil\C51\BIN\OH51.EXE" "mcc"

用于生成hex文件。

其总体过程需要keil三个命令,这三个命令在“Keil安装目录\C51\BIN”目录下,分别为:

c51.exe ——用于编译原文件,默认生成同名的OBJ文件;

bl51.exe  —— 用于链接目标文件,多个目标文件间用逗号连接,格式为:

BL51.EXE  目标文件1.obj, 目标文件2.obj, … , 目标文件n.obj TO 绝对目标文件 

oh51.exe  —— 用于生成hex文件。默认名称同绝对目标文件名。

三、手动编译
试验一:手动编译C51

为了试验简单,将刚才写的main.c,func.h,func.c三个文件复制到一个目录下,例如我是保存在:J:\program\program_tibits\mcc_test_1目录下。

win+r,键入cmd打开控制台窗口。键入:

cd /d J:\program\program_tibits\mcc_test_1

后回车,便可以转到所建的目录下:用dir命令查看,为:

J:\program\program_tibits\mcc_test_1>dir
 驱动器 J 中的卷是 写作
 卷的序列号是 9AE3-528D

 J:\program\program_tibits\mcc_test_1 的目录

2024/01/28  08:49    <DIR>          .
2024/01/28  08:49    <DIR>          ..
2024/01/28  08:07                90 func.c
2024/01/28  08:07                85 func.h
2024/01/28  08:03               116 main.c
               3 个文件            291 字节
               2 个目录 79,599,349,760 可用字节

然后键入:

e:\Keil\C51\BIN\C51.EXE main.c

便可以对main.c进行编译,再次dir查看目录,可以看到生成了main.OBJ文件。然后键入:

e:\Keil\C51\BIN\C51.EXE func.c

对func.c进行编译,再次dir查看目录,可以看到生成了func.OBJ文件。然后键入:

e:\Keil\C51\BIN\BL51.EXE main.obj,func.obj to mcc

再次dir查看生成了一个mcc文件。然后键入:

e:\Keil\C51\BIN\OH51.EXE mcc

再次dir命令查看,看到目录中生成了一个hex文件,为:

J:\program\program_tibits\mcc_test_1>dir
 驱动器 J 中的卷是 写作
 卷的序列号是 9AE3-528D

 J:\program\program_tibits\mcc_test_1 的目录

2024/01/28  08:58    <DIR>          .
2024/01/28  08:58    <DIR>          ..
2024/01/28  08:07                90 func.c
2024/01/28  08:07                85 func.h
2024/01/28  08:55               894 func.LST
2024/01/28  08:55               189 func.OBJ
2024/01/28  08:03               116 main.c
2024/01/28  08:54             1,003 main.LST
2024/01/28  08:54               237 main.OBJ
2024/01/28  08:57               363 MCC
2024/01/28  08:58               113 mcc.hex
2024/01/28  08:57             1,334 MCC.M51
              10 个文件          4,424 字节
               2 个目录 79,599,337,472 可用字节

如果你有兴趣,可以将这个mcc.hex下到52单片机中,看看运行。

四、配置环境变量

这个操作过程还是相对繁琐,我们简化操作。

将E:\Keil\C51\BIN目录添加到系统环境变量path中,如下操作。

首先右键点击“此电脑”,在弹出的菜单中选“属性”菜单项,弹出“系统”界面,选择其中的“高级系统设置”:

后弹出“系统属性对话框”,选择环境变量:

在弹出的“环境变量”对话框中点击“新建”按钮:

然后弹出“新建用户变量”对话框,在“变量名”后的文本框输入“C51”在“变量值”后的文本框中输入KEIL安装的C51路径:

然后确定,然后在“环境变量”对话框中,选中“path”变量,点“编辑”(如果你的系统没有该变量,可以选择新建,建立这样一个变量),弹出“编辑环境变量对话框”,在末尾添加“%C51%\BIN”:

然后一直确定回去,退出“属性”对话框。现在环境变量中已经有了C51、BL51、OH51命令。

在回到控制台,可以直接使用:

C51 main.c
C51 func.c
BL51 main.obj,func.obj to mcc
OH51 mcc

进行编译了,其结果和上面一样。

五、bat脚本编译

这还是太过于繁琐,我们可以在保存mian.c、func.h和func.c的目录下建立一个bat脚本,如命名为:exec51prj.bat,用文本编辑器打开,键入如下内容:

C51 main.c
C51 func.c
BL51 main.obj,func.obj to mcc
OH51 mcc
@pause

如此,便可以通过鼠标双击exec51prj.bat文件完成整个过程。其后的语句@pause几乎是必须的,不然控制台弹出执行完成后,便会自动退出,一旦有编程错误,便无法发现了。双击后执行如下:

J:\program\program_tibits\mcc_test_1>C51 main.c

C51 COMPILER V9.01 - SN: K1PMC-DDHSRC
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2009

C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

J:\program\program_tibits\mcc_test_1>C51 func.c

C51 COMPILER V9.01 - SN: K1PMC-DDHSRC
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2009

C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

J:\program\program_tibits\mcc_test_1>BL51 main.obj,func.obj to mcc

BL51 BANKED LINKER/LOCATER V6.22 - SN: K1PMC-DDHSRC
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2009

Program Size: data=9.0 xdata=0 code=24
LINK/LOCATE RUN COMPLETE.  0 WARNING(S),  0 ERROR(S)

J:\program\program_tibits\mcc_test_1>OH51 mcc

OBJECT TO HEX FILE CONVERTER OH51 V2.6
COPYRIGHT KEIL ELEKTRONIK GmbH 1991 - 2001

GENERATING INTEL HEX FILE: mcc.hex

OBJECT TO HEX CONVERSION COMPLETED.
请按任意键继续. . .
六、总结

这样就可以使用顺手的文本编辑器编辑源文件,然后用bat脚本执行,这个办法相对简陋,需要注意几件事:

1、一般的文本编辑器对C51的特殊关键字没有语法高亮,如xdata,较为容易出现录入错误;

2、编程人对单片机容量、关键字声明等要极度心中有数,不然会出现一些莫名其妙的错误,编译能通过,但是不能执行,如下代码:

#include <reg52.h>

char xdata my_mempool[1024];

void main(void)
{
    //...
    init_mempool(my_mempool, sizeof(my_mempool));

}

编译过程并不会报错,但是分配的内存池明显太大了。程序在单片机中无法顺利执行。

3、如果要手动进行调试,会相当繁琐,调试工作还是在Keil下进行较好。

另,也可以使用VS Code来进行配置,以后文章进行介绍。

Keil5反人类?来试试VSCode写C51单片机程序! 不少使用Keil做C51程序开发的初学者都面临这一个极其严重的问题——这破玩意没有自动补全?!!!刚开始可能代码只有十几行,没有什么函数调用。但一旦开始使用模块化编程,或者定义了十几个变量的时候,你就会开始头皮发麻——这个函数叫啥来着?它要传什么参数来着?这个变量叫啥?我是谁?我在哪?我在干什么?那么,我们不妨祭出地表最强IDE——VSCode来解决这些问题吧! 阅读详情

相关推荐

Keil uVision5中C51编译器安装与TOOLS.INI错误修复指南

Keil C51是面向8051单片机的经典嵌入式C编译器,其核心原理基于ANSI C子集与特定目标架构的代码生成器。随着Keil官方自2014年起将C51移入Legacy产品线,它不再集成于MDK-ARM安装包中,导致uVision5频繁报错‘TOOLS.INI: Invalid path —— C51 is not installed’。这一问题本质是工具链缺失而非配置错误,技术价值在于恢复对传统8051生态的持续支持。典型应用场景包括工业控制、教学实验及老旧设备维护等需兼容51内核的嵌入式开发。本文聚焦

weixin_29194693的博客 230

Keil C51编译/链接/优化

Keil C51编译/链接/优化 一、C51编译库及代码优化技术 如下图所示:可以根据优化等级的需要选择相应的库文件。 通过Keil ->Target 下 Memory Model / code Rom size 来进行配置 SMALL:所有变量都被定义在8051单片机的片内RAM中,对这种变量的访问速度最快。 另外,堆栈也必须位于片内RAM中,而堆栈的长度是很重要的,实际栈长取决与不同函 数的嵌套深度。采用SMALL编译模式与定义变量时指定data存储器类型具有相同效果。 COMPACT:所有变

申小白 6372

Keil C51安装配置全指南:从版本选择到点亮LED

嵌入式开发中,集成开发环境(IDE)是连接代码与硬件的桥梁,其核心原理在于通过编译器将高级语言转换为机器码,并借助调试器实现实时控制。技术价值在于提升开发效率与代码可靠性,应用场景涵盖8051单片机、STM32等嵌入式系统。针对Keil C51,需理解µVision5兼容C51和STM32安装的版本体系,以及STC库添加等关键配置。本文从安装细节到工程实践,系统讲解如何正确搭建环境,避免常见陷阱,并跑通第一个程序。

weixin_30983965的博客 310

基于SDCC和Edsim51的代码仿真

你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!” />你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!更多资料点击此处获qu!!

2401_84009899的博客 1331

如何正确完成Keil C51软件安装并配置STC芯片支持

手把手带你完成Keil C51软件安装全过程,重点解决STC单片机在Keil环境下无法识别、无芯片支持包等常见问题;涵盖安装路径规范、UV4版本兼容性、STC-ISP驱动对接及芯片数据库添加等实操要点,确保开发环境开箱即用。

weixin_42605397的博客 231

Keil-C51 与 Keil -ARM 共存的方法

本篇为《嵌入式相关》系列博客的第五篇,该系列博客主要记录单片机开发及硬件设计的相关过程,方便以后查阅。 Keil-C51 与 Keil -ARM 共存的方法状况解决方案1测试解决方案2 状况 今天装完Keil-C51,然后又换装了Keil-ARM之后,可以正常编译STM32 的工程,但是无法编译C51的工程,并且出现了如下错误: *** Error: Project ‘template’ requires ‘C51’ Toolchain which is not installe 这种情况就是Keil-

梁小憨憨的博客 1万+

c51为啥要宏定义时钟_初学C51者应注意的地方

这里讲述一些初学者学习C51的一些误区和注意事项。高手的特别应用不包括在内。 1)C忌讳绝对定位。常看见初学者要求使用_at_,这是一种谬误,把C当作ASM看待了。在C中变量的定位是编译器的事情,初学者只要定义变量和变量的作用域,编译器就把一个固定地址给这个变量。怎么取得这个变量的地址?要用指针。比如unsigned char data x;后,x的地址就是&x,你只要查看这个参数,就可以...

weixin_30440721的博客 160

手动编译链接生成c51的hex文件

这个纯粹是个人爱好。现在系统的UI的做得越来越好,但还是莫名的喜欢那个命令行,算是种怀旧吧。 再次声明:该举动仅为个人爱好而已 虽然是手动编译,但还是需要个keil安装后的环境。 详细步骤: 1.用记事本或者notepad++编写超简单的代码 例如: #include sbit L1 = P1^2; void main() {      L1 = 0;

清风明月夜 5170

在MDK5(Keil537)中同时配置STM32和C51的环境(简单可行)

但是之前基于ARMCC的项目使用ARMCLANG(compiler version 6)编译会报错,所以导致之前大部分项目都不能直接用,而每个项目都修改代码的话,是一个很大的工作量。这里的解决方案是:打开 'Manage Project Items - Folders/Extensions'(魔术棒旁边的三晶体堆),可看到目前只有ARMCLANG,需要额外添加一个ARMCC(提前在网站下载,并放在Keil安装路径的ARM文件夹下)【OK】,再去编译程序,就不会报错了。2.安装完成后,这一步。

m0_56194543的博客 2048

Keil安装后C51编译器缺失解决方法详解

遇到keil安装后C51编译器找不到的问题别慌,多数是组件未正确安装或路径配置出错。重新检查安装选项,确保C51支持包被勾选,并手动添加编译器路径即可快速恢复功能。

weixin_35592186的博客 1002

Keil C51编译器:嵌入式系统开发利器

在嵌入式系统开发领域,Keil C51编译器由于其对8051微控制器系列的深厚支持而被广泛使用。这一章节将对Keil C51编译器进行概述,从其诞生的背景讲起,逐步引出它在8051微控制器开发中的地位及其特点。在嵌入式系统开发中,库函数为开发者提供了诸多便捷,使得程序设计更加高效。Keil C51作为一款专门为8051系列微控制器设计的C语言开发工具,内置了丰富的标准库函数。本章节将详细介绍Keil C51的标准库函数种类和使用场景,并探讨如何高效利用这些库函数来简化开发流程。

weixin_36300623的博客 665

Keil5中集成C51编译器的路径配置实战

在嵌入式开发中,8051单片机仍是教学与基础工程的重要载体,而Keil µVision 5作为主流ARM开发IDE,原生不支持C51编译器。其本质是工具链架构差异:MDK面向ARM Cortex-M,C51专为8051内核设计。实现二者共存的关键不在替换软件,而在于理解编译器调用机制——通过TOOLS.INI节区伪造、Toolset标识切换、环境变量注入与代理程序路径重定向,使Keil5‘识别’并安全调用正版C51编译器。该方案兼顾工程统一性、许可证合规性与调试一致性,广泛适用于高校实验、课程设计及混合架构

weixin_34268753的博客 389

c51编译器c51编译器c51编译器

c51编译器c51编译器c51编译器c51编译器

告别环境配置烦恼:用快马一键生成keil5兼容c51与stm32的完整安装指南

在快马生成的项目中,这些组件都做了版本校验,确保不会出现"Device not found"这类经典错误。平台生成的文档结构特别清晰,每个步骤都有对应的验证点。这种"步步为营"的设计,让配置过程变得可控很多。从实际体验来看,原本需要3-4小时的配置过程,现在30分钟就能搞定,而且成功率高了很多。这种把复杂流程标准化的思路,确实体现了AI辅助开发的价值。针对ST-Link调试器,文档包含了驱动自动安装和手动安装两种方案,并附有设备管理器中的正确状态截图。可以一键生成完整的配置指南,简直拯救了我的开发效率。

CrystalwaveEagle34的博客 42

WinCC与施耐德PLC的Modbus TCP通信实战指南

本文详细解析了西门子WinCC与施耐德PLC通过Modbus TCP协议实现通信的完整实战流程。内容涵盖硬件网络配置、Modbus地址映射核心规则、WinCC驱动连接建立、变量创建及高级数据访问技巧,并提供了常见故障排查思路,帮助工程师高效解决跨品牌设备通信难题。

weixin_29194693的博客 1001

交通银行金融科技后端开发实习生面试经验

笔试之路的第一个脚印。不足的地方:基本功不扎实,得补。先补sql(先整理出一篇sql语句做题的文章,争取下次笔试拿下这一块),编程题中的SQL写不出来感觉很丢人。然后补八股文,结合一些网上项目教程,来理解常用的一些八股文(比如各种锁)。

T__TSZ的博客 1721

普中51单片机A1-A4开发避坑指南:从零搭建到第一个LED闪烁程序

本文为普中51单片机A1-A4系列开发板的新手提供了一份详尽的避坑指南。内容涵盖从驱动安装、Keil环境配置、硬件连接到代码编写与烧录的全流程,重点解析了CH340驱动安装、芯片选型、灌电流原理及STC-ISP烧录等关键步骤中的常见问题与解决方案,旨在帮助开发者快速完成从零搭建到实现第一个LED闪烁程序,顺利入门单片机开发。

weixin_29193259的博客 230

内网渗透—横向移动&IPC横移&Impacket套件&CS插件

以上便是IPC横移的知识。最后,以上仅为个人的拙见,如何有不对的地方,欢迎各位师傅指正与补充,有兴趣的师傅可以一起交流学习。

2301_76227305的博客 1890

基于STM32的气压检测报警proteus仿真设计+程序+设计报告+讲解

需注意仿真中51单片机芯片是通用的,AT89C51,AT89C52都是51单片。一样的,程序也是一样的,芯片可以替换为STC89C52/STC89C51/AT。51单片机的简易篮球计分器倒计时仿真设计(proteus真+程序+原理。4.具备篮球24秒进攻时间倒计时,精确到0.01秒,进攻时间结束时可以。机的具体型号,内核是兼容的。本设计旨在设计一个基于51单片机的篮球比赛计分器仿真设计,下面。3.当添加比赛分数时,如果有错误,可以手动更改赛场分数。2.中场休息期间交换场地,交换A队和B队的位置。

卧龙文化工作室的博客 323

Xilinx ZYNQ 7000学习笔记二(FSBL代码分析启动-汇编代码)

Xilinx ZYNQ 7000学习笔记

u011116085的博客 4246

基于紫光展锐平台的音频调用到hal层逻辑

基于紫光展锐平台的音频调用到hal层逻辑 1、数据流程图 AudioPolicyService和AudioFlinger的创建: 这两个服务都在audioserver中启动,文件路径: frameworks/av/media/audioserver/main_audioserver.cpp 从AudioFlinger和AudioPolicyService的创建,到output的打开,以及AudioFlinger开始往底层写入数据的具体流程如下图: #mermaid-svg-kjHL4XWwkQXN6NdA

weixin_55053963的博客 1355

Keil C51编译器的使用

Keil C51编译器的使用 吴宏伟 2012-2-5 对于学习51系列单片机的人来说,Keil 可以说是最熟悉不过的了,但一直在Keil UI界面的掩盖之下,我们并不了解一个51的HEX文件是怎样从源代码文件一步一步生成的,这其中又有哪些跟我们的目标MCU有关。我们都知道,程序是从源代码—预编译—编译—连接—生成可以执行文件,今天,我将谈谈C51编译器的使用。 安...

dengmi4308的博客 2630

Isaac Sim 车辆动力学:从参数调优到户外仿真的挑战与实战

本文深入探讨了Isaac Sim在车辆动力学仿真中的应用,从参数调优到户外场景模拟的实战经验。详细解析了悬架系统、轮胎物理模型等核心参数的设置技巧,并分享了应对户外仿真挑战的实用方案。通过Vehicle Wizard高级使用和传感器配置,帮助开发者高效完成车辆仿真与算法开发。

weixin_29192211的博客 404

C51填坑记:中断处理导致主程序函数参数改变

1.现象 平台:keil c51,中颖SH79F7019A 现象:在增加了一个中断处理逻辑后,发现主程序异常,断点调试发现某个函数的参数被改变了,程序使用了错误的数据导致逻辑出错。 2.排查 初步分析,可能原因如下: 1.参数寄存器(R0-R7)的值,被中断函数改变。 2.堆栈溢出。 2.1参数寄存器 首先排查参数寄存器(中断里面调用了函数,有参数传递)。通过仿真器观察中断函数汇编...

yueqifeng_812的专栏 3406

SimSwap复现指引及代码分析【2023有更新】

我的环境!!!😚😚😚 之后会遇到:还会遇到至此环境配置完毕!下面是所需要的checkpoint。至此环境准备结束。先试试环境是否有问题,图片是代码包中给的。我用的是512的checkpoint,无水印,a是源脸,b是目标脸。输出到./output/result_whole_swapsingle.jpg 如图是可以成功换脸的:(为了方便查看将图像裁剪到了128x128) 表示图像预处理,相应的改为也是一样。不加就是对已经面部对齐的图像进行简单的面部交换。 加上就是无水印。 交换一张图片中的所有面孔。

zik的博客 2047

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: C语言主函数的返回值
下一篇: C语言控制台字体颜色控制
金达南
博客等级 码龄3年 137粉丝 12原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值