常用Keil C51库函数
深入剖析keilc51---从汇编到c51
深入剖析keilc51---从汇编到c51C插入汇编语句#pragma asmljmp 0#pragma endasm如果就这样直接编译的话,会出现以下错误:error C272: 'asm/endasm' requires src-control to be active解决方法:在 Files T oolbar 中选中当前C51文件,点右键查看文件选项,将 Generate Assembler SRC File 与 Assemble SRC File 的勾选由灰色变为黑色,即使这两项有效!第一节 main()函数和启动代码汇编是从org 0000h开始启动,那么keil c51是如何启动main()函数的?keil c51有一个启动程序startup.a51,它总是和c程序一起编译和链接。
下面看看它和main()函数是如何编译的;//主函数如下;void main(void){while (1) 这是个无条件空循环。
{}}把上面的main()函数编译后的汇编程序和反汇编代码整理后对照如下;C_C51STARTUP SEGMENT CODEPR?main?TESTMAIN SEGMENT CODESTACK SEGMENT IDATARSEG ?STACKDS 1CSEG AT 0C_STARTUP: LJMP STARTUP1C:0x0000 020003 LJMP STARTUP1(C:0003)RSEG ?C_C51STARTUPSTARTUP1: ;该段程序把内存清零; MOV R0,#IDATALEN - 1C:0x0003 787F MOV R0,#0x7F; CLR AC:0x0005 E4 CLR A; MOV @R0,AIDATALOOP:C:0x0006 F6 MOV @R0,A; DJNZ R0,IDATALOOPC:0x0007 D8FD DJNZ R0,IDATALOOP(C:0006); MOV SP,#?STACK-1 ;设制CPU的堆栈起始地址C:0x0009 758107 MOV SP(0x81),#0x07; LJMP ?C_STARTC:0x000C 02000F LJMP main(C:000F)RSEG ?PR?main?TESTMAINmain:; void main(void)C:0x000F 80FE SJMP main(C:000F) ;main()函数现在分析上面的汇编程序就会明白c51程序是如何启动的。
C51常用头文件
C51常用头文件在KEIL 中,对于单片机所使用的头文件,除了reg51 reg52以外,还有一些从各芯片制商的官网下载与reg51,reg52功能类似的头文件,需了解透外,还要对各类型单片机均可通用且相当有用的的头文件,做相应的了解。
因为,内部所包含的函数与宏定义,可以及大的方便我们编写应用程序1字符函数 ctype.h1 extern bit isalpha(char);功能:检查参数字符是否为英文字母,是则返回12 extern bit isalnum(char)功能:检查字符是否为英文字母或数字字符,是则返回13 extern bit iscntrl(char)功能:检查参数值是否在0x00~0x1f 之间或等于0x7f,是则返回14 extern bit isdigit(char)功能:检查参数是否为数字字符,是则返回15 extern bit isgraph(char)功能:检查参数值是否为可打印字符,是则返回1,可打印字符为0x21~0x7e 6 extern bit isprint(char)功能:除了与isgraph相同之外,还接受空格符0x207 extern bit ispunct(char)功能:不做介绍。
8 extern bit islower(char)功能:检查参数字符的值是否为小写英文字母,是则返回19 extern bit isupper(char)功能:检查参数字符的值是否为大写英文字母,是则返回110 extern bit isspace(char)功能:检查字符是否为下列之一,空格,制表符,回车,换行,垂直制表符和送纸。
如果为真则返回111 extern bit isxdigit(char)功能:检查参数字符是否为16进制数字字符,是则返回112 extern char toint(char)功能:将ASCII字符0~9 a~f(大小写无关)转换成对应的16进制数字,返回值00H~0FH13 extern char tolower(char)功能:将大写字符转换成小写形式,如字符变量不在A~Z之间,则不作转换而直接返回该字符14 extern char toupper(char)功能:将小写字符转换成大写形式,如字符变量不在a~z之间,则不作转换而直接返回该字符15 define toascii(c) ((c)&0x7f)功能:该宏将任何整形数值缩小到有效的ASCII范围之内,它将变量和0x7f相与从而去掉第7位以上的所有数位16 #define tolower(c) (c-‘A’+’a’)功能:该宏将字符与常数0x20 逐位相或17 #define toupper(c) ((c)-‘a’+’A’)功能:该宏将字符与常数0xdf 逐位相与2数学函数 math.hextern int abs (int val);extern char cabs (char val);extern long labs (long val);extern float fabs (float val);功能:返回绝对值。
C语言中KeilC51库函数大全
Keil C51库函数参考C51强大功能及其高效率的重要体现之一在于其丰富的可直接调用的库函数,多使用库函数使程序代码简单,结构清晰,易于调试和维护,下面介绍C51的库函数系统。
第一节本征库函数(intrinsic routin e s)和非本征证库函数C51提供的本征函数是指编译时直接将固定的代码插入当前行,而不是用AC ALL和L CALL语句来实现,这样就大大提供了函数访问的效率,而非本征函数则必须由A CALL及LCALL调用。
C51的本征库函数只有9个,数目虽少,但都非常有用,列如下:_crol_,_cror_:将char型变量循环向左(右)移动指定位数后返回_iror_,_irol_:将int型变量循环向左(右)移动指定位数后返回_lrol_,_lror_:将long型变量循环向左(右)移动指定位数后返回_nop_:相当于插入N OP_testb it_:相当于JBC bitvar测试该位变量并跳转同时清除。
_chkfl oat_:测试并返回源点数状态。
使用时,必须包含#incluc le <intrin s.h>一行。
如不说明,下面谈到的库函数均指非本征库函数。
第二节几类重要库函数1. 专用寄存器i nclud e文件例如8031、8051均为REG51.h其中包括了所有8051的SFR及其位定义,一般系统都必须包括本文件。
2. 绝对地址in clude文件abs acc.h该文件中实际只定义了几个宏,以确定各存储空间的绝对地址。
3. 动态内存分配函数,位于stdl ib.h中4. 缓冲区处理函数位于“string.h”中其中包括拷贝比较移动等函数如:memccp y memchr memcmp memcpy memmov e memset这样很方便地对缓冲区进行处理。
Keil-C51详细设置
Keil-C51详细设置Keil C51详细设置一.target名更改打开Keil后,左侧Project Workspace中的target可改,方法:右击Target——Manage Compnents——双击待修改项即可,若要添加,使用对话框内对应工具栏。
二.option for target 设置之TARGET项1 MEMARY MODELSmall:变量存储在内部ram里.Compact:变量存储在外部ram里,使用页8位间接寻址Large:变量存储在外部Ram里,使用16位间接寻址.我们一般使用Small来存储变量,就是说单片机优先把变量存储在内部ram里,如果内部ram 不够了,才会存到外部去.Compact的方式要自己通过程序来指定页的高位地址,编程比较复杂,如果外部ram很少,只有256个字节,那么对该256个字节的读取就比较快,用MOVX @Ri,A 或MOVX A,@Ri指令.如果超过256字节,那么要不断地进行切换的话,就比较麻烦.Compact模式适用于比较少的外部ram的情况.Large模式,是指变量会优先分配到外部ram里,用MOVX A,@DPTR或MOVX @DPTR,A来读取.要注意的是,3种存储方式都支持内部256字节和外部64k字节的ram.区别是变量的优先(或默认)存储在哪里的区别.除非你不想把变量存储在内部ram,才使用后面的Compact,Large模式.因为变量存储在内部ram里,运算速度比存储在外部ram要快的多,大部分的应用都是选择Small的模式.使用Small的方式:也不是说变量就不可以存储在外部,一样可以存储在外部,只是你要指定,比如:unsigned char xdata a;那么变量a就存储在外部的ram.unsigned char a;变量存储在内部ram.假如用Large的模式:unsigned char xdata a;那么变量a就存储在外部的ram.unsigned char a;变量存储在外部ram.这就是区别,就是说这几个选项只是影响没有特别指定变量的存储空间的时候,默认存储在哪里,比如上面的变量定义unsigned char a .2. CODE ROM SIZESmall: program 2K or less ;适用于89c2051这些芯片,2051只有2k的代码空间,所以跳转地址只有2k,编译的时候会使用ACALL AJMP这些短跳转指令,而不会使用LCALL,LJMP指令.如果你的代码跳转超过2k,那么会出错.Compact:2k functiongs ,64k program:表示每个子函数的程序大小不超过2k,整个工程可以有64k的代码.就是说在main()里可以使用LCALL, LJMP指令,但在子程序里只会使用ACALL,AJMP 指令.除非你确认你的每个子程序不会超过2k,否则不要用Compact方式.Large:64K program:表示程序或子函数都可以大到64k.使用code bank还可以更大.通常我们都选用该方式.Code Rom Size选择Large方式速度不会比Small慢很多,所以一般没有必要选择Compact和Small的方式.我们这里选择Large方式.3. OPERATING方法2:使用BL51 Locate选项。
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新建一个文件,输入如上内容或直接用目录下源文件。
C51函数参考
(12)asin
原型:float asin(float x); 功能:求反正弦 参数:浮点数 x,取值必须在-1~1 之间。 返回:X 的反正弦,值在-π /2~π /2 之间。
(13)acos
原型:float acos(float x); 功能:求反余弦 参数:浮点数 x,取值必须在-1~1 之间。 返回:x 的反余弦,值在 0~π 之间。
(5)_lror_
原型:unsigned long _lror_(unsigned long l,unsigned char b); 功能:_lror_程序将长整数 l 循环右移 b 位。固有函数代码,要求内嵌而不是被调用。 参数:l 要右移的数,b 要右移的位数。 返回:返回右移后的值。摘要:#include<intrins_h>。
《单片机控制装置安装与调试》
电子工业出版社
(8)_lrol_
原型:unsigned long _lrol_(unsigned long l,unsigned char b); 功能:_lrol_程序将长整数 l 循环左移 b 位。固有函数,代码要求内嵌而不是被调用。 参数:l 要左移的数,b 要左移的位数。 返回:返回左移后的值。
(11)_pop_
原型:void _pop_(unsigned char _sfr); 功能:将堆栈中的数据弹出到特殊功能寄存器_sfr。
三、字串转数字,随机数,存储池管理<stdlib.h> (1)atof
原型:float atof(void *string); 功能:将浮点数格式的字符串转换为浮点数。如果 string 的第一个字符不能转换成数字,就 停止处理。 参数:格式为,[{+|-}]数字[.数字][{e|E}[{+|-}]数字]。如,-12.345e+67 返回:atof 函数返回 string 的浮点值。
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声明,见上例。
keil-c51
第一部分 8051开发工具KeilC51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效,快速的特点。
C51编译器的功能不断增强,使你可以更加贴近CPU本身,及其它的衍生产品。
C51已被完全集成到uVision2的集成开发环境中,这个集成开发环境包含:编译器,汇编器,实时操作系统,项目管理器,调试器。
uVision2 IDE可为它们提供单一而灵活的开发环境。
C51 V7版本是目前最高效、灵活的8051开发平台。
它可以支持所有8051的衍生产品,也可以支持所有兼容的仿真器,同时支持其它第三方开发工具。
因此,C51 V7版本无疑是8051开发用户的最佳选择。
第二部分uVision2集成开发环境一、项目管理工程(project)是由源文件、开发工具选项以及编程说明三部分组成的。
一个单一的uVision2工程能够产生一个或多个目标程序。
产生目标程序的源文件构成“组”。
开发工具选项可以对应目标,组或单个文件。
uVision2包含一个器件数据库(device database),可以自动设置汇编器、编译器、连接定位器及调试器选项,来满足用户充分利用特定微控制器的要求。
此数据库包含:片上存储器和外围设备的信息,扩展数据指针(extra data pointer)或者加速器(math accelerator)的特性。
uVision2可以为片外存储器产生必要的连接选项:确定起始地址和规模。
二、集成功能uVision2的强大功能有助于用户按期完工。
1.集成源极浏览器利用符号数据库使用户可以快速浏览源文件。
用详细的符号信息来优化用户变数存储器。
2.文件寻找功能:在特定文件中执行全局文件搜索。
3.工具菜单:允许在V2集成开发环境下启动用户功能。
4.可配置SVCS接口:提供对版本控制系统的入口。
5.PC-LINT接口:对应用程序代码进行深层语法分析。
6.Infineon的EasyCase接口:集成块集代码产生。
Keil C51语言的用法介绍
强制类型转换运算符1.变量赋值时发生的隐式转换,“=”号右边的表达式的数据类型转换成左边变量的数据类型。
如把浮点数赋值给整形变量,小数部分将丢失。
2.所有char 型的操作数转换成int型。
3.两个具有不同数据类型的操作数用运算符连接时,隐式转换会按以下次序进行:如有一操作数是float 类型,则另一个操作数也会转换成float类型;如果一个操作数为long 类型,另一个也转换成long;如果一个操作数是unsigned 类型,则另一个操作会被转换成unsigned 类型。
从上面的规则可以大概知道有那几种数据类型是可以进行隐式转换的。
在C51中只有char, int, long及float这几种基本的数据类型可以被隐式转换。
而其它的数据类型就只能用到显示转换。
要使用强制转换运算符应遵循以下的表达形式:(类型) 表达式用显示类型转换来处理不同类型的数据间运算和赋值是十分方便和方便的,特别对指针变量赋值是很有用的。
表达式语句C语言是一种结构化的程序设计语言。
C语言提供了相当丰富的程序控制语句。
学习掌握这些语句的用法也是C语言学习中的重点。
表达式语句是最基本的一种语句。
不同的程序设计语言都会有不一样的表达式语句,如VB 就是在表达式后面加入回车就构成了VB的表达式语句,而在51单片机的C语言中则是加入分号“;”构成表达式语句。
举例如下:b = b * 10;Count++;X = A;Y = B;Page = (a+b)/a-1;以上的都是合法的表达式语句。
在C 语言中有一个特殊的表达式语句,称为空语句,它仅仅是由一个分号“;”组成。
有时候为了使语法正确,那么就要求有一个语句,但这个语句又没有实际的运行效果那么这时就要有一个空语句。
空语句通常用会以下两种用法。
(1)while,for 构成的循环语句后面加一个分号,形成一个不执行其它操作的空循环体。
我会常常用它来写等待事件发生的程序。
要注意的是“;”号作为空语句使用时,要与语句中有效组成部分的分号相区分,如for (;a<50000;a++);第一个分号也应该算是空语句,它会使a 赋值为0(但要注意的是如程序前有a值,则a的初值为a的当前值),最后一个分号则使整个语句行成一个空循环。
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 C编程
地址 +0 +1 +2 +3 内容 SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM 其中, S为符号位,“0”正“1”负。E为用原码表示的阶码,占 用8位二进制数, 存放在两个字节中,E的取值范围是1~254。注
意, 实际上以2为底的指数要用E的值减去偏移量127,实际幂指
数的取值范围为-126~+127。M为尾数的小数部分,用23位二进 制数表示, 存放在三个字节中。尾数的整数部分永远为1,因此不
Keil C51能够识别的编译器模式
编译模式 SMALL 存储器类型 DATA,
变量被定义在8051片内数据存储器中。
PDATA,
变量被定义在分页寻址的片外数据存储器中, 每 COMPACT 一页片外数据存储器的长度为256字节。这时 对变量的访问是通过寄存器间接寻址(MOVX @Ri)进行 。
XDATA,Keil C51能够识别的存储器类型
存储器类型 DATA BDATA IDATA 说 明 直接寻址的片内数据存储器(128字节), 访问速度最快。 可位寻址的片内数据存储器(16字节), 允许位与字节混合 访问。 间接访问的片内数据存储器(256字节), 允许访问全部片内 地址。 分页寻址的片外数据存储器(256字节), 用MOVX @Ri指令 访问。 片外数据存储器(64K字节), 用MOVX @DPTR指令访问。
Keil-C51详细设置
Keil C51详细设置一.target名更改打开Keil后,左侧Project Workspace中的target可改,方法:右击Target——Manage Compnents——双击待修改项即可,若要添加,使用对话框内对应工具栏。
二.option for target 设置之TARGET项1 MEMARY MODELSmall:变量存储在内部ram里.Compact:变量存储在外部ram里,使用页8位间接寻址Large:变量存储在外部Ram里,使用16位间接寻址.我们一般使用Small来存储变量,就是说单片机优先把变量存储在内部ram里,如果内部ram 不够了,才会存到外部去.Compact的方式要自己通过程序来指定页的高位地址,编程比较复杂,如果外部ram很少,只有256个字节,那么对该256个字节的读取就比较快,用MOVX @Ri,A 或MOVX A,@Ri指令.如果超过256字节,那么要不断地进行切换的话,就比较麻烦.Compact模式适用于比较少的外部ram的情况.Large模式,是指变量会优先分配到外部ram里,用MOVX A,@DPTR或MOVX @DPTR,A来读取.要注意的是,3种存储方式都支持内部256字节和外部64k字节的ram.区别是变量的优先(或默认)存储在哪里的区别.除非你不想把变量存储在内部ram,才使用后面的Compact,Large模式.因为变量存储在内部ram里,运算速度比存储在外部ram要快的多,大部分的应用都是选择Small的模式.使用Small的方式:也不是说变量就不可以存储在外部,一样可以存储在外部,只是你要指定,比如:unsigned char xdata a;那么变量a就存储在外部的ram.unsigned char a;变量存储在内部ram.假如用Large的模式:unsigned char xdata a;那么变量a就存储在外部的ram.unsigned char a;变量存储在外部ram.这就是区别,就是说这几个选项只是影响没有特别指定变量的存储空间的时候,默认存储在哪里,比如上面的变量定义unsigned char a .2. CODE ROM SIZESmall: program 2K or less ;适用于89c2051这些芯片,2051只有2k的代码空间,所以跳转地址只有2k,编译的时候会使用ACALL AJMP这些短跳转指令,而不会使用LCALL,LJMP指令.如果你的代码跳转超过2k,那么会出错.Compact:2k functiongs ,64k program:表示每个子函数的程序大小不超过2k,整个工程可以有64k的代码.就是说在main()里可以使用LCALL, LJMP指令,但在子程序里只会使用ACALL,AJMP 指令.除非你确认你的每个子程序不会超过2k,否则不要用Compact方式.Large:64K program:表示程序或子函数都可以大到64k.使用code bank还可以更大.通常我们都选用该方式.Code Rom Size选择Large方式速度不会比Small慢很多,所以一般没有必要选择Compact和Small的方式.我们这里选择Large方式.3. OPERATINGNONE:不适用操作系统RTX51-TINY:使用TINY操作系统RTX-FULL:使用FULL操作系统Keil C51 提供了Tiny多任务操作系统,使用定时器0来做任务切换,效率很低,无实用价值。
常用Keil C51库函数
unsigned int _iror_(unsigned int val,unsigned char n)
将整型数据val循环右移n位,相当于RR命令
unsigned long _lror_(unsigned long val,unsigned char n)
函数名及定义
功能说明
void *memchr(void *s1, char val, int len)
顺序搜索字符串s1的前len个字符,以找出字符val,成功时返回s1中指向val的指针,失败时返回NULL
char memcmp(void *s1, void *s2, int len)
逐个字符比较串s1和s2的前len个字符,成功时返回0,如果串s1大于或小于s2,则相应地返回一个正数或一个负数
bit isdigit(char c)
检查参数字符是否为十进制数字0~9,是则返回1,否则返回0
bit isgraph(char c)
检查参数字符是否为可打印字符(不包括空格),值域0x21~0x7e,是则返回1,否则返回0
bit isprint(char c)
检查参数字符是否为可打印字符(包括空格),值域0x21~0x7e,是则返回1,否则返回0
检查参数字符是否为空格、制表符、回车、换行、垂直制表符和送纸(值为0x09~0x0d,或为0x20),是则返回1,否则返回0
bit isxdigit(char c)
检查参数字符是否为十六进制数字字符,是则返回1,否则返回0
char toint(char c)
将ASCII字符的0~9、a~f(大小写无关)转换为十六进制数字
void *memcpy(void *dest, void *src , int len)
KEIL C51使用说明
20.1 工程项目的建立、源程序文件的建立及加载Keil C51软件UVision打开后,程序窗口的左边有一个项目工作区管理窗口,该窗口有3个标签,分别是Files、Regs和Books,这3个标签页分别显示当前项目的文件结构、CPU的寄存器及部分特殊功能寄存器的值(调试时才出现)和所选CPU的附加说明文件,如果是第一次启动Keil C51,那么这3个标签页全是空的(图20-1)。
图20-1 Keil C51打开后界面20.1.1 建立工程文件在单片机开发项目中,有时有多个的源程序文件,并且还要为项目选择CPU以确定编译、汇编、连接的参数,指定调试的方式等。
为便于管理,Keil C51使用工程项目(Project)的方法,将这些参数设置和所需的所有文件都放在一个工程项目中,只能对工程项目而不能对单一的源程序进行编译(汇编)和连接等操作。
一、先在硬盘上建立一个需保存工程文件的目录(例如在“我的文档” 中建立一个test的文件夹),为便于管理及使用,目录名称可与工程名称一致。
二、1、选择“工程>新工程”菜单(图20-2)。
弹出对话框,要求给将要建立的工程起一个名字,可以在编辑框中输入一个名字(例如test),扩展名不必输入(默认的扩展名为.uv2)。
点击“保存”按钮(图20-3)。
2、随后弹出一个“为目标target选择设备”(Select Device for Target “Target1”)对话框,这个对话框要求选择目标CPU(即你所用单片机开发板芯片的型号),Keil C51支持的CPU很多,我们选择Atmel公司的AT89C51(或AT89S51)芯片,用鼠标单击Atmel前的“+”号,选择“AT89C51(或AT89S51)”单片机后按确定(图20-4)。
随即系统弹出是否拷贝8051启动代码到工程项目并添加到当前项目组的提示(Copy Standard 8051 Startup Code to Project Folder and Add File to Project ?),我们选否。
KEIL C51及其应用
1 KEIL C51及其应用1.1C51语言1.1.1 C51 概述C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。
目前,使用C语言进行程序设计已经成为软件开发的一个主流。
用C语言开发系统既可以大大缩短开发周期,明显增强程序的可读性,又便于改进和扩充。
而且针对8051的C语言(C51)日趋成熟,已成为了专业化的实用高级语言。
一般来说,C51有如下特点:1)C语言作为一种非常方便的语言而得到广泛的支持,国内最通用的是Keil C51;2)C语言程序本身不依赖于机器硬件系统,基本上不作修改就可将程序从不同的单片机中移植过来;3)C提供了很多数学函数并支持浮点运算,开发效率高,故可缩短开发时间,增加程序可读性和可维护性。
而C51与ASM-51相比,有如下优点:1)对单片机的指令系统不要求了解,仅要求对8051 的存贮器结构有初步了解;2)寄存器分配、不同存贮器的寻址及数据类型等细节可由编译器管理;3)程序有规范的结构,可分成不同的函数,这种方式可使程序结构化;4)具有将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性;5)提供的库包含许多标准子程序,具有较强的数据处理能力;6)由于具有方便的模块化编程技术,使已编好程序可容易地移植。
正是上述这些优点,C51如今已成为51 系列单片机的主流开发语言。
1.1.2 C51的语法C51的语法与C语言基本相同,因此本书将着重介绍C51与C语言的不同之处,从而有利于读者更好地把握两者的相同之处与不同之处,为以后写C51源程序打好基础。
1)C51的常量和变量C51的常量和变量与C语言的常量和变量基本相同,其不同之处主要在于变量的声明的形式,C语言的变量声明的一般格式是:(存储种类) 数据类型变量而在C51中,变量声明的一般格式则是:(存储种类) 数据类型(存储器类型)变量其中,“存储种类”和“存储器类型”是可选项。
变量的存储种类有四种:自动(auto)、外部(extern)、静态(static)和寄存器(register)。
KEIL C51使用技巧
函数的递归调用和再入函数函数类型函数名(形参表)[reentrant]再入函数可被递归调用,无论何时,包括中断服务函数在内的任何函数都可调用再入函数。
与非再入函数的参数传递和局部变量的存储分配方式不同,Cx51编译器为再入函数生成一个模拟栈,通过其来完成参数传递和存放局部变量。
模拟栈所在的存储器空间根据再入函数存储器模式的不同,可以是DA TA、PDATA、XDATA 存储器空间。
当程序中包含有多种存储器模式的再入函数时,编译器为每种模式单独建立一个模拟栈并独立管理各自的栈指针。
对于再入函数有如下规定:(1)再入函数不能传送bit类型的参数,也不能定义一个局部位变量,再入函数不能包括位操作和8051系列单片机的可位寻址区(2)与PL/M51兼容的函数不能具有reentrant属性,也不能调用再入函数(3)编译时存储器模式基础上为再入函数在内部或外部存储器中建立一个模拟堆栈区,称为再入栈。
在small模拟下再入栈位于idata区,在compact模式下再入栈位于pdaa 区,在large模式下再入栈位于xdata区。
再入函数的局部变量及参数都被放入再入栈中,从而使再入函数可进行递归调用。
而非再入函数的局部变量被放在再入栈外的暂存区内,如对其进行递归调用,则上次调用时使用的局部变量数据将被覆盖。
(4)在同意个程序中可定义或使用不同存储器模式的再入函数,任意模式的再入函数不能调用不同模式的再入函数,但可任意调用非再入函数。
(5)在参数的传递上,实际参数可传递给间接调用的再入函数。
无再入属性的间接调用函数不能包含调用参数,但可以使用定义的全局变量来进行参数传递。
采用函数递归调用可使程序结构紧凑,但要求采用再入函数,以便利用再入栈来保存有关的局部变量数据,因此要占用较大的内存空间。
另外,递归调用时对函数的处理速度较慢,因此一般情况下应尽量避免使用函数递归调用,定义函数时应尽量避免使用再入属性。
8051常规栈是位于内部数据RAM中,是向上生长型的而模拟再入栈是向下生长型的。
Keilc51常用库函数汇总参考(最新整理)
(17)tanh 原型:float tanh(float x); 功能:tanh 函数计算浮点数 x 的双曲正切。 返回:tanh 函数返回 x 的双曲正切。
(18)atan2 原型:float atan2(float y,float x); 功能:计算浮点数 y/x 的反正切。 参数:浮点数 y,浮点数 x。 返回:反正切值,值在-π~π 之间。x 和 y 的符号确定返回值的象限。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
从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)
比较串s1和s2,如果相等则返回0;如果s1<s2,则返回一个负数;如果s1>s2,则返回一个正数
char strncmp(char *s1, char *s2, int n)
比较串s1和s2中的前n个字符。返回值同上
char *strcpy(char *s1, char *s2)
int puts(const char *s)
利用putchar函数将字符串和换行符写入串行口,错误时返回EOF,否则返回0
int scanf(const char *fmstr[,argument]...)
在格式控制串的控制下,利用getchar函数从串行口读入数据,每遇到一个符合格式控制串fmstr规定的值,就将它按顺序存入由参数指针argument指向的存储单元。其中每个参数都是指针,函数返回所发现并转换的输入项数,错误则返回EOF
SCON=0x52; //SCON置初值
TMOD=0x20; //TMOD置初值
TH1=0xF3; //T1置初值
TR1=1; //启动T1
函数名及定义
功能说明
char _getkey(void)
等待从8051串口读入一个字符并返回读入的字符,这个函数是改变整个输入端口机制时应做修改的唯一一个函数
char getchar(void)
检查参数字符是否为空格、制表符、回车、换行、垂直制表符和送纸(值为0x09~0x0d,或为0x20),是则返回1,否则返回0
bit isxdigit(char c)
检查参数字符是否为十六进制数字字符,是则返回1,否则返回0
char toint(char c)
将ASCII字符的0~9、a~f(大小写无关)转换为十六进制数字
函数名及定义
功能说明
bit isalpha(char c)
检查参数字符是否为英文字母,是则返回1,否则返回0
bit isalnum(char c)
检查参数字符是否为英文字母或数字字符,是则返回1,否则返回0
bit iscntrl(char c)
检查参数字符是否为控制字符(值在0x00~0x1f之间或等于0x7f)是则返回1,否)
将大写字符转换成小写形式,如果字符参数不在A~Z之间,则该函数不起作用
char _tolower(char c)
将字符参数c与常数0x20逐位相或,从而将大写字符转换成小写字符
char toupper(char c)
将小写字符转换成大写形式,如果字符参数不在a~z之间,则该函数不起作用
char ungetchar(char c)
将输入字符回送到输入缓冲区,因此下次gets或getchar可用该字符。成功时返回char型值,失败时返回EOF,不能处理多个字符
char putchar(char c)
通过8051串行口输出字符,与函数_getkey一样,这是改变整个输出机制所需要修改的唯一一个函数
int sscanf(char *s,const char *fmstr[,argument]...)
与scanf的输入方式相似,但字符串的输入不是通过串行口,而是通过指针s指向的数据缓冲区
void vprintf(const char *s,char *fmstr,char *argptr)
将格式化字符串和数据值输出到由指针s指向的内存缓冲区内。类似于sprintf,但接受一个指向变量表的指针,而不是变量表。返回值为实际写入到输出字符串中的字符数
将整型数据val循环左移n位,相当于RL命令
unsigned long _lrol_(unsigned long val,unsigned char n)
将长整型数据val循环左移n位,相当于RL命令
unsigned char _cror_(unsigned char val,unsigned char n)
使用_getkey从串口读入字符,并将读入的字符马上传给putchar函数输出,其他与_getkey函数相同
char *gets(char *s,int n)
该函数通过getchar从串口读入一个长度为n的字符串并存入由s指向的数组。输入时一旦检测到换行符就结束字符输入。输入成功时返回传入的参数指针,失败时返回NULL
常用Keil C51库函数
Keil C51有丰富的可直接调用的库函数,灵活使用库函数可使程序代码简单、结构清晰,并且易于调试和维护。每个库函数都在相应的头文件中给出了函数原型声明,用户如果需要使用库函数,必须在源程序的开始处用预处理命令“#include”将有关的头文件包含进来。
1.:本征库函数
本征库函数是指编译时直接将固定的代码插入到当前行,而不是用汇编语言中的“ACALL”和“LCALL”指令来实现调用,从而大大提高了函数的访问效率。Keil C51的本征库函数有9个,数量少但非常有用。
int strpos(char *s1, char c)
与strchr类似,但返回的是字符c在串s1中第一次出现的位置值,没有找到则返回-1。s1串首字符的位置是0
char *strrchr(char *s1, char c)
搜索s1串中最后一个出现的字符c,如果成功则返回指向该字符的指针,否则返回NULL。被搜索的字符可以是串结束符
函数名及定义
功能说明
void *memchr(void *s1, char val, int len)
顺序搜索字符串s1的前len个字符,以找出字符val,成功时返回s1中指向val的指针,失败时返回NULL
char memcmp(void *s1, void *s2, int len)
逐个字符比较串s1和s2的前len个字符,成功时返回0,如果串s1大于或小于s2,则相应地返回一个正数或一个负数
将长整型数据val循环右移n位,相当于RR命令
bit _testbit_(bit x)
相当于JBC bit指令
unsigned char _chkfloat_(float ual)
测试并返回浮点数状态
void _nop_(void)
产生一个NOP指令
2.字符判断转换库函数:
字符判断转换库函数的原型声明在头文件CTYPE.H中定义。
char _toupper(char c)
将字符参数c与常数0xdf逐位相与,从而将小写字符转换成大写字符
char toascii(char c)
将任何字符参数值缩小到有效的ASCII范围内,即将c与0x7f相与,去掉第7位以上的位
3.输入输出库函数:
输入输出库函数的原型声明在头文件STDIO.H中定义,通过8051的串行口工作。如果希望支持其他I/O接口,只需要改动_getkey()和putchar()函数。库中所有其他的I/O支持函数都依赖于这两个函数模块。在使用8051系列单片机的串行口之前,应先对其进行初始化。例如,以2400波特率(12MHz时钟频率)初始化串行口的语句如下:
int strcspn(char *s1, char *set)
与strspn相似,但它搜索的是s1串中的第一个包含在set里的字符。
将字符型数据val循环右移n位,相当于RR命令
unsigned int _iror_(unsigned int val,unsigned char n)
将整型数据val循环右移n位,相当于RR命令
unsigned long _lror_(unsigned long val,unsigned char n)
复制src中len个元素到dest中。如果实际复制了len个字符则返回NULL。复制过程在复制完字符val后停止,此时返回指向dest中下一个元素的指针
void *memmove(void *dest, void *src, int len)
它的工作方式于memcpy相同,但复制的区域可以交迭
void memset(void *s, char val, int len)
用val来填充指针s中的len个单元
void *strcat(char *s1, char *s2)