keil预处理命令及方法
keil条件编译

Keil条件编译是指在Keil C编译器中使用预处理指令来控制代码编译的一种方式。
条件编译允许您根据特定的条件来包含或排除代码块,以便在不同的编译环境中生成不同的代码。
在Keil C编译器中,条件编译主要使用预处理指令来实现。
这些预处理指令可以在编译之前对代码进行条件判断,并根据条件的结果决定是否包含或排除特定的代码块。
以下是一些常用的Keil条件编译预处理指令:#if、#elif、#else、#endif:这些指令用于根据条件判断来包含或排除代码块。
例如,您可以使用#if指令来检查某个宏定义是否存在,然后根据结果包含不同的代码。
c#if defined(MY_MACRO)// 如果MY_MACRO已定义,则编译此代码块// ...#else// 如果MY_MACRO未定义,则编译此代码块// ...#endif#ifdef、#ifndef:这些指令用于检查某个宏定义是否存在或不存在。
它们与#if和#else配合使用,以便在宏定义存在或不存在时包含不同的代码。
c#ifdef MY_MACRO// 如果MY_MACRO已定义,则编译此代码块// ...#endif#ifndef MY_MACRO// 如果MY_MACRO未定义,则编译此代码块// ...#endif#define、#undef:这些指令用于定义和取消定义宏。
通过使用这些指令,您可以在代码中创建自己的宏,并在条件编译中使用它们。
c#define MY_MACRO 1// ...#undef MY_MACRO#if defined(MACRO1) && defined(MACRO2):这些指令用于检查多个宏定义是否存在,并根据条件的结果包含不同的代码。
请注意,条件编译的具体语法和规则可能会因编译器和目标环境而有所不同。
KEIL Cx51 编译器 说明书

