补充:单片机C语言与汇编语言混合编程.ppt

上传人:精*** 文档编号:838058 上传时间:2023-09-08 格式:PPT 页数:63 大小:594.50KB
下载 相关 举报
补充:单片机C语言与汇编语言混合编程.ppt_第1页
第1页 / 共63页
补充:单片机C语言与汇编语言混合编程.ppt_第2页
第2页 / 共63页
补充:单片机C语言与汇编语言混合编程.ppt_第3页
第3页 / 共63页
补充:单片机C语言与汇编语言混合编程.ppt_第4页
第4页 / 共63页
补充:单片机C语言与汇编语言混合编程.ppt_第5页
第5页 / 共63页
点击查看更多>>
资源描述

1、*西南大学电子信息工程学院西南大学电子信息工程学院1补充一补充一补充一补充一:单片机混合编程单片机混合编程单片机混合编程单片机混合编程1 1汇编中调用汇编中调用汇编中调用汇编中调用C51C51程序程序程序程序 单片机C语言和汇编语言混合编程分为汇编中调用汇编中调用汇编中调用汇编中调用C51C51函函函函数数数数和C51程序中引用汇编引用汇编引用汇编引用汇编在C51程序中使用汇编语言有两种情况:C51程序调用汇编程序模块的变量和函数和嵌入式汇编 在汇编程序中可以访问C51程序中的变量和函数。(1)(1)汇编中调用汇编中调用汇编中调用汇编中调用C51C51的变量:的变量:的变量:的变量:普通变量:

2、_ _变量名变量名变量名变量名数组:_ _数组名数组名数组名数组名+偏移量偏移量偏移量偏移量用_XX_XX可以访问C语言程序中定义的变量XXXX;用_XX+3_XX+3可以访问数组中的XX3XX3。*西南大学电子信息工程学院西南大学电子信息工程学院2(2)(2)对于函数:对于函数:对于函数:对于函数:如在C51程序中定义了没有参数的函数fun1fun1()(),则在汇编程序中用子程序调用指令调用fun1fun1即可;如定义了有参数的函数fun2fun2()(),则在汇编程序中调用时,子程序名用成_fun2_fun2。注意:注意:注意:注意:为了能够让汇编语言访问到为了能够让汇编语言访问到为了能

3、够让汇编语言访问到为了能够让汇编语言访问到C C C C语言中定语言中定语言中定语言中定义的变量和函数,在义的变量和函数,在义的变量和函数,在义的变量和函数,在C C C C程序中它们必须声明为外部程序中它们必须声明为外部程序中它们必须声明为外部程序中它们必须声明为外部变量,即加变量,即加变量,即加变量,即加extern extern extern extern 前缀前缀前缀前缀 函数没有参数:函数名函数名函数名函数名函数有参数:_ _函数名,函数名,函数名,函数名,调用函数前要准备好参数。*西南大学电子信息工程学院西南大学电子信息工程学院32 2在在在在C51C51中嵌入汇编程序中嵌入汇编程

4、序中嵌入汇编程序中嵌入汇编程序 通过C51中的预处理指令#pragma asm/endasm#pragma asm/endasm 语句来实现的。其格式如下:#pragma#pragma ASM ASM;汇编程序代码汇编程序代码汇编程序代码汇编程序代码#pragma#pragma ENDASM ENDASM3.3.在在在在C51C51中调用汇编程序中调用汇编程序中调用汇编程序中调用汇编程序 这种方法应用较多,C模块与汇编模块的接口较简单,分别用C51与A51对源程序进行编译,然后用L51将obj文件连接即可,关键问题在于C函数与汇编函数之间的参数传递和得到正确的返回值,以保证模块间的数据交换。*

5、西南大学电子信息工程学院西南大学电子信息工程学院4混合汇编的参数传递与实现混合汇编的参数传递与实现混合汇编的参数传递与实现混合汇编的参数传递与实现混合汇编的参数传递混合汇编的参数传递混合汇编的参数传递混合汇编的参数传递1 1汇编程序调用汇编程序调用汇编程序调用汇编程序调用C51C51函数的参数传递函数的参数传递函数的参数传递函数的参数传递 如C51函数有参数,则汇编程序在调用C51函数前要准备好参数。在汇编程序中,C51函数最左边的一个参数最左边的一个参数最左边的一个参数最左边的一个参数由寄存器A传递,其他的参数按顺序通过堆栈按顺序通过堆栈按顺序通过堆栈按顺序通过堆栈给出。C51函数的返回值是

