标题:
对这段单片机程序不理解,求指教
[打印本页]
作者:
创造生活
时间:
2022-4-24 12:30
标题:
对这段单片机程序不理解,求指教
void UartInit(void) //19200bps@32MHz{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xCC; //设置定时初始值
TH1 = 0xCC; //设置定时重载值
ET1 = 0; //禁止定时器%d中断
TR1 = 1; //定时器1开始计时
TI=1; // 很关键,使用printf函数时必须有此命令
}
各位大神大家好,这是一个串口通讯初始化的程序我有一些不理解特此求教!
PCON &= 0x7F;AUXR |= 0x40;AUXR &= 0xFE;TMOD &= 0x0F;TMOD |= 0x20; 这几句为什么串口软件计算器生成的代码不写成这样PCON = 0x7F;AUXR = 0x40;
AUXR = 0xFE;TMOD = 0x0F;TMOD = 0x20;直接赋值呀??
作者:
Y_G_G
时间:
2022-4-24 14:00
=是直接赋值,会影响寄存器的所有位
|是位或,只改变你想要改变的某个位而已,&也一样的道理
作者:
人人学会单片机
时间:
2022-4-24 15:23
你串口用的是定时器T1,那么定时器T0呢?它也是需要TMOD这个寄存器的,并且不能位操作,只能字节一起操作,为了不影响T0,就必须按位与拉低、按位或拉高,而不能直接赋值。
作者:
munuc_w
时间:
2022-4-24 16:55
PCON &= 0x7F; //最高位清零
AUXR |= 0x40; //第二位置1
AUXR &= 0xFE; //最低位清零
TMOD &= 0x0F; //高4位清零
TMOD |= 0x20; //第一位置1
为什么要这样操作?目的是修改寄存器中要修改的位并保持其它位的值不变。
作者:
Hephaestus
时间:
2022-4-24 17:27
初始化的时候直接赋值就可以了,你说得对。&=、|=这样的写法适合于中间要改变寄存器的值,看上去更加直观。
作者:
鬱悶_boy/pz
时间:
2022-4-24 17:50
使用位赋值可能使代码更易于阅读吧
作者:
创造生活
时间:
2022-4-26 11:49
Hephaestus 发表于 2022-4-24 17:27
初始化的时候直接赋值就可以了,你说得对。&=、|=这样的写法适合于中间要改变寄存器的值,看上去更加直观。
多谢您的指导
作者:
创造生活
时间:
2022-4-26 11:49
多谢大家指教
作者:
yzwzfyz
时间:
2022-4-26 17:14
完全可以!
不过,它们都有8个位,每个位有着各自的作用。
你这样做,你看到的位是对了,未看到的位也被你强制修改了啊。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1