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

在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口时最好只能需要的位通过位操作指令进行操作,对不需要操作的位要尽是避免操作,如果要同时操作的位比较多时请使用 &= 与 |=操作符操作,不要用赋值操作符=。

分享到:
评论

相关推荐

    N76E003_BSP_Keil_C51_V1.0.5.rar_N76E003 串口_N76E003 串口0_n76e003_

    在这款微控制器的开发过程中,串口通信扮演着至关重要的角色,尤其是串口0,它是设备与外部世界进行数据交换的常用通道。本教程将详细介绍如何使用N76E003的串口0功能,并结合Keil C51编译环境进行程序设计。 一、...

    Keil C51视频教程.rar

    10. **调试技巧与常见问题**:分享一些调试经验,如何定位和解决问题,以及在开发过程中可能遇到的陷阱和注意事项。 通过这个“Keil C51视频教程”,学习者不仅可以了解8051微控制器的基础知识,还能掌握Keil C51...

    Keil C51软件开发系统

    `安装说明.txt`则包含了详细的安装步骤和注意事项,按照说明进行操作可以确保软件正确安装并使用。 总之,Keil C51软件开发系统是51系列单片机开发不可或缺的工具,它以其丰富的功能、友好的界面和强大的调试能力,...

    KEIL C51 MDK-ARM安装破解配置教程

    尽管KEIL C51 MDK-ARM可以在Win10环境下正常运行,但作者建议在Windows 7操作系统下使用KEIL,主要是考虑到部分硬件设备可能存在驱动兼容性问题或安装过程复杂(例如PCI/PCI-E串口卡)。 #### 二、KEIL C51 MDK-ARM下载...

    keil中文手册

    C51 for Windows的安装及注意事项:... 7 第四节 Keil C51工具包各部分功能及使用简介... 7 1. C51与A51. 7 2. L51和BL51. 8 3. DScope51,Tscope51及Monitor51. 8 4. Ishell及uVision. 9 第二章 Keil C51软件...

    keilc51开发技巧(中文版)

    5. **中断服务程序**:C51支持中断服务程序的编写,书中会介绍如何定义中断向量,以及中断处理的注意事项。 6. **库函数与设备驱动**:keil C51提供了大量用于控制硬件的库函数,如定时器、串口通信、I/O端口等,书...

    Keil C使用教程

    ### Keil C51 使用教程详解 #### 一、Keil C51 概述 Keil C51是一款广泛应用于单片机开发的强大工具,它不仅具备编辑、编译和仿真...对于想要深入学习单片机开发的朋友来说,掌握Keil C51的使用是非常重要的一步。

    单片机C51串口编程指南

    在UART编程中,需要使用一些开发工具,包括Keil µVision、Atmel Studio等。这些工具可以帮助开发者快速实现UART编程。 8. UART编程应用示例 在本指南中,我们提供了多种UART编程应用示例,包括机器人控制、工业...

    keilc51_manual.pdf

    3. 安装指南:提供了在DOS和Windows环境下安装C51的步骤和注意事项,确保用户能够顺利设置开发环境。 二、Keil C51软件使用详解 1. 编译器控制指令:包括源文件控制、目标文件控制和列表文件控制,这些指令帮助...

    基于Keil-C51与Proteus联合仿真的PC与8051单片机串行通信

    注意事项: 1.使用时,Proteus调用的的hex文件,文件夹路径为: PC_单片机通信_Keil--------Objects---------PC_MCU.hex。2.程序运行需要安装Virtual Serial Port Driver 和串口调试助手。资源中给出了两者的安装包...

    Keil51使用详解(very good)

    - **1.3.2 C51 for Windows的安装及注意事项:** - 安装步骤简单直观,通过运行安装程序并按照提示操作即可完成。 - 注意事项: - 确保计算机满足最低配置要求。 - 在安装过程中选择合适的路径以便于后续使用。 ...

    嵌入式系统keilc教程

    - 在使用 Keil C51 开发工具时,需要注意遵守相关的版权和使用协议。 - 开发过程中应注意选择合适的编译器选项,以获得最佳的性能和代码大小。 - 调试时应充分利用 uVision2 提供的高级调试功能,提高问题定位的效率...

    赛元keil 安装包SOC-KEIL-Setup

    4. **嵌入式开发中的注意事项**: - **硬件兼容性**:确认keil支持所使用的微控制器型号,并正确配置芯片的寄存器模型。 - **内存管理**:理解目标MCU的内存结构,合理分配RAM和ROM资源。 - **优化级别**:编译器...

    51单片机串口发送16进制数并在数码管上显示

    程序描述:以16进制发送一个0-65535之间的任一数,当单片机收到后再以16进制形式在数码管上动态显示出来,波特率自定。 使用开发板:清翔电子,普中的...注意事项:使用串口助手发送字符需要带上结束符否则无法使用。

Global site tag (gtag.js) - Google Analytics