Cx51编译器对传统和扩展的8051微处理器的优化的C 编译器和库参考用户手册09.2001Keil Software – Cx51编译器用户手册—ፉᑗኔፉᑗኔ由于本人的英语水平有限所以在使用KEIL C51的过程中老要去看那英文的手册总感到不是那么方便老要用词霸查来查去的烦的很因此在看到C51BBS上的倡议后就动了把它翻译出来的念头我想这对自己和别人都会带来些好处利用工作之余的时间经过几个月的努力终于把它翻译完了但由于水平所限文中肯定有很多不是十分恰当的地方或许没有用大家比较熟悉的惯用语或许可能引起误解所以在这里我请大家能指出其中的错误和不当之处请大家EMAIL告诉我使我能够作出改正对于大家的建议我会很高兴的接受我最大的愿望是希望我的翻译不会误导大家且能对大家有所帮助不明之处可以参考英文原文感谢C51BBS版主龙啸九天的帮助欢迎大家与我交流我的e-mail**************Keil Software声明本文档所述信息不属于我公司的承诺范围其内容的变化也不会另行通知本文档所述软件的出售必须经过授权或签订特别协议本文档所述软件的使用必须遵循协议约定在协议约定以外的任何媒体上复制本软件将触犯法律购买者可以备份为目的而做一份拷贝在未经书面许可之前本手册的任何一部分都不允许为了购买者个人使用以外的目的而以任何形式和任何手段(电子的机械的)进行复制或传播版权1988-2001所有者Keil Elektronik GmbH和Keil Software公司Keil C51™Keil CX51™,和uVision TM是Keil Elektronik GmbH的商标Microsoft®和Windows™是Microsoft Corporation的商标或注册商标IBM®PC®和PS/2®是International Business Machines Corporation的注册商标Intel®MCS®51MCS®251ASM-51®和PL/M-51®是Intel的注册商标我们尽全力去做来保证这本手册的正确从而保证我们个人公司和在此提及的商标的形象前言本手册讲述对8051的目标环境如何使用C x51优化C编译器编译C程序C x51编译器包可以用在所有的8051系列处理器上可以在WINDOWS 32位命令行中执行本手册假定你熟悉WINDOWS操作系统知道如何编程8051处理器并会用C语言编程注意本手册用条件窗口来指明32位WINDOWS版本是WINDOWS95WINDOWS98WINDOWS ME WINDOWS NT WINDOWS 2000或WINDWOS XP如果你对C编程有问题或者你想知道C语言编程的更多信息可参考16页的关于C 语言的书手册中讨论的许多例子和描述是从WINDOWS命令提示符下调用的这对在一个集成环境如µVision2中运行C x51的情况是不适用的本手册中的例子是通用的可以应用到所有编程环境手册组织本用户手册分成下面的章节和附录第一章介绍概述C x51编译器第二章用C x51编译解释怎样用C x51交叉编译器编译一个源文件本章叙述控制文件处理编译和输出的命令行提示第三章语言扩展叙述支持8051系统结构必须的C语言扩展本章提供一个在ANSI C说明中没有的命令函数和控制的详细列表第四章预处理器叙述C x51编译器预处理器的组成和包含的例子第五章派生的8051叙述C x51编译器支持的8051派生系列本章还包括能帮助提高目标程序性能的技巧第六章高级编程技术对有经验的开发人员的重要信息本章包括定制文件描述优化器详细资料和段名约定本章还讨论了C x51编译器产生的程序和别的8051编程语言如何接口第七章错误信息列出了在使用C x51编译器时可能遇到的致命错误语法错误和警告第八章库参考提高一个扩展的C x51库参考分类列出了库例程和相关的包含文件本章最后有一个按字母顺序的参考包括每个库例程的例子代码附录中包含不同编译器版本间的差异作品编号和别的有些信息文档约定本文档有下列约定README .TXT 粗体大写用在可执行程序名数据文件名源文件名环境变量和输入WINDOWS 命令行的命令上表示你必须手工输入的文本不一定要大写例CLS DIR BL51.EXELanguage Elements C 语言的构成包括关键词操作符和库函数用粗体例if != longisdigit main >>Courier 这种字体的文本代表显示在屏幕上或打印出的信息这字体也用在讨论或描述命令行中Variables 斜体字必须提供的信息例如在语法字符串中的projectfile 表示需要提供实际的工程文件名重复的成分…例子中使用的省略号…表示重复的成分省略代码 . . .垂直省略号用在源代码例子中表示省略一段程序例子void main(void ) {...while(1);[可选项]命令行中的可选参数和选择项用方括号表示例C51 TEST.C PRINT [(filename )]{opt1|opt2}大括号中的文本用竖线分隔代表一组选项必须从中选一项大括号中包含了所有选项竖线分隔选项KeysSans serif 字体的文本代表键盘的键例如按Enter 继续ContentsChapter 1. Introduction (15)Support for all 8051 Variants (15)Books About the C Language (16)Chapter 2. Compiling with the C x51 Compiler (17)Environment Variables (17)Running C x51 from the Command Prompt (18)ERRORLEVEL (19)C x51 Output Files (19)Control Directives (20)Directive Categories (20)Reference (23)AREGS / NOAREGS (24)ASM / ENDASM (26)BROWSE (28)CODE (29)COMPACT (30)COND / NOCOND (31)DEBUG (33)DEFINE (34)DISABLE (35)EJECT (37)FLOATFUZZY (38)INCDIR (39)INTERVAL (40)INTPROMOTE / NOINTPROMOTE (41)INTVECTOR / NOINTVECTOR (44)LARGE (46)LISTINCLUDE (47)MAXARGS (48)MOD517 / NOMOD517 (49)MODA2 / NOMODA2 (51)MODAB2 / NOMODAB2 (52)MODDA2 / NOMODDA2 (53)MODDP2 / NOMODDP2 (54)MODP2 / NOMODP2 (55)NOAMAKE (56)NOEXTEND (57)OBJECT / NOOBJECT (58)OBJECTADVANCE (59)OBJECTEXTEND (60)ONEREGBANK (61)OMF2 (62)OPTIMIZE (63)ORDER (65)PAGELENGTH (66)PAGEWIDTH (67)PREPRINT (68)PRINT / NOPRINT (69)REGFILE (70)REGISTERBANK (71)REGPARMS / NOREGPARMS (72)RET_PSTK, RET_XSTK (74)ROM (76)SAVE / RESTORE (77)SMALL (78)SRC (79)STRING (80)SYMBOLS (81)USERCLASS (82)VARBANKING (84)WARNINGLEVEL (85)XCROM (86)Chapter 3. Language Extensions (89)Keywords (89)Memory Areas (90)Program Memory (90)Internal Data Memory (91)External Data Memory (92)Far Memory (93)Special Function Register Memory (93)Memory Models (94)Small Model (94)Compact Model (95)Large Model (95)Memory Types (95)Explicitly Declared Memory Types (96)Implicit Memory Types (97)Data Types (97)Bit Types (98)Bit-addressable Objects (99)Special Function Registers (101)sfr (101)sfr16 (102)sbit (102)Absolute Variable Location (104)Pointers (106)Generic Pointers (106)Memory-specific Pointers (109)Pointer Conversions (111)Abstract Pointers (114)Function Declarations (118)Function Parameters and the Stack (119)Passing Parameters in Registers (120)Function Return Values (120)Specifying the Memory Model for a Function (121)Specifying the Register Bank for a Function (122)Register Bank Access (124)Interrupt Functions (125)Reentrant Functions (129)Alien Function (PL/M-51 Interface) (132)Real-time Function Tasks (133)Chapter 4. Preprocessor (135)Directives (135)Stringize Operator (136)Token-pasting operator (137)Predefined Macro Constants (138)Chapter 5. 8051 Derivatives (139)Analog Devices MicroConverter B2 Series (140)Atmel 89x8252 and Variants (141)Dallas 80C320, 420, 520, and 530 (142)Dallas 80C390, 80C400, 5240, and Variants (143)Arithmetic Accelerator (144)Infineon C517, C509, 80C537, and Variants (145)Data Pointers (145)High-speed Arithmetic (146)Library Routines (146)Philips 8xC750, 8xC751, and 8xC752 (147)Philips 80C51MX Architecture (148)Philips and Atmel WM Dual DPTR (148)Chapter 6. Advanced Programming Techniques (149)Customization Files (150)STARTUP.A51 (151)INIT.A51 (153)XBANKING.A51 (154)Basic I/O Functions (156)Memory Allocation Functions (156)Optimizer (157)General Optimizations (157)8051-Specific Optimizations (158)Options for Code Generation (158)Segment Naming Conventions (159)Data Objects (160)Program Objects (161)Interfacing C Programs to Assembler (163)Function Parameters (163)Parameter Passing in Registers (164)Parameter Passing in Fixed Memory Locations (165)Function Return Values (165)Using the SRC Directive (166)Register Usage (168)Overlaying Segments (168)Example Routines (168)Small Model Example (169)Compact Model Example (171)Large Model Example (173)Interfacing C Programs to PL/M-51 (175)Data Storage Formats (176)Bit Variables (176)Signed and Unsigned Characters, Pointers to data, idata, and pdata (177)Signed and Unsigned Integers, Enumerations, Pointers to xdata andcode (177)Signed and Unsigned Long Integers (177)Generic and Far Pointers (178)Floating-point Numbers (179)Floating-point Errors (182)Accessing Absolute Memory Locations (184)Absolute Memory Access Macros (184)Linker Location Controls (185)The _at_ Keyword (186)Debugging (187)Chapter 7. Error Messages (189)Fatal Errors (189)Actions (190)Errors (191)Syntax and Semantic Errors (193)Warnings (205)Chapter 8. Library Reference (209)Intrinsic Routines (209)Library Files (210)Standard Types (211)jmp_buf (211)va_list (211)Absolute Memory Access Macros (212)CBYTE (212)CWORD (212)DBYTE (213)DWORD (213)FARRAY, FCARRAY (214)FVAR, FCVAR, (215)PBYTE (216)PWORD (216)XBYTE (217)XWORD (217)Routines by Category (218)Buffer Manipulation (218)Character Conversion and Classification (219)Data Conversion (220)Math Routines (221)Memory Allocation Routines (223)Stream Input and Output Routines (224)String Manipulation Routines (226)Variable-length Argument List Routines (227)Miscellaneous Routines (227)Include Files (228)8051 Special Function Register Include Files (228)80C517.H (228)ABSACC.H (229)ASSERT.H (229)CTYPE.H (229)INTRINS.H (229)MATH.H (230)SETJMP.H (230)STDARG.H (230)STDDEF.H (230)STDIO.H (231)STDLIB.H (231)STRING.H (231)Reference (232)abs (233)acos / acos517 (234)asin / asin517 (235)assert (236)atan / atan517 (237)atan2 (238)atof / atof517 (239)atoi (240)atol (241)cabs (242)calloc (243)ceil (244)_chkfloat_ (245)cos / cos517 (246)cosh (247)_crol_ (248)_cror_ (249)exp / exp517 (250)fabs (251)floor (252)fmod (253)free (254)getchar (255)_getkey (256)gets (257)init_mempool (258)_irol_ (259)_iror_ (260)isalnum (261)isalpha (262)iscntrl (263)isdigit (264)isgraph (265)islower (266)isprint (267)ispunct (268)isspace (269)isupper (270)isxdigit (271)labs (272)log / log517 (273)log10 / log10517 (274)longjmp (275)_lrol_ (277)_lror_ (278)malloc (279)memccpy (280)memchr (281)memcmp (282)memcpy (283)memmove (284)memset (285)modf (286)_nop_ (287)offsetof (288)pow (289)printf / printf517 (290)putchar (296)puts (297)rand (298)realloc (299)scanf (300)setjmp (304)sin / sin517 (305)sinh (306)sprintf / sprintf517 (307)sqrt / sqrt517 (309)srand (310)sscanf / sscanf517 (311)strcat (313)strchr (314)strcmp (315)strcpy (316)strcspn (317)strlen (318)strncat (319)strncmp (320)strncpy (321)strpbrk (322)strpos (323)strrchr (324)strrpbrk (325)strrpos (326)strspn (327)strstr (328)strtod / strtod517 (329)strtol (331)strtoul (333)tan / tan517 (335)tanh (336)_testbit_ (337)toascii (338)toint (339)tolower (340)_tolower (341)toupper (342)_toupper (343)ungetchar (344)va_arg (345)va_end (347)va_start (348)vprintf (349)vsprintf (351)Appendix A. Differences from ANSI C (353)Compiler-related Differences (353)Library-related Differences (353)Appendix B. Version Differences (357)Version 6.0 Differences (357)Version 5 Differences (358)Version 4 Differences (359)Version 3.4 Differences (361)Version 3.2 Differences (362)Version 3.0 Differences (363)Version 2 Differences (364)Appendix C. Writing Optimum Code (367)Memory Model (367)Variable Location (369)Variable Size (369)Unsigned Types (370)Local Variables (370)Other Sources (370)Appendix D. Compiler Limits (371)Appendix E. Byte Ordering (373)Appendix F. Hints, Tips, and Techniques (375)Recursive Code Reference Error (375)Problems Using the printf Routines (376)Uncalled Functions (377)Using Monitor-51 (377)Trouble with the bdata Memory Type (378)Function Pointers (379)Glossary (383)Index (391)ጙᐺC语言是一个通用的编程语言它提供高效的代码结构化的编程和丰富的操作符C不是一种大语言不是为任何特殊应用领域而设计它一般来说限制较少可以为各种软件任务提供方便和有效的编程许多应用用C比其他语言编程更方便和有效优化的C x51 C编译器完整的实现了ANSI的C语言标准对8051来说C x51不是一个通用的C编译器它首先的目标是生成针对8051的最快和最紧凑的代码C x51具有C编程的弹性和高效的代码和汇编语言的速度C语言不能执行的操作如输入和输出需要操作系统的支持这些操作作为标准库的一部分提供因为这些函数和语言本身无关所以C特别适合对多平台提供代码既然C x51是一个交叉编译器C语言的某些方面和标准库就有了改变或增强以适应一个嵌套的目标处理器的特性更多的细节参考89页的第三章.语言扩展支持所有的8051变种8051系列是增长最快的微处理器构架之一从不同的芯片厂家提供了400多种芯片新扩展的8051芯片如PHILIPS 8051MX有几M字节的代码和数据空间可被用到大的应用中为了支持这些不同的8051芯片KEIL提供了几种开发工具如下表所列一个新的输出文件格式OMF2允许支持最多16MB代码和数据空间CX51编译器适用于新的PHILIPS 8051MX结构C51编译器A51宏汇编BL51连接器对传统的8051开发工具包括支持32 x64KB 的代码库C51编译器有OMF2输出AX51宏汇编LX51连接器对传统的8051和扩展的8051芯片如DALLAS 390的开发工具包括支持代码库和最多16MB代码和XDATA存储区CX51编译器AX51宏汇编LX51连接器对PHILIPS 8051MX的开发工具支持最多16MB 代码和XDATA存储区C x 51编译器在不同的包中提供上表是完整的8051开发工具参考注意Cx51指两种编译器C51编译器和CX51编译器C 语言的书有许多书介绍C 语言有更多的书详细介绍用C 完成的任务下面的列表不是一个完整的列表列表只是作为参考The C Programming Language, Second Edition Kernighan & RitchiePrentice-Hall, Inc.ISBN 0-13-110370-9C: A Reference Manual, Second EditionHarbison & SteelPrentice-Hall Software SeriesISBN 0-13-109810-1C and the 8051: Programming and MultitaskingSchultzP T R Prentice-Hall, Inc.ISBN 0-13-753815-4औᐺCx51ܠፉܠፉ本章说明怎样编译C源文件讨论编译器的控制命令这些命令可以命令C x51编译器产生列表文件控制包含在OBJ文件中的信息的数量指定优化级别和存储模式注意一般来说你应在µVision2 IDE中使用Cx51关于使用µVision2IDE的更多信息参考用户手册Getting Started with µVision2 and C51”.环境变量如果在µVision2IDE中运行Cx51编译器计算机不需要另外的设置如果想要在命令行中运行C x51编译器和工具必须手工创建下面的环境变量PATH\C51\BIN C51和CX51可执行程序的路径TMP编译器产生的临时文件的路径如果指定的路径不存在编译器会生成错误并停止编译C51INC\C51\INC Cx51头文件的路径C51LIB\C51\LIB Cx51库文件的路径对WINSOWS NT WINDOWS 2000和WINDOWS XP这些环境变量在Control Panel –System – Advanced – Environment Variables中输入对WINDOWS 95WINDOWS 98和WINDOWS ME这些设置放在AUTOEXEC.BAT中PATH=C\KEIL\C51\BIN;%PATH%SET TMP=D:\SET C51INC=C:\KEIL\C51\INCSET C51LIB=C:\KEIL\C51\LIB从命令行运行Cx51调用C51或CX51编译器在命令行输入C51或CX51在命令行中必须包含要编译的C源文件和必需的编译控制命令C x51命令行的格式C51 sourcefile [directives…]CX51 sourcefile [directives…]或C51 @commandfileCX51 @commandfile这里sourcefile要编译的源文件名directives用来控制编译器功能的命令参考20页的控制命令commandfile包含源文件名和命令的命令输入文件当C x51调用行较复杂超过了WINDOWS命令行的限制时使用commandfile下面的命令行例子调用C51指定源文件SAMPLE.C用控制DEBUG CODE和PREPRINTC51 SAMPLE.C DEBUG CODE PREPRINTC x51编译器在成功编译后显示下面的信息C51 COMPILER V6.10C51 COMPILATION COMPLETE. 0 WARNING S0 ERROR S错误级别在编译后错误和警告的数目输出在屏幕上C x51编译器设置ERRORLEVEL指示编译的状态值如下表所列0没有错误或警告1只有警告2错误和可能的警告3致命错误可以在批处理文件中访问ERRORLEVEL变量关于ERRORLEVEL或批处理文件可以参考WINDOWS命令索引或在线帮助Cx51输出文件C x51编译器在编译时产生许多输出文件缺省的输出文件和源文件同名但文件的扩展名不同下面的表列出了文件并有简短的说明Filename.LST列表文件包含格式化的源文件和编译中检测到的错误列表文件可以选择包含所用的符号和生成汇编代码更多的信息参考PRINT命令Filename.OBJ包含可重定位目标代码的OBJ模块OBJ模块用Lx51连接器连接到一个绝对的OBJ模块Filename.I包含由预处理器扩展的源文件所有的宏都扩展了所有的注释都删除了可参考PREPRINT命令Filename.SRC C源代码产生的汇编源文件可以用A51汇编可参考SRC命令控制命令C x51编译器提供许多控制命令控制编译除了指定的命令由一个或多个字母或数字组成在命令行中在文件名后指定或在源文件中用#pragma命令例如C51 testfile.c SYMBOLS CODE DEBUG#pragma SYMBOLS CODE DEBUG在说明的例子中SYMBOLS CODE和DEBUG都是控制命令testfile.C是要编译的源文件注意对命令行和#pragma语法是相同的在#pragma可指定多个选项典型的每个控制命令只在源文件的开头指定一次如果一个命令指定多次编译器产生一个致命错误退出编译可以指定多次的命令在下面部分注明命令种类控制命令可以分成三类源文件控制目标控制和列表控制源文件控制定义命令行的宏定义要编译的文件名目标控制影响产生的目标模块*.OBJ的形式和内容这些命令指定优化级别或在OBJ文件中包含调试信息列表控制管理列表文件*.LST的各种样式特别是格式和指定的内容上下表按字母顺序列出了控制命令有下划线的字母表示命令的缩写AREGS NOAREGS Object 使能或不使能绝对寄存器ARn地址ASM ENDASM Source 标志内嵌汇编块的开始和结束BROWSE †Object 产生浏览器信息CODE †Listing 加一个汇编列表到列表文件COMPACT †Object 设置COMPACT 存储模式COND NOCOND †Listing 包含或执行预处理器跳过的源程序行DEBUG †Object 在OBJ 文件中包含调试信息DEFINE Source 在Cx51调用行定义预处理器名DISABLE Object 在一个函数内不允许中断EJECTListing 在列表文件中插入一个格式输入字符FLOATFUZZY Object 在浮点比较中指定位数INCDIR †Source 指定头文件的附加路径名INTERVAL †Object 对SIECO 芯片指定中断矢量间隔INTPROMOTE NOINTPROMOTE†Object 使能或不使能ANSI 整数同时提升INTVECTOR NOINTVECTOR †Object 指定中断矢量的基地址或不使能矢量LARGE †Object 选择LARGE 存储模式LISTINCLUDE Listing 在列表文件中显示头文件MAXAREGS †Object 指定可变参数列表的大小MOD517NOMOD517Object 使能或不使能代码支持80C517和派生的额外的硬件特征MODA2NOMODA2Object 使能或不使能ATMEL 82x8252和变种的双DPTR 寄存器MODAB2NOMODAB2Object 使能或不使能模拟设备ADuC B2系列支持双DPTR 寄存器MODDA NOMODDA Object 使能或不使能DALLAS 80C39080C400和5240支持算法加速器MODDP2NOMODDP2Object 使能或不使能DALLAS 的320520530550和变种支持双DPTR 寄存器MODP2NOMODP2Object 使能或不使能PHILIPS 和ATMELWM 派生的支持双DPTR 寄存器NOAMAKE †Object 不记录µVision2更新信息NOEXTEND †Source Cx51不扩展到ANSI COBJECT NOOBJECT †Object 指定一个OBJ 文件或禁止OBJ 文件OBJECTEXTEND†Object 在OBJ 文件中包含变量类型信息ONEREGBANKObject假定在中断中只用寄存器组0OMF2†Object 产生OMF2输出文件格式OPTIMIZE Object 指定编译器的优化级别ORDER †Object 按源文件中变量的出现顺序分配PAGELENGTH †Listing 指定页的行数PAGEWIDTH †Listing 指定页的列数PREPRINT †Listing 产生一个预处理器列表文件扩展所有宏PRINTNOPRINT †Listing 指定一个列表文件名或不使能列表文件REGFILE †Object 对全局寄存器优化指定一个寄存器定义文件REGISTERBANK Object 为绝对寄存器访问选择寄存器组REGPARMS NOREGPARMS Object 使能或不使能寄存器参数传递RET_PSTK † RET_XSTK †Object 用重入堆栈保存返回地址ROM †Object AJMP/ACALL 指令产生控制SAVERESTORE Object 保存和恢复AREGS REGPARMS 和OPTIMIZE 命令设置SMALL†Object 选择SMALL 存储模式缺省SRC †Object 产生一个汇编源文件不产生OBJ 模块STRING †Object 定位固定字符串到XDATA 或远端存储区SYMBOLS †Listing 模块中所有符号的列表文件USERCLASS †Object 对可变的变量位置重命名存储区类VARBANKING †Object 使能FAR 存储类型变量WARNINGLEVEL†Listing 选择警告检测级别XCROM †Object对CONST XDATA 变量假定ROM 空间† 这些命令在命令行或源文件开头的#pragma中只指定一次在一个源文件中不能使用多次控制命令和参数除了用DEFINE 命令的参数是大小写无关的参考本章的余下部分按字母顺序描述C x51编译器控制命令他们分成如下部分缩写可以替代命令的缩写参数命令可选和要求的参数缺省命令的缺省设置µVision2控制怎样指定命令说明详细的说明命令和使用参考相关命令例子命令使用的例子有时也列出结果AREGS/NOAREGS缩写无参数无缺省AREGSµVision2控制Options – C51 – Don‘t use absolute register access说明AREGS控制使编译器对寄存器R0到R7用绝对寄存器地址绝对地址提高了代码的效率例如PUSH和POP指令只能用直接或绝对地址用AREGS命令可以直接PUSH或POP寄存器可用REGISTERBANK命令定义使用的寄存器组NOAREGS命令对寄存器R0到R7不使能绝对寄存器地址用NOAREGS编译的函数可以使用所有的8051寄存器组命令可用在被别的函数用不同的寄存器组调用的函数中注意虽然可能在一个程序中定义了几次AREGS/NOAREGS选项只有定义在函数声明为有效例子下面是一个使用NOAREGS 和AREGS 的源程序和代码的列表注意保存R7到堆栈中的不同方法函数noaregfunc 产生的代码是MOV A R7PUSHACC同时对aregfunc 函数的代码是PUSHAR7stmt levelsource1extern char func ();2char k;34#pragma NOAREGS 5noaregfunc (){61k =func ()+func ();71}89#pragma AREGS 10aregfunc (){111k =func ()+func ();121};FUNCTION noaregfunc (BEGIN);SOURCE LINE #60000120000E LCALL func 0003EF MOV A,R70004C0E0PUSH ACC 0006120000E LCALL func 0009D0E0POP ACC 000B 2F ADD A,R7000C F500R MOV k,A;SOURCE LINE #7000E22RET;FUNCTION noaregfunc (END);FUNCTION aregfunc (BEGIN);SOURCE LINE #110000120000E LCALL func 0003C007PUSH AR70005120000E LCALL func 0008D0E0POP ACC 000A 2F ADD A,R7000B F500R MOV k,A;SOURCE LINE #12000D22RET;FUNCTION aregfunc (END)ASM/ENDASM缩写无参数无缺省无µVision2控制本命令不能在命令行指定说明ASM命令标志一块源程序的开始它可以直接合并到由SRC命令产生的.SRC文件中这些源程序可以认为是内嵌的汇编然而它只输出到由SRC命令产生的源文件中源程序不汇编和输出到OBJ文件中在µVision2应对C源文件中包含ASM/ENDASM段如下设置一个文件指定选项右键点击PROJECT窗口 – 文件表中的文件选择Options for…打开选项 – 属性页使能Generate Assembler SRC file使能Assemble SRC file用这些设置µVision2产生一个汇编源文件.SRC并用汇编编译产生一个OBJ文件.OBJENDASM命令标志一个源程序块的结束注意ASM和ENDASM命令只能在源文件中使用且作为#pragma命令的一部分例子#pragma asm / #pragma endasm 下面是C 源文件产生下面的.SRC 文件...stmt levelsource1extern void test ();23main (){41test ();5161#pragma asm 71JMP $;endless loop 81#pragma endasm 91}..;ASM.SRC generated from:ASM.C NAME ASM PRmainASM SEGMENT CODE EXTRN CODE (test)EXTRN CODE (?C_STARTUP)PUBLIC main;extern void test ();;;main (){RSEG ?PR?main?ASM USING 0main:;SOURCE LINE #3;test ();;SOURCE LINE #4LCALL test;;#pragma asmJMP $;endless loop;#pragma endasm ;};SOURCE LINE #9RET ;END OF mainENDBROWSE缩写BR参数无缺省不创建浏览信息µVision2控制Options – Output – Browse Information说明用BROWSE编译器产生浏览信息浏览信息包括标识符包含预处理器符号他们的存储空间类型定义和参考列表信息可以在µVision2内显示选择View – Source Browser打开µVision2源浏览器参考µVision2用户手册第四章µVision2功能源浏览器例子C51 SAMPLE.C BROWSE#pragma browseCODE缩写CD参数无缺省不产生汇编代码列表µVision2控制Options – Listing – C Compiler Listing – Assembly Code说明CODE命令附加一个汇编助记符列表到列表文件汇编程序代码代表源程序中的每个函数缺省的在列表文件中没有汇编代码例子C51 SAMPLE.C CD#pragma code下面例子显示C源程序和它产生的OBJ结果代码和助记符在汇编间显示了产生代码的行号字符R和E代表可重定位和外部的stmt level source1extern unsigned char a,b;2unsigned char c;34main()5{61c=14+15*((b/c)+252);71}...ASSEMBLY LISTING OF GENERATED OBJECT CODE;FUNCTION main(BEGIN);SOURCE LINE#5;SOURCE LINE#60000E500E MOV A,b00028500F0R MOV B,c000584DIV AB000675F00F MOV B,#0FH0009A4MUL AB000A24D2ADD A,#0D2H000C F500R MOV c,A;SOURCE LINE#7000E22RET;FUNCTION main(END)COMPACT缩写CP参数无缺省SMALLµVision2控制Options – Target – Memory Model说明本命令选择COMPACT存储模式在COMPACT存储模式中所有的函数和程序变量和局部数据段定位在8051系统的外部数据存储区外部数据存储区可有最多256字节一页在本模式中外部数据存储区的短地址用@R0/R1不管什么存储类型可以在任何8051的存储范围内声明变量但是把常用的变量如循环计数器和数组索引放在内部数据存储区可以显著的提高系统性能注意函数调用所用的堆栈经常放在IDATA存储区参考SAMLL LARGE ROM例子C51 SAMPLE.C COMPACT#pragma compactCOND/NOCOND缩写CO参数无缺省CONDµVision2控制Options – Listing – C Compiler Listing - Conditional说明本命令定义这些部分的受条件编译影响的源程序是否显示在列表文件中COND命令在列表文件中包含编译省略的行行号和嵌套级不输出以便于阅读本命令影响预处理器删除的行NOCOND命令不在列表文件中包含编译省略的行例子下面的例子显示用COND命令编译产生的一个列表文件...stmt level source1extern unsigned char a,b;2unsigned char c;34main()5{61#if defined(VAX)c=13;#elif defined(__TIME__)91b=14;101a=15;111#endif121}..下面的例子用NOCOND命令编译产生的一个列表文件...stmt level source1extern unsigned char a,b;2unsigned char c;34main()5{61#if defined(VAX)91b=14;101a=15;111#endif121}...缩写DB参数无缺省不产生调试信息µVision2控制Options – Output – Debug Information说明DEBUG命令指示编译器在OBJ文件中包含调试信息缺省OBJ 文件不包含调试信息对程序的符号测试必需有调试信息信息包括全局和局部变量定义和地址和函数名和行号包含在目标模块中的调试信息在连接过程中仍有效这些信息可以被µVision2调试器或任何INTEL兼容的模拟器使用注意OBJECTEXTEND命令用来指示编译器在目标文件中包含附加的变量类型定义信息参考OBJECTEXTEND例子C51 SAMPLE.C DEBUG#pragma db缩写DF参数一个或多个符合C语言约定的的名称用逗号分隔对每个名称可有一个参数用DEFINE给出缺省无µVision2控制在Options –C x51 – Define输入名称说明DEFINE命令定义调用行的名称预处理器要用#if#ifdef和#ifndef查询这些名称定义的名称在输入后被复制这些命令是大小写相关的作为一个选项每个名称可跟一个值注意DEFINE命令只能在命令行中指定在一个C源程序中用C预处理器命令#define例子C51 SAMPLE.C DEFINE check,NoExtRamC51 MYPROG.C DF (X1=“1+5”,iofunc=“getkey()”)DISABLE缩写无参数无缺省无µVision2控制本命令不能在命令行中指定只能在源文件中指定说明DISABLE命令指示编译器在产生代码时在一个函数内不使能所有中断DISABLE必须在一个函数声明前一行用#pragma命令指定DISABLE控制只用到一个函数对每个新的函数必须重新指定注意DISABLE只能用#pragma命令指定不能在命令行指定DISABLE可在一个源文件中指定多次对每个函数只能指定一次执行后不使能中断一个不使能中断的函数不能对调用者返回一个位值例子本例子是一个用DISABLE命令函数的源程序和代码列表注意EA指定函数寄存器在函数进入时清除JBC EA C002在结尾时恢复MOV EA C...stmt level source1typedef unsigned char uchar;23#pragma disable/*Disable Interrupts*/4uchar dfunc(uchar p1,uchar p2){51return(p1*p2+p2*p1);61};FUNCTION_dfunc(BEGIN)0000D3SETB C000110AF01JBC EA,?C00020004C3CLR C0005?C0002:0005C0D0PUSH PSW;----Variable'p1'assigned to register'R7'----;----Variable'p2'assigned to register'R5'----;SOURCE LINE#4;SOURCE LINE#50007ED MOV A,R500088FF0MOV B,R7000A A4MUL AB000B25E0ADD A,ACC000D FF MOV R7,A;SOURCE LINE#6000E?C0001:000E D0D0POP PSW001092AF MOV EA,C001222RET;FUNCTION_dfunc(END)...EJECT缩写EJ参数无缺省无µVision2控制本命令不能在命令行中指定只能在源文件中指定说明EJECT命令在列表文件中插入一个格式输入字符注意EJECT只在源文件中出现必须是#pragma命令的一部分例子#pragma ejectFLOATFUZZY缩写FF参数0到7间的一个数字缺省FLOATFUZZY3µVision2控制Options - C x51 – Bits to round for float compare说明FLOATFUZZY命令在一个浮点比较前定义位数缺省值3指定最少有三个有效位例子C51 MYFILE.C FLOATFUZZY2#pragma FF(0)INCDIR缩写无参数指定头文件的路径缺省无µVision2控制Options - C x51 – Include Paths说明INCDIR命令指定Cx51编译器头文件的位置编译器最多50个路径声明如果需要多个路径路径名必须用分号分开如果指定#include“filename.h”Cx51编译器首先搜索当前目录然后是源文件目录当找不到或用了#include <filename.h>就搜索INCDIR指定的路径当仍找不到就使用C51INC环境变量指定的路径例子C51 SAMPLE.C INDIR C\KEIL\C51\MYINC;C:\CHIP-DIRINTERVAL缩写无参数对中断矢量表可选用括号括住缺省INTERV AL8µVision2控制Options - C x51 – Misc controls:enter the directive说明INTERV AL命令指定中断矢量的间隔指定间隔是SIECO-51派生系列要求的它定义中断矢量在3字节间隔用本命令编译器定位中断矢量在绝对地址如下计算(interval×n)+offset+3,这里interval INTERV AL命令的参数缺省为8n中断号offset INTVECTOR命令的参数缺省为0参考INTVECTOR/NOINTVECTOR例子C51 SAMPLE.C INTERV AL3#pragma interval(3)INTPROMOTE/NOINTPROMOTE缩写IP/NOIP参数无缺省INTPROMOTEµVision2控制Options - C x51 – Enable ANSI integer promotion rules说明INTPROMOTE命令使能ANSI整数提升规则如果提升声明了在比较前所用的表达式从小类型提升到整数表达式这使MICROSOFT C和BORLAND C改动很少就可用到Cx51上因为8051是8位处理器使用INTPROMOTE命令可能在某些应用中降低效率NOINTPROMOTE命令不使能自动整数提升整数提升使Cx51和别的ANSI编译器间有更大的兼容性然而整数提升可能降低效率例子C51 SAMPLE.C INTPROMOTE#pragma intpormoteC51 SAMPLE.C NOINTPROMOTE下面的代码示范用INTPROMOTE和NOINTPROMOTE命令产生的代码stmt lvl source1char c;2unsigned char c1,c2;3int i;45main(){61if(c==0xff)c=0;/*never true!*/71if(c==-1)c=1;/*works*/81i=c+5;91if(c1<c2+4)c1=0;101};FUNCTION main(BEGIN);SOURCE LINE#60000AF00MOV R7,c0002EF MOV A,R7000333RLC A000495E0SUBB A,ACC0006FE MOV R6,A0007EF MOV A,R70008F4CPL A00094E ORL A,R6000A7002JNZ?C0001000C F500MOV c,A000E?C0001:;SOURCE LINE#7000E E500MOV A,c0010B4FF03CJNE A,#0FFH,?C0002 0013750001MOV c,#01H0016?C0002:;SOURCE LINE#80016AF00MOV R7,c0018EF MOV A,R7001933RLC A001A95E0SUBB A,ACC001C FE MOV R6,A001D EF MOV A,R7001E2405ADD A,#05H0020F500MOV i+01H,A0022E4CLR A00233E ADDC A,R60024F500MOV i,A;SOURCE LINE#90026E500MOV A,c200282404ADD A,#04H002A FF MOV R7,A002B E4CLR A002C33RLC A002D FE MOV R6,A002E C3CLR C002F E500MOV A,c100319F SUBB A,R70032EE MOV A,R600336480XRL A,#080H0035F8MOV R0,A00367480MOV A,#080H003898SUBB A,R000395003JNC?C0004003B E4CLR A003C F500MOV c1,A;SOURCE LINE#10003E?C0004:003E22RET;FUNCTION main(END);FUNCTION main(BEGIN);SOURCE LINE#60000AF00MOV R7,c0002EF MOV A,R7000333RLC A000495E0SUBB A,ACC0006FE MOV R6,A0007EF MOV A,R70008F4CPL A00094E ORL A,R6000A7002JNZ?C0001000C F500MOV c,A000E?C0001:;SOURCE LINE#7000E E500MOV A,c0010B4FF03CJNE A,#0FFH,?C0002 0013750001MOV c,#01H0016;SOURCE LINE#80016E500MOV A,c00182405ADD A,#05H001A FF MOV R7,A001B33RLC A001C95E0SUBB A,ACC001E F500MOV i,A00208F00MOV i+01H,R7;SOURCE LINE#90022E500MOV A,c200242404ADD A,#04H0026FF MOV R7,A0027E500MOV A,c10029C3CLR C002A9F SUBB A,R7002B5003JNC?C0004002D E4CLR A002E F500MOV c1,A;SOURCE LINE#100030?C0004:003022RET;FUNCTION main(END)CODE SIZE = 63 Bytes CODE SIZE = 49 BytesINTVECTOR/NOINTVECTOR缩写IV/NOIV参数对中断矢量表一个可选的偏移在括号中缺省INTVECTOR0µVision2控制Options - C x51 – Misc controls:enter the directive说明INTVECTOR命令指示编译器对要求的函数产生中断矢量如果矢量表不从0开始需输入一个偏移用本命令编译器产生一个中断矢量入口根据ROM命令指定的程序存储区用AJMP或LJMP指令跳转NOINTVECTOR命令禁止产生中断矢量表这也许用户用别的编程工具提供中断矢量编译器通常用一个3字节跳转指令LJMP产生一个中断矢量矢量用绝对地址表示(interval × n) + offset + 3,这里n中断号interval INTERV AL命令的参数缺省为8offset INTVECTOR命令的参数缺省为0参考INTERV AL。
KEIL C编译器常见警告与错误信息的解决办法

KEIL C编译器常见警告与错误信息的解决办法1. Warning 280:‟i‟:unreferenced local variable说明局部变量i 在函数中未作任何的存取操作解决方法消除函数中i 变量的宣告2 Warning 206:‟Music3‟:missing function-prototype说明Music3( )函数未作宣告或未作外部宣告所以无法给其他函数调用解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern void Music3(void),即作外部宣告3 Compling :C:\8051\MANN.CError:318:can‟t open file …beep.h‟说明在编译C:\8051\MANN.C 程序过程中由于main.c 用了指令#include “beep.h”,但却找不到所致解决方法编写一个beep.h 的包含档并存入到c:\8051 的工作目录中4 Compling:C:\8051\LED.CError 237:‟LedOn‟:function already has a body说明LedOn( )函数名称重复定义即有两个以上一样的函数名称解决方法修正其中的一个函数名称使得函数名称都是独立的5 ***W ARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_DELAYX1MS?DELAY说明DelayX1ms( )函数未被其它函数调用也会占用程序记忆体空间解决方法去掉DelayX1ms( )函数或利用条件编译#if …..#endif,可保留该函数并不编译6 ***W ARNING 6 :XDA TA SPACE MEMORY OVERLAPFROM : 0025HTO: 0025H说明外部资料ROM 的0025H 重复定义地址解决方法外部资料ROM 的定义如下Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC 变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25 处并修正它7 W ARNING 206:‟DelayX1ms‟: missing function-prototypeC:\8051\INPUT.CE rror 267 :‟DelayX1ms …:requires ANSI-style prototype C:\8051\INPUT.C说明程序中有调用DelayX1ms 函数但该函数没定义即未编写程序内容或函数已定义但未作宣告解决方法编写DelayX1ms 的内容编写完后也要作宣告或作外部宣告可在delay.h的包含档宣告成外部以便其它函数调用8 ***W ARNING 1:UNRESOLVED EXTERNAL SYMBOLSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNALSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)ADDRESS:0018H说明程序中有调用MUSIC 函数但未将该函数的含扩档C 加入到工程档Prj 作编译和连接解决方法设MUSIC3 函数在MUSIC C 里将MUSIC C 添加到工程文件中去9 ***ERROR 107:ADDESS SPACE OVERFLOWSPACE: DA TASEGMENT: _DA TA_GOUP_LENGTH: 0018H***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNALSYMBOL: VOLUMEMODULE: C:\8051\OSDM.OBJ (OSDM)ADDRESS: 4036H说明data 存储空间的地址范围为0~0x7f,当公用变量数目和函数里的局部变量如果存储模式设为SMALL 则局部变量先使用工作寄存器R2~R7 作暂存当存储器不够用时则会以data 型别的空间作暂存的个数超过0x7f 时就会出现地址不够的现象解决方法将以data 型别定义的公共变量修改为idata 型别的定义--------------------------------------------------------------------------------------------------keil c编译器错误与解决方法2008-05-27 20:191. Warning 280:‟i‟:unreferenced local variable说明局部变量i 在函数中未作任何的存取操作解决方法消除函数中i 变量的宣告2 Warning 206:‟Music3‟:missing function-prototype说明Music3( )函数未作宣告或未作外部宣告所以无法给其他函数调用解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern void Music3(void),即作外部宣告3 Compling :C:\8051\MANN.CError:318:can‟t open file …beep.h‟说明在编译C:\8051\MANN.C 程序过程中由于main.c 用了指令#i nclude “beep.h”,但却找不到所致解决方法编写一个beep.h 的包含档并存入到c:\8051 的工作目录中4 Compling:C:\8051\LED.CError 237:‟LedOn‟:function already has a body说明LedOn( )函数名称重复定义即有两个以上一样的函数名称解决方法修正其中的一个函数名称使得函数名称都是独立的5 ***W ARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_DELAYX1MS?DELAY说明DelayX1ms( )函数未被其它函数调用也会占用程序记忆体空间解决方法去掉DelayX1ms( )函数或利用条件编译#if …..#endif,可保留该函数并不编译6 ***W ARNING 6 :XDA TA SPACE MEMORY OVERLAPFROM : 0025HTO: 0025H说明外部资料ROM 的0025H 重复定义地址解决方法外部资料ROM 的定义如下Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25 处并修正它7 W ARNING 206:‟DelayX1ms‟: missing function-prototypeC:\8051\INPUT.CError 267 :‟DelayX1ms …:requires ANSI-style prototype C:\8051\INPUT.C说明程序中有调用DelayX1ms 函数但该函数没定义即未编写程序内容或函数已定义但未作宣告解决方法编写DelayX1ms 的内容编写完后也要作宣告或作外部宣告可在delay.h 的包含档宣告成外部以便其它函数调用8 ***W ARNING 1:UNRESOLVED EXTERNAL SYMBOLSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNALSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)ADDRESS:0018H说明程序中有调用MUSIC 函数但未将该函数的含扩档C 加入到工程档Prj 作编译和连接解决方法设MUSIC3 函数在MUSIC C 里将MUSIC C 添加到工程文件中去9 ***ERROR 107:ADDESS SPACE OVERFLOWSPACE: DA TASEGMENT: _DA TA_GOUP_LENGTH: 0018H***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNALSYMBOL: VOLUMEMODULE: C:\8051\OSDM.OBJ (OSDM)ADDRESS: 4036H说明data 存储空间的地址范围为0~0x7f,当公用变量数目和函数里的局部变量如果存储模式设为SMALL 则局部变量先使用工作寄存器R2~R7 作暂存当存储器不够用时则会以data 型别的空间作暂存的个数超过0x7f 时就会出现地址不够的现象解决方法将以data 型别定义的公共变量修改为idata 型别的定义说明如对编译出错感兴趣的网友能否把你们常遇到的错误信息收集起来并提出最终的解决办法加以归纳以期共享10.***W ARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?_WRITE_GMVLX1_REG?D_GMVLX1CALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?_SPI_SEND_WORD?D_SPICALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?SPI_RECEIVE_WORD?D_SPICALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断服务程序的函数)同时调用,或者同时被多个中断服务程序调用。
keil μvision 5编译顺序

keil μvision 5编译顺序Keil μVision 5 是一款应用广泛的嵌入式开发工具,特别适合于嵌入式系统的开发。
在使用Keil μVision 5 进行编程时,编译顺序是非常重要的。
编译顺序的正确性将直接影响开发的效率和结果。
本文将介绍Keil μVision 5 的编译顺序。
第一步:预处理在Keil μVision 5 中,预处理是编译过程中的第一步。
预处理的作用是去除代码中的注释和空格,并将 #include 等预处理指令所包含的头文件内容转换为代码。
这个步骤的输出结果是一个 .i 文件。
第二步:编译编译是将预处理生成的 .i 文件转换为 .asm 文件格式的代码。
在这个过程中,代码中的语法错误也将被检测出来。
这个步骤的输出结果是一个 .obj 文件。
第三步:汇编汇编是将编译生成的 .obj 文件生成可以在特定平台上运行的机器码的过程。
在这个过程中,Keil μVision 5 将根据特定的处理器类型和所选择的编译选项来选择适当的指令。
这个步骤的输出结果是一个 .o 文件。
第四步:链接链接是将多个 .o 文件组合成一个可执行文件的过程。
在这个过程中,Keil μVision 5 将解析符号并将其绑定到它们所引用的地址上。
这个步骤的输出结果是可执行文件。
总结以上便是Keil μVision 5 编译顺序的详细介绍。
正确的编译顺序对开发的效率和结果有着重要的影响。
希望通过本文的介绍可以让初学者更好地了解Keil μVision 5 的编译顺序和工作原理,为之后的项目开发打下更好的基础。
Keil C51使用详解

Keil C51使用详解第一章Keil C51开发系统基本知识 (6)第一节系统概述 (6)第二节Keil C51单片机软件开发系统的整体结构 (6)第三节Keil C51工具包的安装 (7)1. C51 for Dos 72. C51 for Windows的安装及注意事项: (7)第四节Keil C51工具包各部分功能及使用简介 (7)1. C51与A51. 72. L51和BL51. 83. DScope51,Tscope51及Monitor51. 84. Ishell及uVision. 9第二章Keil C51软件使用详解 (10)第一节Keil C51编译器的控制指令 (10)1. 源文件控制类 (10)2. 目标文件(Object)控制类: (10)3. 列表文件(listing)控制类: (10)第二节dScope51的使用 (11)1. dScope51 for Dos 112. dScope for Windows 12第三节Monitor51及其使用 (13)1. Monitor51对硬件的要求 (13)2. Mon51的使用 (13)3. MON51的配置 (13)4. 串口连接图: (13)5. MON51命令及使用 (14)第四节集成开发环境(IDE)的使用 (14)1. Ishell for Dos的使用 (14)2. uVision for windows的使用 (15)第三章Keil C51 vs 标准C.. 15第一节Keil C51扩展关键字 (15)第二节内存区域(Memory Areas): (16)1. Pragram Area: (16)2. Internal Data Memory: 163. External Data Memory. 164. Speciac Function Register Memory. 16第三节存储模式 (16)1. Small模式 (16)2. Compact模式 (17)3. large模式 (17)第四节存储类型声明 (17)第五节变量或数据类型 (17)第六节位变量与声明 (17)1. bit型变量 (17)2. 可位寻址区说明20H-2FH.. 18第七节Keil C51指针 (18)1. 一般指针 (18)2. 存储器指针 (18)3. 指针转换 (18)第八节Keil C51函数 (19)1. 中断函数声明: (19)2. 通用存储工作区 (19)3. 选通用存储工作区由using x声明,见上例。
keilC语言指令

keilC语⾔指令char 字符型
int 整型
long 长整型
short 短整型
float 浮点型
doublle 双精度浮点型
signed 有符号
unsigned ⽆符号
void 声明函数
register 声明寄存器
static 声明静态变量
struct 声明结构体
volatile 说明变量在程序执⾏中可被隐含的改变
const 只读变量
enum 声明枚举类型
auto 声明⾃动变量
extern 声明变量或函数是在其它⽂件或本⽂件的其他位置定义
union 声明共⽤体
if 条件语句
else 条件否定语句
for ⼀种循环语句
do 循环体
while 循环条件
switch 开关语句
case 开关分⽀
default 开关语句中的其他分⽀,不进⼊case,默认
break 跳出当前整个循环
continue 跳出本次循环,开始下⼀轮新循环
return 函数返回语句
typedef ⽤以给数据类型取别名
sfr 定义特殊功能寄存器
bit 定义位变量
sbit 定义特殊功能寄存器的某⼀位
code 定义代码区的范围
interrupt 指定中断向量⼊⼝
using 指定内部功能寄存器组
#include 调⽤头⽂件
#define 宏定义。
keil教程

keil教程Keil是一款嵌入式开发环境,广泛应用于各种微控制器和单片机的软件开发中。
本教程将介绍Keil的基本使用方法,包括项目创建、代码编辑、编译和调试等。
项目创建:1. 打开Keil软件,点击“File”菜单,选择“New Project”创建一个新项目。
2. 在弹出的对话框中,选择目标设备型号,并为项目命名,然后点击“Save”按钮。
3. 选择项目存储路径,并点击“OK”按钮。
4. 在弹出的对话框中,选择需要包含的源文件和头文件,然后点击“Add”按钮。
5. 点击“Options”菜单,可以对项目进行各种配置,如选择编译器、优化选项等。
代码编辑:1. 在Keil的工作区中,双击打开需要编辑的源文件。
2. 在源文件中输入和编辑代码。
可以使用Keil提供的代码自动补全、语法提示等功能来提高编码效率。
3. 保存代码文件,可以使用快捷键“Ctrl+S”或点击工具栏上的“Save”按钮。
编译:1. 点击“Project”菜单,选择“Build Target”进行项目编译。
也可以直接点击工具栏上的“Build”按钮。
2. Keil会自动检查代码错误和警告,并生成目标文件和可执行文件。
调试:1. 连接目标设备到计算机上。
2. 点击“Debug”菜单,选择“Start/Stop Debug Session”进入调试模式。
3. 在调试模式下,可以设置断点、监视变量、单步执行等操作来调试程序。
4. 调试完成后,点击“Debug”菜单,选择“Stop Debug Session”停止调试。
本教程介绍了Keil的基本使用方法,包括项目创建、代码编辑、编译和调试等。
通过学习和掌握这些基本操作,您可以更好地利用Keil进行嵌入式软件开发。
KeilC51使用详解

KeilC51使用详解 (一)(2009-04-21 14:10:43)标签:keil单片机it分类:资源查询第一章 Keil C51开发系统基本知识第一节系统概述Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
用过汇编语言后再使用C来开发,体会更加深刻。
Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。
另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时更能体现高级语言的优势。
下面详细介绍Ke il C51开发系统各部分功能和使用。
第二节 Keil C51单片机软件开发系统的整体结构C51工具包的整体结构,如图(1)所示,其中uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。
开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。
然后分别由C51及A51编译器编译生成目标文件(.OBJ)。
目标文件可由LI B51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。
ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。
第三节 Keil C51工具包的安装1. C51 for Dos在Windows下直接运行软件包中DOS/C51DOS.exe然后选择安装目录即可。
完毕后欲使系统正常工作须进行以下操作(设C:/C51为安装目录):修改Autoexec.bat,加入path=C:/C51/BinSet C51LIB=C:/C51/LIBSe t C51INC=C:/C51/INC然后运行Autoexec.bat2. C51 for Windows的安装及注意事项:在Windows下运行软件包中WIN/Setup.exe,最好选择安装目录与C51 for Dos相同,这样设置最简单(设安装于C:/C51目录下)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
14.7 C51的用户配置文件
• C51的用户配置文件包括启动代码文件、变量初始 化文件、基本I/O函数文件、分组配置文件,这些 文件都是以源程序的形式存放在Keil\C51\LIB文 件夹中。用户根据需要适当修改配置文件以满足 不同的硬件环境需要。
14.2.1 #define命令
• #define命令用于定义一个“宏名”。其中“宏名”是一个
标识符,在源程序中遇到该标识符时,均以定义的串的内
容替代该标识符。ANSI标准将标识符定义为“宏名”,这
个替换过程称为“宏替换”。#define命令用于定义宏名时,
可以带参数,也可以不带参数,下面分别介绍这两种情况。
• #pragma指令后面的字符串,可以大写,也可以小 写。示例如下:
• #pragma sfr //在C51中使用SFR
• #pragma access //使用绝对地址
• #pragma asm //在C51中插入汇编语句
14.6 C51编译器的控制指令
• C51编译器的控制指令分为三类:源文件控制类、 目标文件控制类及列表控制类。这些指令可能需 要具体的编译器支持,因此这里仅进行简单的说 明,用户可以参考具体的编译器。对于Keil μVision3集成开发环境,可以在项目选项中进行 设置。下面分别介绍各类中常用的控制指令。
• 前面介绍了C51的启动代码,下面详细介绍上面的 启动代码文件中常用的一些EQU语句的功能。
• 1.IDATALEN • 2.XDATASTART、XDATALEN • 3.PDATASTART、PDATALEN • 4.IBPSTACK、IBPSTACKTOP • 5.XBPSTACK、XBPSTACKTOP • 6.PBPSTACK、PBPSTACKTOP • 7.PPAGEENABLE、PPAGE
14.4.3 #ifdef、#ifndef命令
• #ifdef与#ifndef命令用于判断宏名是否被定义, 并根据判断的情况进行条件编译。#ifdef命令的 一般形式是:
• #ifdef 宏名 • 语句段; • #endif • 其执行过程是,如果宏名在前面#define语句中已
定义过,则后面的语句段将被编译。#ifndef的一 般形式是: • #ifndef宏名 • 语句段; • #endif
区名; • SRC:不生成目标文件只生成汇编源文件。
14.6.3 列表文件(Listing)控制类
• 比较常用的有如下几个,详细内容需要参加所使 用的编译器。
• CODE(CD):向列表文件加入汇编列表; • LISTINCLUDE(LC):显示include文件; • SYMBOLS(SB):列表文件包括模块内所有符号的列
//此时再引用是错误的 •}
14.3 文件包含指令
• 文件包含指令#include通常在C51程序的开头,将 另外一文件的内容引入当前文件。其中被包含的 文件通常是头文件、宏定义等,利用文件包含指 令可以有助于更好地调试文件。其一般形式如下:
• #include "头文件.h" • #include <头文件.h> • #include 宏定义标识符
14.7.3 变量初始化文件
• 变量初始化文件用于对源程序中声明的变量进行 初始化赋值。在Keil μVision3编译环境中,主 要的变量初始化文件为INIT.A51,此外还提供了 INIT_TNY.A51文件用于不使用外部XDATA存储器的 实时系统。
• 当C51源程序中包含有初始值的外部变量和静态变 量时,连接定位器BL51将会自动将该目标代码加 入到C51源程序的前面,对已确定初始化的外部变 量和静态变量进行赋值。这是因为变量初始化文 件的目标代码已经驻留在Keil μVision3的编译 器的运行库内。
14.4 条件编译指令
• 条件编译指令用于对程序源代码的各部分有选择 地进行编译。采用条件汇编,可以提高程序的适 用性,缩小目标代码的大小。
• 在默认情况下,源程序中的所有行都要进行编译。 但是有时需要某些语句行在条件满足的情况下, 才进行编译,此时便用到条件编译指令。目前商 业软件公司广泛应用条件编译来制作某个程序的 许多不同用户版本。
• 为了与源程序中的语句相区别,预处理命令前要加一个“#”。C51程序中的预处理命令包括以下几个: • #define
//用于宏定义 • #error
//用于程序调试 • #include
//用于文件包含 • #if
//用于条件编译 • #else
//用于条件编译 • #elif
//用于多种条件编译选择 • #endif
•
printf("SCORE existed!\n");
//如果宏SCORE存在,则执行该语句
• #else
•
#error "No SCORE!\n"
//如果宏SCORE不存在,则执行该处
• #endif
•
• #ifndef GREED
•
#error "GREED is not defined!\n"
• #line 数字["文件名"] • 其中的数字为任意正整数,可选的文件名为任意
有效文件标识符。行号为源程序中当前行号,文 件名为源文件的名字。命令#line主要用于调试及 其他特殊应用。
14.5.2 #error
• #error命令用于强迫编译程序停止编译,主要用于程序调试。其使用的一般形式如下:
// 如 果
宏GREED存在,则执行该处
• #else
•
printf("GREED is defined!\n");
//如果宏GREED不存在,则执行该语句
• #endif
•}
14.5.3 #pragma
• #pragma命令用于向编译程序传送各种C51编译器 的控制指令。根据#pragma指令后面的字符串,编 译系统将按照特定的方式来翻译C51的字符串和函 数。
• 启动代码文件 STARTUP.A51的主要功能包括如下几个方面: • 定义内部RAM大小、外部RAM大小、可重入堆栈位置。 • 清除内部、外部或者以此页为单元的外部存储器。 • 按存储模式初使化重入堆栈及堆栈指针。 • 初始化8051硬件堆栈指针。 • 向main()函数交权。
14.7.2 C51启动代码分析
14.4.2 #elif命令
• #elif命令用于进行多种编译选择。其意义与“else if” 相同,形成一个if-else-if阶梯状语句。此时条件编译的 一般形式如下:
• #if 表达式0 • 语句段; • #elif 表达式1 • 语句段; • #elif 表达式2 • 语句段; • #elif 表达式3 • 语句段; •… • #elif 表达式n • 语句段; • #endif
第14章 预处理及用户配置文件
• 预处理命令通常在程序编译时进行一些符号处理, 其并不执行具体的硬件操作。C51语言中的预处理 命令主要有宏定义指令、文件包含指令和条件编 译指令,还有其他一些调试时使用的指令。本章 将详细介绍各种预处理命令以及C51的用户配置文 件,并结合一定的程序实例以加深理解。本章包 括:
名局限在仅需要的代码段中。示例如下: • #include <stdio.h>
//头文件 • #define COUNT 25
//宏定义
• void main() //主函数
•{ • printf("COUNT =%d\n", COUNT);
//输出COUNT =10 • #undef COUNT
//撤销宏定义 • //printf("COUNT =%d\n", COUNT);
• 2.带参数的宏定义
• 带参数的宏定义指令,其一般形式如下:
• #define 宏名(参数表) 字符串
14.2.2 #undef命令
• #undef命令用于取消前面已定义过的宏名。一般形式为: • #undef 宏名 • 其中,宏名为前面用#define定义过的标识符。使用#undef的目的是将宏
14.5 其他编译指令
• 除了以上几种预处理指令外,在C51语言中还定义 了其他几种编译预处理指令,主要用于编译和调 试程序等。下面分别进行讲解。
14.5.1 #line命令
• #line命令用于改变_LINE_与_FILE_的内容。其中 _LINE_和_FILE_是在编译程序中预先定义的标识 符,分别表示行号和源文件。#line命令使用的一 般形式如下:
• 宏定义指令 • 文件包含指令 • 条件编译指令 • C51编译器的控制指令 • C51的用户配置文件
14.1 预处理命令概述
• C51语言中提供了各种预处理命令,类似于汇编程序中的伪指令。一般来说,在对源程序进行编译前,C51编译器需要 先对程序中的预处理命令进行处理,然后将预处理的结果与源程序一并进行编译,最后产生目标代码。通过这些预处 理命令,在很大程度上为C51提供功能和符号等方面的扩展,使用预处理命令也可以提高程序的可读性。
14.4.1 #if、#else、#endif命令
• #if、#else、#endif指令用于条件编译的一般形 式如下:
• #if 常数表达式 • 语句段; • #else • 语句段; • #endif • 其中,#if、#else、#endif为条件编译指令,常数
表达式为判断的条件,语句段为条件编译部分。 执行过程为,如果常量表达式为真,则编译其后 面的语句段;如果常量表达式为假,则编译#else 后面的语句段;#endif命令是一个条件编译的结束。
14.6.1 源文件控制类
• 比较常用的有如下两个,具体介绍可以参加相应 的编译器。