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

2025-03-12 12:35:50
推荐回答(3个)
回答1:

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:

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

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

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

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

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

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

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

回答3:

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的地址。