目录
PCON 电源控制寄存器
功能:
PCON 寄存器主要用于CHMOS型单片机的电源控制,包括设置电源模式、波特率倍增等。
地址:
- 字节地址:87H
结构:
- SMOD:波特率加倍位。SMOD=1时,串行口波特率加倍;SMOD=0时,波特率正常。
- PD:掉电模式设定位。PD=1时,单片机进入掉电模式;PD=0时,单片机正常工作。
- IDL:空闲模式设定位。IDL=1时,单片机进入空闲模式;IDL=0时,单片机正常工作。
初始化设置:
在进行电源管理时,需要设置PCON寄存器的相关位,以确定单片机的电源模式和工作状态。
PCON &= 0x7F:
这条语句的目的是清除PCON
寄存器中的SMOD
位,即将SMOD
位设置为0。这是通过位与(AND)操作来实现的。
解释如下:
0x7F
是一个十六进制数,其二进制表示为0111 1111
。&=
是位与赋值操作符。它会将PCON
寄存器中的每一位与0x7F
的对应位进行与操作,并将结果存储回PCON
寄存器。- 因为
0x7F
的低7位都是1,而最高位(即SMOD
位)是0,所以与操作会保留PCON
的低7位不变,并将SMOD
位设置为0。
这样,通过执行PCON &= 0x7F;
,你就可以确保SMOD
位被清除(设置为0),从而禁用波特率加倍功能。如果你想要启用波特率加倍功能,你可以使用PCON |= 0x80;
,这会将SMOD
位设置为1,而保持其他位不变。
补充回顾:&=、|=;
位与(AND)运算的规则是:
- 如果两个相应的二进制位都为1,则该位的结果值为1。
- 否则,结果为0。
&=
运算符的使用通常是为了修改一个变量的某些位而不影响其他位。
例如,假设我们有一个字节变量 flags
,我们想要清除它的最高位(即第7位,从右边数起),而不改变其他位。我们可以使用 &=
运算符和掩码(mask)0x7F
(二进制为 0111 1111
)来实现这一点:
在这个例子中,flags
的初始值是 0xA5
(二进制 1010 0101
)。当我们执行 flags &= 0x7F;
时,flags
的每一位都与 0x7F
(二进制 0111 1111
)的对应位进行位与操作。因为 0x7F
的最高位是0,所以 flags
的最高位也被设置为0,而其他位保持不变。最终,flags
的值变为 0x25
(二进制 0010 0101
)。
位或(OR)运算的规则是:
- 如果两个相应的二进制位中至少有一个为1,则该位的结果值为1。
- 否则,结果为0。
|=
运算符通常用于修改一个变量的某些位而不影响其他位。
例如,假设我们有一个字节变量 flags
,我们想要设置它的第二位(从右边数起,索引为1),而不改变其他位。我们可以使用 |=
运算符和掩码(mask)0x02
(二进制为 0000 0010
)来实现这一点:
在这个例子中,flags
的初始值是 0x01
(二进制 0000 0001
)。当我们执行 flags |= 0x02;
时,flags
的每一位都与 0x02
(二进制 0000 0010
)的对应位进行位或操作。因为 0x02
的第二位是1,所以 flags
的第二位也被设置为1,而其他位保持不变(因为它们与 0x02
的对应位进行或运算时,结果仍然是它们原来的值)。最终,flags
的值变为 0x03
(二进制 0000 0011
)。
SCON 控制寄存器
功能:
SCON 控制寄存器主要用于控制串行通信的方式选择、接收和发送,以及指示串口的状态。
地址:
- 字节地址:98H
- 位地址:98H~9FH
结构:
- SM0、SM1:这两位定义了串行口的4种工作方式,包括移位寄存器I/O方式、10位通用异步接口、11位异步通信接口等。
- SM2:多机通信控制位。在方式2和方式3下,当SM2=1时,只有接收到的第9位数据(RB8)为1时,才会产生中断请求并将数据送入SBUF。
- REN:允许串行接收位。REN=1时,允许接收数据;REN=0时,禁止接收数据。
- TB8:在方式2和方式3时,TB8是要发送的第9位数据,其值由软件设置。
初始化设置:
在进行串口通信之前,需要对SCON寄存器进行初始化设置,包括确定串行口的工作方式、允许接收数据等。
SCON = 0x50:
将 SCON
寄存器的所有位设置为一个特定的值。在十六进制数 0x50
中,其二进制表示为 0101 0000
。
根据标准的8051 SCON
寄存器定义,这个值通常意味着:
- SM0 = 1: 通常表示串行通信工作在模式1(9位可变波特率)。但具体的模式可能取决于SM1和其他位的设置。
- SM1 = 0: 与SM0一起确定串行通信的模式。在这里,与SM0结合表示模式1。
- SM2: 通常用于多机通信中的地址识别,但在这里它是0。
- REN: 接收使能位。这里它被设置为0,意味着接收功能被禁用。但在某些应用中,即使REN被设置为0,接收可能仍然可以工作(取决于具体的硬件和固件实现)。
- TB8: 发送数据的第9位。在这里它被设置为0。
- RB8: 接收数据的第9位。这是一个只读位,表示最近接收到的数据的第9位。
- TI: 发送中断标志。这是一个只读位,表示发送缓冲区为空。
- RI: 接收中断标志。这是一个只读位,表示接收缓冲区有数据。
但是,请注意,SCON
寄存器的确切位定义和功能可能因不同的8051变种或制造商而有所不同。因此,最好查阅你正在使用的具体8051微控制器的数据手册或参考手册,以获取关于 SCON
寄存器及其位定义的准确信息。
另外,由于 TI
和 RI
是只读位,直接写入 SCON
寄存器时,这两个位通常会被忽略。如果你需要清除这些中断标志,通常需要通过其他方式(如软件清零)来完成。
自己实现串口编程初始化:
方式1:
SCON 配置 0100 0000
编程练习:
串口波特率9600
每隔一秒,单片机向PC发送一个字符串
PC上位机串口调试助手发送字母o点亮LED,发送字母c关闭LED