6、返回到A寄存器或者由A寄存器给出的地址。2 2在在在在C51C51中嵌入汇编程序的参数传递中嵌入汇编程序的参数传递中嵌入汇编程序的参数传递中嵌入汇编程序的参数传递 通过变量或特殊功能寄存器来实现*西南大学电子信息工程学院西南大学电子信息工程学院53 3在在在在C51C51中调用汇编程序的参数传递(难点)中调用汇编程序的参数传递(难点)中调用汇编程序的参数传递(难点)中调用汇编程序的参数传递(难点)C51中调用汇编程序进行参数传递时都必须严格遵守C51函数的参数和返回值的相关约定。C51中调用汇编程序进行参数传递的方式有两种,一一一一种是通过寄存器种是通过寄存器种是通过寄存器种是通过寄存器传递参

7、数,第二种是通过固定存储区固定存储区固定存储区固定存储区传递。*西南大学电子信息工程学院西南大学电子信息工程学院61)1)通过寄存器传递参数通过寄存器传递参数通过寄存器传递参数通过寄存器传递参数最多可通过51单片机的工作寄存器传递3个参数,余下的通过固定存储区传递 参数类型参数类型charintlong/float通用指针通用指针第第第第1 1个个个个R7R7R6R6、R7R7R4R4R7R7R1R1、R2R2、R3R3第第第第2 2个个个个R5R5R4R4、R5R5R4R4R7R7R1R1、R2R2、R3R3第第第第3 3个个个个R3R3R2R2、R3R3无无无无R1R1、R2R2、R3R3

8、func1(int a)func1(int a)func1(int a)func1(int a)唯一一个参数唯一一个参数唯一一个参数唯一一个参数a a a a在寄存器在寄存器在寄存器在寄存器R6R6R6R6和和和和R7R7R7R7中传递中传递中传递中传递func2(int bfunc2(int bfunc2(int bfunc2(int b,intintintint c c c c,intintintint *d)*d)*d)*d)第一个参数第一个参数第一个参数第一个参数b b b b在寄存器在寄存器在寄存器在寄存器R6R6R6R6和和和和R7R7R7R7中传递,第二中传递,第二中传递,第二中

9、传递,第二个参数个参数个参数个参数c c c c在寄存器在寄存器在寄存器在寄存器R4R4R4R4和和和和R5R5R5R5中传递,第三个参中传递,第三个参中传递,第三个参中传递,第三个参数数数数d d d d在寄存器在寄存器在寄存器在寄存器R1R1R1R1、R2R2R2R2和和和和R3R3R3R3中传递中传递中传递中传递*西南大学电子信息工程学院西南大学电子信息工程学院72)2)通过固定存储区传递通过固定存储区传递通过固定存储区传递通过固定存储区传递用固定存储区传递参数给汇编程序,参数段首地址用段名?function_name?BYTE和?function_name?BIT保存,function

10、_name为函数的名称,其中,?function_name?BIT保存位参数段首地址,?function_name?BYTE保存别的参数段首地址,即使通过寄存器传递参数,参数也将在这些段中分配空间,并按声明的先后在每个段中顺序保存。3)3)函数返回值函数返回值函数返回值函数返回值 函数返回值通常用寄存器传递 返回值类型返回值类型寄寄存存器器说说明明BitBitC由位运算器由位运算器C返回返回(unsigned)char(unsigned)charR7在在R7返回单个字节返回单个字节(unsigned)int(unsigned)intR6、R7高位在高位在R6,低位在,低位在R7(unsigne

11、d)long(unsigned)longR4R7高位在高位在R4,低位在,低位在R7floatfloatR4R732位位IEEE格式格式通用指针通用指针通用指针通用指针R1、R2、R3存储类型在存储类型在R3,高位在,高位在R2,低位在,低位在R1*西南大学电子信息工程学院西南大学电子信息工程学院8混合汇编的实现混合汇编的实现混合汇编的实现混合汇编的实现1 1C51C51中嵌入汇编程序的实现方法中嵌入汇编程序的实现方法中嵌入汇编程序的实现方法中嵌入汇编程序的实现方法#includevoidmain(void)P2=1;#pragmaasm#pragmaasmMOVR7,#10MOVR7,#10

12、DEL:MOVR6,#20DEL:MOVR6,#20DJNZR6,$DJNZR6,$DJNZR7,DELDJNZR7,DEL#pragmaendasm#pragmaendasmP2=0;第一步:在C文件中以如下方式嵌入汇编程序。*西南大学电子信息工程学院西南大学电子信息工程学院9第二步:在KeilKeil C51 C51软件的Project Project 窗口窗口窗口窗口右击嵌入汇编程序的C文件,在弹出的快捷菜单中选择Options for.Options for.命令,选中右边的Generate Assembler SRC File和Assemble SRC File复选框,使检查框由灰色

