用Keil C51编写程序时,经常需要调试,如果不是经常用这个软件的话,很容易忘记这些调试步骤,现在举一个例子“验证延迟函数delay()使其延迟的时间为500ms”说明。

  源程序写完后,就可以调试了,按照图1所示,先进行第一步和第二步操作,使界面切换到图2的状态,可以看到在文本编辑窗口中,有一个黄色箭头指向13行的位置,说明程序从这个位置开始执行。左上角有一些跟调试相关的按钮,如“全速执行”、“单步进入”……。

  对于这个例子,目的是验证delay()函数的延迟时间,使其大约为500ms。按照下列方法可以达到这个目的:

图1 编译界面

图2  调试界面

  点击“单步跳出”按钮(或功能键F10),黄色箭头从第13行往下移一行(14),再单击“单步跳出”,则箭头移到15行那边,表示程序从第13行执行到第15行(注:这种方式是一步一步执行程序。如果要同时执行几行,比如从第13行一下子执行到15行,可以作如下操作:先用鼠标在第15行的位置处点击两下会出现一个图2所示的红色图标;然后点击“全速执行”按钮,则黄色的箭头会从第13行快速移到15行。即:这两行同时被执行)。此时左边寄存器窗口中的sec有一个数值,表示程序执行的时间,即delay()函数的延迟时间。

  如果延迟时间不是500ms,可改变delay()函数中x,y的数值,再点击图1的第二步所对应的按钮切换到图1所示的编译界面,点击“重新构造所有对象文件”编译程序,然后再切换到图2的界面上来进行调试。

重复上面的步骤,直到左边寄存器窗口中的sec(单位秒)数值大约为0.50s,即可说明delay()延迟时间为500ms。

(注:这种方法比较麻烦,而且延迟时间不会很精确,如果要精确延迟的话可采用定时器的方式。)

Keil C调试案例--优化导致的问题

如下是一个简单的Keil C中的小程序:

  1. #include <reg52.h>
  2.  
  3. void main()
  4. {
  5. unsigned char i,j;
  6. i = 0xf0;
  7. j = 0x0f;
  8.  
  9. P0 = i;
  10. P1 = j;
  11. );
  12. }

编译OK后,进入Debug session,按F11单步执行,发现"i = 0xf0"和"j = 0x0f"这两句没有执行。如下图:

很多初学者百思不得其解,其实,这是由于Keil C本身的8级优化导致的。

解决的方法有两种:

1、降底优化级别,如下图,可降至级别2。

2、在局部变量i,j定义前加上Volatile,禁止Keil C优化这两个变量。如下:

  1. volatile unsigned char i,j;

调试OK!

KEIL-C调试点滴

问:用KEIL写C代码,做完以后的调试工作应该如何开展?只有PC机,没有任何的硬件设备。

2 楼good02xaut(good)回复:

用自带的编译功能然后查错误。写完代码后,F7编译,Alt+F5调试,F10单步运行。可以查看寄存器的值以及RAM的内容。还可以改变P1~P3口的输入。KEIL就是一个开发仿真一体的。

4 楼zhou_huanxi(阿周)回复:

Keil C本身就是编译与仿真一体的。

当不要外部数据时很方便,可以使用Keil C自带的软件调试器(软件仿真器),有单步运行,设置断点等功能。

当要外部输入时(比如用定时器作计数器用),有两种处理方法:

(1)做产品时最好是用硬件仿真器调试。

(2)学习时可用以下方法:Keil C提供了几个调试输入用的窗口,可用它们来模拟输入;调试函数由自己根据需要按特定的格式来编辑,再按KEIL C的要求调入即可。

下面给出用定时器作外部事件计数时模拟外部输入的调试函数,并写出Keil C调用的步骤如下:

步骤一:编写如下信号函数:

  1. single void t0_singal(void)
  2. {
  3. )
  4. {
  5. PORT3|=0x10; //pull INT0(P3.4) high again
  6. PORT3&=~0x10; //pull INT0(P3.4) low and generate interrupt
  7. PORT3|=0x10; //pull INT0(P3.4) high again
  8. twatch(CLOCK); //wait for 1 second
  9. }
  10. }

步骤二:在DEBUG状态下选择:

DEBUG》“Function Editor(Open Ini  File)",这时,将弹出两个新屏幕,将其中的“打开”窗口关闭;保留“Function Editor窗口;

步骤三:在Function Editor窗口中输入上面的函数:

single void t0_singal(void)

步骤四:保存(注意:扩展名为.ini),编译该程序,成功后关闭Function Editor窗口;

步骤五:执行用户程序(必须连续执行);

步骤六:在屏幕左下脚的命令窗口中,键入t0_singl()后(必须回车),Keil C便可向P3.4源源不断地提供脉冲信号。

