Keil_C51程序调试过程

时间:2021-03-18 06:49:34

  调试一般都是在发生错误与意外的情况下使用的。如果程序能正常执行,调试很多时候都是用不上的。所以,最高效率的程序开发还是程序员自己做好规范,而不是指望调试来解决问题。

  单片机的程序调试分为两种,一种是使用软件模拟调试,第二种是硬件调试

  使用软件模拟调试,就是用计算机去模拟单片机的指令执行,并虚拟单片机片内资源,从而实现调试的目的。但是软件调试存在一些问题,不可能像真正的单片机运行环境那样执行的指令能在同一个时间完成(往往比单片机慢)。软件调试只能是一种初步的,小型工程的调试,比如一个只有几百上千行的代码的程序,软件调试能很好的完成。

  硬件调试其实也需要计算机软件的配合,大致过程是这样的:计算机软件把编译好的程序通过串行口、并行口或者USB口传输到仿真器,然后与单片机一样执行。仿真器仿真全部的单片机资源(所有的单片机接口,并且有真实的引脚输出)。仿真器会将单片机内部内存与时序等情况返回给计算机,这样就可以在计算机里看到单片机程序真实的执行情况。不仅如此,还可以通过计算机的软件实现单步、全速、运行到光标的常规调试手段。仿真器可以接入实际的电路中。

Keil_C51程序调试过程

图1:仿真器

  下面将具体介绍如何使用Keil uVision 软件来调试单片机程序。

  首先:打开一个已经编译通过的单片机项目。选择Debug下面的Start/Stop Debug Session,这个选项可以打开调试也可以关闭调试。

Keil_C51程序调试过程

接下来看到的窗口就是调试窗口了:

Keil_C51程序调试过程

下面具体说说相关子窗口的功能:

1、左侧的ProjectWorkspace

Keil_C51程序调试过程

Regs是片内内存的相关情况值;Sys是系统一些累加器、计数器等。Regs很简单就不多说。具体介绍一下Sys:

a    累加器ACC,往往在运算前暂存一个操作数(如被加数),而运算后又保存其结果(如代数和)。

b    寄存器B,主要用于乘法和除法操作。

sp

sp_max

dptr    数据指针DPTR。

PC $

states    执行指令的数量。

sec    执行指令的时间累计(单位:秒)。

psw    程序状态标志寄存器,八位寄存器,用来存放运算结果的一些特征量,如有无进位、借位等。

p    奇偶标志P。反映累加器ACC内容的奇偶性,如果ACC中的运算结果有偶数个1(如11001100B,其中有4个1),则P为0,否则,P=1。

f1

ov    溢出标志位OV。MCS-51反映带符号数的运算结果是否有溢出,有溢出时,此位为1,否则为0。

rs

f0

ac    辅助进位标志AC。又称半进位标志,它反映了两个八位数运算低四位是否有半进位,即低四位相加(或减)有否进位(或借位),如有则AC为1状态,否则为0。

cy     进位标志CY(PSW 7)。它表示运算是否有进位(或借位)。如果操作结果在最高位有进位(加法)或者借位(减法),则该位为1,否则为0。

由于PSW存放程序执行中的状态,故又叫程序状态字。运算器中还有一个按位(bit)进行逻辑运算的逻辑处理机(又称布尔处理机)。

根据指令执行的不同,上述值会有相应的变化,程序员可以监测这些在单片机中看不到的值而达到调试的目的。

  虽然软件调试无法实现硬件调试那样的信号输出,但是软件调试也可以在软件窗口监测输出信号的高低电平,以及单片机相关端口的变化,实现模拟监测输出信号的目的。

Keil_C51程序调试过程

上图所示,Port0,Port1,Port2,Port3就对应于单片机的四个P0,P1,P2,P3 口,共32个针脚。

Keil_C51程序调试过程

这是全部打开后的效果。

有了输出,就应该有输入的设置:

Keil_C51程序调试过程

选择Interrupt这个按钮可以打开输入预设窗口,输入值窗口如下:

Keil_C51程序调试过程

选择不同的Int Source 会有不同的 Selected Interrupt的变化,通过选择与赋值达到模拟输入的目的。

接下来是串口的设置:

Keil_C51程序调试过程

出现设置串口的窗口:

Keil_C51程序调试过程

监测窗口数据还有一个窗口:

点击:Keil_C51程序调试过程 将会出现,这个窗口可以监测从串口输出的ASCII代码。

Keil_C51程序调试过程

最下面还有一个定时器的设置:

Keil_C51程序调试过程

3个定时器与一个看门狗,设置定时器的数量与工程选择的单片机种类有关系,如果是8051就只有2个定时器,如果是选择8052 就有3个定时器了。

定时器的设置很简单:

Keil_C51程序调试过程

参考的数很多,这里暂时省略介绍。

下面再介绍一下一些常用的调试按钮:

Keil_C51程序调试过程

Keil_C51程序调试过程就是Reset ,相当于单片机的复位按钮,按下后,所有的系统状态将变成初始状态。

Keil_C51程序调试过程这是全速运行,相当于单片机的通电执行。

Keil_C51程序调试过程这个是停止全速运行的按钮。

Keil_C51程序调试过程step into 逐语句;进入并单步执行。

Keil_C51程序调试过程step over  逐过程。

Keil_C51程序调试过程step out  跳出。

Keil_C51程序调试过程执行到断点处。

可以在代码所在窗口的最左边右击按钮插入一个断点,如下图所示:

Keil_C51程序调试过程

有了这个功能,就可以控制监控要执行到某位置时系统的状态。

最后在介绍一个很实用的功能:

Keil_C51程序调试过程这个是Disassembly Windows,按下后可以把C51 Disassembly 为相应的汇编语言,如果有汇编语言知识的话,就可以对比C51程序与汇编程序了。由于汇编语言的效率高很多,这也可以作为查看C51执行效率的一个方法。

Keil_C51程序调试过程

上图中就可以看出,C51 代码是如何被解释为汇编的。

调试还有很多的功能,这里只是介绍了一小部分,希望能起到抛砖引玉的作用,更多的细节需要你自己去发掘与学习。