关于C51单片机单片机的几个问题

1、徐汉斌版单片机微型计算机原理教材P144上说“中断服务程序最后一条指令必须是中断返回指令RETI“,这句话是不是错了?如果最后一句话是跳转指令不是也可以么,只不过程序不会回到断点处罢了,PC也会填充跳转处PC地址
2、在方式0定时器T0的初值为1E0CH,则TH0,TL0的初值分别为()
这题答案给的居然是F0H、0CH,我觉得分明是1EH、0CH啊,是不是答案错了
3、”MCS 51的程序计数器PC不能被用户使用,因为他没有地址“,首先,不能被用户使用指的收拾什么?其次,它没有地址那他到底在哪?
4、MOV 20H,@DPTR 这个语句错了是因为DPTR只能用于片外寻址么
5、”80C51单片机子程序调用时能自动保护断点和现场“,这句话错了是不是因为只能自动保护断点不能自动保护现场?
6、MOV A,#33H 是把33H当成无符号数吧?那么如果我想移入一个带符号数呢
7、向前转移的偏移量为什么等于(目的地址+0100H)-(原地址+3),0100H是什么?

1、徐汉斌版单片机微型计算机原理教材P144上说“中断服务程序最后一条指令必须是中断返回指令RETI”,
这句话是不是错了?
如果最后一句话是跳转指令不是也可以么,只不过程序不会回到断点处罢了,PC也会填充跳转处PC地址

--写跳转指令、或者写其它什么指令,都行,随你便。单片机都会执行。
--只是,单片机没有执行 RETI 指令,中断程序就没有结束。
--如果,你不写 RETI,中断后,单片机就永远处于中断程序之内。

2、在方式0定时器T0的初值为1E0CH,则TH0,TL0的初值分别为()
这题答案给的居然是F0H、0CH,我觉得分明是1EH、0CH啊,是不是答案错了

--写成二进制:1E0CH = 0001 1110 0000 1100B
--取其低 13 位,写成高八位、低五位:11110000、01100
--方式0的初值,就应该是:F0、0C。

3、”MCS 51的程序计数器PC不能被用户使用,因为他没有地址“,
首先,不能被用户使用指的收拾什么?其次,它没有地址那他到底在哪?
--PC 的数值,时时刻刻,在自动加一,这个特点,用户对其,不可控制。
--但是,用户,可以用 JMP 指令,改变 PC 的数值。
--说 PC 不能被用户使用,实际上是他不会用。
--51 单片机里面,确实没有 PC 的地址,因为,谁都不需要这个地址。

4、MOV 20H,@DPTR 这个语句错了是因为DPTR只能用于片外寻址么
--这个指令,并不存在。
DPTR只能用于片外寻址么
--查一下指令表,就知道了。

5、”80C51单片机子程序调用时能自动保护断点和现场“,
这句话错了是不是因为只能自动保护断点不能自动保护现场?
--中断时,51 单片机,采用压栈的方法,自动的保护断点地址。

--保护现场 ?
--单片机,不知道你的现场是什么。
--把单片机和保护现场联系在一起,就是狗戴嚼子,胡勒!

6、MOV A,#33H 是把33H当成无符号数吧?那么如果我想移入一个带符号数呢

就写上负号即可。
MOV A, #-33H
这就行了。

7、向前转移的偏移量为什么等于(目的地址+0100H)-(原地址+3),0100H是什么?
--编写程序,现在都用编译软件来进行编译。
--编译软件,会自动计算程序中的偏移量。
--编程人,根本不用讨论偏移量的计算,以及推导公式。
--有些教材,作者的思维,还停留在人工编译的阶段,抱残守缺,不用理他。
--0100H,是256。追问

果真大神啊。。。先感谢
还想问一下,2中低五位少的前三位是直接补0么
6中,首先,如果我想表示负的01H,那么最高位运算时是自动改成1么
其次,我想表示正数是是应该加+吗?

追答

--取其低 13 位,写成高八位、低五位:11110000、XXX01100
--方式0的初值,就应该是:F0、0C。
2中低五位少的前三位是直接补0么
--这前三位,写什么都不起作用,单片机并不接受这三位。

