单片机编程软件实际运用较多,因而单片机编程软件具有很强的运用价值。关于单片机编程软件,小编曾带来许多介绍,如单片机编程软件有哪些等。本文对单片机编程软件的解说根据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
}
上面预处理指令中运用了反斜杠\,这儿解释一下:每一条预处理句子总是以”#”字符开端,而且不能超过一行,一旦遇到换行符句子就被作为完毕,仅有的一种能将预处理句子扩展到多行的方法便是在换行符之前加一个反斜杠('\')。
责任编辑;zl