13、变成黑色(有效)状态。第三步:根据选择的编译模式,把相应的库文件(如 Small 模式时,是 KeilC51LibC51S.Lib)加入到工程中,该文件必须作为工程的最后文件。第四步:编译,即可生成目标代码。*西南大学电子信息工程学院西南大学电子信息工程学院102 2C51C51中调用汇编程序的实现方法中调用汇编程序的实现方法中调用汇编程序的实现方法中调用汇编程序的实现方法第一步:先用C语言程序编写出程序框架,如文件名为a1.c(注意参数)。第二步:在Keil C51的Project窗口中右击该C语言文件,在弹出的快捷菜单中选择Options for.,右边的Generate Assemble

14、r SRCFile和Assemble SRC File,使检查框由灰色变成黑色(有效)状态;第三步:根据选择的编译模式,把相应的库文件(如Small模式时,是KeilC51Lib C51S.Lib)加入工程中,该文件必须作为工程的最后文件。*西南大学电子信息工程学院西南大学电子信息工程学院11第四步:编译后将会产生一个SRC的文件,将这个文件扩展名改为ASM。这样就形成了可供C51程序调用的汇编程序。随后可在该文件的代码段中加入所需的指令代码。第五步:将该汇编程序与调用它的主程序一起加到工程文件中,这时工程文件中不再需要原来的C语言文件和库文件,主程序只需要在程序开始处用EXTERN对所调用的

15、汇编程序中的函数作声明,在主程序中就可调用汇编程序中的函数了。*西南大学电子信息工程学院西南大学电子信息工程学院12reg51.h和reg52.h:实质上是没有区别的,都是一些特殊功能寄存器的申明sfrP0=0 x80;sfrP1=0 x90;sfrP2=0 xA0;sfrP3=0 xB0;sfrPSW=0 xD0;sfrACC=0 xE0;sfrB=0 xF0;补充二补充二补充二补充二:头文件说明头文件说明头文件说明头文件说明*西南大学电子信息工程学院西南大学电子信息工程学院13absacc.h可使用其中定义的宏来访问绝对地址,包括:CBYTE、XBYTE、PWORD、DBYTE、CWORD

16、、XWORD、PBYTE、DWORD*西南大学电子信息工程学院西南大学电子信息工程学院14ASSERT.hASSERT.H定义assert调试宏。表达式结果正确性测试并可使程序中止*西南大学电子信息工程学院西南大学电子信息工程学院15CTYPE.h包含有关字符分类及转换的各类信息如_ftolower_ftoupperisalnumisalphaisasciiiscntrlisdigitisgraphislowerisprintispunctisspaceisupperisxdigittoasciitolowertoupper*西南大学电子信息工程学院西南大学电子信息工程学院16ERRNO.h头

17、文件errno.h定义了一个全局的宏errno,它被展开为一个int类型的“左值”,这意味着宏errno不一定是个对象的标识符,也可以展开为一个由函数返回的可以修改的“左值”,比如int*errno()。简单来说,errno.h只是为了提供了一种错误报告机制。比如,一个函数调用fopen()发生了错误,它可能就会去修改errno的值,这样外部的代码可以通过判断errno的值来区分fopen()内部执行时是否发生错误,并根据errno值的不同来确定具体的错误类型。*西南大学电子信息工程学院西南大学电子信息工程学院17FLOAT.h包含有关浮点运算的一些参数和函数。*西南大学电子信息工程学院西南大

18、学电子信息工程学院18其他头文件LIMIT.H包含各环境参数、编译时间限制、数的范围等信息。MATH.H说明数学运算函数,还定了HUGEVAL宏,说明了matherr和matherr子程序用到的特殊结构。SETJMP.H定义longjmp和setjmp函数用到的jmpbuf类型,说明这两个函数。STDARG.H定义读函数参数表的宏。(如vprintf,vscarf函数)。STDDEF.H定义一些公共数据类型和宏。STDIO.H定义Kernighan和Ritchie在UnixSystemV中定义的标准和扩展的类型和宏。还定义标准I/O预定义流:stdin,stdout和stderr,说明I/O流

19、子程序。STDLIB.H说明一些常用的子程序:转换子程序、搜索/排序子程序等。STRING.H说明一些串操作和内存操作函数。*西南大学电子信息工程学院西南大学电子信息工程学院19#inlude“stdio.h”与#inlude双引号表示先在程序源文件所在目录查找,如果双引号表示先在程序源文件所在目录查找,如果未找到则去系统默认目录查找,通常用于包含程未找到则去系统默认目录查找,通常用于包含程序作者编写的头文件序作者编写的头文件;尖括号表示只在系统默认目录或者括号内的路径尖括号表示只在系统默认目录或者括号内的路径查找,通常用于包含系统中自带的头文件查找,通常用于包含系统中自带的头文件有一个叫做有

20、一个叫做math.h的头文件,而你的源代码目录的头文件,而你的源代码目录里也有一个你自己写的里也有一个你自己写的math.h头文件,那么使用头文件,那么使用尖括号时用的就是系统里的;而使用双引号的话尖括号时用的就是系统里的;而使用双引号的话则会使用你自己写的那个。则会使用你自己写的那个。*西南大学电子信息工程学院西南大学电子信息工程学院20voidvoid的字面意思是“无类型”,void*则为“无类型指针”,void*可以指向任何类型的数据。规则一如果函数没有返回值,那么应声明为void类型。凡不加返回值类型限定的函数,就会被编译器作为返回整型值处凡不加返回值类型限定的函数,就会被编译器作为返

21、回整型值处理。理。规则二如果函数无参数,那么应声明其参数为voidintfunction(void)return1;规则三小心使用void指针类型规则四如果函数的参数可以是任意类型指针,那么应声明其参数为void*西南大学电子信息工程学院西南大学电子信息工程学院21规则五void不能代表一个真实的变量voida;/错误function(voida);/错误*西南大学电子信息工程学院西南大学电子信息工程学院22volatile本意是“易变的”volatile定义的变量它的值在编译时是会改变的,跟const相反,而const定义的变量一直不会变的。用volatile声明的类型变量表示可以被某些编译

22、器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。*西南大学电子信息工程学院西南大学电子信息工程学院23补充三补充三:51汇编延时子程序说明汇编延时子程序说明以以12MHZ晶振为例,详细讲解晶振为例,详细讲解MCS-51单片机中汇编程序单片机中汇编程序延时的精确算法。延时的精确算法。指令周期、机器周期与时钟周期指令周期、机器周期与时钟周期指令周期:指令周期:CPU执行一条指令所需要的时间称为指令执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期,它是以机器

23、周期为单位的,指令不同,所需的机器周期也不同。周期也不同。时钟周期:也称为振荡周期,一个时钟周期时钟周期:也称为振荡周期,一个时钟周期晶振的晶振的倒数。倒数。51单片机的一个机器周期单片机的一个机器周期=6个状态周期个状态周期=12个时钟周个时钟周期。期。51单片机的指令有单字节、双字节和三字节的,它们单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,的指令周期不尽相同,一个单周期指令包含一个机器周期,即即12个时钟周期,所以一条单周期指令被执行所占时间为个时钟周期,所以一条单周期指令被执行所占时间为12*(1/12000000)=1s。*西南大学

24、电子信息工程学院西南大学电子信息工程学院24程序分析程序分析例例150ms延时子程序:延时子程序:DEL:MOVR7,#200DEL1:MOVR6,#125DEL2:DJNZR6,DEL2DJNZR7,DEL1RET精确延时时间为:精确延时时间为:1+(1*200)+(2*125*200)+(2*200)+2=(2*125+3)*200+3=50603s50ms*西南大学电子信息工程学院西南大学电子信息工程学院25计算过程由由整理出公式(只限上述写法)延时时间整理出公式(只限上述写法)延时时间=(2*内循环内循环+3)*外循环外循环+3详解:详解:DEL这个子程序共有五条指令,现在分别这个子程

25、序共有五条指令,现在分别就就每一条指令每一条指令被执行的次数和所耗时间进行分析。被执行的次数和所耗时间进行分析。第一句:第一句:MOVR7,#200在整个子程序中只在整个子程序中只被执行一次,且为单周期指令,所以耗时被执行一次,且为单周期指令,所以耗时1s第二句:第二句:MOVR6,#125从从看到看到只要只要R7-1不为不为0,就会返回到这句,共执行了,就会返回到这句,共执行了R7次,次,共耗时共耗时200s第三句:第三句:DJNZR6,DEL2只要只要R6-1不为不为0,就反复执行此句(内循环就反复执行此句(内循环R6次),又受外循环次),又受外循环R7控制,所以共执行控制,所以共执行R6

26、*R7次,因是双周期指令,次,因是双周期指令,所以耗时所以耗时2*R6*R7s。*西南大学电子信息工程学院西南大学电子信息工程学院26例例21秒延时子程序:秒延时子程序:DEL:MOVR7,#10DEL1:MOVR6,#200DEL2:MOVR5,#248DJNZR5,$DJNZR6,DEL2DJNZR7,DEL1RET对每条指令进行计算得出精确延时时间为:对每条指令进行计算得出精确延时时间为:1+(1*10)+(1*200*10)+(2*248*200*10)+(2*200*10)+(2*10)+2=(2*248+3)*200+3*10+3=998033s1s*西南大学电子信息工程学院西南大

