找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 12325|回復(fù): 27
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)4*R0—R7疑問

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:149642 發(fā)表于 2016-11-24 10:18 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
各位大大前輩51單片機(jī)4*R0—R7為什么要用R0—R7啊,還得提前改變狀態(tài)寄存器切換著用,好復(fù)雜的說。

我直接用0H—20H的直接地址不行嗎?
或者直接定義為R0—R28不更方便嗎?
求各位大大解惑!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:149988 發(fā)表于 2016-11-24 20:33 | 只看該作者

RE: 51單片機(jī)4*R0—R7疑問

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

R寄存器是51單片機(jī)工作寄存器區(qū),它有一些特殊的功能。這種用法是51單片機(jī)匯編語言的一個(gè)硬性規(guī)定,不用R0—R28可能是匯編語言創(chuàng)建時(shí)的某些需要所決定的。
回復(fù)

使用道具 舉報(bào)

板凳
ID:111634 發(fā)表于 2016-11-24 21:20 | 只看該作者
本帖最后由 zl2168 于 2016-11-24 21:47 編輯

1. 51匯編只認(rèn)R0~R7,不認(rèn)R8~R28。
2. 4個(gè)工作寄存器區(qū),只能打開一個(gè)。即當(dāng)前只能用一個(gè),都稱為R0~R7。至于那一組,由PSW中PSW.4、PSW.3決定。
3. 可用00H~1FH替代28個(gè)工作寄存器,但那是直接地址,不是工作寄存器。
4. R0~R7的操作指令與直接地址的操作指令是不同的,對同一存儲(chǔ)地址(即28字節(jié)單元)的操作指令碼、指令字節(jié)數(shù)和指令執(zhí)行機(jī)周數(shù)都不同。51有專用于R0~R7的指令,R0~R7的操作指令比直接地址的操作指令,指令字節(jié)數(shù)少1字節(jié),指令執(zhí)行機(jī)周數(shù)少1機(jī)周。

以上摘自張志良編著《80C51單片機(jī)實(shí)用教程——基于Keil CProteus》高等教育出版社ISBN 978-7-04-044532-9, 用于學(xué)習(xí)51單片機(jī)原理,便于閱讀理解,便于自學(xué)。






回復(fù)

使用道具 舉報(bào)

地板
ID:123289 發(fā)表于 2016-11-25 01:49 | 只看該作者
R0-R7:對應(yīng)00H-1FH,分4個(gè)頁面。由于指令表中與R0-R7相關(guān)的指令很多,所以用R0-R7就很方便,被大量使用。
問題是:你主程序中用R0-R7;中斷程序中也用R0-R7。
如此中斷返回主程序后R0-R7就被修改了,數(shù)據(jù)就不對了。為此中斷程序就要先將R0-R7壓堆棧,返回時(shí)再彈出。
有了頁面選擇,就方便了,不用壓棧彈棧了,就是修改R0-R7選擇頁面。
我的使用方法是:
主程序:R0-R7用0頁;
時(shí)間中斷:R0-R7用1頁;
串口中斷:R0-R7用2頁;
其它中斷:R0-R7用3頁。
當(dāng)然會(huì)依據(jù)中斷級(jí)別作處理的。
對于C語言來說,無須考慮。
回復(fù)

使用道具 舉報(bào)

5#
ID:138155 發(fā)表于 2016-11-25 10:02 | 只看該作者
你要是能達(dá)到直接用地址讀取的話就牛逼了 也不用來提這個(gè)問題啦
回復(fù)

使用道具 舉報(bào)

6#
ID:149642 發(fā)表于 2016-11-25 21:04 | 只看該作者
wuyibin2003 發(fā)表于 2016-11-25 10:02
你要是能達(dá)到直接用地址讀取的話就牛逼了 也不用來提這個(gè)問題啦

怎么不可能直接地址讀�。�
變量1 equ 00h
變量2 equ 1fh
//省略
mov a,變量1
不就讀取了????
回復(fù)

使用道具 舉報(bào)

7#
ID:149642 發(fā)表于 2016-11-25 21:07 | 只看該作者
yzwzfyz 發(fā)表于 2016-11-25 01:49
R0-R7:對應(yīng)00H-1FH,分4個(gè)頁面。由于指令表中與R0-R7相關(guān)的指令很多,所以用R0-R7就很方便,被大量使用。
...

謝謝,我寫電腦軟件習(xí)慣了,都是直接定義變量,調(diào)用習(xí)慣了,這里讓設(shè)計(jì)者給設(shè)計(jì)了幾個(gè)變量,關(guān)鍵是還要切換,感覺挺麻煩的,不過你們回答的都非常好,非常專業(yè),謝謝,我是在想,當(dāng)初設(shè)計(jì)的時(shí)候?yàn)樯恫慌獋€(gè)r0-r28省去切來切去。
回復(fù)

使用道具 舉報(bào)

8#
ID:149642 發(fā)表于 2016-11-25 21:11 | 只看該作者
zl2168 發(fā)表于 2016-11-24 21:20
1. 51匯編只認(rèn)R0~R7,不認(rèn)R8~R28。
2. 4個(gè)工作寄存器區(qū),只能打開一個(gè)。即當(dāng)前只能用一個(gè),都稱為R0~R7。 ...

你很專業(yè),也很用心回答,可是我還是不理解,有些指令雖然少了1個(gè)周期,但是切換也要一個(gè)周期啊,而且現(xiàn)在的一些單片機(jī)都優(yōu)化了一些代碼后工作寄存器的專用指令已經(jīng)不局限于這28個(gè)地址了。
回復(fù)

使用道具 舉報(bào)

9#
ID:149642 發(fā)表于 2016-11-25 21:18 | 只看該作者
yzwzfyz 發(fā)表于 2016-11-25 01:49
R0-R7:對應(yīng)00H-1FH,分4個(gè)頁面。由于指令表中與R0-R7相關(guān)的指令很多,所以用R0-R7就很方便,被大量使用。
...

謝謝,非常專業(yè),非常好的回答,電腦軟件寫習(xí)慣了,總是定義好變量直接用就好,這個(gè)別人定義的還要組別切換,感覺挺麻煩的,有時(shí)看多了,這也是r的變量那也是R的變量都不知道哪個(gè)是哪個(gè)了,有時(shí)我在想,有些指令直接用符號(hào)還簡單些,比如mov用=替代,加減乘除什么的。。。。
回復(fù)

使用道具 舉報(bào)

10#
ID:111634 發(fā)表于 2016-11-25 21:40 | 只看該作者
lksbbs 發(fā)表于 2016-11-25 21:11
你很專業(yè),也很用心回答,可是我還是不理解,有些指令雖然少了1個(gè)周期,但是切換也要一個(gè)周期啊,而且現(xiàn) ...

你是用現(xiàn)代的標(biāo)準(zhǔn)質(zhì)疑上世紀(jì)八十年代MCS-51的設(shè)計(jì),苛求了!
現(xiàn)代的改進(jìn)版51,主頻高,不需考慮執(zhí)行指令少一個(gè)機(jī)周;內(nèi)存多,不需考慮指令代碼少一個(gè)字節(jié)。
再說了,用c51編程,也不需考慮是R0~R7的操作指令還是直接地址的操作指令,都有c51編譯器代勞了。
不過,懂匯編是很重要的。當(dāng)然,不懂,也就算了,沒必要深究。
回復(fù)

使用道具 舉報(bào)

11#
ID:150250 發(fā)表于 2016-11-25 23:57 來自觸屏版 | 只看該作者
匯編要學(xué)嗎
回復(fù)

使用道具 舉報(bào)

12#
ID:138155 發(fā)表于 2016-11-26 08:36 | 只看該作者
lksbbs 發(fā)表于 2016-11-25 21:04
怎么不可能直接地址讀�。�
變量1 equ 00h
變量2 equ 1fh

你試過可以執(zhí)行了嗎
回復(fù)

使用道具 舉報(bào)

13#
ID:111634 發(fā)表于 2016-11-26 08:41 | 只看該作者
lksbbs 發(fā)表于 2016-11-25 21:11
你很專業(yè),也很用心回答,可是我還是不理解,有些指令雖然少了1個(gè)周期,但是切換也要一個(gè)周期啊,而且現(xiàn) ...

若用匯編編寫程序,用工作寄存器肯定比直接地址好。
回復(fù)

使用道具 舉報(bào)

14#
ID:111634 發(fā)表于 2016-11-26 08:46 | 只看該作者
本帖最后由 zl2168 于 2016-11-26 08:49 編輯
wuyibin2003 發(fā)表于 2016-11-26 08:36
你試過可以執(zhí)行了嗎

根本不需要先定義,直接讀就行。
MOV   A,direct      ;direct代表片內(nèi)RAM 00H~FFH存儲(chǔ)單元 的 直接地址   
回復(fù)

使用道具 舉報(bào)

15#
ID:150279 發(fā)表于 2016-11-26 10:24 | 只看該作者

R0-R7:對應(yīng)00H-1FH,分4個(gè)頁面。由于指令表中與R0-R7相關(guān)的指令很多,所以用R0-R7就很方便,被大量使用。
問題是:你主程序中用R0-R7;中斷程序中也用R0-R7。
如此中斷返回主程序后R0-R7就被修改了,數(shù)據(jù)就不對了。為此中斷程序就要先將R0-R7壓堆棧,返回時(shí)再彈出。
有了頁面選擇,就方便了,不用壓棧彈棧了,就是修改R0-R7選擇頁面。
我的使用方法是:
主程序:R0-R7用0頁;
時(shí)間中斷:R0-R7用1頁;
串口中斷:R0-R7用2頁;
其它中斷:R0-R7用3頁。
當(dāng)然會(huì)依據(jù)中斷級(jí)別作處理的。
對于C語言來說,無須考慮。
回復(fù)

使用道具 舉報(bào)

16#
ID:150291 發(fā)表于 2016-11-26 11:02 | 只看該作者
不太清楚
回復(fù)

使用道具 舉報(bào)

17#
ID:111634 發(fā)表于 2016-11-26 17:45 | 只看該作者

