KeilC51编译器的控制指令1
- 格式:doc
- 大小:139.00 KB
- 文档页数:36
Keil C51使用详解V1.0第一章 Keil C51开发系统基本知识 (6)第一节系统概述 (6)第二节Keil C51单片机软件开发系统的整体结构 (6)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第二节内存区域(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声明,见上例。
Keil C51使用详解keilc51使用详解v1.0电子设计世界!版权所有,热烈欢迎贴文,切勿修正并标明原文。
留存一切权利。
第一章keilc51开发系统基本知识 (6)1第一节系统概述 (6)第二节keilc51单片机软件开发系统的整体结构...6第三节keilc51工具包的加装...71.c51fordos72.c51forwindows的安装及注意事项:...7第四节keilc51工具包各部分功能及使用简介...71.c51与a51.72.l51和bl51.83.dscope51,tscope51及monitor51.84.ishell及uvision.9第二章keilc51软件使用详解 (10)第一节keilc51编译器的控制指令...101.源文件掌控类 (10)2.目标文件(object)控制类:...103.列表文件(listing)控制类:...10第二节dscope51的使用...111.dscope51fordos112.dscopeforwindows12第三节monitor51及其使用...131.monitor51对硬件的要求...132.mon51的使用...133.mon51的配置...134.串口连接图:...135.mon51命令及使用...14第四节集成开发环境(ide)的使用...141.ishellfordos的使用 (14)22.uvisionforwindows的使用 (15)第三章keilc51vs标准c..15第一节keilc51扩展关键字...15第二节内存区域(memoryareas):...161.pragramarea:...162.internaldatamemory:163.externaldatam emory.162.可位串行区表明20h-2fh..18第七节keilc51指针...181.通常指针...182.存储器指针...183.指针切换...18第八节keilc51函数...191.中断函数声明:...192.通用型存储工作区 (19)3.选通用存储工作区由usingx声明,见上例。
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。
C51 编译的控制参数AREGS,NOAREGS Object 使能或禁止绝对寄存器(ARn)寻址ASM, ENDASM Source 标识内联汇编模块的起始和结束BROWSE ↑ Object 允许生成浏览信息CODE ↑ Listing 在列表文件中加入汇编列表COMPACT ↑ Object 选择压缩内存模式COND,NOCOND ↑ Listing 处理器包括或者排除原文行号DEBUG ↑ Object 在目标文件中包含调试信息DEFINE Source 在Cx51调用行定义处理器的名字DISABLE Object 程序内部禁止中断EJECT Listing 列表文件中插入制表符FLOA TFUZZY Object 在浮点数比较时近视的位数INCDIR ↑ Source 指定头文件的其他路径INTERV AL ↑ Object 为SIECO芯片指定中断向量间隔INTPROMOTE,NOINTPROMOTE ↑Object 使能或禁止ANSI整型提示INTVECTOR,NOINTVECTOR ↑Object 指定中断向量的基地址或者禁止中断向量LARGE ↑ Object 设定大内存模式LISTINCLUDE Listing 在列表文件中显示头文件内容MAXARGS ↑ Object 指定参数列表的数目MOD517,NOMOD517 Object 使能或禁止代码支持80C517系列的其他硬件特性MODA2,NOMODA2 Object 使能或禁止Atmel 82x8252和变种支持的双DPTR指针MODAB2,NOMODAB2 Object 使能或者禁止模拟器件微转换器ADuc B2系列支持的双DPTR 指针MODDA,NOMODDA Object 使能或者禁止对于数学协处理器Dallas80C390,80C400和5240的代码MODDP2,NOMODDP2 Object 使能或者禁止Dallas半导体320, 520, 530, 550和变种的双DPTR指针MODP2,NOMODP2 Object 使能或者禁止Philips和AtmelWM系列的双DPTR指针NOAMAKE ↑ Object 禁止用于μVision2更新的信息记录NOEXTEND ↑ Source 禁止Cx51扩展为ANSI C.OBJECT,NOOBJECT↑Object为目标文件指定名字,或者禁止目标文件生成OBJECTEXTEND ↑ Object 在目标文件中包含附加的变量类型信息ONEREGBANK Object 设定在中断代码中只使用寄存器组0OMF2 ↑ Object 产生OMF2输出文件格式OPTIMIZE Object 指定编译器的优化级数ORDER ↑ Object 按照在源文件的出现顺序分配变量PAGELENGTH ↑ Listing 指定页的行数PAGEWIDTH ↑ Listing 指定页的列数PR EPRINT ↑ Listing 在生成的处理器列表文件中所有的宏都扩展开PRINT, NOPRINT↑ Listing 指定列表文件名或者禁止生成列表文件REGFILE↑ Object 指定一个寄存器定义文件用来做全局寄存器优化REGISTERBANK Object 选择寄存器组用来做绝对寄存器访问REGPARMS,NOREGPARMSObject 使能或者禁止寄存器参数传递RET_PSTK ↑,RET_XSTK ↑Object 使用重入堆栈保存返回地址ROM ↑ Object 控制产生AJMP/ACALL指令SA VE,RESTORE Object 保存和重装对于AREGS, REGPARMS和OPTIMIZE的参数设置SMALL ↑ Object 选择小模式(缺省)SRC ↑ Object 创建一个汇编源文件不产生目标模块STRING ↑ Object 把固定字串常量放在xdata或者远内存SYMBOLS ↑ Listing 产生一个在列表文件中使用到的所有符号的列表USERCLASS ↑ Object 更改内存类名用来灵活存储变量V ARBANKING ↑ Object 使能远内存变量类型WARNINGLEVEL ↑ Listing 选择检测警告的级别XCROM ↑ Object 为固定的xdata变量设定ROM空间↑这些参数只能在指令行或者源文件的开始使用#pragma设定一次。
c51单片机c语言常用指令-回复C51单片机C语言常用指令导语:C51单片机是一种非常常用的微控制器,它广泛应用于许多嵌入式系统和电子设备中。
在单片机的开发过程中,C语言是一种非常常用的编程语言。
本文将介绍C51单片机常用的指令,帮助读者了解这些指令的功能和使用方法。
第一部分:常用的I/O口控制指令I/O口控制指令是C51单片机中非常重要的一部分,因为它们用于控制单片机与外部设备之间的数据交互。
以下是一些常用的I/O口控制指令:- P0:将P0口设置为输入或输出,可以用于与外部设备进行数据通信。
- P1:将P1口设置为输入或输出,可以用于与外部设备进行数据通信。
- P2:将P2口设置为输入或输出,可以用于与外部设备进行数据通信。
- P3:将P3口设置为输入或输出,可以用于与外部设备进行数据通信。
第二部分:常用的中断控制指令中断是C51单片机中实现实时响应的重要机制之一。
以下是一些常用的中断控制指令:- EA:使能所有中断。
- EX0:外部中断0的控制指令,用于外部设备产生中断信号。
- EX1:外部中断1的控制指令,用于外部设备产生中断信号。
- IT0:外部中断0的触发方式,可以设置为电平触发或边沿触发。
- IT1:外部中断1的触发方式,可以设置为电平触发或边沿触发。
第三部分:常用的定时器控制指令定时器是C51单片机中实现时间计数和定时任务的重要模块。
以下是一些常用的定时器控制指令:- TMOD:设置定时器模式,可以选择定时器0/1的工作模式。
- TL0、TL1:定时器0/1的低8位计数器,用于保存定时值的低8位。
- TH0、TH1:定时器0/1的高8位计数器,用于保存定时值的高8位。
- TR0、TR1:定时器0/1的运行控制位,用于启动和停止计时器。
- TF0、TF1:定时器0/1的溢出标志位,用于判断定时器是否溢出。
第四部分:常用的串口通信指令串口通信是C51单片机中常用的通信方式之一,用于与其他设备进行数据交互。
C51与汇编语言混合编程之一
1、函数内部混合编程若想在C 语言函数内部使用汇编语言,应使用以下Cx51 编译器控制命令:
#pragma asm
;;;Assembly code
#pragma endasm
功能作用:
asm 和endasm 命令用于将其标记的汇编程序合并到.SRC 文件中。
这个带有asm 和endasm 块标记的源程序可看作是在线嵌入式汇编程序。
从这点来说,此命令有些类似于#define 命令。
具体实现:
(1)编译器设置及SRC 文件的产生
.SRC 文件在命令行编译模式下是使用SRC 编译器控制命令产生的,在IDE 环境中可以为需要产生SRC 文件的C 源文件设置特定选项:
l 右键单击Project Workspace 下的文件标签
l 选择Options for file 项,打开Options – Properties 页。
l 选中Generate Assembler SRC file 项
l 选中Assembler SRC file 项
(2)添加库文件
根据选择的编译模式,把相应的库文件添加到工程下面,如在small 模式下,需将keil\c51\lib\c51s.lib 文件加入工程中。
在Keil 安装目录下的\C51\LIB\ 目录的LIB 文件如下:
C51S.LIB - 没有浮点运算的Small modelC51C.LIB - 没有浮点运算的。
一、ACALL addr11指令名称:绝对挪用指令指令代码:A10 A9 A8 10001 A7 A6 A5 A4 A3 A2 A1 A0指令功能:构造目的地址,进行子程序挪用。
其方式是以指令提供的11位地址(al0~a0),取代PC的低11位,PC的高5位不变。
操作内容:PC←(PC)+2SP←(SP)+1(SP)←(PC)7~0SP←(SP)+1(SP)←(PC)15~8PC10~0←addrl0~0字节数: 2机械周期:2利用说明:由于指令只给出子程序入口地址的低11位,因此挪用范围是2KB。
二、ADD A,Rn指令名称:寄放器加法指令指令代码:28H~2FH指令功能:累加器内容与寄放器内容相加操作内容:A←(A)+(Rn), n=0~7字节数: 1机械周期;1阻碍标志位:C,AC,OV3、ADD A,direct指令名称:直接寻址加法指令指令代码:25H指令功能:累加器内容与内部RAM单元或专用寄放器内容相加操作内容:A←(A)+(direct)字节数: 2机械周期:1阻碍标志位:C,AC,OV4、ADD A,@Ri ’指令名称:间接寻址加法指令指令代码:26H~27H指令功能:累加器内容与内部RAM低128单元内容相加操作内容:A←(A)+((Ri)), i=0,1字节数: 1机械周期:1阻碍标志位:C,AC,OV五、ADD A,#data指令名称:当即数加法指令指令代码:24H指令功能:累加器内容与当即数相加操作内容:A←(A)+data字节数: 2机械周期:1阻碍标志位:C,AC,OV六、ADDC A,Rn指令名称:寄放器带进位加法指令指令代码:38H~3FH指令功能:累加器内容、寄放器内容和进位位相加操作内容:A←(A)+(Rn)+(C), n=0~7字节数: 1机械周期:1阻碍标志位:C,AC,OV7、ADDC A,direct指令名称:直接寻址带进位加法指令指令代码:35H指令功能:累加器内容、内部RAM低128单元或专用寄放器内容与进位位加操作内容:A←(A)+(direct)+(C)字节数: 2机械周期:1阻碍标志位:C,AC,OV八、ADDC A,@Ri指令名称:间接寻址带进位加法指令指令代码:36H~37H指令功能:累加器内容、内部RAM低128单元内容及进位位相加操作内容:A←(A)+((Ri))+(C), i=0,1字节数: 1机械周期:1阻碍标志位:C,AC,OV九、ADDC A,#data指令名称:当即数带进位加法指令指令代码:34H指令功能:累加器内容、当即数及进位位相加操作内容:A←(A)+data+(C)字节数: 2机械周期:1阻碍标志位:C,AC,OV10、AJMP addr11指令名称:绝对转移指令指令代码:A10 A9 A8 1 0 0 0 1 A7 A6 A5 A4 A3 A2 A1 A0指令功能:构造目的地址,实现程序转移。
2.1 Keiluvision4的安装和使用Keil 公司是一家业界领先的微控制器(MCU )软件开发工具的独立供应商。
Keil 公司由两家私人公司联合运营,分别是德国慕尼黑的KeilElektronikGmbH 和美国德克萨斯的KeilSoftwareInc 。
Keil 公司制造和销售种类广泛的开发工具,包括ANSIC 编译器、宏汇编程序、调试器、连接器、库管理器、固件和实时操作系统核心(real-timekernel)。
有超过10万名微控制器开发人员在使用这种得到业界认可的解决方案。
其KeilC51编译器自1988年引入市场以来成为事实上的行业标准,并支持超过500种8051变种。
KeilC51是美国KeilSoftware 公司出品的51系列兼容单片机C 语言软件开发系统,与汇编相比,C 语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
Keil 提供了包括C 编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision )将这些部分组合在一起。
运行Keil 软件需要WIN2000、WINXP 等操作系统。
如果你使用C 语言编程,那么Keil 几乎就是你的不二之选,即使不使用C 语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
2.1.1 KeilμVision4简介KeilμVision4是美国KeilSoftware 公司2009年2月发布的。
KeilμVision4引入灵活的窗口管理系统,使开发人员能够使用多台监视器,并提供了视觉上的表面对窗口位置的完全控制的任何地方。
新的用户界面可以更好地利用屏幕空间和更有效地组织多个窗口,提供一个整洁,高效的环境来开发应用程序。
新版本支持更多最新的ARM 芯片,还添加了一些其他新功能。
2011年3月ARM 公司发布最新集成开发环境RealViewMDK 开发工具中集成了最新版本的KeiluVision4,其编译器、调试工具实现与ARM 器件的最完美匹配。
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声明,见上例。
51汇编语言指令集符号定义表符号含义Rn R0~R7寄存器n=0~7Direct 直接地址,内部数据区的地址RAM(00H~7FH) SFR(80H~FFH) B,ACC,PSW,IP,P3,IE,P2,SCON,P1,TCON,P0@Ri 间接地址Ri=R0或R1 8051/31RAM地址(00H~7FH) 8052/32RAM地址(00H~FFH) #data 8位常数#data16 16位常数Addr16 16位的目标地址Addr11 11位的目标地址Rel 相关地址bit 内部数据RAM(20H~2FH),特殊功能寄存器的直接地址的位指令介绍指令字节周期动作说明算数运算指令1.ADD A,Rn 1 1 将累加器与寄存器的内容相加,结果存回累加器2.ADD A,direct 2 1 将累加器与直接地址的内容相加,结果存回累加器3.ADD A,@Ri 1 1 将累加器与间接地址的内容相加,结果存回累加器4.ADD A,#data 2 1 将累加器与常数相加,结果存回累加器5.ADDC A,Rn 1 1 将累加器与寄存器的内容及进位C相加,结果存回累加器6.ADDC A,direct 2 1 将累加器与直接地址的内容及进位C相加,结果存回累加器7.ADDC A,@Ri 1 1 将累加器与间接地址的内容及进位C相加,结果存回累加器8.ADDC A,#data 2 1 将累加器与常数及进位C相加,结果存回累加器9.SUBB A,Rn 1 1 将累加器的值减去寄存器的值减借位C,结果存回累加器10.SUBB A,direct 2 1 将累加器的值减直接地址的值减借位C,结果存回累加器11.SUBB A,@Ri 1 1 将累加器的值减间接地址的值减借位C,结果存回累加器12.SUBB A,0data 2 1 将累加器的值减常数值减借位C,结果存回累加器13.INC A 1 1 将累加器的值加114.INC Rn 1 1 将寄存器的值加l 15.INCdirect2 1 将直接地址的内容加116.INC @Ri 1 1 将间接地址的内容加117.INCDPTR1 1 数据指针寄存器值加1说明:将16位的DPTR加1,当DPTR的低字节(DPL)从FFH 溢出至00H时,会使高字节(DPH)加1,不影响任何标志位18.DEC A 1 1 将累加器的值减119.DEC Rn 1 1 将寄存器的值减120.DEC direct 2 1 将直接地址的内容减121.DEC @Ri 1 1 将间接地址的内容减122.MUL AB 1 4 将累加器的值与B寄存器的值相乘,乘积的低位字节存回累加器,高位字节存回B寄存器说明:将累加器A和寄存器B内的无符号整数相乘,产生16位的积,低位字节存入A,高位字节存入B寄存器。
第一节 Keil C51编译器的控制指令C51编译器的控制指令分为三类:源文件控制类,目标文件控制类及列表控制类。
1. 源文件控制类NOEXTEND:C51源文件不允许使用ANSI C扩展功能。
DEFINE(DF):定义预处理(在C51命令行)。
2. 目标文件(Object)控制类:COMPACT LARGE SMALL 选编译模式DEBUG(DB) 包含调试信息,以供仿真器或dSCope51使用。
NOAMAKE(NOAM) 禁止AutoMake信息记录NOREGPARMS 禁止用寄存器传递参数OBJECTEXTEND(OE) Object文件包含附加变量类型信息OPTIMIZE(OT) 指定优化级别REGFILE(RF) 指定一个寄存器使用的文件以供整体优化用REGISTERBANK(RB) 指定一个供绝对寄存器访问的寄存器区名SRC 不生成目标文件只生成汇编源文件其它控件不常用。
3. 列表文件(listing)控制类:CODE(CD):向列表文件加入汇编列表LISTINCLUDE(LC):显示indude文件SYMBOLS(SB):列表文件包括模块内所有符号的列表WARNINGLEVEL(WL):选择“警告”级别第二节 dScope51的使用1. dScope51 for Dos总的来说dScope51具有以下特性:●高级语言显示模式●集成硬件环境模拟●单步或“GO”执行模式●存储器、寄存器及变量访问●Watch表达式之值●函数与信号功能下面,具体说明在进入dScope51 for Dos之后,如何实现上述功能,dScope51采用下拉菜单格式和窗口显示控制,共有language、serial、exe、register四个窗口,其中exe为命令行窗口,language为程序窗口,serial为串口窗,register为寄存器窗。
(1) 高级语言显示模式单击主菜单中的“View”,第一栏中的三条命令“Highlevel”、“Mixed”、“Assembly”分别对所装入的程序按照“高级”、“混合级”及“汇编级”三种方式显示,以方便调试使用。
(2) 集成硬件环境模拟显示主菜单中“Peripheral”各条能显示模拟硬件环境的状态,其中:i/o Port:显示各I/O口之值,对8031而言SFR中的P1、P2、P3、P0与引脚之值分别列出:Interrupt:显示5个中断源的入口模式是否允许,优先级等中断状态。
Timer:显示各定时/计数器的模式,初始值状态等。
int Message:中断信息允许,如为允许(“>>”出现),则当中断申请时,显示中断源信息。
比如当中断发生时会显示:“interrupt Timer 0 occured”等A/D converter:显示A/D转换器状态无时,则提示“无”。
Serial:串口信息显示,包括串口模式、波特产等Other:其它器件,如为8031则显示“无”(3) 单步或“Go”执行“F8”单步执行,“F5”全速执行到断点。
或选主菜单中Trace单步执行CPU中的Go全速执行。
(4) 存储器寄存器及变量访问外部存储器管理MAP菜单:设置(set)、取消(reset)、显示(Display)处理可用存储空间。
修改Code代码:ASM命令存储器显示命令:D 类别为(X、D、I、B、C)修改存储器命令:E 有以下几种命令EB、EC、EI、EL、EF、EP复杂数据类型显示:Object命令;用以显示结构或数组的内容。
欲使此命令有效,C51编译器必须有DB及OBJECTEXTEND两条。
反汇编命令:U(5) “Watch”表达式之值在View菜单的“Watch”一栏中有四项:其中包括定义Watch Point(Define)、删除Watch Point(remove,kill all),及自动更新选项。
也可用WS、WK等命令代替,下面具体看“表达式”类型:dScope51一次最多可设16个WtchPoint表达式,显示于Watch Window之中,表达式可以是简单变量,也可是复杂数据类型如结构、数组和指向结构的指针等,例如:>WS *ptime>WS ptime→hour>WS some_record[o],analog等等(6) 关于.IOF文件启动DS51后必须装入.IOF文件才能使CPU及Peripheral各项起作用,这个函数的使用是依据8051系列CPU的不同特点,装入8051各CPU硬件设备模拟驱动文件,比如8031CPU就必须load DS51目录下的8051.IOF。
2. dScope for WindowsdScope for windows具有dScope for dos的全部功能,此外,它还具有以下明显的优点:(1) 标准的Windows界面,操作更容易更简单;(2) 常用操作多用对话框,而非Dos的行命令方式;(3) 窗口资源更加丰富:存储器窗口、覆盖率分析、运行状态分析窗口,加强了调试功能;因为dScope for Windows功能强大,具体操作在第八章详细介绍。
第三节 Monitor51及其使用1. Monitor51对硬件的要求(1) 硬件系统为51系列CPU;(2) 带5K外部程序存储器(从O地址开始),存放Monitor51程序;(3) 256Bytes的外部数据存储器以及5K的跟踪缓冲区,此外,外部数据存储器必须足够容纳所有应用程序代码及数据,且所有外部数据存储器必须为冯?诺伊曼存储器,即能一致访问XDATA与Code空间。
(4) 一个定时器作为波特率发生器供串口使用;(5) 6 Bytes的空余堆栈。
2. Mon51的使用Mon51的使用途径有三种方式:(1) Dos行命令方式即先用install对MON51进行配置,然后用MON51进入Monitor状态,启用各种命令对Monitor51进行调试。
(2) tScope51方式启动tScope51装入TS51目录下的MON51.IOT驱动文件,与目标板通信。
(3) dScope51 for Windows方式在选CPU驱动文件时,选“MON51.dll”,则检查目标板并进入MON51状态。
3. MON51的配置(1) MON51 for Dos的配置运行install文件(在MON51目录下),不同的参数可以配置不同的硬件环境。
INSTALL Serialtype [xdstastart[codestart[bank][PROMCHECK]]],具体说明见MON51帮助文件或使用手册。
(2) MON51 for Windows的配置在启用MON51.dll时,会使得系统自动检查目标板连接,如配置不对,则弹出“Configuration”对话框,设置PC串口,波特率等,完毕单击“apply”有效。
4. 串口连接图:收发交叉互连,RTS、CTS直连,DSR、DTR直连,具体引脚排列参考串口资料。
5. MON51命令及使用详细的MON51命令可参阅帮助。
第四节集成开发环境(IDE)的使用1. Ishell for Dos的使用进入Ishell之后看到两个窗口:一个是文件窗口,一个是Dos命令行窗口,窗口上方是下拉式的命令菜单,其中的Files控制文件窗口的显隐。
使用Ishell,第一步就是配置系统,即要学习两个文件的修改与创建:(1) Ishell.CFG文件每一个project都有一个Ishell.CFG,其中存放有“Option菜单和Setup菜单下的部分信息;Bell enabled、Monochrome enabled、Editor Selected、CRT Lines、target enviroment、name of user edit、Automatic load for configuration enabled、file window enabled、file specification for file window、translate command line controls、project name等。
对每个project都必须设置以上信息,然后存盘“setup”的的“save”,这样才可正式开始下面工作。
(2) IShell.col文件对IDE颜色设置,如不改动,可以缺省为主。
(3) CDF文件该文件位于BIN目录下,每一文件定义一组外部函数工具包,即定义外部环境如8051.CDF,USER.CDF等,开发者可修改CDF文件,供自己使用,至于CDF文件内容可查看一下8051.CDF即可知道。
注意.CDF文件是Ishell系统的核心所在,不同的CDF文件可使本IDE适用于不同的编译、连接系统,即本IDE并不仅适于C51。
下面谈一谈Automake工具:C51的Automake是一个project管理器,在8051工具包中以OBJECT文件形式保留了一个project的信息,AutoMake用这些信息来进行project 管理,一旦手工建立一个project,Automake可生成一个新的OBJECT,AutoMake利用此文件来编译那些修改过的文件。
Automake支持C51、A51、L51/BL51、C166、A166、L166等编译连接器。
点中主菜单中的Automake即运行本工具。
Ishell for Dos使用比较繁琐,推荐使用uVision for windows。
2. uVision for windows的使用uVision是一个标准的windows应用程序,其编译功能、文件处理功能、project处理功能、窗口功能以及工具引用功能(如A51、C51、PL/M41、BL51 dScope等)等都较Ishell for Dos要强得多。
uVision采用BL51作连接器,因为BL51兼容L51,所以一切能在Dos下工作的project都可以到uVision中进行连接调试。
uVision采用dScope for windows作调试器,该调试器支持MON51及系统模拟两种方式,功能较for DOS要强大好用,调试功能强大。
注意:(1) Option菜单下的各项要会使用,其中A51、C51、PL/M51、BL51定义各文件所使用的编译、连接控制指令,dScope定义一个dScope初始化文件。
Make则是定义一个make文件。
(2) 进入调试是在RUN菜单下运行dScope。
(3) project中包括新建、打开、修改、更新、编译、连接等poject处理,具体使用可参考后面的例子。
深入理解并应用C51对标准ANSIC的扩展是学习C51的关键之一。
因为大多数扩展功能都是直接针对8051系列CPU硬件的。