6中,首先,如果我想表示负的01H,那么最高位运算时是自动改成1么,
其次,我想表示正数是是应该加+吗?
负一,你就直接写-1,即可。
在编译时,负数就变成了补码。于是,-1就成了255。
正数,符号就可以省略。

~~~~~~~~~~~~~~~~~~~~~~~以上是在 2013-11-17 22:06 做出的回答。

后来发现,提问者采纳了错误的答案,就此又补充了一些。

下面,对错误的答案,逐条的加以分析:

1. 如果没有reti指令,...多次中断...把堆栈挤满溢出...

--如果没有reti指令,本次中断就没有结束,也就不会有多次中断。

--即使再发生了高优先级的中断,最多会也只会发生两次中断,谈何溢出?

--中断嵌套,最多只有两层。
--认为可以出现多次中断,这是基本概念不清。

2....TH0=E1H,TL0=F4H

--错误。
--正确数值可见题目给出的数值,推导过程可见做而论道的回答。

3. PC不能直接读取或改变其数值

--错误。
--去看看JMP指令的功能,就知道能不能改变 PC 了。

4.使用指针时,另外一个参数不能使用直接寻址方式

--基本概念不清。汇编语言里面,没有指针的说法。

--另外一个参数,可以使用直接寻址方式,如下:
--MOV B,@R0 这里的B,是不是直接寻址?

5.中断程序会自动保护...

--错误。
--保护断点,这是主程序干的。

--中断程序不会自动保护任何东西。

6. 51单片机只有无符号数,...

--错误。
--可以使用补码,即带符号数。
--也可以直接写上符号:-、+。

7.表达不清。为什么向前转移的偏移量等于...,并没有答出来。

============================================

提问者采纳了满篇错误的回答,还不忘贬低自己的老师,

不仅是水平太低,人品,更差。呵呵

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-11-17

    书上说的是正常完善的中断程序最后需要reti结束。你用其他方式结束当然程序也能继续执行。但是我不建议您这样使用。首先中断程序响应前会保护现场,向堆栈中存入一些数据,如果没有reti指令,堆栈数据不会释放,多次中断执行下来会把堆栈挤满,溢出,会发生不可预料的执行结果。有的人不知道自己的程序为什么会莫名跑飞,往往就是不注意这些细节造成的,个性化程序需要巧妙使用,才能避免灾难性故障

    TH0=1EH,TL0=0CH,但是如果他的初值的意思是设定的定时时间的话,TH0=E1H,TL0=F4H

    PC不能直接读取或改变其数值

    使用指针时,另外一个参数不能使用直接寻址方式

    中断程序会自动保护,子程序不会自动保护,若需要必须在子程序中自行安排指令进行

    51单片机只有无符号数,若是你要把它作为有符号数处理,你需要在程序中自行转换和识别数值。当然如果你使用C语言编写程序,编译器(比如KeilC)会自动处理你的各种数据类型

    单片机里只有加法器,减法也是用加法器完成的,被减数-减数=被减数+减数的补码。100H是为了求负数的补码时数据转换的方法

本回答被提问者采纳
第2个回答  2013-11-17
1、这句话是对的,如果是跳转那么就会出现SP堆栈混乱,进入中断时有一个保护现场的操作,也就是讲地址压栈,你执行完后跳转回去就不会有出栈操作,要不来多少次就会使SP爆满的。何况你知道什么时候进入中断的吗?

2、应该是TH0=1EH,TL0=0CH,答案有错。
3、PC是可以使用的,只是不能赋值而已,当然它确实没有物理地址,一般而言是程序执行过程中靠硬件自动改变值大小的。使用方法如下:
MOVC A,@A+PC
4、MOV 20H,@DPTR是没有这个指令的,DPTR只能通过MOVC或MOVX来访问,而且只能传送到累加器A。
5、是的,只能保护断点地址,不能保护现场比如PSW状态等。
6、可以呀,有无符号是靠你自己的决定的,一般而言,最高位为1位负数,位0 为正数这就是有符号数,没有特别说明和设定,一般都是做无符号数处理。
7、我感觉你的0100H应该是当前转移指令的地址,也即是SJMP的地址。本回答被网友采纳

