




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 第第4 4章章 C51C51语言程序设计语言程序设计学习目标学习目标n掌握掌握C51C51程序结构程序结构n掌握掌握C51C51程序的编辑和编译程序的编辑和编译n掌握掌握C51C51对对C C语言的扩展语言的扩展n了解汇编语言和了解汇编语言和C C语言的混合编程语言的混合编程n了解了解C51C51程序的优化程序的优化n掌握掌握C51C51程序设计方法程序设计方法主要内容主要内容n4.1 C514.1 C51语言简介语言简介n4.2 C514.2 C51对对C C语言的扩展语言的扩展n4.3 C514.3 C51使用技巧使用技巧n4.4 C514.4 C51程序设计方法程序设计方法4.1 C5
2、14.1 C51语言简介语言简介 与汇编语言相比,用与汇编语言相比,用C51C51语言编写程序具有如下优点:语言编写程序具有如下优点:n无需深入了解系统硬件及单片机指令系统;无需深入了解系统硬件及单片机指令系统;nC51C51编译器自动完成内部寄存器分配、存储空间分编译器自动完成内部寄存器分配、存储空间分配和数据类型处理等细节问题;配和数据类型处理等细节问题;n语言简洁、表达能力强、表达方式灵活;语言简洁、表达能力强、表达方式灵活;n程序由若干函数组成,具有完全的模块化结构;程序由若干函数组成,具有完全的模块化结构;n有丰富的库子程序,可减少用户的编程工作量;有丰富的库子程序,可减少用户的编程
3、工作量;n可显著缩短编程和调试时间,提高软件开发效率;可显著缩短编程和调试时间,提高软件开发效率;n程序具有良好的可读性和可维护性;程序具有良好的可读性和可维护性;n具有良好的可移植性,应用程序稍加修改就可以移具有良好的可移植性,应用程序稍加修改就可以移植到其它系统中。植到其它系统中。 为何要使用为何要使用C51C51语言?语言?4.1.1 C514.1.1 C51程序结构程序结构 为了理解为了理解C51C51程序结构,这里用一个程序结构,这里用一个“星星闪烁星星闪烁”程序来开启学习程序来开启学习C51C51程序之旅。如右图的单片机系统程序之旅。如右图的单片机系统中中P1.0P1.0口连接了一
4、个口连接了一个LEDLED发光指示灯。要使这个指示发光指示灯。要使这个指示灯按一定的时间间隔闪烁,我们编写如下程序灯按一定的时间间隔闪烁,我们编写如下程序 。 P1.0输出高电平输出高电平 点亮点亮LEDLED第第1 1部分是说明区,部分是说明区,它包含了程序说明、它包含了程序说明、功能说明、设计者、功能说明、设计者、设计日期、修改日设计日期、修改日期、版本号等说明期、版本号等说明 第第2 2部分是预处理区部分是预处理区 第第3 3部分是全局变量定部分是全局变量定义区义区 4.1.1 C514.1.1 C51程序结构程序结构第第4 4部分是真正能部分是真正能够生成目标代码的够生成目标代码的程序
5、区,它包含了程序区,它包含了一个一个main()main()函数,函数,也称之为该程序的也称之为该程序的主函数,一个主函数,一个C51C51程序有且必须且只程序有且必须且只能有一个名为能有一个名为main()main()的主函数。的主函数。nC51C51程序的书写格式十分自由。每条语句都必须以分号程序的书写格式十分自由。每条语句都必须以分号“;”作为结束符。作为结束符。nC51C51是对大小写字母敏感的。是对大小写字母敏感的。n实际编写程序时一般应按程序的功能以实际编写程序时一般应按程序的功能以“缩格缩格”形式来写程序。形式来写程序。n加入必要的注释。注释的目的是增强程序的可阅读性加入必要的注
6、释。注释的目的是增强程序的可阅读性。4.1.2 C514.1.2 C51程序的编辑和编译程序的编辑和编译以以uVision3uVision3集成开发环境为例,集成开发环境为例,C51C51程序的程序的编辑、编译和调试过程如下:编辑、编译和调试过程如下: n 新建一个工程文件新建一个工程文件n 新建一个新建一个C51C51程序文件程序文件n 把把C51C51程序文件添加到工程程序文件添加到工程文件文件n 程序编译程序编译n 运行和调试运行和调试主要内容主要内容n4.1 C514.1 C51语言简介语言简介n4.2 C514.2 C51对对C C语言的扩展语言的扩展n4.3 C514.3 C51使
7、用技巧使用技巧n4.4 C514.4 C51程序设计方法程序设计方法4.2 C514.2 C51对对C C语言的扩展语言的扩展 C51 C51是支持符合是支持符合ANSIANSI标准的标准的C C语言,为了支持语言,为了支持5151系系列单片机专门加入了一些扩展的内容。列单片机专门加入了一些扩展的内容。C51C51对标准对标准C C语言扩展的内容主要包括:语言扩展的内容主要包括:n特殊功能寄存器定义特殊功能寄存器定义n位变量位变量n数据存储空间的定义数据存储空间的定义n绝对地址访问绝对地址访问n中断函数中断函数n汇编程序接口汇编程序接口n库函数库函数n关键字关键字 本节将重点介绍本节将重点介绍
8、C51C51编程语言和标准编程语言和标准C C语言之间的语言之间的区别。即介绍区别。即介绍C51C51对标准对标准C C语言的扩展。语言的扩展。4.2 C514.2 C51对对C C语言的扩展语言的扩展 C51 C51声明特殊功能寄存器的一般语法格式如下:声明特殊功能寄存器的一般语法格式如下: sfrsfr或或sfr16 sfr16 特殊寄存器名特殊寄存器名 = = 特殊寄存器地址特殊寄存器地址例如把地址分别为例如把地址分别为0 x800 x80、0 x900 x90、0 xa00 xa0、0 xb00 xb0的端口寄存器的端口寄存器分别声明为分别声明为P0P0、P1P1、P2P2、P3P3,
9、可以用,可以用sfrsfr分别声明如下:分别声明如下:sfr P0 = 0 x80; sfr P0 = 0 x80; / /* *P0P0口口, ,地址为地址为0 x80 0 x80 * */ /sfr P1 = 0 x90; sfr P1 = 0 x90; / /* *P1P1口口, ,地址为地址为0 x90 0 x90 * */ /sfr P2 = 0 xA0;sfr P2 = 0 xA0; / /* *P2P2口口, ,地址为地址为0 xA0 0 xA0 * */ /sfr P3 = 0 xB0;sfr P3 = 0 xB0; / /* *P3P3口口, ,地址为地址为0 xB0 0 x
10、B0 * */ / 51 51系列单片机的特殊功能寄存器的数量与类型不尽相同,系列单片机的特殊功能寄存器的数量与类型不尽相同,因此建议将所有特殊的因此建议将所有特殊的“sfr”sfr”定义放入一个头文件中,如定义放入一个头文件中,如“reg51.h” reg51.h” 。这样只要在。这样只要在C51C51程序编制的开头用程序编制的开头用#include#include加入该文件,即可在程序中直接使用加入该文件,即可在程序中直接使用5151特殊功能寄存器的名特殊功能寄存器的名称,免除使用者逐一定义的麻烦。称,免除使用者逐一定义的麻烦。4.2.14.2.1特殊功能寄存器的定义特殊功能寄存器的定义4
11、.2 C514.2 C51对对C C语言的扩展语言的扩展 5151系列单片机中,有一些特殊功能寄存器是系列单片机中,有一些特殊功能寄存器是可以位寻址的,为了便于使用这些可位寻址的特可以位寻址的,为了便于使用这些可位寻址的特殊寄存位,殊寄存位,C51C51提供了特殊寄存器位定义方法,定提供了特殊寄存器位定义方法,定义的一般语法格式如下:义的一般语法格式如下: sbitsbit 特殊寄存器位名特殊寄存器位名 = = 位地址;位地址; 例如,例如,0 xAF0 xAF位地址是总中断控制位,把它声明位地址是总中断控制位,把它声明为为EAEA的声明方法是:的声明方法是: sbitsbit EA = 0
12、xAF;/ EA = 0 xAF;/* *位地址位地址0 xAF0 xAF定义为定义为EA EA * */ / 注意:不是所有的注意:不是所有的SFRSFR都是可位寻址的,都是可位寻址的,SFRSFR中中有有1111个寄存器具有位寻址能力,它们的字节地址个寄存器具有位寻址能力,它们的字节地址都能被都能被8 8整除,即字节地址是以整除,即字节地址是以8 8或或0 0为尾数的。为尾数的。 可位寻址的特殊寄存位也已在头文件中定义可位寻址的特殊寄存位也已在头文件中定义。4.2.24.2.2数据类型数据类型4.2 C514.2 C51对对C C语言的扩展语言的扩展 C51C51具有标准具有标准C C语言
13、的所有标准数据类型。除此之外,还加入了位语言的所有标准数据类型。除此之外,还加入了位变量数据类型,用关键字变量数据类型,用关键字bitbit声明。声明。 bit bit 数据类型可以在变量声明、参数列表和函数返回值中使用,数据类型可以在变量声明、参数列表和函数返回值中使用,bitbit变变量放在量放在5151单片机的片内位寻址寄存器中。位变量声明的一般格式如下:单片机的片内位寻址寄存器中。位变量声明的一般格式如下:bit bit 位变量名位变量名=初值初值 例如:例如:bit High_bitbit High_bit; / /* * 把把High_bitHigh_bit定义为位变量定义为位变量
14、 * */ /bit High_bit=0bit High_bit=0; / /* * 把把High_bitHigh_bit定义为位变量,初值为定义为位变量,初值为0 0* */ / 特别要注意特别要注意bitbit变量和变量和bitbit声明有如下限制:声明有如下限制:1.1. 不能声明一个不能声明一个bitbit类型的数组;类型的数组;2.2. 不能声明一个位指针;不能声明一个位指针;3.3. 禁止中断的函数(禁止中断的函数(#pragma disable#pragma disable)和用明确的寄存器组)和用明确的寄存器组(using nusing n)声明的函数不能返回一个位型值。这样
15、使用时,编译过程)声明的函数不能返回一个位型值。这样使用时,编译过程将返回一个将返回一个bitbit类型错误信息。类型错误信息。4.2.24.2.2数据类型数据类型4.2 C514.2 C51对对C C语言的扩展语言的扩展1.1.变量变量的存储类型的存储类型4.2.34.2.3数据存储空间的定义数据存储空间的定义 一般把频繁使用的变量放在内部数据寄存器,把占用存储一般把频繁使用的变量放在内部数据寄存器,把占用存储单元较多、使用频率低的变量放在外部数据存储器中,以提高单元较多、使用频率低的变量放在外部数据存储器中,以提高程序执行程序执行的效率。的效率。4.2 C514.2 C51对对C C语言的
16、扩展语言的扩展 2.2.编译器的存储模式选择编译器的存储模式选择4.2.34.2.3数据存储空间的定义数据存储空间的定义 C51 C51中数据存储类型声明的一般格式为:中数据存储类型声明的一般格式为: 数据类型数据类型 存储类型存储类型 标识符标识符 =初值初值 例如,例如,unsigned char bdata High=0 x10unsigned char bdata High=0 x10; 如果在变量声明中省略了存储类型,编译器会自动选择编译器设置的缺如果在变量声明中省略了存储类型,编译器会自动选择编译器设置的缺省或暗含的存储类型。省或暗含的存储类型。 1)SMALL1)SMALL模式:
17、模式:所有变量在缺省的情况下定位于所有变量在缺省的情况下定位于80518051系统的内部数据寄系统的内部数据寄存器(与用存器(与用datadata存储类型一样),因此访问十分方便,数据访问效率是最高存储类型一样),因此访问十分方便,数据访问效率是最高的。的。 2)COMPACT2)COMPACT模式:模式:所有变量在缺省的情况下都放在外部数据存储区的一所有变量在缺省的情况下都放在外部数据存储区的一页中(象用页中(象用pdatapdata声明一样),因此最多可同时声明声明一样),因此最多可同时声明256256个字符型变量,访问个字符型变量,访问是采用是采用R0R0和和R1R1间接寻址的方式进行的
18、。间接寻址的方式进行的。 3)LARGE3)LARGE模式模式:所有未定义存储类型的变量放在外部数据存储区(:所有未定义存储类型的变量放在外部数据存储区(64K64K字字节,与使用节,与使用xdataxdata存储类型一样)。访问是通过数据指针(存储类型一样)。访问是通过数据指针(DPTRDPTR)间接寻址)间接寻址来进行的。来进行的。4.2 C514.2 C51对对C C语言的扩展语言的扩展4.2.44.2.4绝对地址访问绝对地址访问 由于由于5151系列单片机资源有限,往往需要实现绝对地址访问,系列单片机资源有限,往往需要实现绝对地址访问,C51C51提供了提供了三种访问绝对地址的方法。三
19、种访问绝对地址的方法。1.1.绝对绝对宏宏 所谓所谓绝对宏是利用绝对宏是利用C51C51提供的头文件提供的头文件absacc.habsacc.h中定义的宏来访问绝对地中定义的宏来访问绝对地址,址,absacc.habsacc.h中定义的宏包括:中定义的宏包括:CBYTECBYTE、XBYTEXBYTE、PWORDPWORD、DBYTEDBYTE、CWORDCWORD、XWORDXWORD、PBYTEPBYTE、DWORDDWORD,绝对宏的使用可以通过以下几个例子来理解。,绝对宏的使用可以通过以下几个例子来理解。rval = CBYTE0 x0002;rval = CBYTE0 x0002;/
20、指向程序存储区地址指向程序存储区地址0 x00020 x0002。rval = CWORD0 x0002; /rval = CWORD0 x0002; /指向程序存储区地址指向程序存储区地址0 x00040 x0004。rval = DBYTE0 x0002;rval = DBYTE0 x0002;/指向内部数据存储区地址指向内部数据存储区地址0 x00020 x0002。rval = DWORD0 x0002;rval = DWORD0 x0002;/指向内部数据存储区地址指向内部数据存储区地址0 x00040 x0004。rval = XBYTE0 x0002;rval = XBYTE0
21、x0002; /指向外部数据存储区地址指向外部数据存储区地址0 x00020 x0002。rval = XWORD 0 x0002;rval = XWORD 0 x0002;/指向外部数据存储区地址指向外部数据存储区地址0 x00040 x0004。CWORDCWORD、DWORDDWORD、XWORDXWORD所用的索引不代表存储区地址的整数值。为了得到存所用的索引不代表存储区地址的整数值。为了得到存储区地址,必须索引乘以一个整数(一个字长储区地址,必须索引乘以一个整数(一个字长2 2字节)的大小。字节)的大小。4.2 C514.2 C51对对C C语言的扩展语言的扩展4.2.44.2.4绝
22、对地址访问绝对地址访问2._at_2._at_关键字关键字 使用使用“_at_”_at_”关键字可以实现绝对地址访问,具体的格式如下所示:关键字可以实现绝对地址访问,具体的格式如下所示: 变量类型变量类型存储类型存储类型 变量名变量名 _at_ _at_ 地址常数;地址常数; 若要指定若要指定texttext数组从片外数据存储器数组从片外数据存储器0 xE0000 xE000单元开始存放,可这样定义单元开始存放,可这样定义 char xdata text25 _at_ 0 xE000char xdata text25 _at_ 0 xE000; 在使用在使用“_at_”_at_”关键字实现绝对
23、地址访问时必须注意以下几点关键字实现绝对地址访问时必须注意以下几点n_at_at_后面的绝对地址必须在可用的实际存储空间内;后面的绝对地址必须在可用的实际存储空间内;n绝对变量不能初始化;绝对变量不能初始化;nbitbit类型的函数和变量不能定位到一个绝对地址;类型的函数和变量不能定位到一个绝对地址;n用用_at_at_关键词声明一个变量来访问一个关键词声明一个变量来访问一个XDATAXDATA外围设备时,应使用外围设备时,应使用volatilevolatile关键词,使关键词,使C C编译器不对他进行优化,确保可以访问到要编译器不对他进行优化,确保可以访问到要访问的存储区。具体应用方法如下:
24、访问的存储区。具体应用方法如下: volatile unsigned char xdata rval _at_ 0 x1000;volatile unsigned char xdata rval _at_ 0 x1000;3.3.连接定位控制连接定位控制 这种绝对地址方法是利用连接控制指令中这种绝对地址方法是利用连接控制指令中code xdata pdata data code xdata pdata data bdatabdata,对,对“段段”地址进行控制,如要指定某具体变量地址,则很有很地址进行控制,如要指定某具体变量地址,则很有很大局限性,不作详细讨论。大局限性,不作详细讨论。 4.2
25、 C514.2 C51对对C C语言的扩展语言的扩展4.2.5 函数的使用函数的使用1.1. 函数声明函数声明 C51C51中对标准中对标准C C的函数声明做了如下扩展:的函数声明做了如下扩展:1)1) 可以指定一个函数为中断处理函数;可以指定一个函数为中断处理函数;2)2) 可以选择函数中所使用的寄存器组;可以选择函数中所使用的寄存器组;3)3) 可选择函数中变量的默认存储模式;可选择函数中变量的默认存储模式;4)4) 可以指定函数为重入函数;可以指定函数为重入函数; C51C51中的函数声明语法格式如下:中的函数声明语法格式如下:返回值类型返回值类型 函数名(函数参数)函数名(函数参数)
26、存储模式存储模式 reentrant interrupt n using m reentrant interrupt n using m其中,符号其中,符号“ ” ”中间的部分为可选项,关键字中间的部分为可选项,关键字“reentrantreentrant代表声明的函数是可重入函数;关键字代表声明的函数是可重入函数;关键字“interrupt”interrupt”表示声表示声明的函数是中断函数,明的函数是中断函数,“n”n”则代表中断源的编号;则代表中断源的编号; “using m”using m”表示函数编译过程中使用第表示函数编译过程中使用第m m组通用寄存器组。组通用寄存器组。4.2 C
27、514.2 C51对对C C语言的扩展语言的扩展4.2.54.2.5函数的使用函数的使用2.2. 中断函数中断函数 使用使用C51C51编程语言可以直接编写中断程序。中断函数定义的语法格式如下:编程语言可以直接编写中断程序。中断函数定义的语法格式如下:返回值返回值 函数名函数名(void) interrupt (void) interrupt 中断号中断号 using using 寄存器组号寄存器组号 一个标准的一个标准的5151单片机中断如下表单片机中断如下表4242。4.2 C514.2 C51对对C C语言的扩展语言的扩展4.2.54.2.5函数的使用函数的使用2.2. 中断函数中断函数
28、 下面的中断函数使用计数器下面的中断函数使用计数器0 0来实现计数功能,来实现计数功能,interruptcntinterruptcnt为计数变为计数变量,每中断一次加量,每中断一次加1 1,当加到,当加到40004000时清零,时清零,secondsecond为第二计数器,用于记为第二计数器,用于记录加满到录加满到40004000的次数。的次数。1 1unsigned int interruptcnt;unsigned int interruptcnt;2 2unsigned char second;unsigned char second;/ /* *中断函数中断函数1 1,使用寄存器组,
29、使用寄存器组2 2* */ /3 3void timer0 (void) interrupt 1 using 2void timer0 (void) interrupt 1 using 2 5 5if (+interruptcnt = 4000) if (+interruptcnt = 4000) 6 6 second+; second+; / /* * 第二计数器第二计数器 * */ /7 7 interruptcnt interruptcnt = 0; / = 0; /* * 中断计数器清零中断计数器清零 * */ /8 89 9 1010 4.2 C514.2 C51对对C C语言的扩展
30、语言的扩展4.2.54.2.5函数的使用函数的使用2.2. 中断函数中断函数 在使用中断函数时必须注意以下问题在使用中断函数时必须注意以下问题1)1) 中断号是整型常数值,取值为中断号是整型常数值,取值为0 0 到到3131,不允许用带操作数的,不允许用带操作数的表达式。表达式。2)2) 编译器根据中断号自动产生中断矢量。编译器根据中断号自动产生中断矢量。3)3) ACCACC、B B、DPHDPH、DPLDPL和和PSWPSW的内容,在中断函数调用时保存在堆的内容,在中断函数调用时保存在堆栈中。栈中。4)4) 中断函数中所用的中断函数中所用的R0R7R0R7寄存器,如果不用寄存器,如果不用u
31、sing using 属性指定一属性指定一个寄存器组则保存在堆栈中。个寄存器组则保存在堆栈中。5)5) 保存在堆栈中的寄存器和保存在堆栈中的寄存器和SFR SFR 在退出中断函数前恢复。在退出中断函数前恢复。6)6) RETIRETI指令终止中断函数的执行。指令终止中断函数的执行。4.2 C514.2 C51对对C C语言的扩展语言的扩展4.2.54.2.5函数的使用函数的使用3.3. 重入函数重入函数 所谓重入函数是指一个可以被多个任务调用的函数,在调用该函数的过所谓重入函数是指一个可以被多个任务调用的函数,在调用该函数的过程中又可以间接或直接地调用其本身。函数的重入又被称为递归调用。程中又
32、可以间接或直接地调用其本身。函数的重入又被称为递归调用。C51C51使用寄存器传递参数,内部变量在数据存储器中,函数重入时会破坏上次使用寄存器传递参数,内部变量在数据存储器中,函数重入时会破坏上次调用的数据。调用的数据。因此在因此在C51C51中所有函数默认都是非重入的中所有函数默认都是非重入的。可重入函数的定义形式为:可重入函数的定义形式为:reentrant reentrant 函数类型函数类型 函数名函数名( (形式参数表形式参数表) )例如,计算阶乘函数例如,计算阶乘函数f(n)f(n)n!n!,可以先计算,可以先计算f(n-1)f(n-1)(n-1)!(n-1)!,而计算,而计算f(
33、n-1)f(n-1)时又可以先计算时又可以先计算f(n-2)f(n-2)(n-2)(n-2)!,这就是递归算法。其再入函数可以这样来!,这就是递归算法。其再入函数可以这样来编写:编写:reentrant fucation1reentrant fucation1(int nint n) if if(n=0|n=1n=0|n=1)return 1 /return 1 /当当n=0n=0或或1 1时返回时返回1 1elseelsereturn nreturn n* * fucation1 fucation1(n-1n-1) /否则递归调用,计算否则递归调用,计算n n! 单片机编程中一般情况下应尽量
34、避免采用函数递归调用。单片机编程中一般情况下应尽量避免采用函数递归调用。 4.2 C514.2 C51对对C C语言的扩展语言的扩展4.2.64.2.6C51C51指针指针 C51 C51支持两种指针:通用指针(支持两种指针:通用指针(Generic PointerGeneric Pointer)和指定)和指定存储器指存储器指针(针(Memory_Specific PointerMemory_Specific Pointer)。)。1.1. 通用指针通用指针C51C51中的通用指针占用中的通用指针占用3 3个字节的存储空间,分别存储指针变量的存储类型、个字节的存储空间,分别存储指针变量的存储类
35、型、高位偏移量、低位偏移量。通用指针的声明和使用均与标准高位偏移量、低位偏移量。通用指针的声明和使用均与标准C C语言相同,另语言相同,另外外还可以说明指针变量的存储类型。例如:还可以说明指针变量的存储类型。例如:long long * * state; state;unsigned char unsigned char * * xdata ptr; xdata ptr;第一第一条语句声明一个指向长整型数据的指针,而指针变量条语句声明一个指向长整型数据的指针,而指针变量statestate本身本身则根据则根据编译器编译器设置的默认存储模式存放在对应的数据单元中设置的默认存储模式存放在对应的数据
36、单元中。第二第二条语句声明一个指向无符号字符型数据的指针,指针变量条语句声明一个指向无符号字符型数据的指针,指针变量ptrptr本身本身则根则根据据变量声明时设定的存储模式存放于外部数据存储空间中变量声明时设定的存储模式存放于外部数据存储空间中。4.2 C514.2 C51对对C C语言的扩展语言的扩展4.2.6 C514.2.6 C51指针指针 C51 C51支持两种指针:通用指针(支持两种指针:通用指针(Generic PointerGeneric Pointer)和指和指定定存储器指针(存储器指针(Memory_Specific PointerMemory_Specific Pointe
37、r)。)。2.2. 指定存储器指针指定存储器指针 C51C51还支持占用空间更小的指针变量,即指定存储器指还支持占用空间更小的指针变量,即指定存储器指针。指定存储器指针实际上是在指针变量声明时,同时指明指针。指定存储器指针实际上是在指针变量声明时,同时指明指针指向数据的存储类型。例如:针指向数据的存储类型。例如:long data long data * * state; state;unsigned char xdata unsigned char xdata * * ptr; ptr; 第一条语句声明的指针变量指向的数据存储在内部数据第一条语句声明的指针变量指向的数据存储在内部数据单元中,
38、这样指针变量本身占用单元中,这样指针变量本身占用1 1个字节。第二条语句声明的指个字节。第二条语句声明的指针变量指向的数据存储在外部数据存储空间,指针变量本身占针变量指向的数据存储在外部数据存储空间,指针变量本身占用用2 2个字节。个字节。4.2 C514.2 C51对对C C语言的扩展语言的扩展4.2.64.2.6C51C51指针指针3.3. 指定存储器指针与通用指针比较指定存储器指针与通用指针比较 使用指定存储区指针的好处是节省了存储空间(如表使用指定存储区指针的好处是节省了存储空间(如表4-44-4),编译器),编译器不用为存储器的选择和操作指令产生代码,使代码更加简短;但使用时不用为存
39、储器的选择和操作指令产生代码,使代码更加简短;但使用时必须保证指针不指向所声明的存储区之外的地方,否则将产生错误。必须保证指针不指向所声明的存储区之外的地方,否则将产生错误。 通用指针产生的代码执行速度要比存储器指针慢,因为其存储区在通用指针产生的代码执行速度要比存储器指针慢,因为其存储区在运行前是未知的,编译器不能优化存储区访问,必须产生可以访问任何运行前是未知的,编译器不能优化存储区访问,必须产生可以访问任何存储区空间的通用代码。存储区空间的通用代码。 如果优先考虑执行速度,应该尽可能地使用指定存储器指针而不是如果优先考虑执行速度,应该尽可能地使用指定存储器指针而不是通用指针。通用指针。4
40、.2 C514.2 C51对对C C语言的扩展语言的扩展4.2.74.2.7库函数库函数3.3. 指定存储器指针与通用指针比较指定存储器指针与通用指针比较 C51 C51编译器包含编译器包含6 6个不同的编译库,这些库几乎支持所有的个不同的编译库,这些库几乎支持所有的ANSIANSI标准标准函数调用。函数调用。C51C51中的编译库都有源代码,可作与硬件相关的修改。用户中的编译库都有源代码,可作与硬件相关的修改。用户改变对于现有硬件输入和输出结构的两个模块,就可修改库函数使之适改变对于现有硬件输入和输出结构的两个模块,就可修改库函数使之适用新的硬件结构。比如重新构造如用新的硬件结构。比如重新构
41、造如“printf”printf”和和“puts”puts”函数可以用于函数可以用于LCDLCD显示。显示。C51C51的库函数与的库函数与ANSI C ANSI C 标准库的差别参见表标准库的差别参见表4-9 4-9 、表、表4-104-10和表和表4-114-11。 4.2 C514.2 C51对对C C语言的扩展语言的扩展4.2.84.2.8关键字关键字3.3. 指定存储器指针与通用指针比较指定存储器指针与通用指针比较 C51 C51包含包含ANSI CANSI C关键字的同时,也针对关键字的同时,也针对5151系列单片机扩展了一些关系列单片机扩展了一些关键字。键字。C51C51的扩展关
42、键字从某种意义上体现了的扩展关键字从某种意义上体现了C51C51语言与标准语言与标准C C语言的不同。语言的不同。C51C51的扩展关键字及其作用如表的扩展关键字及其作用如表4949所示。所示。4.34.3 C51C51使用技巧使用技巧4.3.14.3.1C51C51与汇编程序接口与汇编程序接口 C51 C51的编译器能对的编译器能对C51C51源程序进行高效率的编译,生成高效简洁的目标代源程序进行高效率的编译,生成高效简洁的目标代码,在绝大多数场合采用码,在绝大多数场合采用C51C51编程即可完成预期的任务。但对于一些特殊问编程即可完成预期的任务。但对于一些特殊问题的处理还可能要用汇编程序来
43、处理,题的处理还可能要用汇编程序来处理,C51C51提供了两种与汇编程序接口的方提供了两种与汇编程序接口的方法,即模块内接口和模块间接口方法。法,即模块内接口和模块间接口方法。1.1.模块内接口模块内接口 该方法是用该方法是用pragmapragma语句来实现的,其具体结构是:语句来实现的,其具体结构是:#pragma asm #pragma asm 汇编语句行汇编语句行1 1汇编语句行汇编语句行2 2 #pragma endasm#pragma endasm 这种方法实质是通过这种方法实质是通过asmasm与与endasmendasm告诉告诉C51C51编译器中间行不用编译为编译器中间行不用
44、编译为汇编,并将这些汇编语言语句行直接存入编译后的汇编文件中。汇编,并将这些汇编语言语句行直接存入编译后的汇编文件中。 例如在例如在“星星闪烁星星闪烁”程序,为了得到精确的延时,可以程序,为了得到精确的延时,可以用汇编程序来实现延时,程序代码如下:用汇编程序来实现延时,程序代码如下: 主要内容主要内容n4.1 C514.1 C51语言简介语言简介n4.2 C514.2 C51对对C C语言的扩展语言的扩展n4.3 C514.3 C51使用技巧使用技巧n4.4 C514.4 C51程序设计方法程序设计方法4.34.3 C51C51使用技巧使用技巧4.3.14.3.1C51C51与汇与汇编程序接口
45、编程序接口/ /* *-主程序开始主程序开始-* */ /void main(void)void main(void) while while(1 1) LED=1; LED=1; /LED/LED灯点亮灯点亮 #pragma asm#pragma asm MOV R7,#40 MOV R7,#40DELAY1: MOV R6,#248DELAY1: MOV R6,#248DJNZ R6,$DJNZ R6,$DJNZ R7,DELALY1DJNZ R7,DELALY1#pragma endasm#pragma endasmLED=0LED=0/LED/LED灯熄灭灯熄灭#pragma asm#
46、pragma asmMOV R7,#40MOV R7,#40DELAY2: MOV R6,#248DELAY2: MOV R6,#248DJNZ R6,$DJNZ R6,$DJNZ R7,DELAY2DJNZ R7,DELAY2#pragma endasm#pragma endasm 4.34.3 C51C51使用技巧使用技巧4.3.14.3.1C51C51与汇编程序接口与汇编程序接口2.2.模块间接口模块间接口 是为了实现是为了实现C51C51程序模块和汇编程序模块之间的相互调用,这种相互程序模块和汇编程序模块之间的相互调用,这种相互调用可以理解为函数的调用调用可以理解为函数的调用, ,只不
47、过函数是采用不同语言编写的而已。只不过函数是采用不同语言编写的而已。 为了实现为了实现C51C51调用汇编模块,汇编程序中各种段的命名和安排、参数传调用汇编模块,汇编程序中各种段的命名和安排、参数传递和返回等必须符合递和返回等必须符合C51C51编译器的命名规则,同时还必须要清楚编译器的命名规则,同时还必须要清楚C51C51函数的函数的参数传递、函数返回规则等才能实现正确调用。参数传递、函数返回规则等才能实现正确调用。 当当C51C51模块程序编译成目标文件后模块程序编译成目标文件后, ,其函数名依据其定义的性质不同会其函数名依据其定义的性质不同会转换为不同的函数名转换为不同的函数名, ,因此
48、因此, ,在模块间的相互调用中在模块间的相互调用中, ,要求汇编程序必须服从要求汇编程序必须服从这种函数名的转换规则这种函数名的转换规则, ,否则将无法调用到所需的函数或出现错误。否则将无法调用到所需的函数或出现错误。4.34.3 C51C51使用技巧使用技巧4.3.24.3.2C51C51程序的优化程序的优化 由于由于5151系列单片机本身资源有限,必要时需对系列单片机本身资源有限,必要时需对C51C51程序进行优化。程序进行优化。1.1.尽量减小变量长度尽量减小变量长度2.2.使用无符号类型使用无符号类型3.3.减少浮点变量的使用减少浮点变量的使用4.4.使用位变量使用位变量5.5.尽量使用局部变量尽量使用局部变量6.6.为变量合理分配内部存储区为变量合理分配内部存储区7.7.使用特定指针使用特定指针8.8.使用宏代替函数使用宏代替函数主要内容主要内容n4.1 C514.1 C51语言简介语言简介n4.2 C514.2 C51对对C C语言的扩展语言的扩展n4.3 C514.3 C51使用技巧使用技巧n4.4 C514.4 C51程序设计方法程序设计方法4.44.4 C51C51程序设计方法程序设计方法 C51C51程序设计是用程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 内训师课程开发
- 大班安全教育防踩踏教案
- 全新股权转让书补充协议
- 二零二五医院进修人员管理制及协议书
- 瑜伽馆入会协议二零二五年
- 股权质押担保j短期借款合同二零二五年
- 驾驶员承包协议二零二五年
- 海面租赁合同
- 知识产权合同范文
- 辅导员招聘考试往年试题回顾
- 2025国家粮食和物资储备局直属和垂直管理系统事业单位招聘统一笔试重点基础提升(共500题)附带答案详解
- 2025年四川省成都市高考英语二诊试卷
- 2025年度海鲜餐厅品牌区域合作授权合同
- 企业文化-电力与能源战略参考题库2025版
- 社会行政自考试题及答案
- 2025年保险查勘员笔试试题及答案
- 7.2做中华人文精神的弘扬者教学设计 -2024-2025学年统编版道德与法治七年级下册
- 运维面试试题及答案
- 山东大学教师外其他专业技术岗位招聘真题2024
- 第三单元7.美丽乡村 课件 -2024-2025学年浙人美版(2024)初中美术七年级下册
- 煤矿招生考试试题及答案
评论
0/150
提交评论