找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10307|回复: 27
打印 上一主题 下一主题
收起左侧

51单片机4*R0—R7疑问

  [复制链接]
跳转到指定楼层
楼主
各位大大前辈51单片机4*R0—R7为什么要用R0—R7啊,还得提前改变状态寄存器切换着用,好复杂的说。

我直接用0H—20H的直接地址不行吗?
或者直接定义为R0—R28不更方便吗?
求各位大大解惑!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:149988 发表于 2016-11-24 20:33 | 只看该作者

RE: 51单片机4*R0—R7疑问

本帖最后由 不倒翁.WZT 于 2016-11-25 06:50 编辑

R寄存器是51单片机工作寄存器区,它有一些特殊的功能。这种用法是51单片机汇编语言的一个硬性规定,不用R0—R28可能是汇编语言创建时的某些需要所决定的。
回复

使用道具 举报

板凳
ID:111634 发表于 2016-11-24 21:20 | 只看该作者
本帖最后由 zl2168 于 2016-11-24 21:47 编辑

1. 51汇编只认R0~R7,不认R8~R28。
2. 4个工作寄存器区,只能打开一个。即当前只能用一个,都称为R0~R7。至于那一组,由PSW中PSW.4、PSW.3决定。
3. 可用00H~1FH替代28个工作寄存器,但那是直接地址,不是工作寄存器。
4. R0~R7的操作指令与直接地址的操作指令是不同的,对同一存储地址(即28字节单元)的操作指令码、指令字节数和指令执行机周数都不同。51有专用于R0~R7的指令,R0~R7的操作指令比直接地址的操作指令,指令字节数少1字节,指令执行机周数少1机周。

以上摘自张志良编著《80C51单片机实用教程——基于Keil CProteus》高等教育出版社ISBN 978-7-04-044532-9, 用于学习51单片机原理,便于阅读理解,便于自学。






回复

使用道具 举报

地板
ID:123289 发表于 2016-11-25 01:49 | 只看该作者
R0-R7:对应00H-1FH,分4个页面。由于指令表中与R0-R7相关的指令很多,所以用R0-R7就很方便,被大量使用。
问题是:你主程序中用R0-R7;中断程序中也用R0-R7。
如此中断返回主程序后R0-R7就被修改了,数据就不对了。为此中断程序就要先将R0-R7压堆栈,返回时再弹出。
有了页面选择,就方便了,不用压栈弹栈了,就是修改R0-R7选择页面。
我的使用方法是:
主程序:R0-R7用0页;
时间中断:R0-R7用1页;
串口中断:R0-R7用2页;
其它中断:R0-R7用3页。
当然会依据中断级别作处理的。
对于C语言来说,无须考虑。
回复

使用道具 举报

5#
ID:138155 发表于 2016-11-25 10:02 | 只看该作者
你要是能达到直接用地址读取的话就牛逼了 也不用来提这个问题啦
回复

使用道具 举报

6#
ID:149642 发表于 2016-11-25 21:04 | 只看该作者
wuyibin2003 发表于 2016-11-25 10:02
你要是能达到直接用地址读取的话就牛逼了 也不用来提这个问题啦

怎么不可能直接地址读取?
变量1 equ 00h
变量2 equ 1fh
//省略
mov a,变量1
不就读取了????
回复

使用道具 举报

7#
ID:149642 发表于 2016-11-25 21:07 | 只看该作者
yzwzfyz 发表于 2016-11-25 01:49
R0-R7:对应00H-1FH,分4个页面。由于指令表中与R0-R7相关的指令很多,所以用R0-R7就很方便,被大量使用。
...

谢谢,我写电脑软件习惯了,都是直接定义变量,调用习惯了,这里让设计者给设计了几个变量,关键是还要切换,感觉挺麻烦的,不过你们回答的都非常好,非常专业,谢谢,我是在想,当初设计的时候为啥不弄个r0-r28省去切来切去。
回复

使用道具 举报

