C51程序设计基本知识总结.docx

上传人:b****0 文档编号:9055989 上传时间:2023-05-16 格式:DOCX 页数:24 大小:23.93KB
下载 相关 举报
C51程序设计基本知识总结.docx_第1页
第1页 / 共24页
C51程序设计基本知识总结.docx_第2页
第2页 / 共24页
C51程序设计基本知识总结.docx_第3页
第3页 / 共24页
C51程序设计基本知识总结.docx_第4页
第4页 / 共24页
C51程序设计基本知识总结.docx_第5页
第5页 / 共24页
C51程序设计基本知识总结.docx_第6页
第6页 / 共24页
C51程序设计基本知识总结.docx_第7页
第7页 / 共24页
C51程序设计基本知识总结.docx_第8页
第8页 / 共24页
C51程序设计基本知识总结.docx_第9页
第9页 / 共24页
C51程序设计基本知识总结.docx_第10页
第10页 / 共24页
C51程序设计基本知识总结.docx_第11页
第11页 / 共24页
C51程序设计基本知识总结.docx_第12页
第12页 / 共24页
C51程序设计基本知识总结.docx_第13页
第13页 / 共24页
C51程序设计基本知识总结.docx_第14页
第14页 / 共24页
C51程序设计基本知识总结.docx_第15页
第15页 / 共24页
C51程序设计基本知识总结.docx_第16页
第16页 / 共24页
C51程序设计基本知识总结.docx_第17页
第17页 / 共24页
C51程序设计基本知识总结.docx_第18页
第18页 / 共24页
C51程序设计基本知识总结.docx_第19页
第19页 / 共24页
C51程序设计基本知识总结.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

C51程序设计基本知识总结.docx

《C51程序设计基本知识总结.docx》由会员分享,可在线阅读,更多相关《C51程序设计基本知识总结.docx(24页珍藏版)》请在冰点文库上搜索。

C51程序设计基本知识总结.docx

C51程序设计基本知识总结

C51程序设计

第1节C51对标准C语言的扩展

一、C51关键字

序号

关键字

序号

关键字

序号

关键字

序号

关键字

序号

关键字

序号

关键字

序号

关键字

1

_at_

4

alien

7

bdata

10

bit

13

code

16

compact

19

data

2

idata

5

interrupt

8

large

11

pdata

14

_priority_

17

reentrant

20

sbit

3

sfr

6

sfr16

9

small

12

_task_

15

using

18

xdata

21

----

二、存储区域

存储区域

说明

备注

程序存储区

由code关键字进行说明,该种类型的存储器最多可达64KB。

该存储区是只读的,内容为所有的用户程序及库函数,程序中的一些常量也存放在这个区域

内部数据存储区

内部数据存储器在51系列CPU的内部,可以进行读写操作。

根据51系列单片机的不同型号,最多由256Byte的内部数据存储区可使用。

其中,前128Byte既可被直接寻址,也可被间接寻址,这其中还包括从20H开始的16个可位寻址的字节,剩下的128Byte可被间接寻址。

在C51中可用以下关键字对变量进行内部数据存储区的定位:

•data:

直接寻址区,为内部RAM的低128字节00H~7FH

•idata:

间接寻址区,包括整个内部RAM区00H~FFH

•bdata:

可位寻址区,20H~2FH

由于使用8bit地址,内部存储区的访问速度会比外部存储器的速度块

外部数据存储区

外部数据存储区是可以进行读写操作的区域,该区域一般由硬件上外挂RAM或映射内存的I/O来实现,有两个关键字是专门为外部数据存储区准备的:

•xdata:

可指定多达64KB的外部直接寻址区,地址范围0000H~0FFFFH

•pdata:

能访问1页(256Bytes)的外部RAM,主要用于紧凑模式

由于需使用16位的数据指针DPTR寄存器,对外部RAM的访问会慢很多,不过外部数据存储区大小可达到64KB

