找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13775|回复: 32
打印 上一主题 下一主题
收起左侧

请教STC15系列单片机中的AUXR寄存器使用

  [复制链接]
回帖奖励 25 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
AUXR = 0x14;                    //T2为1T模式, 并启动定时器2
AUXR |= 0x01;                    //选择定时器2为串口1的波特率发生器

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




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:25310 发表于 2019-10-7 09:09 | 只看该作者
要合并就是  AUXR = 0x15;    第二句话是位操作,将0x01按位或到AUXR。
回复

使用道具 举报

板凳
ID:25310 发表于 2019-10-7 09:11 | 只看该作者
合并后为: AUXR = 0x15;   
AUXR |= 0x01; 是按位或   0x01 到 AUXR 的意思
   
回复

使用道具 举报

地板
ID:609989 发表于 2019-10-7 09:13 | 只看该作者
这句写错了:
是:我是不是可以直接写成:AUXR = 0x15;  (既允许打开定时器2,定时器2是8051  12倍,不分频。又可以直接选择定时器2 位UART1的波特率发生器)?
回复

使用道具 举报

5#
ID:25310 发表于 2019-10-7 09:13 | 只看该作者
合并后为: AUXR = 0x15;   
  |   是按位或 的意思
回复

使用道具 举报

6#
ID:609989 发表于 2019-10-7 09:15 | 只看该作者
写错了一句:我是不是可以直接写成:AUXR = 0x15;  (既允许打开定时器2,定时器2是8051  12倍,不分频。又可以直接选择定时器2 位UART1的波特率发生器)?
回复

使用道具 举报

7#
ID:609989 发表于 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”.
回复

使用道具 举报

8#
ID:390416 发表于 2019-10-7 12:36 来自手机 | 只看该作者
我们人人学会单片机的课程,就是这样操作的,意思就是,你单独控制某一位,而其他位则是保持不变。郭傻瓜得课程,就是直接赋值了,是不安全的写法。
回复

使用道具 举报

9#
ID:609989 发表于 2019-10-7 15:45 | 只看该作者
人人学会单片机 发表于 2019-10-7 12:36
我们人人学会单片机的课程,就是这样操作的,意思就是,你单独控制某一位,而其他位则是保持不变。郭傻瓜得 ...

1.他也是单独控制寄存器的某一位,假如控制 SCON寄存器中的 REN(第5位),人家直接写REN=1,不用就 REN=0,也挺好理解。
你的可以写成:SCON | = 0x10。
你们 是一样的 。
2.对于控制位还是控制字节,我感觉对于初学者不了解的,使用位控制,可以使他们充分理解寄存器功能。
对于比较熟练的,直接进行字节赋值,可以减少程序长度。
回复

使用道具 举报

10#
ID:213173 发表于 2019-10-8 13:20 | 只看该作者
STC15系列单片机中的AUXR寄存器不支持位操作,这是一个特殊功能寄存器,并且各个位的功能甚至没有直接关联。因此对其中某一位或某几位操作时不能随意改变其它位的状态,所以用按位与“&”和按位或“|”的方式操作其中某一位或某几位就不会改变其它位的状态。这个方法同样适用于支持位操作的寄存器,可以使代码简洁高效。
回复

使用道具 举报

11#
ID:881491 发表于 2021-2-4 11:09 | 只看该作者
AUXR |= 0x04;                //定时器时钟1T模式
回复

使用道具 举报

12#
ID:382454 发表于 2021-2-4 15:36 | 只看该作者
要多看看例程了,  AUXR “|”这里面的 |  是单单干寄存里的单单某一位,而其它的原封不动。
回复

使用道具 举报

13#
ID:206350 发表于 2021-11-24 14:42 | 只看该作者
按照位或,学习了!!!!
回复

使用道具 举报

14#
ID:897866 发表于 2021-11-27 17:40 | 只看该作者
合并后就是  AUXR = 0x15;   
第二句应该是位操作,将0x01按位或到AUXR。
回复

使用道具 举报

15#
ID:975054 发表于 2022-3-1 21:57 | 只看该作者
wulin 发表于 2019-10-8 13:20
STC15系列单片机中的AUXR寄存器不支持位操作,这是一个特殊功能寄存器,并且各个位的功能甚至没有直接关联 ...

