標題: 51單片機4*R0—R7疑問 [打印本頁]

作者: lksbbs    時間: 2016-11-24 10:18
標題: 51單片機4*R0—R7疑問
各位大大前輩51單片機4*R0—R7為什么要用R0—R7啊,還得提前改變狀態(tài)寄存器切換著用,好復雜的說。

我直接用0H—20H的直接地址不行嗎?
或者直接定義為R0—R28不更方便嗎?
求各位大大解惑!

作者: 不倒翁.WZT    時間: 2016-11-24 20:33
標題: RE: 51單片機4*R0—R7疑問
本帖最后由 不倒翁.WZT 于 2016-11-25 06:50 編輯

R寄存器是51單片機工作寄存器區(qū),它有一些特殊的功能。這種用法是51單片機匯編語言的一個硬性規(guī)定,不用R0—R28可能是匯編語言創(chuàng)建時的某些需要所決定的。
作者: zl2168    時間: 2016-11-24 21:20
本帖最后由 zl2168 于 2016-11-24 21:47 編輯

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

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







作者: yzwzfyz    時間: 2016-11-25 01:49
R0-R7:對應00H-1FH,分4個頁面。由于指令表中與R0-R7相關的指令很多,所以用R0-R7就很方便,被大量使用。
問題是:你主程序中用R0-R7;中斷程序中也用R0-R7。
如此中斷返回主程序后R0-R7就被修改了,數(shù)據(jù)就不對了。為此中斷程序就要先將R0-R7壓堆棧,返回時再彈出。
有了頁面選擇,就方便了,不用壓棧彈棧了,就是修改R0-R7選擇頁面。
我的使用方法是:
主程序:R0-R7用0頁;
時間中斷:R0-R7用1頁;
串口中斷:R0-R7用2頁;
其它中斷:R0-R7用3頁。
當然會依據(jù)中斷級別作處理的。
對于C語言來說,無須考慮。
作者: wuyibin2003    時間: 2016-11-25 10:02
你要是能達到直接用地址讀取的話就牛逼了 也不用來提這個問題啦
作者: lksbbs    時間: 2016-11-25 21:04
wuyibin2003 發(fā)表于 2016-11-25 10:02
你要是能達到直接用地址讀取的話就牛逼了 也不用來提這個問題啦

怎么不可能直接地址讀?
變量1 equ 00h
變量2 equ 1fh
//省略
mov a,變量1
不就讀取了????
作者: lksbbs    時間: 2016-11-25 21:07
yzwzfyz 發(fā)表于 2016-11-25 01:49
R0-R7:對應00H-1FH,分4個頁面。由于指令表中與R0-R7相關的指令很多,所以用R0-R7就很方便,被大量使用。
...

謝謝,我寫電腦軟件習慣了,都是直接定義變量,調(diào)用習慣了,這里讓設計者給設計了幾個變量,關鍵是還要切換,感覺挺麻煩的,不過你們回答的都非常好,非常專業(yè),謝謝,我是在想,當初設計的時候為啥不弄個r0-r28省去切來切去。
作者: lksbbs    時間: 2016-11-25 21:11
zl2168 發(fā)表于 2016-11-24 21:20
1. 51匯編只認R0~R7,不認R8~R28。
2. 4個工作寄存器區(qū),只能打開一個。即當前只能用一個,都稱為R0~R7。 ...

你很專業(yè),也很用心回答,可是我還是不理解,有些指令雖然少了1個周期,但是切換也要一個周期啊,而且現(xiàn)在的一些單片機都優(yōu)化了一些代碼后工作寄存器的專用指令已經(jīng)不局限于這28個地址了。
作者: lksbbs    時間: 2016-11-25 21:18
yzwzfyz 發(fā)表于 2016-11-25 01:49
R0-R7:對應00H-1FH,分4個頁面。由于指令表中與R0-R7相關的指令很多,所以用R0-R7就很方便,被大量使用。
...

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

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