27、学电子信息工程学院27计算过程由由整理得:延时时间整理得:延时时间=(2*第一层循环第一层循环+3)*第第二层循环二层循环+3*第三层循环第三层循环+3此式适用三层循环以内的程序,也验证了例此式适用三层循环以内的程序,也验证了例1中式中式(第三层循环相当于(第三层循环相当于1)的成立。)的成立。注意,要实现较长时间的延时,一般采用多注意,要实现较长时间的延时,一般采用多重循环,有时会在程式序里加入重循环,有时会在程式序里加入NOP指令,这时指令,这时公式公式不再适用,下面举例分析。不再适用,下面举例分析。*西南大学电子信息工程学院西南大学电子信息工程学院28例例3仍以仍以1秒延时为例秒延时为例

28、DEL:MOVR7,#101指令周期指令周期1DEL1:MOVR6,#0FFH1指令周期指令周期10DEL2:MOVR5,#80H1指令周期指令周期255*10=2550KONG:NOP1指令周期指令周期128*255*10=326400DJNZR5,$2指令周期指令周期2*128*255*10=652800DJNZR6,DEL22指令周期指令周期2*255*10=5100DJNZR7,DEL12指令周期指令周期2*10=20RET2延时时间延时时间=1+10+2550+326400+652800+5100+20+2=986883s约为约为1s*西南大学电子信息工程学院西南大学电子信息工程学院

29、29过程整理得:延时时间整理得:延时时间=(3*第一层循环第一层循环+3)*第二层循环第二层循环+3*第三层循环第三层循环+3结论:针对初学者的困惑,对汇编程结论:针对初学者的困惑,对汇编程序的延时算法进行了分步讲解,并就几种序的延时算法进行了分步讲解,并就几种不同写法分别总结出相应的计算公式,只不同写法分别总结出相应的计算公式,只要仔细阅读例要仔细阅读例1中的详解,并用例中的详解,并用例2、例、例3来来加深理解,一定会掌握各种类型程序的算加深理解,一定会掌握各种类型程序的算法并加以运用。法并加以运用。*西南大学电子信息工程学院西南大学电子信息工程学院30补充四*西南大学电子信息工程学院西南大

30、学电子信息工程学院315151系列单片机支持三种高级语言,即系列单片机支持三种高级语言,即PL/MPL/M,C C和和BASICBASIC。80528052单片机内固化有解释单片机内固化有解释BASICBASIC语言语言 ,BASICBASIC语言适用于简单编程而对编语言适用于简单编程而对编程效率运行速度要求不高的场合;程效率运行速度要求不高的场合;PL/MPL/M是一种是一种结构化的语言,很象结构化的语言,很象PASCALPASCAL,PL/M PL/M 编译器好象编译器好象汇编器一样产生紧凑的机器代码,可以说是高汇编器一样产生紧凑的机器代码,可以说是高级汇编语言,但它不支持复杂的算术运算,

31、无级汇编语言,但它不支持复杂的算术运算,无丰富库函数支持,学习丰富库函数支持,学习PL/MPL/M无异于学习一种新无异于学习一种新的语言。的语言。C C语言是一种通用的程序设计语言,其语言是一种通用的程序设计语言,其代码率高,数据类型及运算符丰富,并具有良代码率高,数据类型及运算符丰富,并具有良好的程序结构,适用于各种应用的程序设计,好的程序结构,适用于各种应用的程序设计,是目前使用较广的单片机编程语言。是目前使用较广的单片机编程语言。*西南大学电子信息工程学院西南大学电子信息工程学院32单片机的单片机的C C语言采用语言采用C51C51编译器编译器(简称简称C51)C51)。由。由C51C5

32、1产生的目标代码短、产生的目标代码短、运行速度高、所需存储空间小、符合运行速度高、所需存储空间小、符合C C语语言的言的ANSIANSI标准,生成的代码遵循标准,生成的代码遵循IntelIntel目目标文件格式,而且可与标文件格式,而且可与A51A51汇编语言或汇编语言或PL/M51PL/M51语言目标代码混和使用。语言目标代码混和使用。*西南大学电子信息工程学院西南大学电子信息工程学院33应用应用C51C51编程具有以下优点编程具有以下优点:(1 1)C51C51管管理理内内部部寄寄存存器器和和存存贮贮器器的的分分配配,编编程程时时,无无需需考虑不同存储器的寻址和数据类型等细节问题;考虑不同

