2020年 02月 15日 星期六
您的位置: 威廉希尔主页 > 单片机技术 >

keil c51单片机编程直接使用二进制的方析

来源:未知     作者:威廉希尔     发布时间:2020-02-15 10:46         

  编程软件实际使用较多,因此单片机编程软件具备很强的使用价值。对于单片机编程软件,小编曾带来诸多介绍,如单片机编程软件有哪些等。本文对单片机编程软件的基于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指令,就可以来回切换两个数据指针。

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

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

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

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

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

  字符开始,并且不能超过一行,一旦遇到换行符语句就被当做结束,唯一的一种能将预处理语句扩展到多行的办法就是在换行符之前加一个反斜杠(\)。责任编辑;zl

  例如:家的网络带宽是100mbps=100*1000kbps,为什么我的下载流量没有达到那么高,这里....

  计算机语言通常是一个能完整、准确和规则地表达人们的意图,并用以指挥或控制计算机工作的“符号系统”。计....

  近些年来兴起的二维码,让大家只要扫一扫就能轻松获取各种信息或进行电子支付。这些黑白小方块看似简单,能....

  信息化: 是指将企业在生产经营过程中所发生的业务信息进行记录、储存和管控,用来提供给各层次的人....

  究竟是什么让一枚虚拟货币的汇率在3年间翻了25000倍,是什么力量让央行副行长“感兴趣”但“不承认”....

  二进制来写程序这么的事情,的确是很装的事情,但是它不但是一件很装的事情,也是掌握底层知识的基础....

  们先重述标题。本文的研究讨论了一种用于学习半空间的算法,该算法在与分布无关的PAC模型中使用,且研究....

  通常,异步传输是以字符为传输单位,每个字符都要附加 1 位起始位和 1 位停止位,以标记一个字符的开....

  学习单片机编程,首先要学习基本的模拟电和数字电知识。掌握常用电子器件的工作原理和使用方法。

  1.“与”运算 “与”运算是实现“必须都有, 否则就没有”这种逻辑的一种运算。其运算规则是 0 ¡¤0 = 0 1 ¡¤...

  近些年来兴起的二维码,让大家只要扫一扫就能轻松获取各种信息或进行电子支付。这些黑白小方块看似简单,能....

  IAR里面编写的H文件,怎么没有编译按钮 没办法编译啊? IAR,里面怎么写H文件 ...

  进位定义: 在基本算术中,进位是一种运算形式,加法运算中,每一数位上的数等于基数时向前一位数进一, 它是标准算...

  (1)加法 带符号数进行加法运算时,加数与被加数均用补码形式表示,其结果仍为补码,只要结果不超过的数表示的范围...

  (1) 加法 按照加法运算规则, 从最低位开始逐位相加。例如 (2) 减法 按照减法运算规则, 从最低位开始逐位...

  二进制运算规则 二进制的运算算术运算二进制的加法:0+0=0,0+1=1 ,1+0=1, 1+1=10(向高位进位); 二进制的减...

  计算机中的有符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“...

  在 RFID 系统的应用中,有效地解决标签的碰撞问题和如何提高标签的识别速率对整个RFID 系统的应....

  我们知道并且喜欢的数字系统是以10为底的。这意味着数字的每一新列都是最后一列的10倍(如果您不相信我....

  如:因为51内的RAM很小,C51的函数并不通过堆栈传递参数(重入函数除外),局部变量也不存储在堆栈....

  你以为会写中文就会编程吗?这就像你以为会写汉字就会写出好文章一样。编程是和机器沟通,因而要用机器的言....

  时间设置:许多使用rtc的Arduino示例在设置时间方面都很随意。他们经常使用草图的编译时间来设置....

  现在它已经完成,看起来相对简单,但由于这是我迄今为止尝试过的最大项目,因此随着项目的进展,设计的各个....

  Python标准库:Python自带的标准库。Python标准库无需安装,只需要先通过import方....

  CF(carry flag):进位标志位。这个位是在进行无符号数运算的时候用到的。一般情况下,这个位....

  1987年,美国学者Robert Hecht-Nielsen提出了对偶神经网络模型 (Count....

  用于表示数字电的电压可以是任何值,但通常在数字和计算机系统中,它们保持在10伏以下。在数字系统中,....

  我们知道十进制(或 denary )数字使用十进制(基数为10)编号系统,其中十进制数中的每个数字都....

  将二进制转换为十进制(base-2到base-10) )数字和背面是一个重要的概念,因为二进制编号系....

      威廉希尔