合并后为: AUXR = 0x15; AUXR |= 0x01; 是按位或 0x01 到 AUXR 的意思 |
问问大佬:里面的EXTRAM位为1的话禁止访问内部扩展ram,也就是说不能定义xdata的数据;但是上电的话EXTRAM默认是零吗,如果默认为零的话是不是可以直接在程序中定义xdata数据。 |
要合并: AUXR = 0x15; 第二句话是位操作,将0x01按位或到AUXR。 |
本帖最后由 fosu顽童 于 2024-3-26 10:24 编辑 1、AUXR |= 0x01等价于AUXR= AUXR|0X01 ,这是按位或运算,将AUXR的8位按高到低分别与0000 0001进行或运算。 2、两语句可以合并写,可以分开写。 写例程的人员是为了方便移植所以分开两个语句写出来,抑或是他想给读者传达的编程思路是先配置好定时器参数,最后再配置串口的设置。 |
AUXR |= 0x04; //定时器时钟1T模式 |
AUXR |= 0x01;其实就是AUX = AUX | 0X1; |
通常为了单独控制某个位,就这样操作的,也便于理解。 我常用方法: AUXR = 0; AUXR |= 0x04; //T2 1T模式 AUXR |= 0x01; //串口1选择T2做波特率发生器 AUXR |= 0x10; //启动T2 |
分开写的好处是:不管之前打开了那些位,现在加上这一位。 |
=0x14; |=0x01; 两条分开写, 合并写都是一样的. |
pcbboy 发表于 2019-10-7 09:09 确实如此,不过一般不合并吧,便于程序维护与修改。 |
youlinys 发表于 2022-3-5 21:54 你这问题问得…… , 名称上来讲,就是辅助寄存器。 不同的单片机,用处不同, 楼主贴的是 STC15 系列的,基本都是牵涉到定时器的设置 如果你看 STC89 的手册,里面还有 控制 ALE 的开关。 如果你去看 STC12 的手册, 里面还有 中断开关。 所以,如果抛开型号不讲,光说某个寄存器,压根没法泛泛回答。 |
AUXR寄存器 主要是什么作用? |
AUXR |= 0x01; 这个代表只动它的第一位,置1,其它的不会动。 |
stm32搞多了,51的也忘差不多了 |
AUXR寄存器讲的太好了。 |
AUXR寄存器由8个功能不同的位寄存器组成,不可位寻址。 使用C语言的 &= ,|= 运算符按位配置。 |
不能位操作的寄存器就要整个赋值 你那么写当然可以 但不如手册上那么写方便 也容易出错 |
void Uart1Init() //串口1初始化; { SCON = 0x40; //串口1模1: 0100: 010模式1,可变波特率8位数据方式,0禁收只发(关键:原来0X50可收,平时断开只发不收0X40才能杜绝收发串扰!已验证ok!); TMOD = 0x20; //T1模2: 8位自动重载模式;PCON:未设定,复位值0011,0000默认SMOD=0波特率不加速!; TL1 = BRT; //T1: BRT:相当于串口1使用独立波特率发射器为波特率发生器; 也可前面不定义直接赋值(如:0xDC); TH1 = BRT; // 计数寄存器高低各一个,8位自动重载模式周期计算公式:定时器周期=(256–TH1)/SYSclk (自动重载); TR1 = 1; // T1运行控制位:软件置位和清零。TR1=1允许T1开始计数,TR1=0时禁止; //AUXR = 0x40; //辅助寄存器(特殊,不可位寻址),建议分开写成:AUXR |= 0x40;AUXR &= 0xFE; AUXR |= 0x40; // B6(T1x12):T1速度控制位,"1"选T1且1T模式不分频FOSC/1; AUXR &= 0xFE; // B0(S1ST2):串口1波特率发射器选择位,“0”选T1为波特率发射器); //bufferPtr = 0; //只发不收可去掉!改0X00无变化; Uart1Busy = 0; // delay_ms(100); //延时0.1S; |
wulin 发表于 2019-10-8 13:20 ![]() 熟悉对的话两种写法都可以,不熟悉就分开确实安心些! |
合并后就是 AUXR = 0x15; 第二句应该是位操作,将0x01按位或到AUXR。 |
按照位或,学习了!!!! |
要多看看例程了, AUXR “|”这里面的 | 是单单干寄存里的单单某一位,而其它的原封不动。 |
AUXR |= 0x04; //定时器时钟1T模式 |
STC15系列单片机中的AUXR寄存器不支持位操作,这是一个特殊功能寄存器,并且各个位的功能甚至没有直接关联。因此对其中某一位或某几位操作时不能随意改变其它位的状态,所以用按位与“&”和按位或“|”的方式操作其中某一位或某几位就不会改变其它位的状态。这个方法同样适用于支持位操作的寄存器,可以使代码简洁高效。 |
人人学会单片机 发表于 2019-10-7 12:36 1.他也是单独控制寄存器的某一位,假如控制 SCON寄存器中的 REN(第5位),人家直接写REN=1,不用就 REN=0,也挺好理解。 你的可以写成:SCON | = 0x10。 你们 是一样的 。 2.对于控制位还是控制字节,我感觉对于初学者不了解的,使用位控制,可以使他们充分理解寄存器功能。 对于比较熟练的,直接进行字节赋值,可以减少程序长度。 |
我们人人学会单片机的课程,就是这样操作的,意思就是,你单独控制某一位,而其他位则是保持不变。郭傻瓜得课程,就是直接赋值了,是不安全的写法。 |
pcbboy 发表于 2019-10-7 09:11 往往是最基本的容易疏忽,谢谢。之前一直用“||”(对应一个字节),没用过单个“|”(对应字节中的某位)。 扩展了一个问题,如果我相对AUXR 第二位单独操作,应该怎么写? AUXR | = 0x02?;第三位单独操作,应该 写成: AUXR | = 0x04;。。。第8位“AUXR | = 0x80”. |
写错了一句:我是不是可以直接写成:AUXR = 0x15; (既允许打开定时器2,定时器2是8051 12倍,不分频。又可以直接选择定时器2 位UART1的波特率发生器)? |
合并后为: AUXR = 0x15; | 是按位或 的意思 |
这句写错了: 是:我是不是可以直接写成:AUXR = 0x15; (既允许打开定时器2,定时器2是8051 12倍,不分频。又可以直接选择定时器2 位UART1的波特率发生器)? |
合并后为: AUXR = 0x15; AUXR |= 0x01; 是按位或 0x01 到 AUXR 的意思 |
要合并就是 AUXR = 0x15; 第二句话是位操作,将0x01按位或到AUXR。 |