问题:用计算机通过串行口发送数据到单片机,不连续发送或者每次发送数据不太大时单片机可以正常接收,但是连续发送大批数据之后就不能正常工作,确定硬件肯定没有任何问题,软件似乎没有问题
几经周折找到引发问题的代码所在
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口时最好只能需要的位通过位操作指令进行操作,对不需要操作的位要尽是避免操作,如果要同时操作的位比较多时请使用 &= 与 |=操作符操作,不要用赋值操作符=。
分享到:
相关推荐
keil的使用方法;Keil C51 UV2调试命令(中文版);KEIL C51 Vision2 中文入门教程;Keil C51使用帮助[中文资料];Keil C51语言使用技巧及实战
Keil C51中文教程 Keil C51中文教程 Keil C51中文教程
Keil C51是美国Keil Software公司...界面另外重要的一点只要看一下编译后生成的汇编代码就能体会到Keil C51 生成的目标代码效率非常之高多数语句生成的汇编代码很紧凑容易理解在开 发大型软件时更能体现高级语言的优势
Keil C51 使用详解(中文版) 是单片机开发最常用的工具
keil c51中文使用keil ckeil c51中文使用手册51中文使用手册手册keil c51中文使用手册
关于在keil c51中如何定位变量、常数和函数的位置
单片机Keil C51中函数指针的使用,这个东西不错的,至少我觉得不错啊,
详细介绍了Keil C51 使用技巧及注意事项。具有较好的学习价值。
keil c51使用说明 keil c51使用说明 keil c51使用说明
Keil C51讲座 Keil C51讲座 Keil C51讲座 Keil C51讲座
Keil C51是一款用于51系列兼容单片机C语言软件开发的系统。它支持所有的8051微控制器体系结构,提供了行业标准的Keil C编译器、宏汇编器、调试器、实时内核、单板计算机和仿真器等完整的开发方案。它适合各个阶段的...
Keil C51语言使用技巧及实战......
Keil C51使用帮助[中文资料]xxxxxxx
keil c51 v9.52完整注册版,uvision4 编写单片机利器.
keil c51编程手册,详细,入门最好教材
Keil C51编译器用户手册 Keil C51编译器用户手册 Keil C51编译器用户手册
Keil C51软件的使用和操作教程,大幅度提升操作能力及使用能力
Keil C51 中产生随机数的方法和样例
资源为Keil C51系列汉化包,请直接复制目录下的Uv4.exe到安装目录代替E文的Uv4.exe
Keil C51 编译器用户手册中文完整版,共403页,内容非常详尽。包含了Cx51编译器的各种选项、语言扩展、预处理器指令、8051派生系列、高级编程技术、错误信息以及库参考等等章节,学习Keil C51单片机不可多得的资料,...