你这个现象本质上不是“串口硬件把 +2 变成了 +1”,而是 你在读写同一个 SBUF 时发生了写回/读回混淆,再加上表达式里对 SBUF 的访问顺序不可靠,导致结果看起来像“总是少 1”。8051 的 SBUF 不是普通 RAM,它是两个物理上不同的寄存器:写 SBUF 是发射缓冲,读 SBUF 是接收缓冲;SBUF 不能被当成一个可读可写且值一致的变量来用 。
正确写法
建议改成下面这种方式:
- #include <STC89C5xRC.H>
-
- void UART_Init(void)
- {
- SCON = 0x50; // 8位UART, REN=1
- TMOD &= 0x0F;
- TMOD |= 0x20; // T1方式2
- TH1 = 0xFD; // 11.0592MHz, 9600bps
- TL1 = 0xFD;
- TR1 = 1;
- ES = 0;
- EA = 0;
- }
-
- void main(void)
- {
- unsigned char dat;
-
- UART_Init();
-
- while(1)
- {
- while(!RI);
- dat = SBUF; // 先把接收到的数据存到普通变量
- RI = 0;
-
- dat += 2; // 再做运算
- while(!TI); // 如果你要等发送完成,先确保初始TI状态正确
- TI = 0;
- SBUF = dat; // 最后发送
- }
- }
-
复制代码
|