Keil软件仿真的串口调试技巧

发布者:转眼人老最新更新时间:2007-09-06 来源: 嵌入式在线关键字:程序  通信  变量  硬件 手机看文章 扫描二维码
随时随地手机看文章
引言

在单片机系统中,串口(UART,通用异步收发接口)是一个非常重要的组成部分。通常使用单片机串口通过RS232/RS485电平转换芯片与上位机连接,以进行上位机与下位机的数据交换、参数设置、组成网络以及各种外部设备的连接等。RS232/RS485串行接口总线具有成本低、简单可靠、容易使用等特点,加上其历史悠久,所以目前应用仍然非常广泛;特别对于数据量不是很大的场合,串口通信仍然是很好的选择,有着广阔的使用前景。

在单片机编程中,串口占了很重要的地位。传统方式串口程序的调试,往往是利用专用的单片机硬件仿真器。在编写好程序后,利用仿真器来设置断点,观察变量和程序的流程,逐步对程序进行调试,修正错误。使用硬件仿真器的确是很有效的方法,但是也有一些缺点:

  • 很多仿真器不能做到完全硬件仿真,因而会造成仿真时正常,而实际运行时出现错误的情况;也有仿真不能通过,但是实际运行正常的情况。
  • 对于一些较新的芯片或者是表面贴装的芯片,要么没有合适的仿真器或仿真头;要么就是硬件仿真器非常昂贵,且不容易买到。
  • 有时由于设备内部结构空间的限制,仿真头不方便接入。
  • 有的仿真器属于简单
    的在线仿真型,仿真时有很多限制。例如速度不高,实时性或稳定性不好,对断点有限制等,造成仿真起来不太方便。

1 调试前的准备工作

下面介绍一种利用Keil的软件仿真功能来实现51单片机串口调试用户程序的方法。使用这种方法,无需任何硬件仿真器,甚至都不需要用户电路板。所需的只是:

  ① 硬件。1台普通计算机(需要带有2个标准串口)和1根串口线(两头都是母头,连线关系如图1所示)。

  ② 串口软件可以是自己编写的专用调试或上下位机通信软件,也可以是通用的串口软件(如串口助手、串口调试等),主要用来收发数据。如果没有合适的串口调试软件,则可使用笔者编写的一个免费的串口小工具TurboCom。除了与其他软件一样的数据收发功能外,它还有定时轮流发送自定义数据帧和自动应答(接收到指定数据帧后,自动返回相应的数据帧)这两个很有用的功能,特别适合于老化测试。这个小工具可以从http://shaoziyang.bloger.com.cn下载。

2 基本调试命令介绍

这个串口调试方法主要是利用了Keil强大的软件仿真功能。在新版本(高于6.0)的Keil软件中,增强了软件的仿真能力,可以利用软件仿真更多的单片机功能。在这些功能中,其中有一个很重要的功能就是利用计算机的串口来模拟单片机的串口(这不同于很多软件在仿真时使用的激励文件方式,可以直接与其他串口进行通信,更加方便、灵活)。首先要介绍仿真时需要使用的两个命令:ASSIGN和MODE。

2.1 ASSIGN命令

将单片机的串口绑定到计算机的串口。基本使用方式为:

  ASSIGN channeloutreg

其中: channel代表计算机的串口,可以是COM1、COM2、COM3或COM4;而inreg和outreg代表单片机的串口。对于只有一个串口的普通单片机,即SIN和SOUT;对于有两个或者多个串口的单片机,即SnIN和SnOUT(n=0,1,…即单片机的串口号)。

图1 串口连线示意图

例如:

  ASSIGN COM1SOUT

将计算机的串口1绑定到单片机的串口(针对只有一个串口的单片机)。

  ASSIGN COM2S0OUT

将计算机的串口2绑定到单片机的串口0(针对有多个串口的单片机,注意串口号的位置)。

需要注意的是,参数的括号是不能省略的,而outreg则是没有括号的。

2.2 MODE命令

设置被绑定计算机串口的参数。基本使用方式为:

  MODE COMx baudrate, parity, databits, stopbits

其中: COMx(x = 1,2,…)代表计算机的串口号;baudrate代表串口的波特率;parity代表校验方式;databits代表数据位长度;stopbits代表停止位长度。

例如:

  MODE COM1 9600, n, 8, 1

设置串口1。波特率为9 600,无校验位,8位数据,1位停止位。

  MODE COM2 19200, 1, 8, 1

设置串口2。波特率为19 200,奇校验,8位数据,1位停止位。

使用以上两个命令,就能够将计算机的串口模拟成单片机的串口了。在进行软件仿真时,所有发送到被绑定的计算机串口上的数据都会转发到Keil模拟的单片机串口上,用户程序可以通过中断处理程序或查询方式接收到这些数据;同样,单片机程序中发送到单片机串口上的数据也会通过被绑定的计算机串口发送出来,可以被其他软件所接收。利用这个特点,就可以方便地仿真、调试单片机的串口部分程序。要注意的是,这两个命令需要一起使用。

2.3 仿真步骤

首先,用串口线将计算机的两个串口连接起来(或者是两台计算机上的两个串口)。这两个串口一个用来模拟单片机串口,另一个给调试程序使用。这个由用户自己分配,没有特殊要求。

其次,编写好用户程序,并编译通过。

然后,设置工程文件(Project)的相关参数,如图2和图3所示。主要是选择软件仿真模式(Use Simulator)以及晶振参数。

图2 仿真参数设置

为了不必每次进入仿真状态后,都需要输入串口参数设置命令,可以建立一个初始化文件。初始化文件是一个普通的文本文件,内容就是仿真时需要的命令,按照顺序一行输入一条。如图2所示,建立了一个debug.ini的初始化文件。这样,当每次进入仿真调试状态时,Keil就会自动载入 debug.ini的内容进行初始化。

图3 晶振参数设置

为了正确仿真串口,在软件仿真调试时,在用户的Keil工程文件的属性中,还需要设置实际使用的晶振频率。这个参数非常重要,直接影响通信的波特率,可以按照实际使用的参数进行设置。要注意,这个参数的单位是MHz。

设置好参数后,就可以进行仿真了。单击工具栏的图标按此在新窗口浏览图片进入Debug(仿真调试)状态,在Output window窗口中的command文本框(一般是在左下角)中输入上面介绍的命令。例如,将PC机的串口1设置为单片机的串口:

  mode com1 9600,0,8,1

  assign com1 Sout

然后设置断点,一般是在关键地方或与串口相关联的地方设置。再单击图标运行(Run)用户程序,使用户程序运转起来(不然是接收不到串口数据的)。这时再使用串口调试软件或用户调试软件,发送通信命令或者数据包,看用户程序是否进入断点,以及相关的变量是否正确。还可以有意发送带有错误数据的数据包,以观察用户程序的异常处理部分是否正常。一旦发现程序中的错误,可以马上停止仿真调试,立即修改代码,然后再次重复上面的步骤进行仿真。因为不需要与用户目标板联机,也不用下载代码到用户板上,所以速度非常高。以上这些步骤和使用硬件仿真器的基本一样,只不过现在使用的是软件仿真。

需要注意的是:仿真时单片机串口实际的波特率由MODE命令来指定,单片机程序中的TMOD、SCON等参数是不影响串口仿真状态的(也就是说这些参数不影响仿真的波特率,即使它们是错误的)。但是中断的使能位(如ES、EA等)还是起作用的,如果ES或EA被禁止,那么就不会进入串口中断。

因为这种方法是利用计算机的串口来仿真单片机的串口,而仿真是通过Keil软件来转换串口上的数据,不是直接转发数据的,所以在实际仿真时,处理速度会比实际单片机运行时稍微低一点。比方说仿真状态时1 s只能发送/接收10个数据帧,但在单片机硬件上运行时可能1 s就可以接收/发送50个数据帧。这与使用的计算机的速度有关,但对仿真来说,是没有任何影响的。