對c51編程來說,弄清R0-R7,不是充要條件,不懂也罷!
回復(fù)

使用道具 舉報(bào)

18#
ID:146533 發(fā)表于 2016-11-26 18:05 | 只看該作者
首先,51它就是這樣規(guī)定的R0到R7,然后直接尋址比寄存器尋址多一個(gè)字節(jié),周期也要多一個(gè)。所以還是寄存器尋址還是蠻好的
回復(fù)

使用道具 舉報(bào)

19#
ID:149642 發(fā)表于 2016-11-26 21:26 | 只看該作者
zl2168 發(fā)表于 2016-11-25 21:40
你是用現(xiàn)代的標(biāo)準(zhǔn)質(zhì)疑上世紀(jì)八十年代MCS-51的設(shè)計(jì),苛求了!
現(xiàn)代的改進(jìn)版51,主頻高,不需考慮執(zhí)行指令 ...

呵呵,我不懂c,我記憶很差,c那龐大的代碼完全記不住,懂匯編是發(fā)現(xiàn)它常用到的也就那么幾個(gè)代碼,才自學(xué)的。雖然現(xiàn)在也寫過幾萬行匯編代碼了,可是有時(shí)候還是能夠認(rèn)識(shí)匯編指令,有時(shí)候卻像突然想不起某人名字一樣要翻看電話本。。。。。。電腦編程主要是寫圖片處理,和字節(jié)集處理,沒有寫過大系統(tǒng),用中文軟件寫的。
回復(fù)

使用道具 舉報(bào)

20#
ID:149642 發(fā)表于 2016-11-26 21:30 | 只看該作者
wuyibin2003 發(fā)表于 2016-11-26 08:36
你試過可以執(zhí)行了嗎

我也是初學(xué),但是可以肯定可以執(zhí)行,附件是我最近在研究我們論壇里那個(gè)多模塊化帖子的研究程序,發(fā)現(xiàn)那帖子有問題,很有問題,特別是有兩行代碼他說可以不寫,但我怎么研究都必須要寫。

多模塊化例程.rar

20.71 KB, 下載次數(shù): 10

回復(fù)

使用道具 舉報(bào)

21#
ID:111634 發(fā)表于 2016-11-27 19:14 | 只看該作者
lksbbs 發(fā)表于 2016-11-26 21:26
呵呵,我不懂c,我記憶很差,c那龐大的代碼完全記不住,懂匯編是發(fā)現(xiàn)它常用到的也就那么幾個(gè)代碼,才自學(xué) ...

你與別人相反。大家都說,c比匯編容易學(xué)。你卻說,“c那龐大的代碼完全記不住,懂匯編是發(fā)現(xiàn)它常用到的也就那么幾個(gè)代碼”。
回復(fù)

使用道具 舉報(bào)

22#
ID:111634 發(fā)表于 2016-11-27 19:23 | 只看該作者
本帖最后由 zl2168 于 2016-11-27 19:26 編輯

⒊ C51編程的特點(diǎn)



以上摘自張志良編著《80C51單片機(jī)實(shí)用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9, 用于學(xué)習(xí)51單片機(jī)原理,便于閱讀理解,便于自學(xué)。書中電路和程序設(shè)計(jì)有詳細(xì)說明,程序語句條條有注解。
回復(fù)

使用道具 舉報(bào)

23#
ID:107559 發(fā)表于 2016-11-27 19:31 | 只看該作者
請參考reg51.h文件,打開后你會(huì)看見stb p0=0x80h,定義了地址從80開始。
回復(fù)

使用道具 舉報(bào)

24#
ID:150587 發(fā)表于 2016-11-27 19:32 | 只看該作者
多模塊的設(shè)計(jì)要怎么學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

25#
ID:111634 發(fā)表于 2016-11-27 19:35 | 只看該作者
順便說一聲,剛才向你介紹的張志良編著《80C51單片機(jī)實(shí)用教程——基于Keil C和Proteus》是雙解匯編和c51.
回復(fù)

使用道具 舉報(bào)

26#
ID:149642 發(fā)表于 2017-1-23 14:46 | 只看該作者
zl2168 發(fā)表于 2016-11-27 19:23
⒊ C51編程的特點(diǎn)

謝謝,我又明白了很多,
回復(fù)

使用道具 舉報(bào)

27#
ID:149642 發(fā)表于 2017-1-23 14:53 | 只看該作者
zl2168 發(fā)表于 2016-11-27 19:14
你與別人相反。大家都說,c比匯編容易學(xué)。你卻說,“c那龐大的代碼完全記不住,懂匯編是發(fā)現(xiàn)它常用到的也 ...

我的大腦內(nèi)存與別人有差異,記得我當(dāng)初記電話ic卡和手機(jī)號(hào)碼的時(shí)候是記鍵盤按鍵順序,至于按完了都不知道自己按了些什么,反正電話打通了,現(xiàn)在編程記指令都可能是指令實(shí)在是短,長的也就個(gè)lcall長點(diǎn)?才勉強(qiáng)記得住的吧,或許也是按鍵多了習(xí)慣了才記住,哈哈
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表