51单片机C51语言的几个问题。
问题二:sbit在问题1中说的很清楚了,就是为某一位起别名,sfr 这个关键字在reg52.h头文件中出现很多 它是单片机开发商把特殊功能寄存器的物理地址映射到一个宏上面,这样的话就可以对寄存器操作了,你自己可以改动,比如reg52.h中的sfr P0 = 0x80;你改为sfr PP=0X80; 那么单片机上的P1口(...

关于C51单片机单片机的几个问题
--写跳转指令、或者写其它什么指令,都行,随你便。单片机都会执行。--只是,单片机没有执行 RETI 指令,中断程序就没有结束。--如果,你不写 RETI,中断后,单片机就永远处于中断程序之内。2、在方式0定时器T0的初值为1E0CH,则TH0,TL0的初值分别为()这题答案给的居然是F0H、0CH,我觉得...

c51单片机程序运行顺序的问题?
任何单片机在强电磁干扰下都可能会出问题,所以从设计上要把隔离和抗辐射做足。A、当程序进入外部中断1时断开加热,这个时候只有等待到启动加热信号才跳出外部中断,那么其他程序都不执行了吗?比如这个时候收到启动语句6(异步电机正转信号)。是的,主循环在中断执行期间是不会得到执行的。问题:B、怎么...

51单片机的问题
7.定时\/计数器工作于定时方式时,是通过89C51片内振荡器输出经12分频后的脉冲进行计数,--对。直至溢出。--这要看你的软件,也可以让它永远不溢出。8.80C51单片机的扩展程序存储器与片内程序存储器存储空间重叠。--可以重叠,也可以不重叠。--这要看,是谁设计电路了。9.在中断响应时断点地址...

51单片机的编程问题?
51单片机一个显著优点就是指令执行时间固定,因此可以适应时序要求严格的场合。例如符合ISO7816协议的cpu卡的读写,对时序要求比较严格。其实就是用io脚做出来的同步半双工串口。支持cpu卡的程序一般比较庞大,需要用c51来组织,但是由于c编译的不确定性,必须把底层程序封装成汇编语言模块嵌入到工程中。这就...

急!C51单片机I\/O口默认高电平问题!!!
1. 在C51单片机中,P0、P1、P2、P3端口的寄存器地址分别为0x80、0x90、0xA0、0xB0。这些地址指的是端口寄存器的地址,并非端口的默认高电平或低电平值。2. 如果发光二极管(LED)是高电平驱动的,当P0口输出值为0xFF(二进制为11111111)时,LED会亮起。然而,这个值不是直接从头文件中获得的,...

89c52系列的c51单片机开发版刚买来的,烧入代码后没有写蜂
刚入手的89c52系列C51单片机开发版,尝试烧入代码后却并未实现预期功能,如蜂鸣器的激活。这反映出开发过程中的几个关键问题,需深入探讨。首先,硬件知识的缺失是入门单片机开发的一大障碍。对于蜂鸣器的接线位置、所连接的P口引脚等基本硬件配置,若不清楚,将直接影响到后续代码的正确性。因此,熟悉硬件...

谁能帮我检查下,这个C51单片机的汇编语言有什么错误!
存在以下几个问题:1. 在按键的延时去抖动后,没有重新读取按键键值,即:L8: ACALL DELAY CJNE A,#0FFH,SAVE 这两条指令中间应插入:MOV A, P1,否则你用来比较的A还是第一次读到的A 2. 你在检测到按键按下后,没有等待键释放再去检测下一个按键。从你的程序中看,检测到按键按下后,...

C51 单片机 局部变量 问题
同样可以得出一个结论,正是因为单片机的RAM有限,才会导致局部变量不清除。对于电脑来说,空间近乎无限的,随时随地你都可以分配空间给变量用。但是51单片机就那么128字节,必须详细策划好如何分配,所以局部变量才有了自己固定的地盘。说到这里,我相信你的问题我已经找到答案了,虽然都是我推测的,但是十...

c51单片机问题C语言
单片机支持汇编编程的C51编程。1、汇编编程,传统的汇编代码。缺点:可读性不强,优点:代码精简 2、C51编程,使用专用C语言编程。缺点:代码不精简,优点:可读性强。KeilC和IAR等编译软件,同时支持C51和汇编代码。

相似回答