Keil C51程序调试过程的更多相关文章

  1. Keil_C51程序调试过程

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

  2. KEIL C51程序中如何嵌入汇编

    模块内接口:使用如下标志符:#pragma asm汇编语句#pragma endasm注意:如果在c51程序中使用了汇编语言,注意在Keil编译器中需要激活Properties中的“Generate ...

  3. 【matlab】MATLAB程序调试方法和过程

    3.8  MATLAB程序的调试和优化 在MATLAB的程序调试过程中,不仅要求程序能够满足设计者的设计需求,而且还要求程序调试能够优化程序的性能,这样使得程序调试有时比程序设计更为复杂.MATLAB ...

  4. Hash查找法在Keil C51中的实现

    摘要:散列(hash)是一种重要的存储方法,也是一种常见的查找方法.它是指在记录的存储位置和它的关键字之间建立一个确定的对应关系.本文以射频卡门禁控制器为例,说明用射频卡卡号作为关键字,用Hash查找 ...

  5. Keil共存的方法 - Keil MDK兼容Keil C51,实操可行

    记录一下成功使Keil MDK和Keil C51共存的过程! 之前一直用Keil C51开发,最近需要用到ARM9内核的IC,就需要Keil C51和Keil MDK共存.看了一下网上几个教程,方法大 ...

  6. 57. Android之程序调试LogCat (转)

    无论什么样的程序开发过程中,出现错误都是不可避免的,一般情况下,语法错误会被开发环境检测到,并能及时的提示我们错误的位置以及修改的方法,但是逻辑错误就不是那么容易被发现了,通常逻辑错误的定位和分析是一 ...

  7. [安卓][转]Android eclipse中程序调试

    一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的.步骤如下.1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键点击菜单,选择 Toggle Breakpoi ...

  8. Android eclipse中程序调试

    一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的.步骤如下.1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键点击菜单,选择 Toggle Breakpoi ...

  9. keil c51中C程序的启动过程

    汇编是从org 0000h开始启动,那么keil c51是如何启动main()函数的?keil c51有一个启动程序startup.a51,它总是和c程序一起编译和链接.下面看看它和main()函数是 ...

随机推荐

  1. eclipse中svn插件的安装

    Svn(Subversion)是近年来崛起的版本管理工具,在当前的开源项目里(J2EE),几乎95%以上的项目都用到了SVN.Subversion项目的初衷是为了替换当年开源社区最为流行的版本控制软件 ...

  2. WPF – 使用触发器

    WPF – 使用触发器 WPF提供了很重要的一个东西就是绑定Binding, 它帮助我们做了很多事情,这个我们在WPF学习之绑定这篇里边有讲过.对于Binding我们可以设置其绑定对象,关系,并通过某 ...

  3. sublime text 3.0使用

    # 快捷键    //未完待续 ctrl+p : 文件快速搜索 Ctrl+D : 选词 (按住-继续选择下个相同的字符串) ctrl+L : 选择整行(按住-继续选择下行,即按住ctrl不放按一次L则 ...

  4. RedHat7搭建Nginx+Apache+PHP

    Nginx做为前端服务器(本机IP:192.168.136.104),将访问PHP页面的动态请求转发给Apache服务器(只监听本地回环地址172.0.0.1:80) 安装Apache# yum -y ...

  5. CentOS 6.7编译安装PHP7

    1.首先配置好编译环境 yum update && yum upgrade yum groupinstall "Development Tools" yum ins ...

  6. 复旦大学2016--2017学年第一学期高等代数I期末考试情况分析

    一.期末考试成绩班级前十名 宁盛臻(100).朱民哲(92).徐钰伦(86).范凌虎(85).沈伊南(84).何陶然(84).丁知愚(83).焦思邈(83).董瀚泽(82).钱信(81) 二.总成绩计 ...

  7. 關於Validform 控件 值得注意的地方

    Validform控件其實用起來挺方便的,直接百度就能找到官網,有直接的demo做參考.這些我就不提了,我所要說的是關於Validform控件的ajax的提交. Validform中有個參數ajaxP ...

  8. Repeater 动态增加删除一行

    文章参考:文章参考http://www.cnblogs.com/dataadapter/archive/2012/06/25/2562885.html 效果: 前台代码: <%@ Page La ...

  9. C# 反射 表达式树 模糊搜索

    反射实体T,非datetime字段反射获取表达式树   public static Expression<Func<T, bool>> GetSearchExpression& ...

  10. ACM YTU 《挑战编程》第一章 入门 Problem E: Graphical Editor

    Description Graphical editors such as Photoshop allow us to alter bit-mapped images in the same way ...