你是用現(xiàn)代的標準質(zhì)疑上世紀八十年代MCS-51的設計,苛求了!
現(xiàn)代的改進版51,主頻高,不需考慮執(zhí)行指令少一個機周;內(nèi)存多,不需考慮指令代碼少一個字節(jié)。
再說了,用c51編程,也不需考慮是R0~R7的操作指令還是直接地址的操作指令,都有c51編譯器代勞了。
不過,懂匯編是很重要的。當然,不懂,也就算了,沒必要深究。
作者: 嘰里咕嚕    時間: 2016-11-25 23:57
匯編要學嗎
作者: wuyibin2003    時間: 2016-11-26 08:36
lksbbs 發(fā)表于 2016-11-25 21:04
怎么不可能直接地址讀?
變量1 equ 00h
變量2 equ 1fh

你試過可以執(zhí)行了嗎
作者: zl2168    時間: 2016-11-26 08:41
lksbbs 發(fā)表于 2016-11-25 21:11
你很專業(yè),也很用心回答,可是我還是不理解,有些指令雖然少了1個周期,但是切換也要一個周期啊,而且現(xiàn) ...

若用匯編編寫程序,用工作寄存器肯定比直接地址好。
作者: zl2168    時間: 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存儲單元 的 直接地址   
作者: 常長訣    時間: 2016-11-26 10:24

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

對c51編程來說,弄清R0-R7,不是充要條件,不懂也罷!
作者: 一曲笙歌    時間: 2016-11-26 18:05
首先,51它就是這樣規(guī)定的R0到R7,然后直接尋址比寄存器尋址多一個字節(jié),周期也要多一個。所以還是寄存器尋址還是蠻好的
作者: lksbbs    時間: 2016-11-26 21:26
zl2168 發(fā)表于 2016-11-25 21:40
你是用現(xiàn)代的標準質(zhì)疑上世紀八十年代MCS-51的設計,苛求了!
現(xiàn)代的改進版51,主頻高,不需考慮執(zhí)行指令 ...

呵呵,我不懂c,我記憶很差,c那龐大的代碼完全記不住,懂匯編是發(fā)現(xiàn)它常用到的也就那么幾個代碼,才自學的。雖然現(xiàn)在也寫過幾萬行匯編代碼了,可是有時候還是能夠認識匯編指令,有時候卻像突然想不起某人名字一樣要翻看電話本。。。。。。電腦編程主要是寫圖片處理,和字節(jié)集處理,沒有寫過大系統(tǒng),用中文軟件寫的。
作者: lksbbs    時間: 2016-11-26 21:30
wuyibin2003 發(fā)表于 2016-11-26 08:36
你試過可以執(zhí)行了嗎

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

多模塊化例程.rar

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


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

你與別人相反。大家都說,c比匯編容易學。你卻說,“c那龐大的代碼完全記不住,懂匯編是發(fā)現(xiàn)它常用到的也就那么幾個代碼”。
作者: zl2168    時間: 2016-11-27 19:23
本帖最后由 zl2168 于 2016-11-27 19:26 編輯

⒊ C51編程的特點



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

作者: jblbin2008    時間: 2016-11-27 19:31
請參考reg51.h文件,打開后你會看見stb p0=0x80h,定義了地址從80開始。
作者: 千萬千萬    時間: 2016-11-27 19:32
多模塊的設計要怎么學習
作者: zl2168    時間: 2016-11-27 19:35
順便說一聲,剛才向你介紹的張志良編著《80C51單片機實用教程——基于Keil C和Proteus》是雙解匯編和c51.
作者: lksbbs    時間: 2017-1-23 14:46
zl2168 發(fā)表于 2016-11-27 19:23
⒊ C51編程的特點

謝謝,我又明白了很多,
作者: lksbbs    時間: 2017-1-23 14:53
zl2168 發(fā)表于 2016-11-27 19:14
你與別人相反。大家都說,c比匯編容易學。你卻說,“c那龐大的代碼完全記不住,懂匯編是發(fā)現(xiàn)它常用到的也 ...

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




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1