第02课用指令方式延时闪烁LED灯.pdf
第二课,用指令方式延时闪烁第二课,用指令方式延时闪烁 LED 灯灯 本章将学习如何使 LED 闪烁,和如何查看变量的值。 单片机内部的 CPU 工作都是要靠时钟驱动的。在标准 51 芯片中,每个指令周期是 12 个时钟。所以只要外部时钟固定,某一条指令运行的时间也是固定的。比如本试验中的 单片机晶振振荡输出的时钟是 22118400HZ,一条单周期指令执行的时间就是 12/22118400 秒=5.42534710-7 秒,这样如果你想在程序里延迟一段时间,就可以用循环执行多少条 指令来实现。这是一个最简单的延时方法,优点是不占用其他的单片机资源,缺点是不容易 计算准确延时时间,而且延时过程中 CPU 无法做其他工作。指令延时方法一般用在一些不 用精确计时的场合。在需要精确计时的场合,需要使用定时器,在之后的课程中将会学到。 现在请打开 lesson02code 目录下的工程文件。 如图 程序由一个循环组成,在点亮 P10 口的 LED 之后,延时一段时间,再灭掉 LED,又延 时一段时间,之后循环到前面。 for()循环后面直接一个分号,表示这个循环里面什么事情也不做,就等循环完成指定 的次数就退出来。这也是指令循环延时的最常见的 C 写法。 编译后,按进入仿真。 按全速运行,可以看到 P1.0 的 LED 灯不断地闪烁。 下面我们用另一个更简单的方式点灯,就是取反 IO 口的状态。取反指令将当前 bit 变量 的状态反转,当前是 1,取反后就是 0,当前是 0,取反后就是 1。IO 口相当于一个 bit 变量, 也可以这样取反。 请修改程序如下 编译成功后,再点全速运行。同样可以看到 LED 闪烁的现象。 可以看到,这种方法,我们只需要一次延时,就可以实现闪烁了。 下面我们再来学习如何查看变量 n 在运行中的值。注意,要查看变量的值,只能在程序 停下来的状态下查看。在程序运行的过程中,程序不断地运行,变量也在不断地变化,一般 是无法查看的。 点停止程序,将鼠标放在程序中的“n”上面, 可以看到旁边出现了一个小框框,上面显示了 n0 x47D3,这就是变量此时的值。 如果觉得这样可能会点不准确,可以选中你要看的变量,同样会显示变量的值,个人感 觉这种操作更为方便。如图 用上面的选中的方式,你还可以选中一个表达式,也会显示出这个表达式的结果 如图,选中 n20000,结果为 1。 在命令行输入的方法也可以看变量,在命令行输入 n,回车,就看到结果了。请注意看 下图的命令行窗口的结果。 这里再教一招,如果我想让 n 现在就变成我想要的值怎么办 这也是调试常见的手段,设置一个变量的值,比如,让 n 0 x1234,只要在命令框里输入 “n0 x1234” 就行了, 几乎所有变量都可以这样直接设置, 包括 IO 口, 比如你输入 “P1.10” , 结果第二个灯就亮了。 还有一招常用的,就是在 watch 窗口看变量。点 watch 图标,就是那个有个眼镜的图标, 打开 watch 窗口。如图 这个窗口里有 locals 页就是当前函数使用的变量的列表,还有有 watch 1 和 2 两个窗口, 就是自定义要看的变量的值,可以手工输入,也可以选中某个变量,按右键,将出现一个菜 单。选择 add 到 watch 窗口即可,在程序停止时随时看到此变量的值。 注意要看某个变量,如果这个变量是某个函数私有的,必须是程序停止时并且 PC 已经 停止在了这个函数中才可以看到,各种看变量的情况都是这样。 还有一种直接看存储器的方法,可以看到所有存储器的值,但是和变量名称就不是那么 好对应起来了。点 memory 窗口图标,打开 memory 窗口,如图 在 Address 窗口输入 “d0 x00”就可以看到 data 空间的从 0 x00 开始的所有内存。如上 图。 输入“i0 x00” ,就可以看到 idata 空间的所有内存的值。 输入“x0 x00” ,就可以看到 xdata 空间的所有内存的值。 输入“c0 x00” ,就可以看到 code 空间的所有程序。 在实际的硬件调试方式中,如果不用看 memery 窗口,就建议不用打开它。因为保持它 的打开会增加仿真时通讯的时间,特别是单步运行的时间。 Keil 调试环境的使用可以千变万化,还有许多方法会在之后的课程中陆续介绍,您可以 可以去看购买 dx516 的光盘中附带的 uv2 使用文档。 这一章就完成了,我们学会了,指令延时,取反的用法,还有更重要的就是如何在 keil 调试环境中查看变量。 作业 试着修改 n 的循环次数,使闪烁的频率改变。