厉害了我的哥! 手册里 对PCON 、AUXR等寄存器的位功能描述比较分散,我也是看了又看才知道。
熟悉对的话两种写法都可以,不熟悉就分开确实安心些!
回复

使用道具 举报

16#
ID:975054 发表于 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;
回复

使用道具 举报

17#
ID:47286 发表于 2022-3-2 00:47 来自手机 | 只看该作者
不能位操作的寄存器就要整个赋值 你那么写当然可以 但不如手册上那么写方便 也容易出错
回复

使用道具 举报

18#
ID:57657 发表于 2022-3-2 11:33 | 只看该作者
AUXR寄存器由8个功能不同的位寄存器组成,不可位寻址。
使用C语言的 &= ,|= 运算符按位配置。
回复

使用道具 举报

19#
ID:983641 发表于 2022-3-2 15:57 | 只看该作者
AUXR寄存器讲的太好了。
回复

使用道具 举报

20#
ID:61261 发表于 2022-3-4 13:09 | 只看该作者
stm32搞多了,51的也忘差不多了
回复

使用道具 举报

21#
ID:382454 发表于 2022-3-5 20:08 | 只看该作者
AUXR |= 0x01;         这个代表只动它的第一位,置1,其它的不会动。
回复

使用道具 举报

22#
ID:983641 发表于 2022-3-5 21:54 | 只看该作者
AUXR寄存器 主要是什么作用?
回复

使用道具 举报

23#
ID:624769 发表于 2022-3-5 22:12 | 只看该作者
youlinys 发表于 2022-3-5 21:54
AUXR寄存器 主要是什么作用?

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

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

所以,如果抛开型号不讲,光说某个寄存器,压根没法泛泛回答。
回复

使用道具 举报

24#
ID:1113460 发表于 2024-3-21 14:56 | 只看该作者
pcbboy 发表于 2019-10-7 09:09
要合并就是  AUXR = 0x15;    第二句话是位操作,将0x01按位或到AUXR。

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

使用道具 举报

25#
ID:517951 发表于 2024-3-24 10:35 | 只看该作者
=0x14; |=0x01; 两条分开写, 合并写都是一样的.
回复

使用道具 举报

26#
ID:965189 发表于 2024-3-24 12:08 | 只看该作者
分开写的好处是:不管之前打开了那些位,现在加上这一位。
回复

使用道具 举报

27#
ID:1034262 发表于 2024-3-24 12:56 | 只看该作者
通常为了单独控制某个位,就这样操作的,也便于理解。
我常用方法:
AUXR = 0;
AUXR |= 0x04;   //T2 1T模式
AUXR |= 0x01;   //串口1选择T2做波特率发生器
AUXR |= 0x10;   //启动T2
回复

使用道具 举报

28#
ID:419968 发表于 2024-3-24 15:38 | 只看该作者
AUXR |= 0x01;其实就是AUX = AUX | 0X1;
回复

使用道具 举报

29#
ID:1069659 发表于 2024-3-25 17:54 | 只看该作者
AUXR |= 0x04;                //定时器时钟1T模式
回复

使用道具 举报

30#
ID:402383 发表于 2024-3-26 10:19 | 只看该作者
本帖最后由 fosu顽童 于 2024-3-26 10:24 编辑

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

2、两语句可以合并写,可以分开写。
写例程的人员是为了方便移植所以分开两个语句写出来,抑或是他想给读者传达的编程思路是先配置好定时器参数,最后再配置串口的设置。
回复

使用道具 举报

31#
ID:1069659 发表于 2024-3-27 23:05 | 只看该作者
要合并:  AUXR = 0x15;   
第二句话是位操作,将0x01按位或到AUXR。
回复

使用道具 举报

32#
ID:874002 发表于 2024-3-28 14:03 | 只看该作者
问问大佬:里面的EXTRAM位为1的话禁止访问内部扩展ram,也就是说不能定义xdata的数据;但是上电的话EXTRAM默认是零吗,如果默认为零的话是不是可以直接在程序中定义xdata数据。
回复

使用道具 举报

33#
ID:993578 发表于 2024-3-29 10:51 | 只看该作者
合并后为: AUXR = 0x15;   
AUXR |= 0x01; 是按位或   0x01 到 AUXR 的意思
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表