版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
作者丁向荣单片微机原理与接口技术第5章程序设计
5.1
汇编语言程序设计
5.2C51程序设计
5.1汇编语言程序设计
5.1.1程序编制的方法和技巧1.程序编制的步骤(1)系统任务的分析首先,要对单片机应用系统的任务进行深入的分析,明确系统的设计任务、功能要求和技术指标。其次,要对系统的硬件资源和工作环境进行分析。这是单片机应用系统程序设计的基础和条件。
返回目录5.1汇编语言程序设计
5.1.1程序编制的方法和技巧
1.程序编制的步骤(2)提出算法与算法的优化算法是解决问题的具体方法。一个应用系统经过分析、研究和明确规定后,对应实现的功能和技术指标可以利用严密的数学方法或数学模型来描述,从而把一个实际问题转化成由计算机进行处理的问题。同一个问题的算法可以有多种,也都能完成任务或达到目标,但程序的运行速度、占用单片机资源以及操作方便性会有较大的区别,所以,应对各种算法进行分析比较,并进行合理的优化。
返回目录5.1汇编语言程序设计
5.1.1程序编制的方法和技巧
1.程序编制的步骤
(3)程序总体设计及绘制程序流程图 经过任务分析、算法优化后,就可以进行程序的总体构思,确定程序的结构和数据形式,并考虑资源的分配和参数的计算等。然后根据程序运行的过程,勾画出程序执行的逻辑顺序,用图形符号将总体设计思路及程序流向绘制在平面图上,从而使程序的结构关系直观明了,便于检查和修改。通常,应用程序依功能可以分为若干部分,通过流程图可以将具有一定功能的各部分有机地联系起来,并由此抓住程序的基本线索,对全局可以有一个完整的了解。清晰正确的流程图是编制正确无误的应用程序的基础和条件,所以,绘制一个好的流程图,是程序设计的一项重要内容。
返回目录5.1汇编语言程序设计
5.1.1程序编制的方法和技巧
2.程序流程图
流程图可以分为总流程图和局部流程图。总流程图侧重反映程序的逻辑结构和各程序模块之间的相互关系。局部流程图反映程序模块的具体实施细节。对于简单的应用程序,可以不画流程图。但当程序较为复杂时,绘制流程图是一个良好的编程习惯。常用的流程图符号有开始和结束符号、工作任务(肯定性工作内容)符号、判断分支(疑问性工作内容)符号、程序连接符号、程序流向符号等,如图5.1所示。
返回目录5.1汇编语言程序设计
5.1.1程序编制的方法和技巧
2.程序流程图
返回目录5.1汇编语言程序设计
5.1.2程序的模块化设计
(1)采用模块化程序设计方法单片机应用系统的程序一般由包含多个模块的主程序和各种子程序组成。每一程序模块都要完成一个明确的任务,实现某个具体的功能,如发送、接收、延时、打印、显示等。采用模块化的程序设计方法,就是将这些不同的具体功能程序进行独立的设计和分别调试,最后将这些模块程序装配成整体程序并进行联调。
返回目录5.1汇编语言程序设计
5.1.2程序的模块化设计
(2)尽量采用循环结构和子程序采用循环结构和子程序可以使程序的长度减少,程序简单化,占用内存空间减少。对于多重循环,要注意各重循环的初值、循环结束条件与需循环位置,避免出现程序无休止循环的“死循环”现象。对于通用的子程序,除了用于存放子程序入口参数的寄存器外,子程序中用到的其它寄存器的内容应压入堆栈进行现场保护,并要特别注意堆栈操作的压入和弹出的顺序。对于中断处理子程序除了要保护程序中用到的寄存器外,还应保护标志寄存器。返回目录5.1汇编语言程序设计
5.1.3伪指令
(1)设置起始地址指令ORG指令格式为:
ORG16位地址该指令的作用是指明后面的程序或数据块的起始地址,它总是出现在每段源程序或数据块的开始。一个汇编语言源程序中可以有多条ORG伪指令,但后一条ORG伪指令指定的地址应大于前面机器码已占用的存储地址。
返回目录5.1汇编语言程序设计
5.1.3伪指令
(2)汇编语言源程序结束指令END指令格式为:
[标号:]END[mm]其中mm是程序起始地址。标号和mm不是必需的。指令功能是表示源程序到此结束,END指令以后的指令汇编程序将不予处理。一个源程序中只能在末尾有一个END指令。返回目录5.1汇编语言程序设计
5.1.3伪指令
(3)赋值伪指令EQU指令格式为:
字符名称EQU数值或汇编符号
EQU伪指令的功能是使指令中的“字符名称”等价于给定的“数值或汇编符号”。赋值后的字符名称可在整个源程序中使用。字符名称必须先赋值后使用,通常将赋值放在源程序的开头。
例5.3
返回目录5.1汇编语言程序设计
5.1.3伪指令
(4)数据地址赋值指令DATA指令格式为:
字符名称DATA表达式
DATA伪指令的功能是将表达式指定的数据地址赋予规定的字符名称。 DATA伪指令与EQU伪指令的功能相似,其主要区别是: DATA伪指令定义的字符名称可先使用后定义,放于程序开头、结尾均可;而EQU伪指令定义的字符名称只能是先定义,后使用; EQU伪指令既可以将一个汇编符号赋值给字符名称,而DATA伪指令只能将数据地址赋值给字符名称。返回目录5.1汇编语言程序设计
5.1.3伪指令
(5)定义字节伪指令DB指令格式为:
[标号:]DB字节常数表
DB伪指令的功能是从指定的地址单元开始,定义若干个8位内存单元的内容。字节常数可以采用二进制、十进制、十六进制和ASCII码等多种表示形式。
返回目录5.1汇编语言程序设计
5.1.3伪指令
(6)定义字伪指令DW指令格式为:
[标号:]DW字常数表
DW伪指令功能是从指定地址开始,定义若干个16位数据,高八位存入低地址,低八位存入高地址。
返回目录5.1汇编语言程序设计
5.1.3伪指令
(7)定义存储区指令DS指令格式为:
[标号:]DS表达式指令功能为从指定的单元地址开始,保留一定数量的存储单元,以备使用。汇编时,对这些单元不赋值。返回目录5.1汇编语言程序设计
5.1.3伪指令
(8)位定义伪指令BIT指令格式为:
字符名称BIT位地址指令功能为将位地址赋值给指定的符号名称,通常用于位符号地址的定义。返回目录5.1汇编语言程序设计
5.1.3伪指令
(9)文件包含命令INCLUDE指令格式为:
$INCLUDE(文件名)
INCLUDE用于将寄存器定义文件或其它程序文件包含于当前程序中,寄存器定义文件的后缀名一般为“.INC”,也可直接包含汇编程序文件。
例如$INCLUDE(STC15F2K60S2.INC)返回目录5.2基本程序结构与程序设计举例
1.顺序结构程序顺序程序是指无分支、无循环结构的程序,其执行流程是依指令在程序存储器中的存放顺序进行的。顺序程序比较简单,一般不需绘制程序流程图,直接编程既可。
例5.4试将8位二进制数据转换为十进制(BCD码)数据
返回目录5.2基本程序结构与程序设计举例
2.分支结构程序通常情况下,程序的执行是按照指令在程序存储器中存放的顺序进行的,但有时需要对某种条件的判断结果来决定程序的不同走向,这种程序结构就属于分支结构。分支结构可以分成单分支、双分支和多分支几种情况,各分支间相互独立。返回目录5.2基本程序结构与程序设计举例
2.分支结构程序----例题例5.5例5.6
返回目录5.2基本程序结构与程序设计举例
3.循环结构程序在程序设计中,当需要对某段程序进行大量地有规律地重复执行时,可采用循环方法设计程序。循环结构的程序主要包括以下四个部分:①循环初始化部分:设置循环开始时的状态。如清结果单元、设置地址指针、设定寄存器初值、循环次数等。②循环体部分:需要重复执行的程序段,是循环结构的主体。③循环控制部分:这部分的作用是修改循环变量和控制变量,并判断循环是否结束,直到符合结束条件,跳出循环为止。④结束部分:该部分主要完成循环结束后的结果处理工作,例如对结果进行分析、处理和存放。根据条件的判断位置与循环次数的控制,循环结构又分为3种基本结构:while结构、do-while结构和for结构。
返回目录5.2基本程序结构与程序设计举例
3.循环结构程序
while结构的特点是先判断后执行,因此,循环体程序也许一次都不执行。
do-while结构的特点是先执行后判断,因此,循环体程序至少要执行一次。for结构的特点和do-while结构一样也是先执行后判断,但是,for结构循环体程序的执行次数是固定的。返回目录5.2基本程序结构与程序设计举例
3.循环结构程序---例题
例5.8
例5.9
例5.10
例5.11
返回目录5.2基本程序结构与程序设计举例
4.子程序1)子程序的调用与返回2)现场保护与恢复
3)参数传递利用累加器或寄存器利用存储器(指针传递)利用堆栈
例5.12
例5.13
例5.14返回目录5.3C51程序设计
5.3.1C51基础标识符是用来标识源程序中某个对象的名字,这些对象可以是语句、数据类型、函数、变量、常量、数组等。关键字是编程语言保留的特殊标识符,也称为保留字,它们具有固定名称和含义。在C语言的程序编写中,不允许标识符与关键字相同。返回目录5.3C51程序设计
5.3.1C51基础
标识符是用来标识源程序中某个对象的名字,这些对象可以是语句、数据类型、函数、变量、常量、数组等。关键字是编程语言保留的特殊标识符,也称为保留字,它们具有固定名称和含义。在C语言的程序编写中,不允许标识符与关键字相同。返回目录5.3C51程序设计
5.3.1C51基础
1.C51数据类型
(1)KeilC51编译器支持的数据类型见表5.3。返回目录数据类型长度值域unsignedchar单字节0~255signedchar单字节-128~+127unsignedint双字节0~65535signedint双字节-32768~+32767unsignedlong4字节0~4294967295signedlong4字节-2147483648~+2147483647float4字节±1.175494E-38~±3.402823E+38*1~3字节对象的地址bit位0或1sfr单字节0~255sfr16双字节0~65535sbit位0或15.3C51程序设计
5.3.1C51基础
(2)数据类型分析
1)char字符类型
有unsignedchar和signedchar之分,默认值为signedchar,长度为1个字节,用以存放1个单字节数据。对于signedchar型数据,其字节的最高位表示该数据的符号,“0”表示正数,“1”表示负数,数据格式为补码形式,所能表示的数值范围为:-128~+127;而unsignedchar型数据是无符号字符型数据,所能表示的数值范围为:0~255。返回目录5.3C51程序设计
5.3.1C51基础
(2)数据类型分析
2)int整型
有unsignedint和signedint之分,默认值为signedint,长度为2个字节,用以存放双字节数据。signedint是有符号整型数,unsignedint是无符号整型数。
3)long长整型
有unsignedlong和signedlong之分,默认值为signedlong,长度为4个字节。signedlong是有符号长整型数,unsignedlong是无符号长整型数。返回目录5.3C51程序设计5.3.1C51基础
(2)数据类型分析
4)float浮点型
它是符合IEEE-754标准的单精度浮点型数据。float浮点型数据占用4个字节(32位二进制数),其存放格式为:返回目录字节(偏移)地址+3+2+1+0浮点数内容SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM5.3C51程序设计5.3.1C51基础
(2)数据类型分析
5)指针型
指针型数据不同于以上4种基本数据类型,它本身是一个变量。但在这个变量中存放的不是普通的数据而是指向另一个数据的地址。指针变量也要占据一定的内存单元,在KeilC51中,指针变量的长度一般为1~3字节。指针变量也具有类型,其表示方法是在指针符号“*”的前面冠以数据类型符号,如“char*point”是一个字符型指针变量。指针变量的类型表示该指针所指向地址中数据的类型。返回目录5.3C51程序设计5.3.1C51基础
(2)数据类型分析
6)bit位标量
这是C51编译器的一种扩充数据类型,利用它可以定义一个位标量。7)sfr定义特殊功能寄存器
这是C51编译器的一种扩充数据类型,利用它可以访问8051单片机的所有内部的特殊功能寄存器。它占用一个内存单元,其取值范围是0~255。返回目录5.3C51程序设计
5.3.1C51基础
(2)数据类型分析
8)sfr16定义16位特殊功能寄存器
它占用两个内存单元,其取值范围是0~65535。
9)sbit定义可寻址位
这也是C51编译器的一种扩充数据类型,利用它可以访问8051单片机内部RAM中的可寻址位和特殊功能寄存器的可寻址位。返回目录5.3C51程序设计
5.3.1C51基础
(3)变量的数据类型选择
变量的数据类型选择的基本原则:1)若能预算出变量的变化范围,则可根据变量长度来选择变量的类型,则尽量减少变量的长度。2)如果程序中不需使用负数,则选择无符号数类型的变量。3)如果程序中不需使用浮点数,则要避免使用浮点数变量。返回目录5.3C51程序设计
5.3.1C51基础
(4)数据类型之间的转换
在C语言程序的表达式或变量的赋值运算中,有时会出现运算对象的数据类型不一样的情况,C语言程序允许在标准数据类型之间隐式转换,隐式转换按以下优先级别(由低到高)自动进行:
bit→char→int→long→float→signed→unsigned返回目录5.3C51程序设计5.3.1C51基础
2.C51的变量:
C51中对变量的定义格式为:
[存储种类]数据类型[存储器类型]变量名表
1autointdatax;2charcodey=0x22;返回目录5.3C51程序设计5.3.1C51基础
2.C51的变量:
(1)变量的存储种类变量的存储种类有4种,分别为:auto(自动)、extern(外部)、static(静态)、register(寄存器)。返回目录5.3C51程序设计
5.3.1C51基础2.C51的变量:
(2)变量的存储器类型KeilC编译器完全支持8051系列单片机的硬件结构、可以访问其硬件系统的各个部分,对于各个变量可以准确地赋予其存储器类型,使之能够在单片机内准确定位。KeilC编译器支持的存储器类型见表所示。返回目录存储器类型说明data变量分配在低128字节,采用直接寻址方式,访问速度最快bdata变量分配在20H~2FH,采用直接寻址方式,允许位或字节访问idata变量分配在低128字节或高128字节,采用间接寻址方式pdata变量分配在XRAM,分页访问外部数据存储器(256B),用MOVX@Ri指令xdata变量分配在XRAM,访问全部外部数据存储器(64KB),用MOVX@DPTR指令code变量分配在程序存储器(64KB),用MOVCA,@A+DPTR指令访问5.3C51程序设计
5.3.1C51基础
2.C51的变量
(3)KeilC编译器的编译模式与默认存储器类型
SMALL
变量被定义在8051单片机的内部数据存储器(data)区中,因此对这种变量的访问速度最快。另外,所有的对象,包括堆栈,都必须嵌入内部数据存储器。返回目录5.3C51程序设计
5.3.1C51基础
2.C51的变量
(3)KeilC编译器的编译模式与默认存储器类型
COMPACT
变量被定义在外部数据存储器(pdata)区中,外部数据段长度可达256字节。这时对变量的访问是通过寄存器间接寻址(MOVX@Ri)实现的。采用这种模式编译时,变量的高8位地址由P2口确定。因此,在采用这种模式的同时,必须适当改变启动程序STARTUP.A51中的参数:PDATASTART和PDATALEN,用L51进行连接时还必须采用控制命令PDATA来对P2口地址进行定位,这样才能确保P2口为所需要的高8位地址。
返回目录5.3C51程序设计
5.3.1C51基础
2.C51的变量
(3)KeilC编译器的编译模式与默认存储器类型
LARGE
变量被定义在外部数据存储器(xdata)区中,使用数据指针DPTR进行访问。这种访问数据的方法效率是不高的,尤其是对于2个或多个字节的变量,用这种数据访问方法对程序的代码长度影响非常大。另外一个不便之处是数据指针不能对称操作。返回目录5.3C51程序设计
5.3.1C51基础
3.51单片机特殊功能寄存器变量的定义
(1)8位地址特殊功能寄存器的定义定义格式:
sfr特殊功能寄存器名=特殊功能寄存器的地址常数;例如:sfrP0=0x80;//定义特殊功能寄存器P0口的地址为80H。返回目录5.3C51程序设计
5.3.1C51基础3.51单片机特殊功能寄存器变量的定义:
(
2)16位特殊功能寄存器变量的定义
在新一代的增强型8051单片机中,特殊功能寄存器经常组合成16位使用。为了有效地访问这种16位的特殊功能寄存器,可采用关键字sfr16进行定义。返回目录5.3C51程序设计
5.3.1C51基础
3.51单片机特殊功能寄存器变量的定义
(3)特殊功能寄存器中位变量的定义
1)sbit位变量名=位地址
这种方法将位的绝对地址赋给位变量,位地址必须位于80H~FFH之间。例如:sbitOV=0xD2;
//定义位变量OV(溢出标志),其位地址为D2H。sbitCY=0xD7;//定义位变量CY(进位位),其位地址为D7H。sbitRSPIN=0x80;//定义位变量RSPIN,其位地址为80H。返回目录5.3C51程序设计
5.3.1C51基础
3.51单片机特殊功能寄存器变量的定义:
(3)特殊功能寄存器中位变量的定义
2)sbit位变量名=特殊功能寄存器名^位位置
适用已定义的特殊功能寄存器位变量的定义,位位置值为0~7。例如:sbitOV=PSW^2;//定义位变量OV(溢出标志),它是PSW的第2位。sbitCY=PSW^7;//定义位变量CY(进位位),它是PSW的第7位。sbitRSPIN=P0^0;//定义位变量RSPIN,它是P0口第0位。返回目录5.3C51程序设计
5.3.1C51基础3.51单片机特殊功能寄存器变量的定义:
(3)特殊功能寄存器中位变量的定义
3)sbit位变量名=字节地址^位位置
这种方法是以特殊功能寄存器的地址作为基址,其值位于80H~FFH之间,位位置值为0~7。例如:sbitOV=0xD0^2;//定义位变量OV(溢出标志),直接指明了特殊功能寄存器PSW的地址,它是0xD0地址单元的第2位。sbitCY=0xD0^7;//定义位变量CY(进位位),直接指明了特殊功能寄存器PSW的地址,它是0xD0地址单元第7位。sbitRSPIN=0x80^0;//定义位变量RSPIN,直接指明了P0口的地址为80H,它是80H的第0位。
返回目录5.3C51程序设计
5.3.1C51基础
4.51单片机位寻址区(20H~2FH)位变量的定义:
(1)定义位寻址区变量
intbdatamy_y=0x20
(2)定义位寻址区位变量
sbitmy_ybit0=my_y^0;sbitmy_ybit15=my_y^15;返回目录5.3C51程序设计
5.3.1C51基础
5.函数的定位:
(1)指定工作寄存器区
当需要指定函数中使用的工作寄存器区时,使用关键字using后跟一个0~3的数,对应工作寄存器组0~3区。例如:unsignedcharGetKey(void)using2{……/*用户代码区*/}返回目录5.3C51程序设计
5.3.1C51基础
5.函数的定位:
(2.)指定存储模式
用户可以使用small、compact及large说明存储模式。例如:voidOutBCD(void)small{}返回目录5.3C51程序设计
5.3.1C51基础6.中断服务函数:
(1)中断服务函数的定义
中断服务函数定义的—般形式为:
函数类型函数名(形式参数表)interruptn[usingm]
其中,关键字interrupt后面的n是中断号,n的取值范围为0~31。编译器从8n+3处产生中断向量,具体的中断号n和中断向量取决于不同的单片机芯片。返回目录5.3C51程序设计
5.3.1C51基础
6.中断服务函数:
(2)8051单片机中断源的中断号与中断向量返回目录中断源中断号n中断向量8n+3外部中断000003H定时/计数器中断01000BH外部中断120013H定时/计数器中断13001BH串行口中断40023H5.3C51程序设计
5.3.1C51基础
6.中断服务函数:(3)中断服务函数的编写规则1)中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译出错。2)中断函数没有返回值,如果企图定义一个返回值将得到不正确的结果。因此,最好定义中断函数时将其定义为void类型,以明确说明没有返回值。3)在任何情况下都不能直接调用中断函数,否则会产生编译错误。因为中断函数的返回是由8051单片机指令RETI完成的,RETI指令影响8051单片机的硬件中断系统。4)如果中断函数中用到浮点运算,必须保存浮点寄存器的状态,当没有其他程序执行浮点运算时可以不保存。5)如果在中断函数中调用了其他函数,则被调用函数所使用的寄存器组必须与中断函相同。用户必须保证按要求使用相同的寄存器组,否则会产生不正确的结果。如果定义中函数时没有使用using选项,则由编译器选择一个寄存器组作绝对寄存器组访问。返回目录5.3C51程序设计
5.3.1C51基础
7.函数的递归调用与再入函数
C语言中允许在调用一个函数过程中,又间接或直接地调用该函数自己,这就称为函数的递归调用。递归调用可以使程序简洁,代码紧凑,但速度会稍慢,并目要占用较大的堆栈空间。在C51中,采用一个扩展关键字reentrant,作为定义函数时的选项,从而构造成再入函数,使其在函数体内可以直接或间接地调用自身函数,实现递归调用。需要将一个函数定义为再入函数时,只要在函数名后面加上关键字reentrant就可以了,格式如下:
函数类型函数名(形式参数表)[reentrant]返回目录5.3C51程序设计
5.3.1C51基础
8.在C51中嵌入汇编:
(1)在C文件中以如下方式嵌入汇编代码#pragmaASM…;嵌入的汇编语言代码
…;#pragmaENDASM
(2)在KeilC51编译器Project窗口中包含汇编代码的C文件上单击鼠标右键,选择“Optionsfor…”,单击右边的“GenerateAssemblerSRCFile”并在“AssembleSRCFile”前打勾,使检查框由灰色变成黑色(有效)状态。返回目录5.3C51程序设计
5.3.1C51基础
8.在C51中嵌入汇编:(3)根据选择的编译模式,把相应的库文件(如Small模式时,是KeilC51LibC5ISLib)加入工程中,该文件必须作为工程的最后文件。(4)编译,即可生成目标代码。这样,在“asm”和“endasm”中的代码将被复制到输出的SRC文件中,然后这个文件编译并和其他的目标文件连接后产生最后的可执行文件。返回目录5.3C51程序设计
5.3.2C51程序设计
1.C51程序框架:(1)预处理部分(2)全局变量定义与函数声明(3)主函数(4)子函数与中断服务函数返回目录5.3C51程序设计
5.3.2C51程序设计
1.C51程序框架:
(1)预处理
所谓编译预处理,是编译器在对C语言源程序进行正常编译之前,先对一些特殊的预处理命令作解释,产生一个新的源程序。编译预处理主要是为程序调试、程序移植提供便利。
在源程序中,为了区分预处理命令和一般的C语句的不同,所有预处理命令行都以符号“#”开头,并且结尾不用分号。预处理命令可以出现在程序任何位置,但习惯上尽可能地写在源程序的开头,其作用范围从其出现的位置到文件尾。C语言提供的预处理命令主要有:宏定义、文件包含和条件编译。返回目录5.3C51程序设计
5.3.2C51程序设计
1.C51程序框架:
(1)预处理
1)文件包含
文件包含实际上就是一个源程序文件可以包含另外一个源程序文件的全部内容。文件包含不仅可以包含头文件,如#include<REG51.H>,还可以包含用户自己编写的源程序文件,如#include“MY_PROC.C”。C51文件中首先必须包含有关51单片机特殊功能寄存器地址以及位地址定义的头文件,比如#include<REG51.H>。返回目录5.3C51程序设计
5.3.2C51程序设计
1.C51程序框架:
(1)预处理
1)文件包含
文件包含预处理命令的一般格式
#include<文件名>或#include"文件名"
前一种形式的文件名用尖括弧括起来,系统将到包含C语言库函数的头文件所在的目录(通常是KEIL目录中的include子目录)中寻找文件;后一种形式的文件名用双引号括起来,系统先在当前目录下寻找,若找不到,再到其他路径中寻找。返回目录C51程序设计
5.3.2C51程序设计
1.C51程序框架:
(1)预处理
1)文件包含
文件包含使用注意①一个#include命令只能指定一个被包含的文件。②如果文件1包含了文件2,而文件2要用到文件3的内容,则在文件1中用两个#include命令分别包含文件2和文件3,并且文件3包含要写在文件2的包含之前,即在file1.c中定义:#include<file3.c>include<file2.c>③文件包含可以嵌套。返回目录5.3C51程序设计
5.3.2C51程序设计
1.C51程序框架:
(1)预处理
2)宏定义宏定义分为带参数的宏定义和不带参数的宏定义。①不带参数的宏定义
#define标识符字符串#definePI3.14/*PI即为3.148/返回目录5.3C51程序设计
5.3.2C51程序设计
1.C51程序框架:
(1)预处理
2)宏定义
无参数的宏定义使用时,要注意以下几个问题:
☆
宏名一般用大写字母,以便于与变量名的区别。当然,用小写字母也不为错。☆
在编译预处理中宏名与字符串进行替换时,不作语法检查,只是简单的字符替换,只有在编译时才对已经展开宏名的源程序进行语法检查。返回目录5.3C51程序设计
5.3.2C51程序设计
1.C51程序框架:
(1)预处理
2)宏定义☆
宏名的有效范围是从定义位置到文件结束。如果需要终止宏定义的作用域,可以用#undef命令。例如:
#undefPI//该语句之后的PI不再代表3.14,这样可以灵活控制宏定义的范围☆
宏定义时可以引用己经定义的宏名。例如:
#defineX2.0
#definePI3.14
#defineALLPI*X
☆
对程序中用双引号括起来的字符串内的字符,不进行宏的替换操作。返回目录5.3C51程序设计5.3.2C51程序设计
1.C51程序框架:
(1)预处理
2)宏定义
②带参数的宏定义
#define标识符(参数表)字符串
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 数学八年级下册4.5 一次函数的应用教学设计
- 科学五年级下册8 二氧化碳教案
- 精神科患者防走失管理制度
- 绿化材料验收保养方案制定
- 储料场堆放安全防护规范方案
- 心电监护仪应用与护理
- 机加工车间晚班追赶进度计划
- 赣美版美的体验第16课 电脑绘画教案
- 自动恢复链路验证执行细则
- 地裂缝救援队伍
- 经胸超声心动图标准切面及标准测量
- 深度解读2025年家庭教育指导服务行业市场规模、增长速度及政策环境分析报告
- 2024年高考语文全国二卷(含答案)精校版
- 腾讯公司质量管理制度
- 教育事业十五五发展规划
- CJ/T 409-2012玻璃钢化粪池技术要求
- 单独支付药品用药申请表
- T/CNPPA 3017-2021塑料和橡胶类药包材自身稳定性研究指南
- 2025年合肥兴泰金融控股(集团)有限公司招聘23人笔试参考题库附带答案详解
- 太钢不锈钢产品手册
- 施工单位安全生产汇报材料
评论
0/150
提交评论