`
yidongkaifa
  • 浏览: 4059731 次
文章分类
社区版块
存档分类
最新评论

在KEIL C51中使用串口的重要注意事项

 
阅读更多

问题:用计算机通过串行口发送数据到单片机,不连续发送或者每次发送数据不太大时单片机可以正常接收,但是连续发送大批数据之后就不能正常工作,确定硬件肯定没有任何问题,软件似乎没有问题

几经周折找到引发问题的代码所在
P3 = ((P3 & 0xC3) | (newVal可能是这行代码影响串行口根本无法工作改成以下代码,串行口工作正常
P3 &= 0xC3; <代码2>
P3 |= (newVal经查阅AT89C51的数据手册,其中有两点特别重要的说明
1、当P3口不作IO使用,而使用第二功能时,发源将该口置1,否则该口会一直保持0(The alternate functions can only be activated if the corresponding bit latch in the port SFR contains a 1. Otherwise the port pin is stuck at 0.)
2、当使用如下指令时,读取的是端口寄存器的值,而不是外部引脚的值(When the destination operand is a port, or a port bit, these instructions read the latch rather than the pin):
ANL (logical AND, e.G., ANL P1,A)
ORL (logical OR, e.g., ORL P2,A)
XRL (logical EX-OR, e.g., XRL P3,A)
JBC (jump if bit = 1 and clear bit, e.g., JBC P1.1, LABEL)
CPL (complement bit, e.g., CPL P3.0)
INC (increment, e.g., INC P2)
DEC (decrement, e.g., DEC P2)
DJNZ (decrement and jump if not zero, e.g., DJNZ P3, LABEL)
MOV PX.Y,C(move carry bit to bit Y of Port X)
CLR PX.Y(clear bit Y of Port X)
SETB PX.Y(set bit Y of Port X)
以下是比较该段代码所使用的程序,汇编程序如下
48: { uchar newVal = 0x18;
C:0x003A 756018 MOV 0x60,#0x18
49: P3 = ((P3 & 0xC3) | (newVal 50:
C:0x003D E560 MOV A,0x60
C:0x003F 25E0 ADD A,ACC(0xE0)
C:0x0041 25E0 ADD A,ACC(0xE0)
C:0x0043 FF MOV R7,A
C:0x0044 E5B0 MOV A,P3(0xB0) // 此处读的是外部引脚(PIN)
C:0x0046 54C3 ANL A,#0xC3
C:0x0048 4F ORL A,R7
C:0x0049 F5B0 MOV P3(0xB0),A
51: newVal = 0x28;
C:0x004B 756028 MOV 0x60,#0x28
52: P3 &= 0xC3;
C:0x004E 53B0C3 ANL P3(0xB0),#0xC3 // 此处读取、修改的是寄存器
53: P3 |= (newValC:0x0051 E560 MOV A,0x60
C:0x0053 25E0 ADD A,ACC(0xE0)
C:0x0055 25E0 ADD A,ACC(0xE0)
C:0x0057 42B0 ORL P3(0xB0),A
54: }
答案:
串行口出现问题的原因就很清楚了,就是使用<代码1>时,读取的是外部引脚,而这时串行口正在通信,可能些接收到的位刚好为0,读进来也是0,再把它写到P3时,就是把寄存器写成了0,些时串行口的接收端被置零,串行口的输入被禁止,所以,以后根本就接收不到数据;而用<代码2>时修改的是寄存器,而P3.0,P3.1即串行口的两条IO口线的寄存器一开始就是1,读取是仍然是1,通过ANL,与ORL进行操作的正是寄存器,所以不会改写P3寄存器的值,例口串行口仍然能进行工作。
建议:
使用IO口时最好只能需要的位通过位操作指令进行操作,对不需要操作的位要尽是避免操作,如果要同时操作的位比较多时请使用 &= 与 |=操作符操作,不要用赋值操作符=。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics