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