51单片机C语言程序设计经典实例(第3版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

任务2 流水灯的设计

设计要求

使用单片机P0端口实现8个LED的流水灯控制。

硬件设计

在Proteus的元器件库中,没有STC89C51RC单片机,但有大家较熟悉的AT89C51单片机,因此本书使用AT89C51进行电路仿真。

在桌面上双击图标,打开Proteus 8 Professional主界面,如图3-5所示。

图3-5 Proteus 8 Professional主界面

图3-6 执行菜单命令“File”→“New Project”

如图3-6所示,执行菜单命令“File”→“New Project”,弹出“New Project Wizard:Start”对话框,如图3-7所示。

在“Project Name”区域的“Name”栏中输入“流水灯.pdsprj”,在“Path”栏中设定保存路径;选中“New Project”选项,单击“Next”按钮,弹出“New Project Wizard:Schematic Design”对话框,如图3-8所示。

选中“Create a schematic from the selected template.”选项,在“Design Templates”列表框中选择“DEFAULT”,单击“Next”按钮,弹出“New Project Wizard:PCB Layout”对话框,如图3-9所示。

由于不需要设计PCB文件,所以选中“Do not create a PCB layout”选项,单击“Next”按钮,弹出“New Project Wizard:Firmware”对话框,如图3-10所示。

由于不需要模拟设计,所以选中“No Firmware Project”选项,单击“Next”按钮,弹出“New Project Wizard:Summary”对话框,如图3-11所示。

单击“Finish”按钮,打开Proteus 8 Professional原理图编辑窗口,如图3-12所示。

图3-7 “New Project Wizard:Start”对话框

图3-8 “New Project Wizard:Schematic Design”对话框

图3-9 “New Project Wizard:PCB Layout”对话框

图3-10 “New Project Wizard:Firmware”对话框

图3-11 “New Project Wizard:Summary”对话框

图3-12 Proteus 8 Professional原理图编辑窗口

如图3-13所示,执行菜单命令“File”→“Save Project As”,弹出“Save Proteus Project File”对话框,如图3-14所示。

确认文件名、保存类型和保存路径,单击“保存”按钮。

在元器件选择按钮中单击“P”按钮,或者执行菜单命令“Library”→“Pick parts from libraries”,弹出“Pick Devices”对话框,如图3-15所示。添加表3-2所列的元器件。

在Proteus 8 Professional原理图编辑窗口中放置元器件,再单击工具箱中的元器件终端图标,在对象选择器中单击“POWER”和“GROUND”,放置电源和接地符号。放置好元器件后,进行布线,然后用鼠标左键双击各元器件,设置相应的元器件参数,完成流水灯电路图的设计,如图3-16所示。

图3-13 执行菜单命令“File”→“Save Project As”

说明在Proteus 8 Professional中完成电路设计的操作步骤基本相同因此在本书后续章节的硬件设计部分将不再赘述其详细的操作过程请参照本节的硬件设计操作过程进行操作

图3-14 “Save Proteus Project File”对话框

图3-15 “Pick Devices”对话框

表3-2 流水灯的设计所用元器件

图3-16 流水灯电路图

程序设计

流水灯又称为跑马灯,是通过单片机控制8个LED (D0~D7) 循环点亮,即刚开始时D0点亮,延时片刻后 D1 亮,然后依次点亮 D2→D3→…→D7,然后再点亮 D7→D6→…→D0,重复循环。从显示规律看,流水灯实质上是由左移和右移控制实现的,其中 D0→D1→…→D7为左移控制,D7→D6→…→D0为右移控制。要实现流水灯的左移、右移控制,可以使用移位指令、移位函数及数组这3种方法进行软件程序设计。

1利用移位指令实现软件程序设计 在项目二中介绍了按位左移(<<)、按位右移(>>)指令,其中按位左移(<<)是将一个操作数的各二进制位全部左移若干位,移位后,空白位补0,而溢出的位被舍弃;按位右移(>>)是将一个操作数的各二进制位全部右移若干位,移位后,空白位补0,而溢出的位被舍弃。

由于移位过程中空出位自动用0填充,而图3-16所示的电路中LED是低电平有效,因此可以将左移的移位初始数据置为0x01,右移的移位初始数据置为0x80,然后将该数据每次移位取反后送给单片机P0端口。但是,在送给P0端口前,还需判断是否已经移位8次,若是,则退出移位操作。利用移位指令实现流水灯的程序流程图如图3-17所示。

图3-17 利用移位指令实现流水灯的程序流程图

2利用移位函数实现软件程序设计 在C51的“intrins.h”中,有循环左移和循环右移函数,其函数原型见表3-3。intrins.h属于C51编译器内部库函数,编译时直接将固定的代码插入当前行,而不是用ACALL或LCALL指令来实现,这样可以大大提高函数访问的效率。

从表中可以看出,“_crol_”和“_cror_”分别为循环左移函数和循环右移函数,相应的两条指令可以分别取代按位左移(<<)、按位右移(>>)指令,因此使用循环移位函数实现流水灯的程序流程图可以参考图3-17。

注意在使用内部函数时要用#include <intins.h>指令将intrins.h头文件包含到源程序文件中

3利用数组实现软件程序设计 使用数组实现流水灯控制,可以将每一时刻的显示状态数据放在一个数组中来实现(见表3-4),每次通过调用数组中的某一元素内容来控制LED的显示状态。

表3-3 intrins.h中的函数原型及功能说明

表3-4 流水灯显示状态数据

从表3-4中可以看出,由D0→…→D7点亮时,就是数据中的二进制数0的位置依次左移了1位;由D7→…→D0点亮时,数据中的二进制数0的位置依次右移了1位。在C51中,要直接实现数据的计算有时不太容易,如果将所有的数据取反后,D0→…→D7依次点亮的数据就变成了0x01、0x02、0x04、0x08、0x10、0x20、0x40、0x80,也就是后一个数是在前一个数的基础上乘以2。所以在实际使用时,可以通过建立两个一维数组来实现流水灯控制,其程序流程图也可以参考图3-17。

源程序

1利用移位指令实现的源程序

2利用移位函数实现的源程序

3利用数组实现的源程序

调试与仿真

单击Proteus 8 Professional工具栏中的“Source Code”按钮,打开源代码编辑窗口,如图3-18所示。

图3-18 源代码编辑窗口

执行菜单命令“Source”→“Create Project”,弹出“New Firmware Project”对话框,如图3-19所示。

图3-19 “New Firmware Project”对话框

在“Family”栏中选择“8051”,在“Contoller”栏中选择“AT89C51”,在“Compiler”栏中选择“Keil for 8051(not configured)”,不选中“Create Quick Start Files”选项,单击“确定”按钮,返回源代码编辑窗口。

执行菜单命令“Source”→“Add New File”,弹出“Add New File”对话框,如图3-20所示。

图3-20 “Add New File”对话框

在“文件名”栏输入“流水灯”,在“保存类型”栏选择“C Files(*.c)”,确认保存路径,单击“保存”按钮,将“流水灯.c”添加到源文件中,输入源程序,如图3-21所示。

图3-21 输入源程序

输入源程序后,执行菜单命令“File”→“Save Project”,保存源文件。

执行菜单命令“Build”→“Build Target”,编译源程序。若编译成功,则在“VSM Studio Output”窗口中显示没有错误,同时创建了Debug.OMF文件(该文件相当于Keil中生成的“流水灯.HEX”文件)。

说明若要使用Keil生成的.HEX文件在进行Proteus仿真前必须在Edit Component对话框中对单片机进行加载设置如项目一任务3中的图1-34所示而创建.OMF文件时无须在Edit Component对话框中进行设置该文件会自动加载到单片机中

执行菜单命令“Debug”→“Enable Remote Debug Monitor”,使Proteus与Keil真正链接起来,以便利用它们进行联合调试。

执行菜单命令“Debug”→“Start VSM Debug”,或者直接单击图标,进入Keil调试环境。同时,在Proteus 8 Professional窗口中可看到已经进入程序调试状态。

在Keil代码编辑窗口设置相应的断点。断点的设置方法是,在需要设置断点语句的空白处双击鼠标左键;再次双击,即可取消该断点。

设置断点后,在Keil中按“F5”键或“F11”键运行程序。此时可以看到D0亮,延时片刻后,接着点亮D1→D2→…→D7,然后再依次点亮D7→D6→…D1→D0,重复循环,其仿真效果图如图3-22所示。

图3-22 流水灯运行仿真效果图

说明在Proteus 8 Professional中完成调试与仿真的操作步骤基本相同因此在本书后续章节的调试与仿真部分将不再赘述其详细的操作过程请参照本节的调试与仿真操作过程进行操作