标题: 请教STC15系列单片机中的AUXR寄存器使用 [打印本页]

作者: baiyun1234    时间: 2019-10-7 08:36
标题: 请教STC15系列单片机中的AUXR寄存器使用
AUXR = 0x14;                    //T2为1T模式, 并启动定时器2
AUXR |= 0x01;                    //选择定时器2为串口1的波特率发生器

这里面的AUXR明明是一个寄存器,为什么分开写? 为什么第二个是   AUXR “|”这里面的 |是什么意思?
我是不是可以直接写成:
AUXR = 0x14;  (既允许打开定时器2,定时器2是8051  12倍,不分频。又可以直接选择定时器2 位UART1的波特率发生器)?
两个问题。





作者: pcbboy    时间: 2019-10-7 09:09
要合并就是  AUXR = 0x15;    第二句话是位操作,将0x01按位或到AUXR。
作者: pcbboy    时间: 2019-10-7 09:11
合并后为: AUXR = 0x15;   
AUXR |= 0x01; 是按位或   0x01 到 AUXR 的意思
   
作者: baiyun1234    时间: 2019-10-7 09:13
这句写错了:
是:我是不是可以直接写成:AUXR = 0x15;  (既允许打开定时器2,定时器2是8051  12倍,不分频。又可以直接选择定时器2 位UART1的波特率发生器)?
作者: pcbboy    时间: 2019-10-7 09:13
合并后为: AUXR = 0x15;   
  |   是按位或 的意思
作者: baiyun1234    时间: 2019-10-7 09:15
写错了一句:我是不是可以直接写成:AUXR = 0x15;  (既允许打开定时器2,定时器2是8051  12倍,不分频。又可以直接选择定时器2 位UART1的波特率发生器)?
作者: baiyun1234    时间: 2019-10-7 11:32
pcbboy 发表于 2019-10-7 09:11
合并后为: AUXR = 0x15;   
AUXR |= 0x01; 是按位或   0x01 到 AUXR 的意思

往往是最基本的容易疏忽,谢谢。之前一直用“||”(对应一个字节),没用过单个“|”(对应字节中的某位)。
扩展了一个问题,如果我相对AUXR 第二位单独操作,应该怎么写? AUXR | = 0x02?;第三位单独操作,应该
写成: AUXR | = 0x04;。。。第8位“AUXR | = 0x80”.
作者: 人人学会单片机    时间: 2019-10-7 12:36
我们人人学会单片机的课程,就是这样操作的,意思就是,你单独控制某一位,而其他位则是保持不变。郭傻瓜得课程,就是直接赋值了,是不安全的写法。
作者: baiyun1234    时间: 2019-10-7 15:45
人人学会单片机 发表于 2019-10-7 12:36
我们人人学会单片机的课程,就是这样操作的,意思就是,你单独控制某一位,而其他位则是保持不变。郭傻瓜得 ...

1.他也是单独控制寄存器的某一位,假如控制 SCON寄存器中的 REN(第5位),人家直接写REN=1,不用就 REN=0,也挺好理解。
你的可以写成:SCON | = 0x10。
你们 是一样的 。
2.对于控制位还是控制字节,我感觉对于初学者不了解的,使用位控制,可以使他们充分理解寄存器功能。
对于比较熟练的,直接进行字节赋值,可以减少程序长度。
作者: wulin    时间: 2019-10-8 13:20
STC15系列单片机中的AUXR寄存器不支持位操作,这是一个特殊功能寄存器,并且各个位的功能甚至没有直接关联。因此对其中某一位或某几位操作时不能随意改变其它位的状态,所以用按位与“&”和按位或“|”的方式操作其中某一位或某几位就不会改变其它位的状态。这个方法同样适用于支持位操作的寄存器,可以使代码简洁高效。
作者: 随丶缘    时间: 2021-2-4 11:09
AUXR |= 0x04;                //定时器时钟1T模式
作者: univers    时间: 2021-2-4 15:36
要多看看例程了,  AUXR “|”这里面的 |  是单单干寄存里的单单某一位,而其它的原封不动。
作者: guolh    时间: 2021-11-24 14:42
按照位或,学习了!!!!
作者: plb1213    时间: 2021-11-27 17:40
合并后就是  AUXR = 0x15;   
第二句应该是位操作,将0x01按位或到AUXR。
作者: ax6808    时间: 2022-3-1 21:57
wulin 发表于 2019-10-8 13:20
STC15系列单片机中的AUXR寄存器不支持位操作,这是一个特殊功能寄存器,并且各个位的功能甚至没有直接关联 ...

