补充:单片机C语言与汇编语言混合编程.ppt
《补充:单片机C语言与汇编语言混合编程.ppt》由会员分享,可在线阅读,更多相关《补充:单片机C语言与汇编语言混合编程.ppt(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
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 补充 单片机 语言 汇编语言 混合 编程