基于Proteus和Keil的C51程序设计项目教程(第2版):理论、仿真、实践相融合
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 任务2:有规律变化的花样灯——亮点流动

2.2.1 任务要求与分析

1.任务要求

8个LED,每一刻只有一个亮,显示为亮点由低位向高位循环流动。

2.任务目标

(1)掌握显示的顺序输出控制。学会将一串显示效果分解为一个个稳定状态,并按先后次序主线将它们一一串起来,即按一定的顺序依次输出控制数据。

(2)掌握循环移位函数_crol_()的应用。

3.任务分析

硬件电路见图2-9。P1口控制8个LED。根据亮灯逻辑,引脚电平为高,LED灭;引脚电平为低,LED亮。所以第1个显示状态为只有P1.0脚的LED亮,……,第8个显示状态为只有P1.7脚的LED亮。亮点流动控制数据分析见表2-4。

表2-4 亮点流动控制数据分析

4.建立时间概念

在单片机的振荡频率为12MHz时,其机器周期为1μs,最短的指令执行时间也是1μs。

在本例中,每个LED亮的时间就是输出数据指令执行的时间,如LED 1亮,则P1口输出0xFE(P1=0xFE),也就是1μs的时间;接下来LED2亮,P1=0xFD,也是1μs;……。这样,几乎每个LED依次亮1μs,我们的眼睛根本分辨不出哪个LED亮了,只看到8个LED一直是暗红的。画面时间间隔小于1/24s时,人眼就分辨不出来了。为了看清每个LED亮,必须要延时,延时约40ms以上就可看清了。2.2.3节程序中延时函数的延时约为500ms。

2.2.2 头文件reg51.h解读

C51程序设计是针对51单片机的,故编程中要涉及硬件资源(特殊功能寄存器及其可操作的位)。这些硬件资源用sfr、sbit等统一定义成一个头文件,供所有应用该单片机的控制源程序调用。如在Keil软件中,已将89C51单片机的硬件资源定义为头文件“reg51.h”,将89C52的头文件定义为“reg52.h”。其他许多51的变体单片机,只要添加新增的特殊功能寄存器等定义,保存为自己的头文件,保存在Keil安装路径“驱动器\Keil\C51\INC”下即可如“reg51.h”一样被引用。

头文件引用格式:

#include <*.h>:优先搜索由关键字INCDIR指定的编译器包含文件路径,接着搜索C51库函数头文件所在目录。

#include"*.h":先搜索工程文件所在目录,再搜索C库函数头文件所在目录。

通过#include"reg51.h"或#include <reg51.h>,就可在自己的源程序中直接使用其内定义的特殊功能寄存器、特殊功能位,无须再用sfr、sbit定义。因其所有的特殊功能寄存器、特殊位都是大写字母,所以注意程序中用到特殊功能寄存器、特殊位时都要大写,如P1、IT0等。

2.2.3 流程与程序设计——一个亮点流动

根据表2-4的分析,只要对P1口按状态1~8输出相应的数据即可,流程图如图2-20所示。

图2-20 顺序结构流水灯(一个亮点流动)的程序流程图

2.2.4 编译、代码下载、仿真、测判

按项目1所述方法,先在Keil中新建工程led21.uv2,然后添加源程序、设置工程选项并编译,生成代码文件LED21.HEX。参考2.1.7节下载代码,设置振荡频率为12MHz,进行仿真调试。由仿真看到的现象应该与设计目标一样。

将代码下载到实物板进行测试。实践记录:是否成功?__________。自评分:__________。

2.2.5 应用移位函数_crol_设计亮点流动程序

2.2.3节的程序有点长,单片机循环输出了一串数据,且这串数据是有规律的,8位二进制数中最低位的0逐位向高位(向左)移动,移到最高位时,一个循环完成,又重新开始。使用Keil提供的循环移位函数是便捷方法。

1.认识移位函数

6个循环移位函数为_crol_、_irol_、_lrol_、_cror_、_iror_、_lror_,说明如图2-21所示。

图2-21 循环移位函数说明

各函数名中第1个字母表示变量类型,第4个字母表示移位方向,l表示左,r表示右。与汇编指令RL A、RR A相似,以上各函数是多位数的封闭循环移位。左移时,最高位移到最低位,其他位依次左移;右移时,最低位移到最高位,其他位依次右移。移动的位数取决于变量类型,如字符型变量可移动的位数为0~7。

函数原型:

函数功能:将无符号字符型/无符号整型/无符号长整型变量a,循环左移/右移n位。

2.用移位函数处理数据

此处选用无符号字符数据左移函数_crol_实现,数据变化规律(见表2-5)如下:

下一状态数据=上一状态数据循环左移1位=_crol_(上一状态数据,1)

3.流程设计与程序设计

根据表2-5的分析,使用左移函数实现亮点流动的程序流程图如图2-22所示,依此逐句写出主函数。

表2-5 用_crol_()进行数据变化规律推演

图2-22 使用左移函数实现亮点流动的程序流程图

4.编写程序

建立工程led22,编写程序,编译生成led22.HEX,下载代码,然后进行仿真调试。

5.深入理解移位函数

将程序中倒数第3句改一改,想一想改后有什么变化:

(1)改为OutData=_crol_(OutData,2),变化____________________。

(2)改为OutData=_crol_(OutData,3),变化____________________。

(3)改为OutData=_cror_(OutData,1),变化____________________。

总结移位函数的应用:______________________________。