厉害了我的哥! 手册里 对PCON 、AUXR等寄存器的位功能描述比较分散,我也是看了又看才知道。
熟悉对的话两种写法都可以,不熟悉就分开确实安心些!
作者: ax6808    时间: 2022-3-1 23:35
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;
作者: dzbj    时间: 2022-3-2 00:47
不能位操作的寄存器就要整个赋值 你那么写当然可以 但不如手册上那么写方便 也容易出错
作者: npn    时间: 2022-3-2 11:33
AUXR寄存器由8个功能不同的位寄存器组成,不可位寻址。
使用C语言的 &= ,|= 运算符按位配置。
作者: youlinys    时间: 2022-3-2 15:57
AUXR寄存器讲的太好了。
作者: fhsgjsgjsfgjsfj    时间: 2022-3-4 13:09
stm32搞多了,51的也忘差不多了
作者: univers    时间: 2022-3-5 20:08
AUXR |= 0x01;         这个代表只动它的第一位,置1,其它的不会动。
作者: youlinys    时间: 2022-3-5 21:54
AUXR寄存器 主要是什么作用?
作者: 188610329    时间: 2022-3-5 22:12
youlinys 发表于 2022-3-5 21:54
AUXR寄存器 主要是什么作用?

你这问题问得…… , 名称上来讲,就是辅助寄存器。
不同的单片机,用处不同,

楼主贴的是 STC15 系列的,基本都是牵涉到定时器的设置
如果你看 STC89 的手册,里面还有 控制 ALE 的开关。
如果你去看 STC12 的手册, 里面还有 中断开关。

所以,如果抛开型号不讲,光说某个寄存器,压根没法泛泛回答。
作者: Ottifant127    时间: 2024-3-21 14:56
pcbboy 发表于 2019-10-7 09:09
要合并就是  AUXR = 0x15;    第二句话是位操作,将0x01按位或到AUXR。

确实如此,不过一般不合并吧,便于程序维护与修改。

作者: rayin    时间: 2024-3-24 10:35
=0x14; |=0x01; 两条分开写, 合并写都是一样的.
作者: 君工创    时间: 2024-3-24 12:08
分开写的好处是:不管之前打开了那些位,现在加上这一位。
作者: coody_sz    时间: 2024-3-24 12:56
通常为了单独控制某个位,就这样操作的,也便于理解。
我常用方法:
AUXR = 0;
AUXR |= 0x04;   //T2 1T模式
AUXR |= 0x01;   //串口1选择T2做波特率发生器
AUXR |= 0x10;   //启动T2
作者: adject    时间: 2024-3-24 15:38
AUXR |= 0x01;其实就是AUX = AUX | 0X1;
作者: 雪糕yya    时间: 2024-3-25 17:54
AUXR |= 0x04;                //定时器时钟1T模式
作者: fosu顽童    时间: 2024-3-26 10:19
本帖最后由 fosu顽童 于 2024-3-26 10:24 编辑

1、AUXR |= 0x01等价于AUXR= AUXR|0X01 ,这是按位或运算,将AUXR的8位按高到低分别与0000 0001进行或运算。

2、两语句可以合并写,可以分开写。
写例程的人员是为了方便移植所以分开两个语句写出来,抑或是他想给读者传达的编程思路是先配置好定时器参数,最后再配置串口的设置。
作者: 雪糕yya    时间: 2024-3-27 23:05
要合并:  AUXR = 0x15;   
第二句话是位操作,将0x01按位或到AUXR。
作者: lsylsyyyy    时间: 2024-3-28 14:03
问问大佬:里面的EXTRAM位为1的话禁止访问内部扩展ram,也就是说不能定义xdata的数据;但是上电的话EXTRAM默认是零吗,如果默认为零的话是不是可以直接在程序中定义xdata数据。

作者: a1592608215    时间: 2024-3-29 10:51
合并后为: AUXR = 0x15;   
AUXR |= 0x01; 是按位或   0x01 到 AUXR 的意思




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1