特殊寄存器区

8051提供128Bytes的SFR寻址区,该区域可位寻址、字节寻址,用以控制定时器、计数器、串口、I/O及其它部件,可由以下几种关键字说明:

•sfr:

字节寻址

•sfr16:

字寻址,在比较新的一些51系列芯片中,会使用连续的2个寄存器

•sbit:

位寻址

三、数据变量分类(C51中扩展了若干数据类型)

类型

说明

备注

bit型变量

该种类型的变量可用于变量的定义和声明、函数的参数传递和函数的返回值。

所有比特类型的变量都被存放在51系列单片机的一片内部数据存储区中,该区域通常被称为比特寻址区,由于该区域只有16Byte(20H~2FH),故比特类型的变量只可以有128个。

比特类型的变量也可以进行存储区域的定位,由于该类型变量只可能存在于内部数据存储区中,所以只有data和idata型的定义是有效的。

使用比特型的变量还有如下3种限制:

•如果在函数中禁止使用中断(即有#pragmadisable的函数)以及使用了现式的registerbank的函数,那么函数将不允许返回比特类型的值。

•比特类型的值不能被声明为指针。

•比特类型不可以声明为数组。

定义方式与C语言中的其它数据类型一样

可按位寻址的数据

比特可寻址的对象也可以被按照字节的方式被访问,在C51中使用bdata关键字来定义这种变量,使用关键字sbit就可以在已经定义的idata变量的基础上声明新的变量。

使用sbit定义新的变量的时候除非是对sfr,否则必须要先使用bdata关键字定义一个变量后才能在该变量的基础上使用sbit

特殊寄存器

SFR在程序中被用来控制定时器、计数器、串口、输入输出端口以及各种外设。

SFR在51单片机中储在地址80H~FFH,并可以按照比特、字节或者字的方式来访问。

C51对SFR寄存器提供了sfr、sfr16、sbit这几种关键字。

并不是所有的SFR都可以位寻址,因此并不是所有的SFR都可以使用sbit(51有11个,52有12个)

四、存储器模式(在C51编译器选项中选定的,它决定了没有明确指定存储类型的变量、函数等数据的默认存储区域)

模式

说明

备注

small模式

所有缺省变量参数均装入内部RAM(与使用显式的data关键字来定义是一样的结果)。

优点是访问速度快,缺点是空间有限,且是对堆栈的空间分配比较少

只适用于小程序

compact模式

所有缺省变量均位于外部RAM区的一页(与显式的使用关键字pdata来定义效果是相同的)最大变量数为256Byte,优点是空间较small宽裕、速度较small慢、较large要快,是一种中间状态

large模式

所有缺省变量可放在多达64KB的外部RAM区(与显式的使用xdata关键词来定义是相同的),均使用数据指针DPTR来寻址。

优点是空间大,可存变量多,缺点是速度较慢,尤其对于2个以上的多字节变量的访问速度来说更是如此

五、绝对地址的访问

在一些情况下,可能希望把一些变量定位在51单片机的某个固定的地址空间上。

C51为此专门提供了一个关键字_at_。

关于该关键字,有两点在使用时需要注意:

•绝对地址的变量是不可以被初始化的

•函数或类型为bit的的变量是不可以被定为成绝对地址的

六、指针

类型

说明

备注

通用指针

通用指针和一般的C语言中的指针定义相同,通常用3个字节来存储:

第一个字节为存储器的类型,第二个为高字节偏移地址,第三个则是低字节偏移地址。

通用指针可以被用来指示51单片机存储器中的任何类型的变量,所以在C51库函数中通常使用这种指针类型

存储器专用指针

这种指针一般来说在定义的时候包含了数据类型和数据空间的说明。

存储器专用指针只需要一个字节(当数据类型为idata、data、bdata或者pdata时)或两个字节(当数据类型为code或xdata类型时)

由于专用指针对比通用指针来说少了一个字节来指示类型,故在程序执行的时候会块一些

指针变换

抽象指针

抽象指针类型能够访问存储器的任何空间的内容,甚至可以通过这种类型的指针来访问定位在某个地址的函数

七、函数

在C51中,函数的定义与ANSIC中是相同的,唯一不同的就是可能在函数的后面需要带若干的C51专用的关键字。

函数定义格式:

[return_type]funcname([args])[{small|compact|large}][reentrant][interruptn][usingn]

return_type:

返回值类型;funcname:

函数名;args:

函数参数列表;{small|compact|large}:

函数模式选择;reentrant:

重入函数;interruptn:

中断函数;usingn:

有codebanking是究竟使用哪一块空间。

第2节C51函数库

函数库

函数原型

再入属性

功能

备注

字符函数CTYPE.H

externbitisalpha(unsignedchar)

reentrant

检查参数字符是否为英文字符,是则返回1,否则返回0

externbitisalnum(unsignedchar)

reentrant

检查参数字符是否位应为字母或数字字符,是则返回1,否则返回0

externbitiscntrl(unsignedchar)

reentrant

检查参数值是否在0x00~0x1F之间或者等于0x7F,是则返回1,否则返回0

externbitisdigit(unsignedchar)

reentrant

检查参数值是否为数字字符,是则返回1,否则返回0

externbitisgraph(unsignedchar)

reentrant

检查参数是否为可打印字符,可打印字符的值域为0x21~0x7E。

为真时返回值为1,否则返回值为0

externbitisprint(unsignedchar)

reentrant

除了还接受空格符(0x20)以外,其余与isgraph相同

externbitispunct(unsignedchar)

reentrant

检查字符参数是否为标点、空格或格式字符

externbitislower(unsignedchar)

reentrant

检查参数字符的值是否为小写字母,是则返回1,否则返回0

externbitisupper(unsignedchar)

reentrant

检查参数字符的值是否为大写字母,是则返回1,否则返回0

externbitisspace(unsignedchar)

reentrant

检查参数是否为下列之一:

空格、制表符、回车、换行、垂直制表符和送纸符号,是则返回1,否则返回0

externbitisxdigit(unsignedchar)

reentrant

检查参数字符是否为十六进制数字字符,是则返回1,否则返回0

externunsignedchartolower(unsignedchar)

reentrant

将大写字符转换成小写形式,如果字符不在“A”到“Z”之间,则不做变换而直接返回这个字符

externunsignedchartoupper(unsignedchar)

reentrant

将小写字符转换成大写形式,如果字符不在“a”到“z”之间,则不做变换而直接返回这个字符

externunsignedchartoint(unsignedchar)

reentrant

将ASCII字符的0~9,A~F(大小写无关)转换为十六进制数字,返回值0H~9H由ASCII字符的0~9得到,返回值0AH~0FH由ASCII字符A~F(大小写无关)得到

#define_tolower(c)((c)-‘A’+‘a’)

reentrant

该宏将字符c与常数0x20逐位相减

#define_toupper(c)((c)-‘A’+‘a’)

reentrant

该宏将字符c与常数0x20逐位相与

#definetoascii(c)((c)&0x7F)

reentrant

该宏将任何整型数值缩小到有效的ASCII字符范围之内,它将变量和~0x7F相与从而去掉第7位以上的所有位

函数库

函数原型

再入属性

功能

备注

一般I/O函数

STDIO.H

externchar_getkey(void)

reentrant

从8051串口读入一个字符,然后等待字符输入。

该函数是改变整个输入端口机制时应作修改的唯一一个函数

externchargetchar(void)

reentrant

该函数使用_getkey()函数从串口读入字符,并将读入的字符马上传给putchar()函数输出,其它与_getkey()函数相同

externcharungetchar(void)

reentrant

将输入的字符回送输入缓冲区,因此下次gets或getchar可以使用该字符。

externcharputchar(void)

reentrant

通过51单片机的串口输出字符,与_getkey()函数相同

externintprintf(constchar*,•••)

non-reentrant

以一定的格式通过8051串口输出数值和字符,返回值为实际输出的字符数。

格式控制串总是以%开始

externintsprintf(char*,constchar*,•••)

non-reentrant

功能与printf相似,但数据不是输出到串行口,而是通过一个指针s送入可寻址的内存缓冲区,并以ASCII码的形式存储

externintvprintf(constchar*,char*)

reentrant

功能与printf基本相同,但该函数使用指针作为参数列表

externintvsprintf(char*,constchar*,char*)

reentrant

功能与printf基本相同,但该函数使用指针作为参数列表

externchar*gets(char*,intn)

non-reentrant

该函数通过getchar()函数从串口中读入一个长度为n的字符串并存入由“s”指向的数组。

externintscanf(constchar*,•••)

non-reentrant

该函数在格式控制串的控制下,利用getchar函数从串行口中读入数据,每遇到一个符合格式控制串规定的值,就将它按顺序存入由参数指针指向的存储单元。

externintsscanf(char*,constchar*,•••)

non-reentrant

该函数与scanf的输入方式相似,但是字符串的输入不是通过串行口,而是通过另一个以空结束的指针。

externintputs(constchar*)

reentrant

将字符串和换行符写入串行口,错误是返回EOF,否则返回一个非负数

字符串函数STRING.H

void*memccpy(void*dest,void*src,charc,intlen)

non-reentrant

从src开始的字节复制到dest所指向的位置。

该函数可以复制0个或多个字节。

调用该函数以后,字符串会被复制,指导c字符被复制,或者复制了len个字节为止。

void*memchr(void*buf,charc,intlen)

reentrant

该函数将从buf开始,长度为len的字符串中查找字符c

void*memcmp(void*buf1,void*buf2,intlen)

reentrant

该函数将比较从buf1和buf2开始,长度为len的两个字符串的大小

void*memcpy(void*dest,void*src,intlen)

reentrant

该函数将把长度为len,起始地址为src的字符串复制到起始地址为dest的地方

void*memmove(void*dest,void*src,intlen)

reentrant

该函数将把长度为len,起始地址为src的字符串移动到起始地址为dest的地方

void*memset(void*buf,charc,intlen)

reentrant

该函数将把长度为len,起始地址为buf的所有字符的内容写为c

void*strcat(char*dest,char*src)

reentrant

该函数将src指向的字符串复制到dest指向的字符串之后

void*strchr(constchar*string,charc)

reentrant

该函数将从起始地址为string的字符串中查找出现的第一个c字符。

void*strcmp(char*string1,char*string2)

reentrant

该函数将比较字符串string1和string2的大小

void*strcpy(char*dest,char*src)

reentrant

该函数将把src指向的字符串复制到dest

intstrcspn(char*src,char*set)

reentrant

该函数在字符串src中查找是否由字符数组set中的任何一个元素

intstrlen(char*src)

reentrant

该函数返回字符串src的长度

char*strncat(char*dest,char*src,intlen)

non-reentrant

该函数将把最长为len,起始地址为src的字符串复制到dest字符串之后

char*strncmp(char*string1,char*string2,intlen)

reentrant

该函数比较字符串string1和string2的前len个字符的大小

char*strncpy(char*dest,char*src,intlen)

reentrant

将src字符串中最多len字节长度的字符复制到dest中

char*strpbrk(char*string,char*set)

non-reentrant

该函数在string中查找是否有字符数组set中的任何一个元素

int*strpos(constchar*string,charc)

reentrant

该函数在字符串string中查找字符c,返回查找到的字符的符号

char*strrchr(constchar*string,charc)

reentrant

该函数与strchr相同,只不过是反向查找

char*strrpbrk(char*string,char*set)

non-reentrant

功能与strpbrk基本相同,只不过是反向查找

int*strrpos(constchar*string,charc)

reentrant

与strpos基本相同,只不过是反向查找

int*strspn(char*src,char*set)

non-reentrant

与strcspn基本相同,只不过查找额是set中没有的字符

标准函数

STDLIB.H

floatatof(void*string)

non-reentrant

将字符串转换成浮点数

floatatoi(void*string)

non-reentrant

将字符串转换成整数

floatatol(void*string)

non-reentrant

将字符串转换成长整数

unsignedlongstrtod(constchar*string,char**ptr)

non-reentrant

将字符串转换成整数

longstrtol(constchar*string,char**ptr,unsignedcharbase)

non-reentrant

将字符串转换成长整数

unsignedlongstrtoul(constchar*string,char**ptr)

non-reentrant

将字符串转换成无符号长整数

void*calloc(unsignedintnum,unsignedintlen)

non-reentrant

申请由num个元素的,每个元素的大小为len的数组

void*calloc(unsignedintsize)

non-reentrant

申请一块大小为size的内存

void*realloc(voidxdata*p,unsignedintsize)

non-reentrant

重新申请一块大小为size的内存

voidfree(voidxdata*p)

non-reentrant

释放一块被申请的内存

voidinit_mempool(voidxdata*p,unsignedintsize)

non-reentrant

初始化内存

intrand(void)

reentrant

取一个0~32767之间的随机数

voidsrand(intseed)

non-reentrant

根据种子seed的值取随机数

数学函数

MATH.H

intabs(intval)、charcabs(charval)、floatfabs(floatval)、longlabs(longval)

reentrant

计算并返回val的绝对值,这4个函数除了变量和返回值类型不同以外,没有太大区别

floatexp(floatx)、floatlog(floatx)、floatlog10(floatx)

non-reentrant

exp返回以e为底x的幂。

Log返回自然对数,log10返回以10为底的对数

floatsqrt(floatx)

non-reentrant

返回x的正平方根

floatcos(floatx)、floatsin(floatx)、floattan(floatx)

non-reentrant

返回相应的三角函数值

floatacos(floatx)、floatasin(floatx)、floatatan(floatx)、floatatan2((floaty,floatx)

non-reentrant

返回相应的反三角函数值

floatcosh(floatx)、floatsinh(floatx)、floattanh(floatx)

non-reentrant

返回相应的双曲函数值

voidfpsave(structFPBUF*p)、voidfprestore(structFPBUF*p)

reentrant

fpsave保存浮点子程序的状态,fprestore恢复浮点子程序的原始状态,当中断程序中需要执行浮点运算的时候,这两个函数是很有用的

floatceil(floatx)

non-reentrant

ceil返回一个不小于x的最小整数(作为浮点数)

floatfloor(floatx)

non-reentrant

返回一个不大于x的最大整数(作为浮点数)

floatmodf(floatx,float*ip)

non-reentrant

将浮点数x分为整数和小数两个部分,两者都含有与x相同的符号,整数部分放入*ip,小数部分作为返回值

floatpow(floatx,floaty)

non-reentrant

计算

绝对地址访问

ABSACC.H

#defineCBYTE((unsignedcharvolatilecode*)0)

#defineDBYTE((unsignedcharvolatileidata*)0)

#definePBYTE((unsignedcharvolatilepdata*)0)

#defineXBYTE((unsignedcharvolatilexdata*)0)

---------

用来对8051系列单片机的存储器空间进行绝对地址访问,可作为字节寻址。

CBYTE寻址CODE区,DBYTE寻址DATA区,PBYTE寻址分页XDATA区,XBYTE寻址XDATA区

 

#defineCWORD((unsignedintvolatilecode*)0)

#defineDWORD((unsignedintvolatileidata*)0)

#definePWORD((unsignedintvolatilep

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2