|
發(fā)布時(shí)間: 2019-10-7 08:36
正文摘要:AUXR = 0x14; //T2為1T模式, 并啟動(dòng)定時(shí)器2 AUXR |= 0x01; &nbs ... |
|
合并后為: AUXR = 0x15; AUXR |= 0x01; 是按位或 0x01 到 AUXR 的意思 |
|
問(wèn)問(wèn)大佬:里面的EXTRAM位為1的話禁止訪問(wèn)內(nèi)部擴(kuò)展ram,也就是說(shuō)不能定義xdata的數(shù)據(jù);但是上電的話EXTRAM默認(rèn)是零嗎,如果默認(rèn)為零的話是不是可以直接在程序中定義xdata數(shù)據(jù)。 |
|
要合并: AUXR = 0x15; 第二句話是位操作,將0x01按位或到AUXR。 |
|
本帖最后由 fosu頑童 于 2024-3-26 10:24 編輯 1、AUXR |= 0x01等價(jià)于AUXR= AUXR|0X01 ,這是按位或運(yùn)算,將AUXR的8位按高到低分別與0000 0001進(jìn)行或運(yùn)算。 2、兩語(yǔ)句可以合并寫,可以分開寫。 寫例程的人員是為了方便移植所以分開兩個(gè)語(yǔ)句寫出來(lái),抑或是他想給讀者傳達(dá)的編程思路是先配置好定時(shí)器參數(shù),最后再配置串口的設(shè)置。 |
| AUXR |= 0x04; //定時(shí)器時(shí)鐘1T模式 |
| AUXR |= 0x01;其實(shí)就是AUX = AUX | 0X1; |
|
通常為了單獨(dú)控制某個(gè)位,就這樣操作的,也便于理解。 我常用方法: AUXR = 0; AUXR |= 0x04; //T2 1T模式 AUXR |= 0x01; //串口1選擇T2做波特率發(fā)生器 AUXR |= 0x10; //啟動(dòng)T2 |
| 分開寫的好處是:不管之前打開了那些位,現(xiàn)在加上這一位。 |
| =0x14; |=0x01; 兩條分開寫, 合并寫都是一樣的. |
pcbboy 發(fā)表于 2019-10-7 09:09 確實(shí)如此,不過(guò)一般不合并吧,便于程序維護(hù)與修改。 |
youlinys 發(fā)表于 2022-3-5 21:54 你這問(wèn)題問(wèn)得…… , 名稱上來(lái)講,就是輔助寄存器。 不同的單片機(jī),用處不同, 樓主貼的是 STC15 系列的,基本都是牽涉到定時(shí)器的設(shè)置 如果你看 STC89 的手冊(cè),里面還有 控制 ALE 的開關(guān)。 如果你去看 STC12 的手冊(cè), 里面還有 中斷開關(guān)。 所以,如果拋開型號(hào)不講,光說(shuō)某個(gè)寄存器,壓根沒法泛泛回答。 |
| AUXR寄存器 主要是什么作用? |
| AUXR |= 0x01; 這個(gè)代表只動(dòng)它的第一位,置1,其它的不會(huì)動(dòng)。 |
| stm32搞多了,51的也忘差不多了 |
| AUXR寄存器講的太好了。 |
|
AUXR寄存器由8個(gè)功能不同的位寄存器組成,不可位尋址。 使用C語(yǔ)言的 &= ,|= 運(yùn)算符按位配置。 |
| 不能位操作的寄存器就要整個(gè)賦值 你那么寫當(dāng)然可以 但不如手冊(cè)上那么寫方便 也容易出錯(cuò) |
|
void Uart1Init() //串口1初始化; { SCON = 0x40; //串口1模1: 0100: 010模式1,可變波特率8位數(shù)據(jù)方式,0禁收只發(fā)(關(guān)鍵:原來(lái)0X50可收,平時(shí)斷開只發(fā)不收0X40才能杜絕收發(fā)串?dāng)_!已驗(yàn)證ok!); TMOD = 0x20; //T1模2: 8位自動(dòng)重載模式;PCON:未設(shè)定,復(fù)位值0011,0000默認(rèn)SMOD=0波特率不加速!; TL1 = BRT; //T1: BRT:相當(dāng)于串口1使用獨(dú)立波特率發(fā)射器為波特率發(fā)生器; 也可前面不定義直接賦值(如:0xDC); TH1 = BRT; // 計(jì)數(shù)寄存器高低各一個(gè),8位自動(dòng)重載模式周期計(jì)算公式:定時(shí)器周期=(256–TH1)/SYSclk (自動(dòng)重載); TR1 = 1; // T1運(yùn)行控制位:軟件置位和清零。TR1=1允許T1開始計(jì)數(shù),TR1=0時(shí)禁止; //AUXR = 0x40; //輔助寄存器(特殊,不可位尋址),建議分開寫成:AUXR |= 0x40;AUXR &= 0xFE; AUXR |= 0x40; // B6(T1x12):T1速度控制位,"1"選T1且1T模式不分頻FOSC/1; AUXR &= 0xFE; // B0(S1ST2):串口1波特率發(fā)射器選擇位,“0”選T1為波特率發(fā)射器); //bufferPtr = 0; //只發(fā)不收可去掉!改0X00無(wú)變化; Uart1Busy = 0; // delay_ms(100); //延時(shí)0.1S; |
wulin 發(fā)表于 2019-10-8 13:20 厲害了我的哥! 手冊(cè)里 對(duì)PCON 、AUXR等寄存器的位功能描述比較分散,我也是看了又看才知道。熟悉對(duì)的話兩種寫法都可以,不熟悉就分開確實(shí)安心些! |
|
合并后就是 AUXR = 0x15; 第二句應(yīng)該是位操作,將0x01按位或到AUXR。 |
| 按照位或,學(xué)習(xí)了!!!! |
| 要多看看例程了, AUXR “|”這里面的 | 是單單干寄存里的單單某一位,而其它的原封不動(dòng)。 |
| AUXR |= 0x04; //定時(shí)器時(shí)鐘1T模式 |
| STC15系列單片機(jī)中的AUXR寄存器不支持位操作,這是一個(gè)特殊功能寄存器,并且各個(gè)位的功能甚至沒有直接關(guān)聯(lián)。因此對(duì)其中某一位或某幾位操作時(shí)不能隨意改變其它位的狀態(tài),所以用按位與“&”和按位或“|”的方式操作其中某一位或某幾位就不會(huì)改變其它位的狀態(tài)。這個(gè)方法同樣適用于支持位操作的寄存器,可以使代碼簡(jiǎn)潔高效。 |
人人學(xué)會(huì)單片機(jī) 發(fā)表于 2019-10-7 12:36 1.他也是單獨(dú)控制寄存器的某一位,假如控制 SCON寄存器中的 REN(第5位),人家直接寫REN=1,不用就 REN=0,也挺好理解。 你的可以寫成:SCON | = 0x10。 你們 是一樣的 。 2.對(duì)于控制位還是控制字節(jié),我感覺對(duì)于初學(xué)者不了解的,使用位控制,可以使他們充分理解寄存器功能。 對(duì)于比較熟練的,直接進(jìn)行字節(jié)賦值,可以減少程序長(zhǎng)度。 |
| 我們?nèi)巳藢W(xué)會(huì)單片機(jī)的課程,就是這樣操作的,意思就是,你單獨(dú)控制某一位,而其他位則是保持不變。郭傻瓜得課程,就是直接賦值了,是不安全的寫法。 |
pcbboy 發(fā)表于 2019-10-7 09:11 往往是最基本的容易疏忽,謝謝。之前一直用“||”(對(duì)應(yīng)一個(gè)字節(jié)),沒用過(guò)單個(gè)“|”(對(duì)應(yīng)字節(jié)中的某位)。 擴(kuò)展了一個(gè)問(wèn)題,如果我相對(duì)AUXR 第二位單獨(dú)操作,應(yīng)該怎么寫? AUXR | = 0x02?;第三位單獨(dú)操作,應(yīng)該 寫成: AUXR | = 0x04;。。。第8位“AUXR | = 0x80”. |
| 寫錯(cuò)了一句:我是不是可以直接寫成:AUXR = 0x15; (既允許打開定時(shí)器2,定時(shí)器2是8051 12倍,不分頻。又可以直接選擇定時(shí)器2 位UART1的波特率發(fā)生器)? |
|
合并后為: AUXR = 0x15; | 是按位或 的意思 |
|
這句寫錯(cuò)了: 是:我是不是可以直接寫成:AUXR = 0x15; (既允許打開定時(shí)器2,定時(shí)器2是8051 12倍,不分頻。又可以直接選擇定時(shí)器2 位UART1的波特率發(fā)生器)? |
|
合并后為: AUXR = 0x15; AUXR |= 0x01; 是按位或 0x01 到 AUXR 的意思 |
| 要合并就是 AUXR = 0x15; 第二句話是位操作,將0x01按位或到AUXR。 |
Powered by 單片機(jī)教程網(wǎng)