C51程序设计基本知识总结.docx
- 文档编号:23425105
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:24
- 大小:23.93KB
C51程序设计基本知识总结.docx
《C51程序设计基本知识总结.docx》由会员分享,可在线阅读,更多相关《C51程序设计基本知识总结.docx(24页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C51 程序设计 基本知识 总结