8#
ID:149642 发表于 2016-11-25 21:11 | 只看该作者
zl2168 发表于 2016-11-24 21:20
1. 51汇编只认R0~R7,不认R8~R28。
2. 4个工作寄存器区,只能打开一个。即当前只能用一个,都称为R0~R7。 ...

你很专业,也很用心回答,可是我还是不理解,有些指令虽然少了1个周期,但是切换也要一个周期啊,而且现在的一些单片机都优化了一些代码后工作寄存器的专用指令已经不局限于这28个地址了。
回复

使用道具 举报

9#
ID:149642 发表于 2016-11-25 21:18 | 只看该作者
yzwzfyz 发表于 2016-11-25 01:49
R0-R7:对应00H-1FH,分4个页面。由于指令表中与R0-R7相关的指令很多,所以用R0-R7就很方便,被大量使用。
...

谢谢,非常专业,非常好的回答,电脑软件写习惯了,总是定义好变量直接用就好,这个别人定义的还要组别切换,感觉挺麻烦的,有时看多了,这也是r的变量那也是R的变量都不知道哪个是哪个了,有时我在想,有些指令直接用符号还简单些,比如mov用=替代,加减乘除什么的。。。。
回复

使用道具 举报

10#
ID:111634 发表于 2016-11-25 21:40 | 只看该作者
lksbbs 发表于 2016-11-25 21:11
你很专业,也很用心回答,可是我还是不理解,有些指令虽然少了1个周期,但是切换也要一个周期啊,而且现 ...

你是用现代的标准质疑上世纪八十年代MCS-51的设计,苛求了!
现代的改进版51,主频高,不需考虑执行指令少一个机周;内存多,不需考虑指令代码少一个字节。
再说了,用c51编程,也不需考虑是R0~R7的操作指令还是直接地址的操作指令,都有c51编译器代劳了。
不过,懂汇编是很重要的。当然,不懂,也就算了,没必要深究。
回复

使用道具 举报

11#
ID:150250 发表于 2016-11-25 23:57 来自手机 | 只看该作者
汇编要学吗
回复

使用道具 举报

12#
ID:138155 发表于 2016-11-26 08:36 | 只看该作者
lksbbs 发表于 2016-11-25 21:04
怎么不可能直接地址读取?
变量1 equ 00h
变量2 equ 1fh

你试过可以执行了吗
回复

使用道具 举报

13#
ID:111634 发表于 2016-11-26 08:41 | 只看该作者
lksbbs 发表于 2016-11-25 21:11
你很专业,也很用心回答,可是我还是不理解,有些指令虽然少了1个周期,但是切换也要一个周期啊,而且现 ...

若用汇编编写程序,用工作寄存器肯定比直接地址好。
回复

使用道具 举报

14#
ID:111634 发表于 2016-11-26 08:46 | 只看该作者
本帖最后由 zl2168 于 2016-11-26 08:49 编辑
wuyibin2003 发表于 2016-11-26 08:36
你试过可以执行了吗

根本不需要先定义,直接读就行。
MOV   A,direct      ;direct代表片内RAM 00H~FFH存储单元 的 直接地址   
回复

使用道具 举报

15#
ID:150279 发表于 2016-11-26 10:24 | 只看该作者

R0-R7:对应00H-1FH,分4个页面。由于指令表中与R0-R7相关的指令很多,所以用R0-R7就很方便,被大量使用。
问题是:你主程序中用R0-R7;中断程序中也用R0-R7。
如此中断返回主程序后R0-R7就被修改了,数据就不对了。为此中断程序就要先将R0-R7压堆栈,返回时再弹出。
有了页面选择,就方便了,不用压栈弹栈了,就是修改R0-R7选择页面。
我的使用方法是:
主程序:R0-R7用0页;
时间中断:R0-R7用1页;
串口中断:R0-R7用2页;
其它中断:R0-R7用3页。
当然会依据中断级别作处理的。
对于C语言来说,无须考虑。
回复

使用道具 举报

16#
ID:150291 发表于 2016-11-26 11:02 | 只看该作者
不太清楚
回复

