keil C51中的本征函数库及使用说明
常用Keil C51库函数
从src所指向的内存中复制len个字符到dest中,返回指向dest中最后一个字符的指针。如果src与dest发生交迭,则结果是不可测的
void *memccpy(void *dest, void *src, char val, int len)
bit isdigit(char c)
检查参数字符是否为十进制数字0~9,是则返回1,否则返回0
bit isgraph(char c)
检查参数字符是否为可打印字符(不包括空格),值域0x21~0x7e,是则返回1,否则返回0
bit isprint(char c)
检查参数字符是否为可打印字符(包括空格),值域0x21~0x7e,是则返回1,否则返回0
int printf(const char *fmstr[,argument]...)
以第一个参数指向字符串制定的格式通过8051串行口输出数值和字符串,返回值为实际输出的字符数
int sprintf(char *s,const char *fmstr[,argument]...)
与printf功能相似,但数据是通过一个指针s送入内存缓冲区,并以ASCII码的形式存储
将串s2(包括结束符)复制到s1中,返回指向s1中第一个字符的指针
char *strncpy(char *s1, char *s2, int n)
与strcpy相似,但它只复制n个字符。如果s2的长度小于n,则s1串以0补齐到长度n
int strlen(char *s1)
返回串s1中的字符个数,不包括结尾的空字符
char strcmp(char *s1, char *s2)
keil c51 详细中文手册
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声明,见上例。
keilc详细中文手册
Keil C51使用详解V1.0第一章 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声明,见上例。
C语言中KeilC51库函数大全
C51强大功能及其高效率的重要体现之一在于其丰富的可直接调用的库函数,多使用库函数使程序代码简单,结构清晰,易于调试和维护,下面介绍C51的库函数系统。
第一节本征库函数(i n t r i n s i c r o u t i n es)和非本征证库函数C51提供的本征函数是指编译时直接将固定的代码插入当前行,而不是用ACALL 和LCALL语句来实现,这样就大大提供了函数访问的效率,而非本征函数则必须由ACALL及LCALL调用。
C51的本征库函数只有9个,数目虽少,但都非常有用,列如下:_crol_,_cror_:将char型变量循环向左(右)移动指定位数后返回_iror_,_irol_:将int型变量循环向左(右)移动指定位数后返回_lrol_,_lror_:将long型变量循环向左(右)移动指定位数后返回_nop_:相当于插入NOP_testbit_:相当于JBC bitvar测试该位变量并跳转同时清除。
_chkfloat_:测试并返回源点数状态。
使用时,必须包含#inclucle <>一行。
如不说明,下面谈到的库函数均指非本征库函数。
第二节几类重要库函数1. 专用寄存器include文件例如8031、8051均为其中包括了所有8051的SFR及其位定义,一般系统都必须包括本文件。
2. 绝对地址include文件该文件中实际只定义了几个宏,以确定各存储空间的绝对地址。
3. 动态内存分配函数,位于中4. 缓冲区处理函数位于“”中其中包括拷贝比较移动等函数如:memccpy memchr memcmp memcpy memmove memset这样很方便地对缓冲区进行处理。
5. 输入输出流函数,位于“”中流函数通8051的串口或用户定义的I/O口读写数据,缺省为8051串口,如要修改,比如改为LCD显示,可修改lib目录中的及源文件,然后在库中替换它们即可。
第三节K ei l C51库函数原型列表1.bit isalnum(char c);bit isalpha(char c);bit iscntrl(char c);bit isdigit(char c);bit isgraph(char c);bit islower(char c);bit isprint(char c);bit ispunct(char c);bit isspace(char c);bit isupper(char c);bit isxdigit(char c);bit toascii(char c);bit toint(char c);char tolower(char c);char __tolower(char c);char toupper(char c);char __toupper(char c);2.unsigned char _crol_(unsigned char c,unsigned char b);unsigned char _cror_(unsigned char c,unsigned char b);unsigned char _chkfloat_(float ual);unsigned int _irol_(unsigned int i,unsigned char b);unsigned int _iror_(unsigned int i,unsigned char b);unsigned long _irol_(unsigned long l,unsigned char b);unsigned long _iror_(unsigned long L,unsigned char b);void _nop_(void);bit _testbit_(bit b);3.char getchar(void);char _getkey(void);char *gets(char * string,int len);int printf(const char * fmtstr[,argument]…);char putchar(char c);int puts (const char * string);int scanf(const char * fmtstr.[,argument]…);int sprintf(char * buffer,const char *fmtstr[;argument]);int sscanf(char *buffer,const char * fmtstr[,argument]);char ungetchar(char c);void vprintf (const char *fmtstr,char * argptr);void vsprintf(char *buffer,const char * fmtstr,char * argptr);4.float atof(void * string);int atoi(void * string);long atol(void * string);void * calloc(unsigned int num,unsigned int len);void free(void xdata *p);void init_mempool(void *data *p,unsigned int size);void *malloc (unsigned int size);int rand(void);void *realloc (void xdata *p,unsigned int size);void srand (int seed);5.void *memccpy (void *dest,void *src,char c,int len);void *memchr (void *buf,char c,int len);char memcmp(void *buf1,void *buf2,int len);void *memcopy (void *dest,void *SRC,int len);void *memmove (void *dest,void *src,int len);void *memset (void *buf,char c,int len);char *strcat (char *dest,char *src);char *strchr (const char *string,char c);char strcmp (char *string1,char *string2);char *strcpy (char *dest,char *src);int strcspn(char *src,char * set);int strlen (char *src);char *strncat (char 8dest,char *src,int len);char strncmp(char *string1,char *string2,int len);char strncpy (char *dest,char *src,int len);char *strpbrk (char *string,char *set);int strpos (const char *string,char c);char *strrchr (const char *string,char c);char *strrpbrk (char *string,char *set);int strrpos (const char *string,char c);int strspn(char *string,char *set);系统分类:用户分类:标签:无标签来源:整理阅读全文(121) | 回复(0)发表于2009/6/23 13:41:24Hello位于\C51\excmples\Hello\目录,其功能是向串口输出“Hello,world”整个程序如下:#pragma DB OE CD#indule <>#include<>void main(void){SCOn=0x50;TMOD=0x20TH1=0xf3;Tri=1;TI=1;printf(“Hello,world \n”);while(1) { }}第一节u V i s i o n f o r W i n d o w s的使用步骤(1) file_new新建一个文件,输入如上内容或直接用目录下源文件。
KEIL中常用库函数头文件的说明
INTRINS.H详细说明:c51中的intrins.h库函数 _crol_ 字符循环左移 _cror_ 字符循环右移 _irol_ 整数循环左移 _iror_ 整数循环右移_lrol_ 长整数循环左移 _lror_ 长整数循环右移_nop_ 空操作8051 NOP 指令_testbit_ 测试并清零位8051 JB C 指令-C51 in the library function intrins.h cycle _crol_ characters characters left _cror_ cycle shifted to right _irol_ the left circle _iror_ integer integer integer cycle shifted to right _lrol_ long cycle of the left circle _lror_ long integer _nop_ air operation shifted to right 8051 NOP instructions _testbit_ tested and cleared 8051 JBC-bit instruction/*--------------------------------------------------------------------------INTRINS.H 本征库函数Intrinsic functions for C51.Copyright (c) 1988-2001 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.--------------------------------------------------------------------------*/extern void _nop_ (void); //空操作,相当于8051的NOP指令extern bit _testbit_ (bit); //测试并清零位,相当于8051的JBC指令extern unsigned char _cror_ (unsigned char, unsigned char); //字符循环右移extern unsigned int _iror_ (unsigned int, unsigned char); //整数循环右移extern unsigned long _lror_ (unsigned long, unsigned char); //长整数循环右移extern unsigned char _crol_ (unsigned char, unsigned char); //字符循环左移extern unsigned int _irol_ (unsigned int, unsigned char); //整数循环左移extern unsigned long _lrol_ (unsigned long, unsigned char); //长整数循环左移extern unsigned char _chkfloat_(float); //测试并返回源点数状态/***************************************************************************详解函数: _crol_,_irol_,_lrol_原型: unsigned char _crol_(unsigned char val,unsigned char n);unsigned int _irol_(unsigned int val,unsigned char n);unsigned int _lrol_(unsigned int val,unsigned char n);功能: _crol_,_irol_,_lrol_以位形式将变量val循环左移n位。
keil c51 详细中文手册
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声明,见上例。
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目录下)。
Keil C51 中文使用手册
Keil C51使用详解V1.0第一章 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声明,见上例。
KeilC51的库函数
KeilC51的库函数Keil C51有丰富的可直接调⽤的库函数,灵活使⽤库函数可使程序代码简单、结构清晰,并且易于调试和维护。
每个库函数都在相应的头⽂件中给出了函数原型声明,⽤户如果需要使⽤库函数,必须在源程序的开始处⽤预处理命令“#include”将有关的头⽂件包含进来。
1. 本征库函数:本征库函数是指编译时直接将固定的代码插⼊到当前⾏,⽽不是⽤汇编语⾔中的“ACALL”和“LCALL”指令来实现调⽤,从⽽⼤⼤提⾼了函数的访问效率。
Keil C51的本征库函数有9个,数量少但⾮常有⽤。
使⽤本征库函数时,C51源程序中必须包含预处理命令“#include <intrins.h>”。
函数名及定义功能说明unsigned char _crol_(unsigned char val,unsigned char n)将字符型数据val循环左移n位,相当于RL命令unsigned int _irol_(unsigned int val,unsigned char n)将整型数据val循环左移n位,相当于RL命令unsigned long _lrol_(unsigned long val,unsigned char n)将长整型数据val循环左移n位,相当于RL命令unsigned char _cror_(unsigned char val,unsigned char n)将字符型数据val循环右移n位,相当于RR命令unsigned int _iror_(unsigned int val,unsigned char n)将整型数据val循环右移n位,相当于RR命令unsigned long _lror_(unsigned long val,unsigned char n)将长整型数据val循环右移n位,相当于RR命令bit _testbit_(bit x)相当于JBC bit指令unsigned char _chkfloat_(float ual)测试并返回浮点数状态void _nop_(void)产⽣⼀个NOP指令2. 字符判断转换库函数:字符判断转换库函数的原型声明在头⽂件CTYPE.H中定义。
KEIL中常用库函数头文件的说明
INTRINS.H详细说明:c51中的intrins.h库函数 _crol_ 字符循环左移 _cror_ 字符循环右移 _irol_ 整数循环左移 _iror_ 整数循环右移_lrol_ 长整数循环左移 _lror_ 长整数循环右移_nop_ 空操作8051 NOP 指令_testbit_ 测试并清零位8051 JB C 指令-C51 in the library function intrins.h cycle _crol_ characters characters left _cror_ cycle shifted to right _irol_ the left circle _iror_ integer integer integer cycle shifted to right _lrol_ long cycle of the left circle _lror_ long integer _nop_ air operation shifted to right 8051 NOP instructions _testbit_ tested and cleared 8051 JBC-bit instruction/*--------------------------------------------------------------------------INTRINS.H 本征库函数Intrinsic functions for C51.Copyright (c) 1988-2001 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.--------------------------------------------------------------------------*/extern void _nop_ (void); //空操作,相当于8051的NOP指令extern bit _testbit_ (bit); //测试并清零位,相当于8051的JBC指令extern unsigned char _cror_ (unsigned char, unsigned char); //字符循环右移extern unsigned int _iror_ (unsigned int, unsigned char); //整数循环右移extern unsigned long _lror_ (unsigned long, unsigned char); //长整数循环右移extern unsigned char _crol_ (unsigned char, unsigned char); //字符循环左移extern unsigned int _irol_ (unsigned int, unsigned char); //整数循环左移extern unsigned long _lrol_ (unsigned long, unsigned char); //长整数循环左移extern unsigned char _chkfloat_(float); //测试并返回源点数状态/***************************************************************************详解函数: _crol_,_irol_,_lrol_原型: unsigned char _crol_(unsigned char val,unsigned char n);unsigned int _irol_(unsigned int val,unsigned char n);unsigned int _lrol_(unsigned int val,unsigned char n);功能: _crol_,_irol_,_lrol_以位形式将变量val循环左移n位。
keil c51 详细中文手册
KeilC51使用详解V1.0第一章KeilC51开发系统基本知识 (6)第一节系统概述 (6)第二节KeilC51单片机软件开发系统的整体结构 (6)第三节第四节1.C512.L51第一节1.2.3.第二节1.dScope51forDos112.dScopeforWindows12第三节Monitor51及其使用 (13)1.Monitor51对硬件的要求 (13)2.Mon51的使用 (13)3.MON51的配置 (13)5.MON51命令及使用 (14)第四节集成开发环境(IDE)的使用 (14)1.IshellforDos的使用 (14)2.uVisionforwindows的使用 (15)第三章KeilC51vs标准C..15第一节KeilC51扩展关键字 (15)1.bit2.可位寻址区说明20H-2FH..18第七节KeilC51指针 (18)1.一般指针 (18)2.存储器指针 (18)3.指针转换 (18)第八节KeilC51函数 (19)2.通用存储工作区 (19)3.选通用存储工作区由usingx声明,见上例。
(19)4.指定存储模式 (19)5.#pragmadisable.196.递归或可重入函数指定 (19)7.指定PL/M-51函数 (20)1.2._at_3.第二节1.2.第三节1.2.C513.4.第四节段名协定与程序优化 (25)1.段名协定(SegmentNamingConventions)252.程序优化 (25)第五章KeilC51库函数参考 (26)第一节本征库函数(intrinsicroutines)和非本征证库函数 (26)第二节几类重要库函数 (26)1.专用寄存器include文件 (26)2.绝对地址include文件absacc.h.263.动态内存分配函数,位于stdlib.h中 (27)4.缓冲区处理函数位于“string.h”中 (27)5.输入输出流函数,位于“stdio.h”中 (27)第三节KeilC51库函数原型列表 (27)1.CTYPE.H..27第一节第二节2.调试窗口(DEBUGWindow) (32)3.命令窗口(CommandWindow) (32)4.观察窗口(WatchWindow) (32)5.寄存器窗口(RegisteWindow) (32)6.串口窗口(SericalWindows) (32)7.性能分析窗口 (32)8.内存窗口(MemoryWindow) (32)9.符号浏览窗口(SymbolBrowserWindow) (33)10.调用线窗口(Call-StackWindow) (33)11.代码覆盖窗口 (33)12.外围设备窗口(peripherals)33第二节dScopeforWindows基本操作 (33)1.指定初始化文件 (33)第三节8.指针: (38)9.dScope命令语句 (38)10.函数 (43)第一章KeilC51开发系统基本知识第一节系统概述KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
C51使用详解
Keil C51使用详解V1.0©电子设计世界版权所有欢迎转贴请勿修改并注明出处保留一切权利第一章 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. DScope51Tscope51及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. 可位寻址区说明20H2FH.. 18第七节Keil C51指针 (18)1. 一般指针 (18)2. 存储器指针 (18)3. 指针转换 (18)第八节Keil C51函数 (19)1. 中断函数声明 (19)2. 通用存储工作区 (19)3. 选通用存储工作区由using x声明见上例 (19)4. 指定存储模式 (19)5. #pragma disable. 196. 递归或可重入函数指定 (19)7. 指定PL/M51函数 (20)第四章 Keil C51高级编程 (20)第一节绝对地址访问 (20)1. 绝对宏 (20)2. _at_关键字 (21)3. 连接定位控制 (21)第二节Keil C51与汇编的接口 (21)1. 模块内接口 (21)2. 模块间接口 (21)第三节Keil C51软件包中的通用文件 (22)1. 动态内存分配 (22)2. C51启动文件STARTUP.A51. 223. 标准输入输出文件 (25)4. 其它文件 (25)第四节段名协定与程序优化 (25)1. 段名协定(Segment Naming Conventions) 252. 程序优化 (25)第五章 Keil C51库函数参考 (26)第一节本征库函数(intrinsic routines)和非本征证库函数 (26)第二节几类重要库函数 (26)1. 专用寄存器include文件 (26)2. 绝对地址include文件absacc.h. 263. 动态内存分配函数位于stdlib.h中 (27)4. 缓冲区处理函数位于string.h”中 (27)5. 输入输出流函数位于stdio.h”中 (27)第三节Keil C51库函数原型列表 (27)1. CTYPE.H.. 272. INTRINS.H.. 273. STDIO.H.. 284. STDLIB.H.. 285. STRING.H.. 28第六章 Keil C51例子Hello.c.. 29第一节uVision for Windows的使用步骤 (29)第二节Ishell for Dos使用步骤 (30)第七章 Keil C51的代码效率 (30)第一节存储模式的影响 (30)第二节程序结构的影响 (31)第八章 dScope for Windows使用详解 (32)第一节概述 (32)1. 主窗口Mainframe Window (32)2. 调试窗口DEBUG Window (32)3. 命令窗口Command Window (32)4. 观察窗口Watch Window (32)5. 寄存器窗口Registe Window (32)6. 串口窗口Serical Windows (32)7. 性能分析窗口 (32)8. 内存窗口Memory Window (32)9. 符号浏览窗口Symbol Browser Window (33)10. 调用线窗口Call Stack Window (33)11. 代码覆盖窗口 (33)12. 外围设备窗口(peripherals) 33第二节dScope for Windows基本操作 (33)1. 指定初始化文件 (33)2. 观察变量 (33)3. 显示RAM的值 (34)4. 观察堆栈 (34)5. 中断处理程序调试 (34)6. 性能分析Performance Analyzer PA (34)第三节dScope for Windows命令文件的编制 (34)1. 地址空间及地址空间类型 (34)2. 常量 (35)3. 变量 (36)4. 运算符 (38)5. 表达式 (38)6. 数组 (38)7. 结构和联合 (38)8. 指针 (38)9. dScope命令语句 (38)10. 函数 (43)第一章 Keil C51开发系统基本知识第一节系统概述Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统与汇编相比C语言在功能上结构性可读性可维护性上有明显的优势因而易学易用用过汇编语言后再使用C来开发体会更加深刻Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具全Windows 界面另外重要的一点只要看一下编译后生成的汇编代码就能体会到Keil C51生成的目标代码效率非常之高多数语句生成的汇编代码很紧凑容易理解在开发大型软件时更能体现高级语言的优势下面详细介绍Keil C51开发系统各部分功能和使用第二节Keil C51单片机软件开发系统的整体结构C51工具包的整体结构如图(1)所示其中uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE)可以完成编辑编译连接调试仿真等整个开发流程开发人员可用IDE本身或其它编辑器编辑C或汇编源文件然后分别由C51及A51编译器编译生成目标文件(.OBJ)目标文件可由LIB51创建生成库文件也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)ABS文件由OH51转换成标准的Hex文件以供调试器dScope51或tScope51使用进行源代码级调试也可由仿真器使用直接对目标板进行调试也可以直接写入程序存贮器如EPROM中图(1) C51工具包整体结构图第三节Keil C51工具包的安装1. C51 for Dos在Windows下直接运行软件包中DOS\C51DOS.exe然后选择安装目录即可完毕后欲使系统正常工作须进行以下操作(设C:\C51为安装目录)修改Autoexec.bat加入path=C:\C51\BinSet C51LIB=C:\C51\LIBSet C51INC=C:\C51\INC然后运行Autoexec.bat2. C51 for Windows的安装及注意事项在Windows下运行软件包中WIN\Setup.exe最好选择安装目录与C51 for Dos 相同这样设置最简单(设安装于C:\C51目录下)然后将软件包中crack目录中的文件拷入C:\C51\Bin目录下第四节Keil C51工具包各部分功能及使用简介1. C51与A51(1) C51C51是C语言编译器其使用方法为C51 sourcefile[编译控制指令]或者C51 @ commandfile其中sourcefile为C源文件(.C)大量的编译控制指令完成C51编译器的全部功能包控C51输出文件C.LST.OBJ.I和.SRC文件的控制源文件(.C)的控制等详见第五部分的具体介绍而Commandfile为一个连接控制文件其内容包括.C源文件及各编译控制指令它没有固定的名字开发人员可根据自己的习惯指定它适于用控制指令较多的场合(2) A51A51是汇编语言编译器使用方法为A51 sourcefile[编译控制指令]或A51 @ commandfile其中sourcefile为汇编源文件(.asm或.a51)而编译控制指令的使用与其它汇编如ASM 语言类似可参考其他汇编语言材料Commandfile同C51中的Commandfile类似它使A51使用和修改方便2. L51和BL51(1) L51L51是Keil C51软件包提供的连接/定位器其功能是将编译生成的OBJ文件与库文件连接定位生成绝对目标文件(.ABS)其使用方法为L51 目标文件列表[库文件列表] [to outputfile] [连接控制指令]或L51 @Commandfile源程序的多个模块分别经C51与A51编译后生成多个OBJ文件连接时这些文件全列于目标文件列表中作为输入文件如果还需与库文件(.LiB)相连接则库文件也必须列在其后outputfile为输文件名缺少时为第一模块名后缀为.ABS 连接控制指令提供了连接定位时的所有控制功能Commandfile为连接控制文件其具体内容是包括了目标文件列表库文件列表及输出文件连接控制命令以取代第一种繁琐的格式由于目标模块库文件大多不止1个因而第2种方法较多见这个文件名字也可由使用者随意指定(2) Bl51BL51也是C51软件包的连接/定位器其具有L51的所有功能此外它还具有以下3点特别之处a. 可以连接定位大于64kBytes的程序b. 具有代码域及域切换功能(CodeBanking & Bank Switching)c. 可用于RTX51操作系统RTX51是一个实时多任务操作系统它改变了传统的编程模式甚至不必用main( )函数单片机系统软件向RTOS发展是一种趋势这种趋势对于186和386及68K系列CPU更为明显和必须对8051因CPU较为简单程序结构等都不太复杂RTX51作用显得不太突出其专业版软件PK51软件包甚至不包括RTX51Full 而只有一个RTX51TINY版本的RTOS RTX51 TINY适用于无外部RAM的单片机系统因而可用面很窄在本文中不作介绍Bank switching技术因使用很少也不作介绍3. DScope51Tscope51及Monitor51(1) dScope51dScope51是一个源级调试器和模拟器它可以调试由C51编译器A51汇编器PL/M-51编译器及ASM51汇编器产生的程序它不需目标板for windows也可通过mon51接目标板只能进行软件模拟但其功能强大可模拟CPU及其外围器件如内部串口外部I/O及定时器等能对嵌入式软件功能进行有效测试其使用方法为DS51[debugfile][INIT(initfile)]其中debugfile是一个Hex格式的8051文件即待调试的文件其为可选的可在进入dScope51后用load命令装入Initfile为一个初使化文件它在启动dScope51后在debugfile装入前装入装有一些dScope的初使化参数及常用调试函数等下面是一个dScope.ini文件(for dos)的内容Load ..\..\ds51\8051.iofMap 0,0xffffdScope51 for Windows则直接用鼠标进入然后用load装入待调文件(2) tScope51与dScope51不同的是Scope51必须带目标板目前它可以通过两种方式访问目标板(1) 通过EMul51在线仿真器tScope51为该仿真器准备了一个动态连接文件EMUL51.IOT但该方法必须配合该仿真器(2) 通过Monitov51监控程序这种方法是可行的tScope51为访问Monitor51专门带有MON51.IOT连接程序使用时可通过串口及监控程序来调试目标板其使用方法为TS51[INIT(file_name.ini)]其中file_name.ini为一个初使化文件进入TS51后必须装入IOT文件可用的有MON51.IOT及EMUL51.IOT两种如装入MON51.IOTLoad.C:\C51\TS51\MON51.IOT CPUTYPE(80517)可惜的是tScope51只有for Dos的版本(3) Monitor 51Monitor51是一个监控程序通过PC机的串口与目标板进行通信Monitor操作需要MON51或dScope51 for Windows,后面部分将对Monitor51做较为详细的介绍4. Ishell及uVision(1) Ishell for Dos这是一个for Dos的IDE直接在命令行键入Ishell则进入该环境它使用简单方便其命令行与DOS命令行具有同样的功能对单模块的Project直接由菜单进行编译连接对多模块的project则通过批处理BAT文件进行编译连接然后通过菜单控制由dScope51或tScope51对程序进行调试因为是for dos的不做太详细介绍(2) uVision for WindowsuVision for Windows是一个标准的Windows应用程序它是C51的一个集成软件开发平台具有源代码编辑project管理集成的make等功能它的人机界面友好操作方便是开发者的首选具体配置及使用见第五部分第二章 Keil C51软件使用详解第一节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中的P1P2P3P0与引脚之值分别列出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.IOF2. 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支持C51A51L51/BL51C166A166L166等编译连接器点中主菜单中的Automake即运行本工具Ishell for Dos使用比较繁琐推荐使用uVision for windows2. uVision for windows的使用uVision是一个标准的windows应用程序其编译功能文件处理功能project 处理功能窗口功能以及工具引用功能(如A51C51PL/M41BL51 dScope等)等都较Ishell for Dos要强得多uVision采用BL51作连接器因为BL51兼容L51所以一切能在Dos下工作的project都可以到uVision中进行连接调试uVision采用dScope for windows作调试器该调试器支持MON51及系统模拟两种方式功能较for DOS要强大好用调试功能强大注意(1) Option菜单下的各项要会使用其中A51C51PL/M51BL51定义各文件所使用的编译连接控制指令dScope定义一个dScope初始化文件Make则是定义一个make文件(2) 进入调试是在RUN菜单下运行dScope(3) project中包括新建打开修改更新编译连接等poject处理具体使用可参考后面的例子第三章 Keil C51 vs 标准C深入理解并应用C51对标准ANSIC的扩展是学习C51的关键之一因为大多数扩展功能都是直接针对8051系列CPU硬件的大致有以下8类8051存储类型及存储区域存储模式存储器类型声明变量类型声明位变量与位寻址特殊功能寄存器(SFR)C51指针函数属性具体说明如下(8031为缺省CPU)第一节Keil C51扩展关键字C51 V4.0版本有以下扩展关键字(共19个)_at_ idata sfr16 alien interrupt smallbdata large _task_ Code bit pdatausing reentrant xdata compact sbit data sfr第二节内存区域(Memory Areas)1. Pragram Area由Code说明可有多达64kBytes的程序存储器2. Internal Data Memory:内部数据存储器可用以下关键字说明data直接寻址区为内部RAM的低128字节00H7FHidata间接寻址区包括整个内部RAM区00H FFHbdata可位寻址区20H2FH3. External Data Memory外部RAM视使用情况可由以下关键字标识xdata可指定多达64KB的外部直接寻址区地址范围0000H0FFFFHpdata能访问1页(25bBytes)的外部RAM主要用于紧凑模式(Compact Model) 4. Speciac Function Register Memory8051提供128Bytes的SFR寻址区这区域可位寻址字节寻址或字寻址用以控制定时器计数器串口I/O及其它部件可由以下几种关键字说明sfr字节寻址比如sfr P0=0x80;为PO口地址为80H后H FFH之间的常数sfr16字寻址如sfr16 T2=0xcc;指定Timer2口地址T2L=0xcc T2H=0xCD sbit位寻址如sbit EA=0xAF;指定第0xAF位为EA即中断允许还可以有如下定义方法sbit 0V=PSW^2(定义0V为PSW的第2位)sbit 0V0XDO^2(同上)或bit 0V-0xD2(同上)第三节存储模式存储模式决定了没有明确指定存储类型的变量函数参数等的缺省存储区域共三种1. Small模式所有缺省变量参数均装入内部RAM优点是访问速度快缺点是空间有限只适用于小程序2. Compact模式所有缺省变量均位于外部RAM区的一页(256Bytes)具体哪一页可由P2口指定在STARTUP.A51文件中说明也可用pdata指定优点是空间较Small为宽裕速度较Small慢较large要快是一种中间状态3. large模式所有缺省变量可放在多达64KB的外部RAM区优点是空间大可存变量多缺点是速度较慢提示存储模式在C51编译器选项中选择第四节存储类型声明变量或参数的存储类型可由存储模式指定缺省类型也可由关键字直接声明指定各类型分别用code,data,idata,xdata,pdata说明例data uar1char code array[ ]hello!”;unsigned char xdata arr[10][4][4]第五节变量或数据类型C51提供以下几种扩展数据类型bit 位变量值为0或1sbit 从字节中定义的位变量0或1sfr sfr字节地址0255sfr16 sfr字地址065535其余数据类型如char,enum,short,int,long,float等与ANSI C相同第六节位变量与声明1. bit型变量bit型变量可用变量类型函数声明函数返回值等存贮于内部RAM20H2FH 注意(1) 用pragma disable说明函数和用usign”指定的函数不能返回bit值(2) 一个bit变量不能声明为指针如bit *ptr是错误的(3) 不能有bit数组如bit arr[5]错误2. 可位寻址区说明20H2FH可作如下定义int bdata ichar bdata arr[3]然后sbit bito in0sbit bit15=I^15sbit arr07=arr[0]^7sbit arr15=arr[i]^7第七节Keil C51指针C51支持一般指针(Generic Pointer)和存储器指针(Memory_Specific Pointer).1. 一般指针一般指针的声明和使用均与标准C相同不过同时还可以说明指针的存储类型例如long * state;为一个指向long型整数的指针而state本身则依存储模式存放char * xdata ptr ptr为一个指向char数据的指针而ptr本身放于外部RAM区以上的long,char等指针指向的数据可存放于任何存储器中一般指针本身用3个字节存放分别为存储器类型高位偏移低位偏移量2. 存储器指针基于存储器的指针说明时即指定了存贮类型例如char data * str;str指向data区中char型数据int xdata * pow; pow指向外部RAM的int型整数这种指针存放时只需一个字节或2个字节就够了因为只需存放偏移量3. 指针转换即指针在上两种类型之间转化当基于存储器的指针作为一个实参传递给需要一般指针的函数时指针自动转化如果不说明外部函数原形基于存储器的指针自动转化为一般指针导致错误因而请用include”说明所有函数原形可以强行改变指针类型第八节Keil C51函数C51函数声明对ANSI C作了扩展具体包括1. 中断函数声明中断声明方法如下void serial_ISR () interrupt 4 [using 1]{/* ISR */}为提高代码的容错能力在没用到的中断入口处生成iret语句定义没用到的中断/* define not used interrupt, so generate "IRET" in their entrance */void extern0_ISR() interrupt 0{} /* not used */void timer0_ISR () interrupt 1{} /* not used */void extern1_ISR() interrupt 2{} /* not used */void timer1_ISR () interrupt 3{} /* not used */void serial_ISR () interrupt 4{} /* not used */2. 通用存储工作区3. 选通用存储工作区由using x声明见上例4. 指定存储模式由small compact 及large说明例如void fun1(void) small { }提示small说明的函数内部变量全部使用内部RAM关键的经常性的耗时的地方可以这样声明以提高运行速度5. #pragma disable在函数前声明只对一个函数有效该函数调用过程中将不可被中断6. 递归或可重入函数指定在主程序和中断中都可调用的函数容易产生问题因为51和PC不同PC使用堆栈传递参数且静态变量以外的内部变量都在堆栈中而51一般使用寄存器传递参数内部变量一般在RAM中函数重入时会破坏上次调用的数据可以用以下两种方法解决函数重入a在相应的函数前使用前述#pragma disable”声明即只允许主程序或中断之一调用该函数b将该函数说明为可重入的如下void func(param...) reentrant;KeilC51编译后将生成一个可重入变量堆栈然后就可以模拟通过堆栈传递变量的方法由于一般可重入函数由主程序和中断调用所以通常中断使用与主程序不同的R 寄存器组另外对可重入函数在相应的函数前面加上开关#pragma noaregs”以禁止编译器使用绝对寄存器寻址可生成不依赖于寄存器组的代码7. 指定PL/M51函数由alien指定第四章 Keil C51高级编程本章讨论以下内容绝对地址访问C与汇编的接口C51软件包中的通用文件段名转换与程序优化第一节绝对地址访问C51提供了三种访问绝对地址的方法1. 绝对宏在程序中用include<absacc.h>”即可使用其中定义的宏来访问绝对地址包括CBYTE XBYTE PWORD DBYTE CWORD XWORD PBYTE DWORD具体使用可看一看absacc.h便知例如rval=CBYTE[0x0002];指向程序存贮器的0002h地址rval=XWORD [0x0002];指向外RAM的0004h地址2. _at_关键字直接在数据定义后加上_at_ const即可但是注意(1)绝对变量不能被初使化(2)bit型函数及变量不能用_at_指定例如idata struct link list _at_ 0x40;指定list结构从40h开始xdata char text[25b] _at_0xE000指定text数组从0E000H开始提示如果外部绝对变量是I/O端口等可自行变化数据需要使用volatile关键字进行描述请参考absacc.h3. 连接定位控制此法是利用连接控制指令code xdata pdata \data bdata对段地址进行如要指定某具体变量地址则很有局限性不作详细讨论第二节Keil C51与汇编的接口1. 模块内接口方法是用pragma语句具体结构是#pragma asm汇编行#pragma endasm这种方法实质是通过asm与ndasm告诉C51编译器中间行不用编译为汇编行因而在编译控制指令中有SRC以控制将这些不用编译的行存入其中2. 模块间接口C模块与汇编模块的接口较简单分别用C51与A51对源文件进行编译然后用L51将obj文件连接即可关键问题在于C函数与汇编函数之间的参数传递问题C51中有两种参数传递方法(1) 通过寄存器传递函数参数最多只能有3个参数通过寄存器传递规律如下表参数数目Char Int long,float 一般指针1 R7 R6 & R7 R4R7 R1R32 R5 R4 & R5 R4R7 R1R33 R3 R2 & R3 R1R3(2) 通过固定存储区传递(fixed memory)这种方法将bit型参数传给一个存储段中function_name?BIT将其它类型参数均传给下面的段function_name?BYTE,且按照预选顺序存放至于这个固定存储区本身在何处则由存储模式默认(3) 函数的返回值函数返回值一律放于寄存器中有如下规律Return type Registev 说明Bit 标志位由具体标志位返回char/unsigned charR7 单字节由R7返回1_byte指针R6 & R7 双字节由R6和R7返回,MSB在R6 int/unsigned int2_byte指针long&unsigned long R4R7 MSB在R4, LSB在R7Float R4R7 32Bit IEEE格式一般指针R1R3 存储类型在R3 高位R2 低R1 (4) SRC控制该控制指令将C文件编译生成汇编文件(.SRC)该汇编文件可改名后生成汇编.ASM 文件再用A51进行编译第三节Keil C51软件包中的通用文件在C51\LiB目录下有几个C源文件这几个C源文件有非常重要的作用对它们稍事修改就可以用在自己的专用系统中1. 动态内存分配init_mem.C此文件是初始化动态内存区的程序源代码它可以指定动态内存的位置及大小只有使用了init_mem( )才可以调回其它函数诸如malloc calloc,realloc 等calloc.c此文件是给数组分配内存的源代码它可以指定单位数据类型及该单元数目malloc.c此文件是malloc的源代码分配一段固定大小的内存realloc.c此文件是realloc.c源代码其功能是调整当前分配动态内存的大小2. C51启动文件STARTUP.A51。
C51使用详解
Keil C51使用详解V1.0©电子设计世界版权所有欢迎转贴请勿修改并注明出处保留一切权利第一章 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. DScope51Tscope51及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. 可位寻址区说明20H2FH.. 18第七节Keil C51指针 (18)1. 一般指针 (18)2. 存储器指针 (18)3. 指针转换 (18)第八节Keil C51函数 (19)1. 中断函数声明 (19)2. 通用存储工作区 (19)3. 选通用存储工作区由using x声明见上例 (19)4. 指定存储模式 (19)5. #pragma disable. 196. 递归或可重入函数指定 (19)7. 指定PL/M51函数 (20)第四章 Keil C51高级编程 (20)第一节绝对地址访问 (20)1. 绝对宏 (20)2. _at_关键字 (21)3. 连接定位控制 (21)第二节Keil C51与汇编的接口 (21)1. 模块内接口 (21)2. 模块间接口 (21)第三节Keil C51软件包中的通用文件 (22)1. 动态内存分配 (22)2. C51启动文件STARTUP.A51. 223. 标准输入输出文件 (25)4. 其它文件 (25)第四节段名协定与程序优化 (25)1. 段名协定(Segment Naming Conventions) 252. 程序优化 (25)第五章 Keil C51库函数参考 (26)第一节本征库函数(intrinsic routines)和非本征证库函数 (26)第二节几类重要库函数 (26)1. 专用寄存器include文件 (26)2. 绝对地址include文件absacc.h. 263. 动态内存分配函数位于stdlib.h中 (27)4. 缓冲区处理函数位于string.h”中 (27)5. 输入输出流函数位于stdio.h”中 (27)第三节Keil C51库函数原型列表 (27)1. CTYPE.H.. 272. INTRINS.H.. 273. STDIO.H.. 284. STDLIB.H.. 285. STRING.H.. 28第六章 Keil C51例子Hello.c.. 29第一节uVision for Windows的使用步骤 (29)第二节Ishell for Dos使用步骤 (30)第七章 Keil C51的代码效率 (30)第一节存储模式的影响 (30)第二节程序结构的影响 (31)第八章 dScope for Windows使用详解 (32)第一节概述 (32)1. 主窗口Mainframe Window (32)2. 调试窗口DEBUG Window (32)3. 命令窗口Command Window (32)4. 观察窗口Watch Window (32)5. 寄存器窗口Registe Window (32)6. 串口窗口Serical Windows (32)7. 性能分析窗口 (32)8. 内存窗口Memory Window (32)9. 符号浏览窗口Symbol Browser Window (33)10. 调用线窗口Call Stack Window (33)11. 代码覆盖窗口 (33)12. 外围设备窗口(peripherals) 33第二节dScope for Windows基本操作 (33)1. 指定初始化文件 (33)2. 观察变量 (33)3. 显示RAM的值 (34)4. 观察堆栈 (34)5. 中断处理程序调试 (34)6. 性能分析Performance Analyzer PA (34)第三节dScope for Windows命令文件的编制 (34)1. 地址空间及地址空间类型 (34)2. 常量 (35)3. 变量 (36)4. 运算符 (38)5. 表达式 (38)6. 数组 (38)7. 结构和联合 (38)8. 指针 (38)9. dScope命令语句 (38)10. 函数 (43)第一章 Keil C51开发系统基本知识第一节系统概述Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统与汇编相比C语言在功能上结构性可读性可维护性上有明显的优势因而易学易用用过汇编语言后再使用C来开发体会更加深刻Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具全Windows 界面另外重要的一点只要看一下编译后生成的汇编代码就能体会到Keil C51生成的目标代码效率非常之高多数语句生成的汇编代码很紧凑容易理解在开发大型软件时更能体现高级语言的优势下面详细介绍Keil C51开发系统各部分功能和使用第二节Keil C51单片机软件开发系统的整体结构C51工具包的整体结构如图(1)所示其中uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE)可以完成编辑编译连接调试仿真等整个开发流程开发人员可用IDE本身或其它编辑器编辑C或汇编源文件然后分别由C51及A51编译器编译生成目标文件(.OBJ)目标文件可由LIB51创建生成库文件也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)ABS文件由OH51转换成标准的Hex文件以供调试器dScope51或tScope51使用进行源代码级调试也可由仿真器使用直接对目标板进行调试也可以直接写入程序存贮器如EPROM中图(1) C51工具包整体结构图第三节Keil C51工具包的安装1. C51 for Dos在Windows下直接运行软件包中DOS\C51DOS.exe然后选择安装目录即可完毕后欲使系统正常工作须进行以下操作(设C:\C51为安装目录)修改Autoexec.bat加入path=C:\C51\BinSet C51LIB=C:\C51\LIBSet C51INC=C:\C51\INC然后运行Autoexec.bat2. C51 for Windows的安装及注意事项在Windows下运行软件包中WIN\Setup.exe最好选择安装目录与C51 for Dos 相同这样设置最简单(设安装于C:\C51目录下)然后将软件包中crack目录中的文件拷入C:\C51\Bin目录下第四节Keil C51工具包各部分功能及使用简介1. C51与A51(1) C51C51是C语言编译器其使用方法为C51 sourcefile[编译控制指令]或者C51 @ commandfile其中sourcefile为C源文件(.C)大量的编译控制指令完成C51编译器的全部功能包控C51输出文件C.LST.OBJ.I和.SRC文件的控制源文件(.C)的控制等详见第五部分的具体介绍而Commandfile为一个连接控制文件其内容包括.C源文件及各编译控制指令它没有固定的名字开发人员可根据自己的习惯指定它适于用控制指令较多的场合(2) A51A51是汇编语言编译器使用方法为A51 sourcefile[编译控制指令]或A51 @ commandfile其中sourcefile为汇编源文件(.asm或.a51)而编译控制指令的使用与其它汇编如ASM 语言类似可参考其他汇编语言材料Commandfile同C51中的Commandfile类似它使A51使用和修改方便2. L51和BL51(1) L51L51是Keil C51软件包提供的连接/定位器其功能是将编译生成的OBJ文件与库文件连接定位生成绝对目标文件(.ABS)其使用方法为L51 目标文件列表[库文件列表] [to outputfile] [连接控制指令]或L51 @Commandfile源程序的多个模块分别经C51与A51编译后生成多个OBJ文件连接时这些文件全列于目标文件列表中作为输入文件如果还需与库文件(.LiB)相连接则库文件也必须列在其后outputfile为输文件名缺少时为第一模块名后缀为.ABS 连接控制指令提供了连接定位时的所有控制功能Commandfile为连接控制文件其具体内容是包括了目标文件列表库文件列表及输出文件连接控制命令以取代第一种繁琐的格式由于目标模块库文件大多不止1个因而第2种方法较多见这个文件名字也可由使用者随意指定(2) Bl51BL51也是C51软件包的连接/定位器其具有L51的所有功能此外它还具有以下3点特别之处a. 可以连接定位大于64kBytes的程序b. 具有代码域及域切换功能(CodeBanking & Bank Switching)c. 可用于RTX51操作系统RTX51是一个实时多任务操作系统它改变了传统的编程模式甚至不必用main( )函数单片机系统软件向RTOS发展是一种趋势这种趋势对于186和386及68K系列CPU更为明显和必须对8051因CPU较为简单程序结构等都不太复杂RTX51作用显得不太突出其专业版软件PK51软件包甚至不包括RTX51Full 而只有一个RTX51TINY版本的RTOS RTX51 TINY适用于无外部RAM的单片机系统因而可用面很窄在本文中不作介绍Bank switching技术因使用很少也不作介绍3. DScope51Tscope51及Monitor51(1) dScope51dScope51是一个源级调试器和模拟器它可以调试由C51编译器A51汇编器PL/M-51编译器及ASM51汇编器产生的程序它不需目标板for windows也可通过mon51接目标板只能进行软件模拟但其功能强大可模拟CPU及其外围器件如内部串口外部I/O及定时器等能对嵌入式软件功能进行有效测试其使用方法为DS51[debugfile][INIT(initfile)]其中debugfile是一个Hex格式的8051文件即待调试的文件其为可选的可在进入dScope51后用load命令装入Initfile为一个初使化文件它在启动dScope51后在debugfile装入前装入装有一些dScope的初使化参数及常用调试函数等下面是一个dScope.ini文件(for dos)的内容Load ..\..\ds51\8051.iofMap 0,0xffffdScope51 for Windows则直接用鼠标进入然后用load装入待调文件(2) tScope51与dScope51不同的是Scope51必须带目标板目前它可以通过两种方式访问目标板(1) 通过EMul51在线仿真器tScope51为该仿真器准备了一个动态连接文件EMUL51.IOT但该方法必须配合该仿真器(2) 通过Monitov51监控程序这种方法是可行的tScope51为访问Monitor51专门带有MON51.IOT连接程序使用时可通过串口及监控程序来调试目标板其使用方法为TS51[INIT(file_name.ini)]其中file_name.ini为一个初使化文件进入TS51后必须装入IOT文件可用的有MON51.IOT及EMUL51.IOT两种如装入MON51.IOTLoad.C:\C51\TS51\MON51.IOT CPUTYPE(80517)可惜的是tScope51只有for Dos的版本(3) Monitor 51Monitor51是一个监控程序通过PC机的串口与目标板进行通信Monitor操作需要MON51或dScope51 for Windows,后面部分将对Monitor51做较为详细的介绍4. Ishell及uVision(1) Ishell for Dos这是一个for Dos的IDE直接在命令行键入Ishell则进入该环境它使用简单方便其命令行与DOS命令行具有同样的功能对单模块的Project直接由菜单进行编译连接对多模块的project则通过批处理BAT文件进行编译连接然后通过菜单控制由dScope51或tScope51对程序进行调试因为是for dos的不做太详细介绍(2) uVision for WindowsuVision for Windows是一个标准的Windows应用程序它是C51的一个集成软件开发平台具有源代码编辑project管理集成的make等功能它的人机界面友好操作方便是开发者的首选具体配置及使用见第五部分第二章 Keil C51软件使用详解第一节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中的P1P2P3P0与引脚之值分别列出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.IOF2. 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支持C51A51L51/BL51C166A166L166等编译连接器点中主菜单中的Automake即运行本工具Ishell for Dos使用比较繁琐推荐使用uVision for windows2. uVision for windows的使用uVision是一个标准的windows应用程序其编译功能文件处理功能project 处理功能窗口功能以及工具引用功能(如A51C51PL/M41BL51 dScope等)等都较Ishell for Dos要强得多uVision采用BL51作连接器因为BL51兼容L51所以一切能在Dos下工作的project都可以到uVision中进行连接调试uVision采用dScope for windows作调试器该调试器支持MON51及系统模拟两种方式功能较for DOS要强大好用调试功能强大注意(1) Option菜单下的各项要会使用其中A51C51PL/M51BL51定义各文件所使用的编译连接控制指令dScope定义一个dScope初始化文件Make则是定义一个make文件(2) 进入调试是在RUN菜单下运行dScope(3) project中包括新建打开修改更新编译连接等poject处理具体使用可参考后面的例子第三章 Keil C51 vs 标准C深入理解并应用C51对标准ANSIC的扩展是学习C51的关键之一因为大多数扩展功能都是直接针对8051系列CPU硬件的大致有以下8类8051存储类型及存储区域存储模式存储器类型声明变量类型声明位变量与位寻址特殊功能寄存器(SFR)C51指针函数属性具体说明如下(8031为缺省CPU)第一节Keil C51扩展关键字C51 V4.0版本有以下扩展关键字(共19个)_at_ idata sfr16 alien interrupt smallbdata large _task_ Code bit pdatausing reentrant xdata compact sbit data sfr第二节内存区域(Memory Areas)1. Pragram Area由Code说明可有多达64kBytes的程序存储器2. Internal Data Memory:内部数据存储器可用以下关键字说明data直接寻址区为内部RAM的低128字节00H7FHidata间接寻址区包括整个内部RAM区00H FFHbdata可位寻址区20H2FH3. External Data Memory外部RAM视使用情况可由以下关键字标识xdata可指定多达64KB的外部直接寻址区地址范围0000H0FFFFHpdata能访问1页(25bBytes)的外部RAM主要用于紧凑模式(Compact Model) 4. Speciac Function Register Memory8051提供128Bytes的SFR寻址区这区域可位寻址字节寻址或字寻址用以控制定时器计数器串口I/O及其它部件可由以下几种关键字说明sfr字节寻址比如sfr P0=0x80;为PO口地址为80H后H FFH之间的常数sfr16字寻址如sfr16 T2=0xcc;指定Timer2口地址T2L=0xcc T2H=0xCD sbit位寻址如sbit EA=0xAF;指定第0xAF位为EA即中断允许还可以有如下定义方法sbit 0V=PSW^2(定义0V为PSW的第2位)sbit 0V0XDO^2(同上)或bit 0V-0xD2(同上)第三节存储模式存储模式决定了没有明确指定存储类型的变量函数参数等的缺省存储区域共三种1. Small模式所有缺省变量参数均装入内部RAM优点是访问速度快缺点是空间有限只适用于小程序2. Compact模式所有缺省变量均位于外部RAM区的一页(256Bytes)具体哪一页可由P2口指定在STARTUP.A51文件中说明也可用pdata指定优点是空间较Small为宽裕速度较Small慢较large要快是一种中间状态3. large模式所有缺省变量可放在多达64KB的外部RAM区优点是空间大可存变量多缺点是速度较慢提示存储模式在C51编译器选项中选择第四节存储类型声明变量或参数的存储类型可由存储模式指定缺省类型也可由关键字直接声明指定各类型分别用code,data,idata,xdata,pdata说明例data uar1char code array[ ]hello!”;unsigned char xdata arr[10][4][4]第五节变量或数据类型C51提供以下几种扩展数据类型bit 位变量值为0或1sbit 从字节中定义的位变量0或1sfr sfr字节地址0255sfr16 sfr字地址065535其余数据类型如char,enum,short,int,long,float等与ANSI C相同第六节位变量与声明1. bit型变量bit型变量可用变量类型函数声明函数返回值等存贮于内部RAM20H2FH 注意(1) 用pragma disable说明函数和用usign”指定的函数不能返回bit值(2) 一个bit变量不能声明为指针如bit *ptr是错误的(3) 不能有bit数组如bit arr[5]错误2. 可位寻址区说明20H2FH可作如下定义int bdata ichar bdata arr[3]然后sbit bito in0sbit bit15=I^15sbit arr07=arr[0]^7sbit arr15=arr[i]^7第七节Keil C51指针C51支持一般指针(Generic Pointer)和存储器指针(Memory_Specific Pointer).1. 一般指针一般指针的声明和使用均与标准C相同不过同时还可以说明指针的存储类型例如long * state;为一个指向long型整数的指针而state本身则依存储模式存放char * xdata ptr ptr为一个指向char数据的指针而ptr本身放于外部RAM区以上的long,char等指针指向的数据可存放于任何存储器中一般指针本身用3个字节存放分别为存储器类型高位偏移低位偏移量2. 存储器指针基于存储器的指针说明时即指定了存贮类型例如char data * str;str指向data区中char型数据int xdata * pow; pow指向外部RAM的int型整数这种指针存放时只需一个字节或2个字节就够了因为只需存放偏移量3. 指针转换即指针在上两种类型之间转化当基于存储器的指针作为一个实参传递给需要一般指针的函数时指针自动转化如果不说明外部函数原形基于存储器的指针自动转化为一般指针导致错误因而请用include”说明所有函数原形可以强行改变指针类型第八节Keil C51函数C51函数声明对ANSI C作了扩展具体包括1. 中断函数声明中断声明方法如下void serial_ISR () interrupt 4 [using 1]{/* ISR */}为提高代码的容错能力在没用到的中断入口处生成iret语句定义没用到的中断/* define not used interrupt, so generate "IRET" in their entrance */void extern0_ISR() interrupt 0{} /* not used */void timer0_ISR () interrupt 1{} /* not used */void extern1_ISR() interrupt 2{} /* not used */void timer1_ISR () interrupt 3{} /* not used */void serial_ISR () interrupt 4{} /* not used */2. 通用存储工作区3. 选通用存储工作区由using x声明见上例4. 指定存储模式由small compact 及large说明例如void fun1(void) small { }提示small说明的函数内部变量全部使用内部RAM关键的经常性的耗时的地方可以这样声明以提高运行速度5. #pragma disable在函数前声明只对一个函数有效该函数调用过程中将不可被中断6. 递归或可重入函数指定在主程序和中断中都可调用的函数容易产生问题因为51和PC不同PC使用堆栈传递参数且静态变量以外的内部变量都在堆栈中而51一般使用寄存器传递参数内部变量一般在RAM中函数重入时会破坏上次调用的数据可以用以下两种方法解决函数重入a在相应的函数前使用前述#pragma disable”声明即只允许主程序或中断之一调用该函数b将该函数说明为可重入的如下void func(param...) reentrant;KeilC51编译后将生成一个可重入变量堆栈然后就可以模拟通过堆栈传递变量的方法由于一般可重入函数由主程序和中断调用所以通常中断使用与主程序不同的R 寄存器组另外对可重入函数在相应的函数前面加上开关#pragma noaregs”以禁止编译器使用绝对寄存器寻址可生成不依赖于寄存器组的代码7. 指定PL/M51函数由alien指定第四章 Keil C51高级编程本章讨论以下内容绝对地址访问C与汇编的接口C51软件包中的通用文件段名转换与程序优化第一节绝对地址访问C51提供了三种访问绝对地址的方法1. 绝对宏在程序中用include<absacc.h>”即可使用其中定义的宏来访问绝对地址包括CBYTE XBYTE PWORD DBYTE CWORD XWORD PBYTE DWORD具体使用可看一看absacc.h便知例如rval=CBYTE[0x0002];指向程序存贮器的0002h地址rval=XWORD [0x0002];指向外RAM的0004h地址2. _at_关键字直接在数据定义后加上_at_ const即可但是注意(1)绝对变量不能被初使化(2)bit型函数及变量不能用_at_指定例如idata struct link list _at_ 0x40;指定list结构从40h开始xdata char text[25b] _at_0xE000指定text数组从0E000H开始提示如果外部绝对变量是I/O端口等可自行变化数据需要使用volatile关键字进行描述请参考absacc.h3. 连接定位控制此法是利用连接控制指令code xdata pdata \data bdata对段地址进行如要指定某具体变量地址则很有局限性不作详细讨论第二节Keil C51与汇编的接口1. 模块内接口方法是用pragma语句具体结构是#pragma asm汇编行#pragma endasm这种方法实质是通过asm与ndasm告诉C51编译器中间行不用编译为汇编行因而在编译控制指令中有SRC以控制将这些不用编译的行存入其中2. 模块间接口C模块与汇编模块的接口较简单分别用C51与A51对源文件进行编译然后用L51将obj文件连接即可关键问题在于C函数与汇编函数之间的参数传递问题C51中有两种参数传递方法(1) 通过寄存器传递函数参数最多只能有3个参数通过寄存器传递规律如下表参数数目Char Int long,float 一般指针1 R7 R6 & R7 R4R7 R1R32 R5 R4 & R5 R4R7 R1R33 R3 R2 & R3 R1R3(2) 通过固定存储区传递(fixed memory)这种方法将bit型参数传给一个存储段中function_name?BIT将其它类型参数均传给下面的段function_name?BYTE,且按照预选顺序存放至于这个固定存储区本身在何处则由存储模式默认(3) 函数的返回值函数返回值一律放于寄存器中有如下规律Return type Registev 说明Bit 标志位由具体标志位返回char/unsigned charR7 单字节由R7返回1_byte指针R6 & R7 双字节由R6和R7返回,MSB在R6 int/unsigned int2_byte指针long&unsigned long R4R7 MSB在R4, LSB在R7Float R4R7 32Bit IEEE格式一般指针R1R3 存储类型在R3 高位R2 低R1 (4) SRC控制该控制指令将C文件编译生成汇编文件(.SRC)该汇编文件可改名后生成汇编.ASM 文件再用A51进行编译第三节Keil C51软件包中的通用文件在C51\LiB目录下有几个C源文件这几个C源文件有非常重要的作用对它们稍事修改就可以用在自己的专用系统中1. 动态内存分配init_mem.C此文件是初始化动态内存区的程序源代码它可以指定动态内存的位置及大小只有使用了init_mem( )才可以调回其它函数诸如malloc calloc,realloc 等calloc.c此文件是给数组分配内存的源代码它可以指定单位数据类型及该单元数目malloc.c此文件是malloc的源代码分配一段固定大小的内存realloc.c此文件是realloc.c源代码其功能是调整当前分配动态内存的大小2. C51启动文件STARTUP.A51。
C语言中KeilC51库函数大全
Keil C51库函数参考C51强大功能及其高效率的重要体现之一在于其丰富的可直接调用的库函数,多使用库函数使程序代码简单,结构清晰,易于调试和维护,下面介绍C51的库函数系统。
第一节本征库函数(i n t ri ns i c rou t i ne s)和非本征证库函数C51提供的本征函数是指编译时直接将固定的代码插入当前行,而不是用ACALL和LCALL语句来实现,这样就大大提供了函数访问的效率,而非本征函数则必须由ACALL及LCALL调用。
C51的本征库函数只有9个,数目虽少,但都非常有用,列如下:_crol_,_cror_:将char型变量循环向左(右)移动指定位数后返回_iror_,_irol_:将int型变量循环向左(右)移动指定位数后返回_lrol_,_lror_:将long型变量循环向左(右)移动指定位数后返回_nop_:相当于插入NOP_testbit_:相当于JBC bitvar测试该位变量并跳转同时清除。
_chkfloat_:测试并返回源点数状态。
使用时,必须包含#inclucle <intrins.h>一行。
如不说明,下面谈到的库函数均指非本征库函数。
第二节几类重要库函数1. 专用寄存器include文件例如8031、8051均为REG51.h其中包括了所有8051的SFR及其位定义,一般系统都必须包括本文件。
2. 绝对地址include文件absacc.h该文件中实际只定义了几个宏,以确定各存储空间的绝对地址。
3. 动态内存分配函数,位于stdlib.h中4. 缓冲区处理函数位于“string.h”中其中包括拷贝比较移动等函数如:memccpy memchr memcmp memcpy memmove memset这样很方便地对缓冲区进行处理。
5. 输入输出流函数,位于“stdio.h”中流函数通8051的串口或用户定义的I/O口读写数据,缺省为8051串口,如要修改,比如改为LCD显示,可修改lib目录中的getkey.c及putchar.c源文件,然后在库中替换它们即可。
(完整版)Keilc51常用库函数汇总参考
Keil c51函数参考一、数学函数<math.h >(1)cabs原型:char cabs(char val);功能:cabs函数取val的绝对值。
参数:一字节数val。
返回:cabs返回val的绝对值。
(2)abs原型:Int abs(int val);功能:求绝对值参数:val整型数返回:val的绝对值(3)labs原型:long labs(long val);功能:labs函数确定长整数val的绝对值。
返回:val的绝对值。
(4)fabs原型:float fabs(float val);功能:fabs函数确定浮点数val的绝对值。
参数:返回:fabs返回val的绝对值。
(5)sqrt原型:float sprt(float x);功能:sqrt函数计算x的平方根。
返回:sqrt函数返回x的正平方根。
(6)exp原型:float exp(float x);功能:exp函数计算自然对数中e的x次幂。
e≈2.71828182845953581496,是无限循环小数。
返回:e x的值。
(7)log原型:float log(float val);功能:log函数计算浮点数val的自然对数。
自然对数基数为e。
返回:val的浮点自然对数。
(8)log10原型:float log10(float val);功能:logl0函数计算浮点数val的常用对数。
常用对数为基数10。
返回:val的浮点常用对数。
(9)sin原型:float sin(float x);功能:sin函数计算浮点数x的正弦值。
参数:x必须在-65535~65535之间,或产生一个NaN错误。
返回:sin函数返回x的正弦。
(10)cos原型:float cos(float x);功能:COS函数计算浮点数X的余弦。
参数:X的值必须在-65535~65535之间,或产生一个NaN错误。
返回:COS函数返回X的余弦。
(11)tan原型:float tan(float x);功能:tan函数计算浮点数x的正切值。
keilc详细中文手册
k e i l c详细中文手册 The latest revision on November 22, 2020Keil 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声明,见上例。
C51编程头文件的使用方法
C51编程中头文件的使用头文件在C51的编程中是不可缺少的部分。
本文将对keil C中常用头文件予以说明,并就如何编写头文件进行初步介绍。
一、C51常见本征函数库一些常见的头文件都是keil C自带的,在安装目录下的C51文件夹的INC中可以找到keilC中所有的芯片所对应的头文件。
51系列单片机在编程中常用的头文件有:AT89X51.H、INTRINS.H、ABSACC.H、MATH.H。
1、AT89X51.H——本征函数库头文件AT89X51.H是编程中必需要用到的专用寄存器文件。
它与INC中的头文件REG51.H所定义的内容是一样的。
主要用来定义特殊功能寄存器的位地址、程序状态寄存器的位地址、定时器/计数器控制寄存器的位地址、中断使能控制器位地址、单片机P3引脚特殊功能位地址、中断优先权控制寄存器位地址、串行口控制寄存器位地址。
Header file for generic 80C51 and 80C31 microcontroller. Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc. All rights reserved.#ifndef __REG51_H_#define __REG51_H_BYTE Register 特殊功能寄存器的位地址sfr P0 = 0x80 P0口锁存器的地址sfr P1 = 0x90 P1口锁存器的地址sfr P2 = 0xA0 P2口锁存器的地址sfr P3 = 0xB0 P3口锁存器的地址sfr PSW = 0xD0 程序状态字sfr ACC = 0xE0 累加器sfr B = 0xF0 B寄存器sfr SP = 0x81 堆栈指针sfr DPL = 0x82 数据指针低位sfr DPH = 0x83 数据指针高位sfr PCON = 0x87 电源控制寄存器sfr TCON = 0x88 定时器/计数器控制寄存器sfr TMOD = 0x89 定时器/计数器方式控制寄存器sfr TL0 = 0x8A 定时器/计数器0(低字节)sfr TL1 = 0x8B 定时器/计数器1(低字节)sfr TH0 = 0x8C 定时器/计数器0(高字节)sfr TH1 = 0x8D 定时器/计数器1(高字节)sfr IE = 0xA8 中断允许控制寄存器sfr IP = 0xB8 中断优先级控制寄存器sfr SCON = 0x98 串行控制寄存器sfr SBUF = 0x99 串行缓冲器BIT Register 程序状态寄存器的地址sbit CY = 0xD7 进位标志sbit AC = 0xD6 辅助进位标志sbit F0 = 0xD5 标志位(可自行定义)sbit RS1 = 0xD4 寄存器选择控制位sbit RS0 = 0xD3 寄存器选择控制位sbit OV = 0xD2 溢出标志位sbit P = 0xD0 奇偶标志位TCON 定时器/计数器控制寄存器的地址sbit TF1 = 0x8F T1计数溢出标志位sbit TR1 = 0x8E T1计数运行控制位sbit TF0 = 0x8D T0计数溢出标志位sbit TR0 = 0x8C T0计数运行控制位sbit IE1 = 0x8B 中断1边沿标志sbit IT1 = 0x8A 中断1控制位sbit IE0 = 0x89 中断0边沿标志位sbit IT0 = 0x88 中断0控制位IE 中断使能控制器位地址sbit EA = 0xAF 总中断控标志位sbit ES = 0xAC 串行中断标志位sbit ET1 = 0xAB T1计数中断标志位sbit EX1 = 0xAA 外部中断1标志位sbit ET0 = 0xA9 T0计数中断标志位sbit EX0 = 0xA8 外部中断0标志位IP 中断优先权控制寄存器位地址sbit PS = 0xBC 串行中断优先标志位sbit PT1 = 0xBB 计数器1中断优先标志位sbit PX1 = 0xBA 外部中断1优先标志位sbit PT0 = 0xB9 计数器0中断优先标志位sbit PX0 = 0xB8 外部中断0优先标志位P3 单片机P3引脚特殊功能位地址sbit RD = 0xB7 外部数据存储器的写入控制信号sbit WR = 0xB6 外部数据存储器的读取控制信号sbit T1 = 0xB5 定时器1外部中断sbit T0 = 0xB4 定时器0外部中断sbit INT1 = 0xB3 外部中断0sbit INT0 = 0xB2 外部中断1sbit TXD = 0xB1 串行输出口sbit RXD = 0xB0 串行输入口SCON 串行口控制寄存器位地址sbit SM0 = 0x9F 串行口模式的选择位sbit SM1 = 0x9E 串行口模式的选择位sbit SM2 = 0x9D 允许模式2和3的多机通讯控制位sbit REN = 0x9C 允许串行接收位sbit TB8 = 0x9B 在模式2和3下传送第9数据位sbit RB8 = 0x9A 在模式2和3下存放第9数据位sbit TI = 0x99 传送中断标志位sbit RI = 0x98 接收中断标志位#endif2、INTRINS.H——本征函数库头文件INTRINS.H主要用来定义空操作、判断并清零和字符及数字的循环移动。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
keil C51 中的本征函数库及使用说明
本征函数(intrinsicroutines)是指编译时直接将固定代码插入当前行,而
不用ACALL 和LCALL 来实现(无需堆栈操作?),可大大提高函数的访问效率.
函数原型extern void _nop_ (void);extern bit _testbit_ (bit);extern unsigned char _cror_ (unsigned char, unsigned char);extern unsigned int _iror_ (unsigned int, unsigned char);extern unsigned long _lror_ (unsigned long, unsigned char);extern unsigned char _crol_ (unsigned char, unsigned char);extern unsigned int _irol_ (unsigned int, unsigned char);extern unsigned long _lrol_ (unsigned long, unsigned char);extern unsigned char _chkfloat_(float);头文件#include
说明
extern void _nop_ (void);产生一个nop 指令
extern bit_testbit_ (bit);产生一个JBC 指令,若该位置位,返回1,否则为0;只能作
用于直接寻址的位变量,不能用于表达式
之中
extern unsigned char _cror_ (unsigned char val, unsigned char n);(unsigned char)val 右移n 位
extern unsigned int _iror_ (unsigned int val, unsigned char n));(unsigned int)val 右移n 位
extern unsigned long _lror_ (unsigned long val, unsigned char n));(unsigned long)val 右移n 位
extern unsigned char _crol_ (unsigned char val, unsigned char n));(unsigned char)val 左移n 位
extern unsigned int _irol_ (unsigned int val, unsigned char n));(unsigned int)val 左。