当前位置:首页 > 单片机 > 单片机
[导读]单片机编程软件实际使用较多,因此单片机编程软件具备很强的使用价值。对于单片机编程软件,小编曾带来诸多介绍,如单片机编程软件有哪些等。本文对单片机编程软件的讲解基于Keil C51,主要内容为介绍keil对双数据指针的支持情况以及其代码生成机制,并为大家介绍keil c51直接使用二进制的方法。

单片机编程软件实际使用较多,因此单片机编程软件具备很强的使用价值。对于单片机编程软件,小编曾带来诸多介绍,如单片机编程软件有哪些等。本文对单片机编程软件的讲解基于Keil C51,主要内容为介绍keil对双数据指针的支持情况以及其代码生成机制,并为大家介绍keil c51直接使用二进制的方法。

在8051体系中,数据指针DPTR作为一个特殊的16位寄存器,用于寻址64 KB的XDATA或CODE空间,通常它被当作一个16位指针,指向一个常数表。双数据指针可以改善同时有两个16位指针使用时的性能。作为一种增强特性,有许多8051派生型器件支持双数据指针。以宏晶科技STC89系列的产品为例,DPTR被增强为DPTR0和DPTR1两个,仍然使用原来的地址,用另外一个SFR AUXR1的0位DPS来切换。当DPS位为0时,所有对DPTR的操作使用DPTR0;当DPS位为1时,所有对DPTR的操作使用DPTR1。这样,通过一个简单的INC AUXR1指令,就可以来回切换两个数据指针。

一、Keil C51对双数据指针的支持情况

作为一个常用的C51编译器,Keil C51是支持双数据指针的,但并不是直接支持。如果要在C51程序中使用双数据指针,有一些特别的要求。

首先来看Keil C51是如何支持双数据指针的。

在Keil C51的编译器手册中指出:#pragma modp2可以打开Philips或Atmel WM系列器件中有双DPTR的型号,并且可以提升以下库函数的性能,包括:memcpy,memmove,memcmp,strcpy,strcmp。

Keil公司也提供了一个对照表,对比性能的提升。对比的型号是8051和Dallas 320,函数是memcpy块拷贝。对照表如下:

看起来似乎使用库函数就可以大幅度提高程序性能,但实际上这样做并不能保证一定可以提高程序性能。首先Dallas 320是4T的CPU,本身就比12T的8051快。其次,以memcpy为例,它的原型是void*memcpy(void*s1,const void*s2,int len),其传人参数有3个,合计8字节,要使用数据段来传送。在数据量少的情况下,参数传递的开销就有可能大过数据传递的开销。如果想要在数据块拷贝或移动的同时对数据加以处理,比如在一个目的数据块后面加上一个校验和,那么使用库函数是办不到的,只有通过循环来进行。当数据块的源和目都是16位地址时,每一次循环都会有两次对数据指针的赋值,在源地址和目地址之间来回切换,这时采用双数据指针会有效地提高程序性能。

如果要在程序中直接生成使用双数据指针的代码,目前没有直接的编译指令。Keil公司在它的网站上曾说过多数据指针支持库函数,并且目前也未打算在编泽器中直接支持多数据指针。

二、 Keil C中直接生成双数据指针的代码

实际上,Keil C51编译器还是可以直接生成使用双数据指针的代码的,只要没定好适当的优化级别,安排好适当的C51语句,编译器就会生成使用双数据指针的代码。下面给出一个例子,使用双数据指针将CODE区的一个16字节的数组拷贝到XDATA区。 编译后其中for循环的汇编代码主体如下:

可以看到,汇编代码基本上是最简化的使用双数据指针的汇编程序。

由上面的代码可知,在优化级别7(Extended Index Ac-cess OpTImizing)的作用下,DPTR被调用了。通过类型转换和SFR指令的配合,双数据指针指令被生成。这足一个经验方法,基本上这是一个框架,可以在看到双DPTR调用被生成后加入其他语句,在块操作的同时处理数据。

三、调试环境的设定

在Keil uVision2环境下,软件仿真Philips或AtmelWM系列器件中有双DPTR的型号时,仿真器中会有AUXR1、DPTR0、DPTR1这3个寄存器。如果不使能双DPTR特性,仿真时DPTR的值是混乱的。对于宏晶科技STC89系列器件的双DPTR特性,打开软件仿真设定的具体步骤是:在File/Device Database菜单中选择STC的某一具体型号,在OpTIons框中"CPU="一项后加上MODP2,然后单击Update更新器件库。打开双数据指针调试后,再启动Debug,就会有AUXR1、DPTR[0]、DPTR[1]这3个寄存器。当加载上述程序时,会清楚地看到双数据指针的操作和AUXR1的变化。