33、存储器的寻址和数据类型等细节问题;()程序由若干函数组成,具有良好的模块化结构;()程序由若干函数组成,具有良好的模块化结构;()有有丰丰富富的的子子程程序序库库可可直直接接引引用用,从从而而大大大大减减少少用用户户编编程的工作量。程的工作量。()()C C语言和汇编语言可以交叉使用语言和汇编语言可以交叉使用.汇编语言程序代码短、汇编语言程序代码短、运行速度快、但复杂运算编程耗时。如果用汇编语言编写与硬运行速度快、但复杂运算编程耗时。如果用汇编语言编写与硬件有关的部分程序,用件有关的部分程序,用C C语言编写与硬件无关的运算部分程序,语言编写与硬件无关的运算部分程序,充分发挥两种语言的长处,可

34、以提高开发效率。充分发挥两种语言的长处,可以提高开发效率。*西南大学电子信息工程学院西南大学电子信息工程学院34C51程序结构 同标准同标准C C一样,一样,C51C51的程序由一个个的程序由一个个函数组成,这里的函数和其他语言的函数组成,这里的函数和其他语言的“子程子程序序”或或“过程过程 ”具有相同的意义。其中必具有相同的意义。其中必须有一个主函数须有一个主函数main()main(),程序的执行从,程序的执行从mainmain()()函数开始,调用其他函数后返回主函数函数开始,调用其他函数后返回主函数mainmain()(),最后在主函数中结束整个程序而不管函,最后在主函数中结束整个程序

35、而不管函数的排列顺序如何。数的排列顺序如何。*西南大学电子信息工程学院西南大学电子信息工程学院35C语言程序的组成结构如下所示:全全局局变变量量说说明明/*可可被被各各函函数数引用引用*/main()/*主函数主函数*/局局部部变变量量说说明明/*只只在在本本函函数数引用引用*/执行语句执行语句(包括函数调用语句包括函数调用语句)fun1(形式参数表形式参数表)/*函数函数1*/形式参数说明形式参数说明局部变量说明局部变量说明执执行行语语句句(包包括括调调用用其其他他函函数语句数语句)funn(形形式式参参数数表表)/*函数函数n*/形式参数说明形式参数说明局部变量说明局部变量说明执行语句执行