对于多串口的单片机,从理论上来说,可以一次绑定多个串口,只要计算机有足够多的串口。基本上,使用这种方法需要占用计算机的串口数量是单片机绑定串口的2倍。一个串口被Keil占用,用来模拟单片机的串口;另外一个串口被计算机占用,用来给单片机的串口收发数据。

3 小结

这里介绍的方法对C51和汇编语言都是适合的。它最大的好处就是简单、方便,容易使用,不需要使用任何电路,也没有特殊的要求;甚至可以在硬件电路制作好之前就将串口部分的程序编写、调试完毕。笔者使用这种方法已经很长时间了,事实证明这种方法确实非常有效。其实对于51单片机,Keil的仿真功能实在是太强大了,只要充分掌握其特点,能够熟练利用它,就可以解决工作中的大部分问题。很多工作都可以使用软件仿真来完成,根本无需任何硬件仿真器;只有一些新的外部器件的时序、接口的调试才有可能需要用到硬件仿真器。目前介绍Keil软件仿真这方面的参考书籍很少,有些讲的还是老版本的用法,不过没有关系,Keil的帮助文件写得很详细、很清楚,只要认真看明白就会使用了。使用熟练后,就会发现Keil的功能相当强。

对于串口编程,51单片机有Keil这个功能强大的开发软件,给我们带来了极大的便利;而在其他单片机软件的开发中,目前还没有这么强大的开发工具和方便的调试手段。这里有个变通的办法,就是可以先在Keil中编写并调试好串口程序,然后将程序移植到其他单片机平台中(笔者在PIC18单片机开发中就使用了这种方法,收到了很好的效果。当然这是指在使用C语言开发单片机程序时,汇编语言是没有可移植性的)。至于如何能够减小程序移植的工作量,使得程序具有更好的通用性,以最小的代价就可以平滑地移植到其他单片机平台上,也是一个非常值得探讨的问题。另外,为了方便初学者掌握这种方法,笔者专门做了一个例子程序,放在http://shaoziyang.bloger.com.cn上,可以用来练习。

参考文献

[1] Keil公司的帮助文件DBG51.CHM.

关键字:程序  通信  变量  硬件 引用地址:Keil软件仿真的串口调试技巧

上一篇:Keil软件仿真的串口调试技巧
下一篇:基于ARM的嵌入式系统中从串配置FPGA的实现

推荐阅读最新更新时间:2024-05-02 20:37

密码锁硬件电路原理图
  采用MCS51 系列单片机At89S51 作为主控制器,外围电路器件包括数码管驱动、蜂鸣器的输出驱动、独立式键盘以及发光二极管的输出等。数码管驱动采用2 个四联共阴极数码管显示,由于单片机驱动能力有限,采用74HC244 作为数码管的驱动。在74HC244 的7 段码输出线上串联100 欧姆电阻起限流作用。蜂鸣器的驱动采用PNP 三极管8550 来驱动,低电平有效。   独立式按键使用上提拉电路连接,在没有键按下时,输出高电平。发光二极管串联500 欧姆电阻再接到电源上,当输入为低电平时,发光二极管导通发光。硬件电路原理图如图1所示。