四、Keil C51中直接使用二进制数方法

在Keil C51中数不能直接以二进制形式赋值,虽然在8051的汇编中是可以的。二进制数虽然书写长,易出错,但是由于是一位位写的,所以程序设计者能够很明确的看到每一位的状态,看得比较直观。于是很多人怀念了8051的汇编,很想在C51中使用二进制。没猜错的话搜到本篇日志的人很可能就是来找这种解决办法的,下面两种办法都是不错的选择。

方法一:

建立一个头文件,将所有的二进制数宏定义列举出来,用的时候直接使用宏定义,头文件定义:binary(右键>>“目标另存为”>>下载)。

方法二:

做一个带参数宏定义,将输入的类二进制数变换为对应的16进制数,整个定义和使用实例请见下文,可以直接使用,如果想研究原理又看不懂带参宏定义的朋友们请参考谭浩强的《C程序设计》预处理命令一章内容(第三版在P204-P211)。

#define LongToBin(n) \

(\

((n >> 21) & 0x80) | \

((n >> 18) & 0x40) | \

((n >> 15) & 0x20) | \

((n >> 12) & 0x10) | \

((n >> 9) & 0x08) | \

((n >> 6) & 0x04) | \

((n >> 3) & 0x02) | \

((n ) & 0x01) \

)

#define Bin(n) LongToBin(0x##n##l)

void main(void)

{

unisigned char c;

c = Bin(10101001); //相当于c = 0xA9

}

上面预处理指令中使用了反斜杠\,这里解释一下:每一条预处理语句总是以"#"字符开始,并且不能超过一行,一旦遇到换行符语句就被当做结束,唯一的一种能将预处理语句扩展到多行的办法就是在换行符之前加一个反斜杠('\')。

以上便是此次小编带来的“单片机编程软件”相关内容,通过本文,希望大家对keil c51的双数据指针以及代码生成等知识具备一定的认知。如果你喜欢本文,不妨持续关注我们网站哦,小编将于后期带来更多精彩内容。最后,十分感谢大家的阅读,have a nice day!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

语音识别技术,也被称为自动语音识别(Automatic Speech Recognition,ASR),其目标是将人类的语音中的词汇内容转换为计算机可读的输入,例如按键、二进制编码或者字符序列。

关键字: 语音识别 按键 二进制

触发器是数字逻辑电路中的基本元件,用于存储二进制状态。RS触发器是最早的触发器类型之一,由两个与门和一个或门构成。基本RS触发器具有置位、复位和保持功能,其特性方程是描述触发器输入与输出之间逻辑关系的数学表达式。

关键字: 触发器 数字逻辑电路 二进制

半加器虽然可以完成两个二进制位相加,但是它无法处理进位问题,因此不能用于加上多位数。为了解决这个问题,我们引入全加器。

关键字: 半加器 全加器 二进制

将“二进制”单独拿出来作为一节来讲,是因为它是一个极为基础的概念。但是很多人对二进制并没有形象的认识,甚至有一些已经入门、稍有开发经验的人对它的理解仍然比较模糊。所以振南认为有必要将它以一种更为形象、通俗而又深刻的方式着...

关键字: 二进制 单片机 CPU

二进制(binary),是在数学和数字电路中以2为基数的记数系统,是以2为基数代表系统的二进位制。这一系统中,通常用两个不同的符号0(代表零)和1(代表一)来表示。发现者是莱布尼茨。数字电子电路中,逻辑门的实现直接应用了...

关键字: 单片机 二进制 十六进制

Base64就是一种基于64个可打印字符来表示二进制数据的方法,网络上最常见的用于传输8Bit字节码的编码方式之一。

关键字: Base64 64 二进制

计算机网络编程中一个非常基本的问题:该怎样表示client与server之间交互的数据,在往下看之前先想一想这个问题。

关键字: 计算机 二进制

外部数据总线是中央处理器CPU(Central Processing Unit)的一部分,是CPU与外部数据传输的通道。外部数据总线一次可传输二进制数据的位数越大,CPU与外部交换数据的能力越强。

关键字: 外部数据线 CPU 二进制

关注星标公众号,不错过精彩内容来源| 码农的荒岛求生准确的来说,CPU不认识也不理解任何东西。CPU就像一个单细胞一样,本身不具备任何思考能力,没什么自己的想法,你给它一个刺激,它只是简单的会有一个反应。那这个刺激是什么...

关键字: CPU 二进制

寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。按照功能的不同,可将寄存器分为基本寄存器和移位寄存器两大类。

关键字: 寄存器 二进制 CPU
关闭
关闭