36、语句*西南大学电子信息工程学院西南大学电子信息工程学院36C语言的语句规则语言的语句规则:1.每每个个变变量量必必须须先先说说明明后后引引用用,变变量量名名英英文大小写是有差别的。文大小写是有差别的。2.C语语言言程程序序一一行行可可以以书书写写多多条条语语句句,但但每每个个语语句句必必须须以以“;”结结尾尾,一一个个语语句句也也可可以多行书写为好。以多行书写为好。3.C语言的注释用语言的注释用/*/表示。表示。4.“”花括号必须成对,位置随意,可在花括号必须成对,位置随意,可在紧挨函数名后,也可另起一行,多个花括号紧挨函数名后,也可另起一行,多个花括号可以同行书写,也可逐行书写,为层次分明,

37、可以同行书写,也可逐行书写,为层次分明,增加可读性,同一层的增加可读性,同一层的“”花括号对齐,采花括号对齐,采用逐层缩进方式书写。用逐层缩进方式书写。*西南大学电子信息工程学院西南大学电子信息工程学院37C51的数据类型C51的数据有常量和变量之分。的数据有常量和变量之分。常常量量在在程程序序运运行行中中其其值值不不变变的的量量,可可以以为为字字符符,十十进进制制数数或或十六进制数十六进制数(用用0 x表示表示)。常常量量分分为为数数值值型型常常量量和和符符号号型型常常量量,如如果果是是符符号号型型常常量量,需需用用宏宏定定义义指指令令(#define)对对其其进进行行定定义义(相相当当于于

38、汇汇编编的的“EQU”伪指令伪指令)如:如:#definePI3.1415那么程序中只要出现那么程序中只要出现PI的地方,编译程序都译为的地方,编译程序都译为3.1415。变量变量在程序运行中其值可以改变的量。在程序运行中其值可以改变的量。一个变量由变量名和变量值构成,变量名即是存贮单元地一个变量由变量名和变量值构成,变量名即是存贮单元地址的符号表示,而变量的值就是该单元存放的内容。定义一个址的符号表示,而变量的值就是该单元存放的内容。定义一个变量,编译系统就会自动为它安排一个存贮单元,具体的地址变量,编译系统就会自动为它安排一个存贮单元,具体的地址值用户不必在意。值用户不必在意。*西南大学电

39、子信息工程学院西南大学电子信息工程学院38C51变量的数据类型无论哪种数据都是存放在存贮单无论哪种数据都是存放在存贮单元中的,每一个数据究竟要占用几个单元元中的,每一个数据究竟要占用几个单元(即数据的长度即数据的长度)都要提供给编译系统,正都要提供给编译系统,正如汇编语言中存放数据的单元要用如汇编语言中存放数据的单元要用DB或或DW伪指令进行定义一样,编译系统以此伪指令进行定义一样,编译系统以此为根据预留存贮单元,这就是定义数据类为根据预留存贮单元,这就是定义数据类型的意义型的意义.C51编译器支持数据类型见表编译器支持数据类型见表10.1。*西南大学电子信息工程学院西南大学电子信息工程学院3

40、9表表10-1 C51的数据类型的数据类型*西南大学电子信息工程学院西南大学电子信息工程学院40对表对表10.1作如下说明:作如下说明:1.字字符符型型(char)、整整型型(int)和和长长整整型型(long)均均有有符符号号型型(signed)和和无无符符号号型型(unsigned)两两种种,如如果果不不是是必必须须,尽尽可可能能选选择择unsigned型型,这这将将会会使使编编译译器器省省却却符符号号位位的的检检测测,使使生生成成的程序代码比的程序代码比signed类型短得多。类型短得多。2.程程序序编编译译时时,C51编编译译器器会会自自动动进进行行类类型型转转换换,例例如如将将一一个

41、个位位变变量量赋赋值值给给一一个个整整型型变变量量时时,位位型型值值自自动动转转换换为为整整型型值值;当当运运算算符符两两边边为为不不同同类类型型的的数数据据时时,编编译译器器先先将将低低级级的的数数据据类类型型转转换换为为较较高高级级的的数数据据类类型型,运运算算后后,运运算算结结果果为为高高级级数数据类型。据类型。3.51单片机内部数据存贮器的可寻址位单片机内部数据存贮器的可寻址位(20H2FH)定义定义为为bit型,而特殊功能寄存器的可寻址位型,而特殊功能寄存器的可寻址位(即地址为即地址为X0H和和X8H的的SFR的各位的各位)只能定义为只能定义为sbit类型。类型。*西南大学电子信息工

42、程学院西南大学电子信息工程学院41关于指针型数据(1)关于指针型变量关于指针型变量在汇编语言程序中,要取存贮单元在汇编语言程序中,要取存贮单元m的内容可用直接寻址方的内容可用直接寻址方式,也可用寄存器间接寻址方式式,也可用寄存器间接寻址方式,如果用,如果用R1寄存器指示寄存器指示m的的地址,用地址,用R1取取m单元的内容。相对应的在单元的内容。相对应的在C语言中用变量语言中用变量名表示取变量的值名表示取变量的值(相当于直接寻址相当于直接寻址),也可用另一个变量,也可用另一个变量(如如P)存放存放m的地址,的地址,P就相当于就相当于R1寄存器寄存器。用。用*P取得取得m单元的单元的内容内容(相当

43、于汇编的间接寻址方式相当于汇编的间接寻址方式)这里这里P即为指针型变量。下即为指针型变量。下面表格表示两种语言将面表格表示两种语言将m单元的内容送单元的内容送n单元的对照语句。单元的对照语句。注:注:上表省略了汇编语言程序中对符号地址上表省略了汇编语言程序中对符号地址n和和m用用EQU伪指令进行具体地伪指令进行具体地址定义的址定义的 语句以及语句以及C语言对变量语言对变量n、m和指针变量和指针变量P进行类型定义的语句,实进行类型定义的语句,实际程序设计中,此步是不可际程序设计中,此步是不可 缺少的。表中缺少的。表中&为取地址运算符,为取地址运算符,*为取内容运为取内容运算符。算符。表表1O-2

44、 1O-2 汇编语言和汇编语言和C语言的对照语言的对照*西南大学电子信息工程学院西南大学电子信息工程学院42(2)指针型数据的类型指针型数据的类型由由于于C51是是结结合合51单单片片机机硬硬件件的的,51单单片片机机的的不不同同存存贮贮空空间间,有有不不同同的的地地址址范范围围,即即使使对对于于同同一一外外部部数数据据存存贮贮器器,又又有有用用Ri分分页页寻寻址址(Ri为为八八位位)和和用用DPTR寻寻址址(DPTR为为十十六六位位)两两种种寻寻址址方方式式,而而指指针针本本身身也也是是一一个个变变量量,有有它它存存放放的的存存贮贮区区和和数数据据长长度度。因因此此,在在指指针针类类型型的的

45、定定义义中中要要说说明明:被被指指的的变变量量的的数数据据类类型型和和存存贮贮类类型型;指指针针变变量量本本身身的的数数据据类类型型(占几个字节占几个字节)和存贮类型和存贮类型(即指针本身存放在什么存贮区即指针本身存放在什么存贮区)。例如类型定义为例如类型定义为data或或idata,表示指针指示内部数据,表示指针指示内部数据存贮器;而存贮器;而pdata表示指针指向外部数据存贮器,用表示指针指向外部数据存贮器,用Ri间址。间址。以上均为八位地址;而类型以上均为八位地址;而类型code/xdata表示指针指向外部程表示指针指向外部程序存贮器或外部数据存贮器指针,本身序存贮器或外部数据存贮器指针

46、,本身(即被指即被指示地址示地址)应为应为十六位长度。如果想使指针能适用于指向任何存贮空间,则十六位长度。如果想使指针能适用于指向任何存贮空间,则可以定义指针为通用型,此时指针长度为可以定义指针为通用型,此时指针长度为3字节,第一字节表字节,第一字节表示存贮器类型编码,第二、三字节分别表示所指示存贮器类型编码,第二、三字节分别表示所指地址的高位地址的高位和低位。第一字节表示的存贮器类型编码见表和低位。第一字节表示的存贮器类型编码见表10-3:*西南大学电子信息工程学院西南大学电子信息工程学院43表表10-3通用型指针的存贮类型编码通用型指针的存贮类型编码*西南大学电子信息工程学院西南大学电子信

47、息工程学院44数据的存贮类型和存贮模式数据的存贮类型数据的存贮类型C51是面向是面向8XX51系列单片机及硬系列单片机及硬件控制系统的开发语言,它定义的任何变量件控制系统的开发语言,它定义的任何变量必须以一定的存贮类型的方式定位在必须以一定的存贮类型的方式定位在8XX51的某一存贮区中,否则便没有意义。因此在的某一存贮区中,否则便没有意义。因此在定义变量类型时,还必须定义它的存贮类型,定义变量类型时,还必须定义它的存贮类型,C51的变量的存贮类型如表的变量的存贮类型如表10-4所示:所示:*西南大学电子信息工程学院西南大学电子信息工程学院45表10-4C51的变量的存贮类型 访问内部数据存贮器

48、访问内部数据存贮器(idata)比访问外部数据存贮器比访问外部数据存贮器(xdata)相对要快一些,因此,可将经常使用的变量置于内部相对要快一些,因此,可将经常使用的变量置于内部数据存贮器中,而将较大及很少使用的数据变量置于外部数数据存贮器中,而将较大及很少使用的数据变量置于外部数据存贮器中。例如定义变量据存贮器中。例如定义变量x语句:语句:datacharx(等价于等价于chardatax)。如果用户不对变量的存贮类型定义,则编译。如果用户不对变量的存贮类型定义,则编译器承认默认存贮类型,默认的存贮类型由编译控制命令的存器承认默认存贮类型,默认的存贮类型由编译控制命令的存贮的模式部分决定。贮

49、的模式部分决定。*西南大学电子信息工程学院西南大学电子信息工程学院46存贮器模式存贮器模式存贮器模式决定了变量的默认存贮器类型、参数传递区和存贮器模式决定了变量的默认存贮器类型、参数传递区和无明确存贮区类型的说明。无明确存贮区类型的说明。C51的存贮器模式有的存贮器模式有SMALL、LARGE和和COMPACT(见表(见表10-5)。)。在固定的存贮器地址进行变量参数传递是在固定的存贮器地址进行变量参数传递是C51的一个标的一个标准特征,在准特征,在SMALL模式下参数传递是在内部数据存贮区中完模式下参数传递是在内部数据存贮区中完成的。成的。LARGE和和COMPACT模式允许参数在外部存贮器

50、中传模式允许参数在外部存贮器中传递。递。C51同时也支持混同时也支持混合模式,例如在合模式,例如在LARGE模式下生成的模式下生成的程序可将一些函数分页放入程序可将一些函数分页放入SMALL模式中从而加快执行速度。模式中从而加快执行速度。例如设例如设C语言源程序为语言源程序为PROR.C,若使程序中的变量类型和参数传递区限定,若使程序中的变量类型和参数传递区限定 在在外部数据存贮区外部数据存贮区,有两种方法:,有两种方法:方法方法1:用:用C51对对PROR.C进行编译时,使用命令进行编译时,使用命令C51 PROR.C COMPACT。方法方法2:在程序的第一句加预处理命令:在程序的第一句加

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 学术论文 > 毕业设计

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922