[单片机]
密码锁<font color='red'>硬件</font>电路原理图
2440驱动MMA7455L源程序
单片机源程序如下: /**************************************************************** 文件名:Main.c 功能描述:主程序 ****************************************************************/ #define GLOBAL_CLK 1 #include stdlib.h #include string.h #include def.h #include option.h #include 2440addr.h #include 2440lib.h #include
[单片机]
2440驱动MMA7455L源<font color='red'>程序</font>
LCD12864带中文字库图形显示-单片机程序
代码: #include reg52.h #define uchar unsigned char sbit rs=P2^2;//写指令/数据 sbit rw=P2^3;//读状态/写 sbit e=P2^4;//使能端 sbit psb=P2^5;//串/并输入 //校徽 unsigned char code image ={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0x
[单片机]
LCD12864带中文字库图形显示-单片机<font color='red'>程序</font>
基于ARM9的Web服务器Boa的软/硬件设计
1.ARM简介 广义地讲,凡是带有微处理器的专用软硬件系统都可以称为嵌入式系统。它是嵌入到对象体系中的专用计算机系统,以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。目前非常流行的ARM内核有ARM7TDM1、S t r o n g A R M 、A R M 7 2 0 T 、A R M 9 T D M 1 、ARM920T、ARM940T、ARM946T、ARM966T、ARM10TDM1等。本文所讨论的目标板的CPU为ARM920T内核的三星S3C2410芯片。 ARM9系列微处理器主要应用于无线设备、仪器仪表、安全系统、机顶盒、高端打印机、数字照相机和数
[电源管理]
基于ARM9的Web服务器Boa的软/<font color='red'>硬件</font>设计
选择低成本硬件和IP方案加速高清平板电视设计
不久以前,高清平板电视对普通消费者来说还是一个奢侈品。而现在,大多数一般收入家庭去购买一台高清平板电视已非难事。应对这一变化,面板厂家正在扩大产能去迎合市场需求并且鼓励更多的人去购买这一显示设备。 市场研究公司iSuppli预计,在世界范围内,液晶和等离子(PDP)电视的出货量将从2,000万台(2004年)增长到接近9,000万台(2009年)。随着技术和显示尺寸的扩展,这些平板显示设备正在替代传统的阴极射线管(CRT)显示设备,甚至即使在同样的显示尺寸上,前者的价格还要稍高于后者。 较高的清晰度、优秀的色彩还原能力、最小的数字运动失真,这些都是消费者追求的性能。这些指标让消费者将不同的平板显示模式区分开来,在特定的屏幕
[嵌入式]
什么是串口通信?基于STM32的printf打印输出
  前言:平时我们进行c语言编程的时候会经常用到printf函数进行打印输出,来调试代码。可是这个printf函数C库已经帮我们实现好了,通常只需要直接调用即可,但是如果在一个新的开发平台,如果库没有帮我们实现好,比如STM32开发板,那么我们怎么实现printf打印输出呢?   首先我们来了解一下串口通信!   1、什么是串口通信?   串口通信(Serial Communication),是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种通讯方式。   串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。   2、串口通信协议   在串口通信中,常用的协议包括RS-232、R
[单片机]
什么是串口<font color='red'>通信</font>?基于STM32的printf打印输出
PDH通信二次群复接器在CPLD中的实现
1 引 言 数字复接就是把两个或两个以上的支路数字信号按时分复接方式合并成单一的合路数字信号。按照各低次群时钟的情况,复接有3种方式:如果各输入支路数字信号相互同步,且与本机定时信号也同步,那么调整单元只需调整相位,这就是同步复接;如果输入支路数字信号不同步且与本机定时信号也异步,那么调整单元就要对各支路信号进行频率和相位的调整,使之成为同步信号,这就是异步复接;如果输入支路数字信号的生效瞬间相对于本机对应的定时信号是以同一标称速度出现,而速度的任何变化都限制在规定的容差范围内,这种就是准同步(PDH)复接 ,本文研究的就是基于CPLD的PDH通信二次群复接器。 2 二次群复接的基本原理 二次群复接就是把4个2 048 kb
[嵌入式]
N76E003红外解码程序、电路
红外解码和红外编码的数据一一对应,在此不再对红外编码协议过多赘述 在N76E003单片机中,我们使用外部中断1进行读取红外信号。参照下图,进行配置,外部中断1的引脚为P17 外部中断1:中断号为2 IE = 0x84; //允许总中断中断,使能 INT1 外部中断 TCON = 0x10; //触发方式为脉冲负边沿触发 我们编写的红外解码程序,思路大致就是根据下图中的第一个108ms中的数据格式进行解码 void IR_IN() interrupt 2 using 0//中断服务程序 { unsigned char j,k; EX1 = 0; //禁用外部中断1
[单片机]
N76E003红外解码<font color='red'>程序</font>、电路
小广播
热门活动
换一批
更多
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved