您的位置 首页 传感器

ASM51调用C51函数的完成

MCS-51系列单片机在目前和今后的相当一段时间内都将是我国的单片机主流机种。但在早期的开发过程中,程序员不得不从深奥的汇编语言…

MCS-51系列单片机在现在和往后的适当一段时刻内都将是我国的单片机干流机种。但在前期的开发过程中,程序员不得不从艰深的汇编言语开端探索,一起要求开发人员对硬件亦有适当的子解。比较而言,专用8051系列单片机规划的Franklin C51言语是一种通用的高档结构化的程序规划言语。入门简略,程序可读性强,调试、移植都很便利,故开发功率高,特别在数值运算处理便利具有很大的优势(这正是ASM51汇编言语的薄弱环节)。不过,C言语虽然也可对核算机的硬件体系进行操作,但在处理特别I/O口和中止向量方面,不如汇编那样直接、有用。因而,在功率为重的今日,将ASM51汇编与C51言语结合起来,充沛发挥各自的优势,无疑是单片机开发人员的最佳挑选。

1 、汇编与C51的混合编程

一般的做法都是运用C51上手简略、便于了解的优势来编写主程序,在C51言语不便利处理或许功率比较低时调用汇编函数。考虑到MCS-51(特别是 8031内部的资源装备状况:可用的RAM不到256字节,5个固定地址的有限中止源,4个8位并口中实践可作I/O口的只需P1口。因而要求开发都对单片机的内部结构有清楚的了解,并尽可能地统筹组织这些资源。现实也证明,不了解汇编言语是很难写出高效程序的。故笔者的观念是运用汇编言语对I/O接口、中止向量及程序空间分配的茂大优势,让程序员对MCS-51内的第一个字节乃至是每一比特(可位寻址的空间)悉数进行统筹组织,规划好各个程序模块,包含 I/O口地址和中止向量地址的处理;一起在详细的数据处理、通讯等不需求过多与硬件直接打交道的程序模块中,充沛运用C51言语强壮高效的编程才能。

最终的关键是怎么让汇编模块能正确辨认C51函数并调用它来完结相应的功用。ASM51汇编与C51言语之间的调用约好并不简略,并且各种编译器运用的约好不尽相同,乃至还依赖于程序所挑选的大、中、小存储形式。一般每个需传递的参数按调用次序和类型分别由约好的寄存器来传递。假如参数过多或许无满足寄存器可用时,参数的传递将在固定持存储器区域内进行,相同类型的参数同享一个参数传递段,按参数调用次序递加其寄存地址,回来值也由约好的寄存器或地址段回来。由此可见程序调用的功率必将遭到接口杂乱度的影响。虽然现在的单片机仿真器现已供给了标准接口的全主动转化功用,减少了接口工作量,但在程序的调试及移植中,假如程序员不了解这些接口的各种约好,将对呈现的过错手足无措。比方回来值不止一个时,编译器自己就无法正确完结接口装备。这儿力荐一种简练有用的调用办法——无参数化调用。

2 、ASM51无参数化调用C51函数的完结原理

所谓的无参数化调用是指让C51子函数不带任何参数,这样就能够从底子上避开调用参数的传递和回来值的组织等繁琐易犯错的问题,只需求简略地在汇编言语最初阐明一下外部C51子函数(“EXTRN code()”)。至于C51函数中需求运用的外部参数值及其回来值,彻底能够经过参加C51的< absacc.h>头文件来处理。

头文件中的函数原型为:

# define CBYTE((unsigned char *)0x50000L)

# define DBYTE ((unsigned char *)0x50000L)

# define PBYTE ((unsigned char *)0x50000L)

# define XBYTE((unsigned char *)0x50000L)

其间CBYTE界说为寻址CODE程序区;DBYTE界说为寻址DATA数据区;PBYTE界说为寻址相关于MOVX @R0″指令的分页数据XDATA区;XBYTE界说为寻址相关于MOVX @DPTR”指令的散布数据XDATA区。它们的类型决议了肯定地址空间的方位。

引入该头文件后,程序员就能够对8051系列单片机的存储器进行肯定地址的拜访,把对参数值和回来值的操作转化为对存储器肯定地址的操作,像纯汇编操作相同,底子不必界说C51函数与汇编接口的参数和回来值的装备,然后进步了调用功率。详细做法是:先在C51函数中界说好传递参数和回来值所需求的各个肯定地址(视程序员自己的空间装备而定),在其它汇编模块中将C51函数中将要运用的参数值放入这些肯定地址中,把被调用C51模块将输出的核算值(能够不止一个)也放入相似的肯定地址中。所以,当C51函数中需求运用某个参数值时,就直接从相应的肯定地址中读取该值;当其他汇编模块中需求运用C51函数回来值时,也直接对寄存回来值的肯定地址进行读操作即可。下面以一个调试经过的汇编调用C51函数的简略程序为例进行详细阐明。

3 、ASM51无参数化调用C51函数的完结示例

该体系要示但是单片机依据实时采样输入的转速完结机车速度的丈量,并可随键盘输入的车轮直径改变实时调整车速,最终将车速和轮径值都显现出来。规划使命很简略,编程中的最大难度就在于车速的核算程序。因为轮径值要求准确到mm(最大值超过了1000),车速的核算结果要保留到小数点后一位,因而需求进行浮点数运算,期间还要完结数的各种进制间的换算。虽然算法简略,但实践用汇编言语完结起来常常考虑不周,调试起来费时吃力(笔者调试经过的这段汇编代码长达近400行)。这样,天然就想到调用C51函数了,充发发挥两种言语的优势。先用汇编言语规划好各个模块,包含循环显现车速和轮径值的主程序模块,呼应采样转速值和键盘输入两个中止模块,代码如下所示。

EXTRN CODE(CALL1) ;声明外部C51函数

ORG 0000H

LJMP MAIN

ORG 0003H

AJMP KEYINPUT ;键盘输入中止

ORG 000BH

AJMP SETTIME ;采样时刻到,采样转速值中止

ORG 0100H

KEYINPUT:…… ;键盘输入中止

…… ;将键盘输入信号保存在

;70h~73h的地址空间中

RETI

ORG 0600H

SETTIME:…… ;采样时刻到,采样转速值中止

…… ;将转速值放置在地址为3Ah的空间中

;紧接着调用外部C51函数CALL1()进

;行车速的核算

LCALL CALL1

RETI

ORG 2000H ;主程序模块

MAIN:…… ;首要进行初始化操作

……

;直接从地址空间70h~77h中读取显现数据,循环显现车速和轮径值

END

这些小模块用汇编完结起来不只简略,并且程序员能够清楚地了解到各个模块的出入口及其相应的功用,完结对程序空间的充沛装备。最终用C51言语来完结车速的核算模块CALL1()。曾经用汇编编写的近400行代码,一会儿被压缩到20~30行(真实的核算代码仅9行),不只简略易懂,并且简直就不需求调试了。

下面的代码是核算模块CALL1()及其需求的肯定地址界说。

#pragma code small

#include

#include

#define PI 3.1415926

#define NCIRCLE DBYTE[0x3A] ;界说放置转速的肯定地址

#define DIRECT1 DBYTE[0x70] ;界说放置轮径千位的肯定地址

#define DIRECT2 DBYTE[0x71] ;界说放置轮径百位的肯定地址

#define DIRECT3 DBYTE[0x72] ;界说放置轮径十位的肯定地址

#define DIRECT4 DBYTE[0x73] ;界说放置轮径个位的肯定地址

#define VELOCITY1 DBYTE[0x74] ;界说回来车速的千位肯定地址

#define VELOCITY2 DBYTE[0x75] ;界说回来车速的百位肯定地址

#define VELOCITY3 DBYTE[0x76] ;界说回来车速的十位肯定地址

#define VELOCITY4 DBYTE[0x77] ;界说回来车速的个位肯定地址

void call1()

{

float data result;

int data DIRECT;

DIRECT=DIRECT1*1000+DIRECT2*100+DIRECT3*10+DIRECT4;

result=(DIRECT/1000.0)*PI*NCIRCLE*3.6;

VELOCITY1=result/100;

Result=result-VELOCITY1*100;

VELOCITY2=result/10;

result=result-CELOCITY 2*10;

VELOCITY3=result;

result=result-VELOCITY3;

VELOCITY4=result*10;

}

在本例中界说了肯定地址空间70h~77H和3AH。其间3AH寄存采样转速值输入模块输入的转速;70H~73H的地址空间中寄存键盘输入中止模块中键盘输入的轮径值;而地址为74H~77H的空间中则寄存核算模块中的车速核算回来值。虽然需求传递和回来的参数比较多,但经过这些肯定地址的界说,彻底处理了本来杂乱的汇编与C51之间的调用接口装备。核算模块中需求运用转速和轮径值时,将主动从肯定地址3AH和70H~73H中取值;在循环显现车速和轮径值的主程序模块中则直接读取肯定地址空间70H~77H的各个数据进行循环显现。当然,程序员能够依据自己的空间装备别的界说这些肯定地址。

以上程序代码均已在Dais-52.196P仿真器上顺畅调试经过。

由上面的简略程序能够看出这种无参数化调用办法的优越性和有用:从程序代码看,无论是编写C51子程序仍是汇编主程序,都与编写纯C51函数或许纯汇编主程序的格局彻底相同,从底子上简化了C51与汇编函数之间的接口编程,进步了程序调用的功率;充沛运用了汇编与高检验C51言语各自的长处,开发、调试快速便利,通用性强,特别适合于初学者。关于杂乱程序,相同能够运用无参数化办法来协助完结。这关于进步单片机应用程序的开发功率很有含义。

无参数化调用实质上在C51函数中界说了几个全局变量(肯定地址),依托它们直接完结参数值的传递和回来值的调用,适当于一种程序员自界说的传递办法,扔掉了传统C与汇编之间的接口约好。只需程序员组织妥当,还能够进一步人工完结C51中的动态掩盖重用,进步RAM区的运用功率。由上也可看出:无参数化调用办法要在ASM汇编调用C51函数时才分依速无参数化思维,就违反了运用C51编程,过衷,因小失大。当然,假如开发人员现已对C51与汇编函数之间的参数传递接口很熟悉,彻底能够按接口约好或许由编译器主动完结参数的传递。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/266735.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部