导航:首页 > 操作系统 > 为什么51单片机不用声明数据段

为什么51单片机不用声明数据段

发布时间:2022-07-12 22:22:57

A. 51单片机编程问题

1:C51编译器如何区分位地址和字节地址
是靠预定义实现的,比如:sfr P0 = 0x80; sbit P0_0 = 0x80;前者声明了P0端口地址位于0x80,后者说明了P0端口的bit0,即P0.0位于位地址空间0x80处。这2个0x80具有完全不同的含义,靠关键字sfr和sbit来区别。这样当程序被编译时,编译器会依此编译成相应的汇编语言。例如:

C51语句: P0 = 1;

P0声明为sfr,因此编译成:mov 80h,01h,将把0x01数据送入0x80单元,由于0x80单元物理上对应P0端口,因此,P0.0脚将输出高电平(其实是呈现高阻态,P0口独有的),其他.1-.7脚输出低电平。

C51语句: P0_0 = 1;

P0_0声明为sbit,因此编译成:setb 80h,这将把位地址空间的0x80地址的bit的值置1。这个位正是P0口的bit0,执行后,P0.0将输出高阻态。而P0.1-.7不会变化。

2:C51为什么要嵌套汇编
51单片机一个显着优点就是指令执行时间固定,因此可以适应时序要求严格的场合。例如符合ISO7816协议的cpu卡的读写,对时序要求比较严格。其实就是用io脚做出来的同步半双工串口。支持cpu卡的程序一般比较庞大,需要用c51来组织,但是由于c编译的不确定性,必须把底层程序封装成汇编语言模块嵌入到工程中。这就带来几个问题:如何声明函数、参数如何传递等。限于篇幅,不能说得很细。下面举例:

汇编程序单独保存一个文件,加入到工程中,函数如下:

_proc_a:

mov a, r7

inc a

mov r7, a

ret

用c语言在.h文件中声明: extern unsigned char proc_a(unsigned char val);

调用时形如: retvalue = proc_a(0x11);

说明:

a:汇编程序如果带参数,则需要在汇编程序前多加一个下划线。而声明它的地方不用加(伟福编译器这么要求的)。

b:函数的形参中第一参数用R7传递,函数返回值用R7返回,这是C51的通用规范。其他参数都有相应规定。函数可以返回一个位,用psw的c位返回。c:上面的语句,执行顺序是把0x11给R7,然后跳转子程序,子程序将它加1后送回。

d:函数跳转到汇编程序时,本区的R0-R7,A,B,PSW,DPTR等寄存器可以供子程序使用,不必考虑调用后是否要恢复这些常规资源。上例中,A的值被函数使用了,编程者不必恢复调用前的值。

B. 单片机输入时为什么要先定义接口比如直接使用P2^0的值为什么不可以而要声明sbit XX=P2^0;

因为P2^0口程序自己没有自己定义,必须自己声明,但是你可以直接对整个P2口进行操作,如
P2=0xff. 这是因为P2口在include<reg51.h>中得reg51.h已经定义好了,你可以把鼠标放在reg51.h上,右键,选择open,查看里面已经定义多得一些引脚和寄存器等东西。

C. 为什么51单片机的地址总线是16位而数据总线8位为什么不都是16或者都是8呢

1.51单片机是8位的,因为其中的累加器是8位,所以一次最多能处理8位的数据,所以数据总线是8位的。如果数据总线是16位,那一次要将16位数据分两次8位来处理,这样的效率反而降低了,不合算。

2.如果地址总线是8位的,那能访问的ROM空间有多大?只有256字节!一般写的程序都会大于256字节吧?再说256字节的ROM能保存怎样的一个程序呢?

D. 有一个问题,51单片机中是否需要函数声明

第一个程序,使用的i,j,k是全局变量,而且中断是电平中断,在没有清中断标志位的情况下,在按下中断电路后,会产生多个中断信号,每个中断程序都在把他们清零,从而相互影响,导致很难达到计数终点,程序难以终止;而第二个程序使用的是局部变量,各中断程序相互独立进行不受干扰的延时,所以表现正常。

E. 51单片机C程序为什么不能声明浮点数

#include <reg51.h>
void main()
{ float c,a=78.3, b=70.1;
c=a-b;

}
试试先,好像单片机里面用浮点运算比较复杂..

F. 51单片机在申请变量时总是有data,idata,xdata等限定词,可以不用吗有什么好处吗为什么别的单片机没有

data: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。
idata: 固定指前面0x00-0xff的256个RAM,其中前128和dATa的128完全相同,只是因为访问的方式不同。idata:是用类似C中的指针方式 访问的。汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idATa做指针式的访问效果很好)
xdata: 外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。
pdata: 外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG, 建议少用。

G. 51单片机C编程中的问题

你的编译模式用的不对,你的data数据段指定的太短了。用large模式试一试。

在C编译器里,变量有两个地方可以放,数据段和堆栈段,而外部变量是必须放到数据段中的。解决办法是:优化程序,将除了信号量以外的数据耦合都用参数调用方式来进行,而不要用外部变量,既增强了程序可读性,又减小了数据段空间。

阅读全文

与为什么51单片机不用声明数据段相关的资料

热点内容
php开发客户端 浏览:998
theisle测试服怎么搜服务器 浏览:447
广播PDF 浏览:218
单片机编程300例汇编百度 浏览:35
腾讯云连接不上服务器 浏览:222
不能用来表示算法的是 浏览:861
6轴机器人算法 浏览:890
手机主题照片在哪个文件夹 浏览:294
安卓手机后期用什么软件调色 浏览:628
cad修改快捷键的命令 浏览:242
好钱包app怎么登录不了 浏览:859
树莓派都用python不用c 浏览:757
access文件夹树的构造 浏览:662
安卓多指操作怎么设置 浏览:658
linux树形目录 浏览:727
平方根的简单算法 浏览:898
千牛订单页面信息加密取消 浏览:558
单片机自制红外遥控灯 浏览:719
服务器最小配置怎么弄 浏览:853
ibm服务器硬件如何升级 浏览:923