使用道具 举报

17#
ID:111634 发表于 2016-11-26 17:45 | 只看该作者

对c51编程来说,弄清R0-R7,不是充要条件,不懂也罢!
回复

使用道具 举报

18#
ID:146533 发表于 2016-11-26 18:05 | 只看该作者
首先,51它就是这样规定的R0到R7,然后直接寻址比寄存器寻址多一个字节,周期也要多一个。所以还是寄存器寻址还是蛮好的
回复

使用道具 举报

19#
ID:149642 发表于 2016-11-26 21:26 | 只看该作者
zl2168 发表于 2016-11-25 21:40
你是用现代的标准质疑上世纪八十年代MCS-51的设计,苛求了!
现代的改进版51,主频高,不需考虑执行指令 ...

呵呵,我不懂c,我记忆很差,c那庞大的代码完全记不住,懂汇编是发现它常用到的也就那么几个代码,才自学的。虽然现在也写过几万行汇编代码了,可是有时候还是能够认识汇编指令,有时候却像突然想不起某人名字一样要翻看电话本。。。。。。电脑编程主要是写图片处理,和字节集处理,没有写过大系统,用中文软件写的。
回复

使用道具 举报

20#
ID:149642 发表于 2016-11-26 21:30 | 只看该作者
wuyibin2003 发表于 2016-11-26 08:36
你试过可以执行了吗

我也是初学,但是可以肯定可以执行,附件是我最近在研究我们论坛里那个多模块化帖子的研究程序,发现那帖子有问题,很有问题,特别是有两行代码他说可以不写,但我怎么研究都必须要写。

多模块化例程.rar

20.71 KB, 下载次数: 10

回复

使用道具 举报

21#
ID:111634 发表于 2016-11-27 19:14 | 只看该作者
lksbbs 发表于 2016-11-26 21:26
呵呵,我不懂c,我记忆很差,c那庞大的代码完全记不住,懂汇编是发现它常用到的也就那么几个代码,才自学 ...

你与别人相反。大家都说,c比汇编容易学。你却说,“c那庞大的代码完全记不住,懂汇编是发现它常用到的也就那么几个代码”。
回复

使用道具 举报

22#
ID:111634 发表于 2016-11-27 19:23 | 只看该作者
本帖最后由 zl2168 于 2016-11-27 19:26 编辑

⒊ C51编程的特点



以上摘自张志良编著《80C51单片机实用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9, 用于学习51单片机原理,便于阅读理解,便于自学。书中电路和程序设计有详细说明,程序语句条条有注解。
回复

使用道具 举报

23#
ID:107559 发表于 2016-11-27 19:31 | 只看该作者
请参考reg51.h文件,打开后你会看见stb p0=0x80h,定义了地址从80开始。
回复

使用道具 举报

24#
ID:150587 发表于 2016-11-27 19:32 | 只看该作者
多模块的设计要怎么学习
回复

使用道具 举报

25#
ID:111634 发表于 2016-11-27 19:35 | 只看该作者
顺便说一声,刚才向你介绍的张志良编著《80C51单片机实用教程——基于Keil C和Proteus》是双解汇编和c51.
回复

使用道具 举报

26#
ID:149642 发表于 2017-1-23 14:46 | 只看该作者
zl2168 发表于 2016-11-27 19:23
⒊ C51编程的特点

谢谢,我又明白了很多,
回复

使用道具 举报

27#
ID:149642 发表于 2017-1-23 14:53 | 只看该作者
zl2168 发表于 2016-11-27 19:14
你与别人相反。大家都说,c比汇编容易学。你却说,“c那庞大的代码完全记不住,懂汇编是发现它常用到的也 ...

我的大脑内存与别人有差异,记得我当初记电话ic卡和手机号码的时候是记键盘按键顺序,至于按完了都不知道自己按了些什么,反正电话打通了,现在编程记指令都可能是指令实在是短,长的也就个lcall长点?才勉强记得住的吧,或许也是按键多了习惯了才记住,哈哈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表