呼吸灯应用系统的工作流程如图1.1所示,其过程相当简单,就是一个“明—暗—明”的过程。
图1.1 呼吸灯应用系统的工作流程图
设计呼吸灯应用系统,需要考虑以下几个方面的内容:
(1)要发光,则需要一个合适的光源;
(2)需要一个能这个光源进行相应控制的驱动电路;
(3)作为控制系统的51单片机要能和这个驱动电路进行接口;
(4)需要设计合适的单片机软件。
对于51单片机的应用系统而言,最常用的发光源是发光二极管(LED)。发光二极管的发光强弱和通过其的电流大小相关,当电流越大时发光二极管的亮度就越大;反之灯光则变暗,通过控制这个电流的大小,即可实现发光二极管亮度的控制。
51单片机是最常见的8位单片机,通常由8位CPU、时钟模块、I/O端口、程序存储器、数据存储器、2个16位定时器/计数器、中断系统和一个串行口组成,如图1.2所示。
图1.2 51单片机的内部结构示意图
51单片机内部模块的功能说明如下。
(1)8位CPU:51单片机的核心部件,执行预先设置好的代码,负责数据的计算和逻辑的控制等。
(2)程序存储器:用于存放待执行的程序代码。
(3)数据存储器:用于存放程序执行过程中的各种数据。
(4)中断系统:根据51单片机相应的寄存器的设置,来监测和处理单片机的各种中断事件并且提交给中央处理器处理。
(5)时钟模块:以外部时钟源为基准,产生单片机各个模块所需要的各个时钟信号。
(6)串行口:根据相应的寄存器设置进行串行数据通信。
(7)16位定时器/计数器:根据相应寄存器的设置进行定时或者计数。
(8)I/O端口:作为数据、地址或者控制信号通道和外围器件进行数据交换。
常见51单片机(AT89C52)的引脚封装结构如图1.3所示。
注意: AT89C52单片机目前已经停产,其替代产品是AT89S52,但是在Proteus中没有该型号的产品,而在实际使用中这两款单片机几乎可以通用,所以本书的仿真大部分都是使用AT89C52单片机来完成的。
图1.3 51单片机的引脚封装结构
51单片机的输出是一个数字信号,只有“0”和“1”两种状态,也就是说只有“大电流”和“小电流”,不能直接对LED进行控制,此时需要一个相应的电路来将这个数字信号转化为模拟信号。
RCL响应电路是一种可以进行储能释放的电路,其电路原理如图1.4所示。如果在电容C 1 两端加上一个电源,其将对C 1 进行充电,同时C 1 将在两端累积电荷;如果此时电源被撤去,C 1 开始通过R 1 和L 1 组成的回路开始放电,但是电感L 1 会产生逆电动势同时继续给C 1 充电,所以此时C 1 处于一个反复的充放电过程,直到其中最开始存储的电能都被电阻R 1 消耗掉。
图1.4 RCL响应电路
如果在RCL电路的R 1 和L 1 之间串联一个发光二极管,而在电容两端加上高低的数字逻辑电平,则可以控制发光二极管上电流的变化。
注意: 这个充放电的过程,被称为RCL的阶跃响应,其充/放电的时间是可以通过相关的公式计算出来的,有兴趣的读者可以自行查阅电路相关书籍。
虽然RCL电路能够将对应的数字逻辑高低电平转换为模拟信号,并且能控制电流的大小变化,但还是需要51单片机提供这个数字逻辑电平,此时可以应用PWM控制原理来实现转换功能。
PWM(Pulse Width Modulation)是脉冲宽度调制,简称脉宽调制,是一种使用51单片机或者其他处理器的数字输出来对模拟电路进行控制的方法,这种方法可用数字方式来控制模拟电路,能大幅度降低系统的成本和功耗。
在采样控制理论中有一个重要的结论:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。PWM控制技术就是以该结论为理论基础,利用51单片机的I/O引脚输出一系列幅值相等而宽度不相等的脉冲,来代替正弦波或其他所需要的波形,并按一定的规则对各脉冲的宽度进行调制,既可改变逆变电路输出电压的大小,也可改变输出频率。
对于PWM控制来说,其关键的参数有两个:脉冲的频率和脉冲的宽度,在实际的51单片机应用系统中,通常可以使用定时器来实现对这两个参数的控制。
在呼吸灯实例中,修改PWM的输出波形,可以改变外加在RCL电路的电源时间长度和对RCL电路进行充电的频率,从而可以分别控制吸气和呼气的长度以及呼吸的频率。
51单片机的开发环境包括软件和硬件两个部分,其中软件开发环境主要是用于51单片机的代码编写、编译、调试和生成对应的可执行文件。德国Keil公司提供的Keil μVision是目前应用最为广泛的51单片机软件开发环境,本章将详细介绍如何在其中进行51单片机的软件开发。
Keil μVision运行在Windows操作系统上,其内部集成了C51编译器、集项目管理、编译工具、代码编写工具、代码调试以及完全仿真于一体,为开发者提供了一个简单易用的开发平台。
C51编译器是将用户编写的51单片机C语言“翻译”为“机器语言(低级语言)”的程序,其主要工作流程如下:源代码(source code)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标代码(object code)→链接器(Linker)→可执行程序(executables)。
注意: Keil μVision已经发布了多个版本号,目前最新的Keil μVision版本号是V4.0,但是其各个版本号在基础使用方面差别不大,本书的所有应用实例都是基于Keil μVision V3.30的。
Keil μVision的界面窗口如图1.5所示,Keil μVision提供了丰富的工具,常用命令都具有快捷工具栏,除了代码窗口外,软件还具有多种观察窗口,这些窗口使开发者在调试过程中能随时掌握代码所实现的功能。Keil μVision的界面窗口提供了菜单命令栏、快捷工具栏等工具栏;项目管理窗口、代码窗口、目标文件窗口、存储器窗口、输出窗口、信息窗口等窗口和大量其他相关对话框,在Keil μVision支持打开多个项目文件进行同时编辑。
图1.5 Keil μVision的界面窗口
Keil μVision的菜单包括File、Edit、View、Project、Debug、Flash、Peripherals、Tools、SVCS、Windows和Help11个选项,并提供了文本操作、项目管理、开发工具配置、仿真等功能。
(1)Keil μVision的File菜单主要提供文件相关操作功能,如图1.6所示,其详细说明如下。
① New:新建一个文本文件,需要通过保存才能成为对应的.h或.c文件。
② Open:打开一个已存在的文件。
③ Close:关闭一个当前打开的文件。
④ Save:保存当前文件。
⑤ Save as:把当前文件另存为另外一个文件。
⑥ Save all:保存当前已打开的所有文件。
⑦ Device Database:打开元器件的数据库。
⑧ Print Setup:设置打印机。
⑨ Print:打印当前的文件。
⑩ Print Review:预览打印效果。
⑪ 1~9+文件名称:打开最近使用的文件。
⑫ Exit:退出。
(2)Keil μVision的Edit菜单主要提供文本编辑和相关操作功能,如图1.7所示,其中部分菜单内容被隐藏,其详细说明如下。
图1.6 Keil μVision的File菜单
图1.7 Keil μVision的Edit菜单
① Undo:撤销上一次操作。
② Redo:恢复上一次的操作。
③ Cut:剪切选定的内容到剪贴板。
④ Copy:复制选定的内容到剪贴板。
⑤ Paste:把剪贴板中的内容粘贴到指定位置。
⑥ Indent Selected Text:把选定的内容向右缩进一个Tab键的距离。
⑦ Unindent Selected Text:把选定的内容向左缩进一个Tab键的距离。
⑧ Toggle Bookmark:在光标当前行设定书签标记。
⑨ Goto Next Bookmark:跳转到下一个书签标记处。
⑩ Goto Previous Bookmark:跳转到前一个书签标记处。
⑪ Clare All Bookmarks:清除所有的书签标记。
⑫ Find:在当前编辑的文件中查找特定的内容。
⑬ Replace:用当前内容替换特定的内容。
⑭ Find in Files:在几个文件中查找特定的内容。
⑮ Incremental Find:依次查找。
⑯ Outlining:用于对代码中的函数标记(大括号)进行配对。
⑰ Advanced:一些高级的操作命令,包括查找配对大括号等。
⑱ Configuration:对Keil μVision进行设置,弹出如图1.8所示的Keil μVision属性设置对话框。
图1.8 Keil μVision属性设置对话框
Keil μVision的文本操作快捷键,参见表1.1。
表1.1 KeilμVision的文本操作快捷键
(3)Keil μVision的View菜单主要提供界面显示内容的设置相关操作功能,如图1.9所示,其详细说明如下。
① Status Bar:显示或隐藏状态栏。
② File Toolbar:显示或隐藏文件工具栏。
③ Build Toolbar:显示或隐藏编译工具栏。
④ Debug Toolbar:显示或隐藏调试工具栏。
⑤ Project Window:显示或隐藏项目窗口。
⑥ Output Window:显示或隐藏输出窗口。
⑦ Source Browser:打开源浏览器窗口。
⑧ Disassembly Window:显示或隐藏反汇编窗口。
⑨ Watch&Call Stack Window:显示或隐藏观察及调用堆栈窗口。
⑩ Memory Window:显示或隐藏存储器窗口。
⑪ Code Coverage Window:显示或隐藏代码覆盖窗口。
⑫ Performance Analyzer Window:显示或隐藏性能分析窗口。
⑬ Symbol Window:显示或隐藏符号窗口。
图1.9 Keil μVision的View菜单
⑭ Serial Window#1:显示或隐藏串行数据窗口1号。
⑮ Serial Window#2:显示或隐藏串行数据窗口2号。
⑯ Serial Window#3:显示或隐藏串行数据窗口3号。
⑰ Toolbox:显示或隐藏工具箱。
⑱ Periodic Window Update:程序运行时更新调试窗口。
⑲ Include File Dependencies:显示文件的相互依赖关系。
(4)Keil μVision的Project菜单主要提供工程文件的配置管理,以及目标代码的生成管理相关操作功能,如图1.10所示,其详细说明如下。
图1.10 Keil μVision的Project菜单
① New Project:建立一个新的工程文件。
② ImportμVision1 Project:转换一个μVision1的工程文件。
③ Open Project:打开一个工程文件。
④ Close Project:关闭当前工程文件。
⑤ File Extensions,Books and Environment:设置各种文件类型的扩展名,在项目窗口中添加书籍,以及设置工作目录环境。
⑥ Targets,Groups,Files:管理项目中的目标、文件组及文件。
⑦ Select Device For Target:从设备数据库中选出一款51单片机作为目标器件。
⑧ Remove Item:从当前的工程文件中删除一个文件。
⑨ Options for Target:更改目标、文件组或者文件的工具选项。
⑩ Build Target:编译并且链接当前的工程文件。
⑪ Rebuild All Target Files:重新编译并且链接当前的工程文件。
⑫ Translate:只编译不链接当前工程文件。
⑬ Stop Build:停止当前的编译链接。
⑭ 1~9+项目名:打开最近使用过的10个项目。
(5)Keil μVision的Debug菜单主要提供在软件和硬件仿真环境下的调试相关操作功能,如图1.11所示,其详细说明如下。
① Start/Stop Debug Session:开始或结束调试模式。
② Go:全速运行,如果有断点则停止。
③ Step:单步运行程序,包括子程序的内容。
④ Step Over:单步运行程序,遇到子程序则一步跳过。
⑤ Step Out of Current Function:在单步运行程序时,跳出当前所进入的子程序,进入该子程序的下一条语句。
⑥ Run to Cursor Line:运行至光标行。
⑦ Stop Running:停止运行。
⑧ Breakpoints:打开断点对话框。
⑨ Insert/Remove Breakpoint:在当前行设定或去除断点。
⑩ Enable/Disable Breakpoint:使能或去除当前行的断点。
⑪ Disable All Breakpoints:设定程序中所有的断点无效。
⑫ Kill All Breakpoints:去除程序中的所有断点。
⑬ Show Next Statement:显示下一个可以执行的语句。
⑭ Debug Setting:设置调试相关参数。
⑮ Enable/Disable Trace Recording:打开语句执行跟踪记录功能。
图1.11 Keil μVision的Debug菜单
⑯ View Trace Records:查看已经执行过的语句。
⑰ Memory Map:打开内存对话框。
⑱ Performance Analyzer:打开性能分析的设置对话框。
⑲ Inline Assembly:停止当前编译的进程。
⑳ Function Editor(Open Ini File):编辑调试程序和调试用ini文件。
注意: 断点是Keil μVision提供的功能之一,可以让程序中断在需要的地方,从而方便其分析。也可以在一次调试中设置断点,下一次只需要让程序自动运行到设置断点的位置时中断下来,这样极大地方便了操作,同时也节省了时间。
(6)Keil μVision的Flash菜单主要提供对51单片机的内部Flash进行在线下载和擦除等相关操作功能,如图1.12所示,其详细说明如下。
① Download:下载程序到Flash存储器中。
② Erase:擦除Flash存储器中的内容。
③ Configure Flash Tools:Flash存储器的配置工具。
(7)Keil μVision的Peripherals菜单主要用于在Debug(调试)模式下打开其外围接口观察窗,如图1.13所示,其详细说明如下。
图1.12 Keil μVision的Flash菜单
图1.13 Keil μVision的Peripherals菜单
① Reset CPU:复位51单片机。
② Interrupt:打开中断观察窗。
③ I/O-Ports:打开I/O端口观察窗。
④ Serial:打开串行模块观察窗。
⑤ Timer:打开定时器/计数器观察窗。
在打开的各个观察窗中可以看到51单片机的对应状态,并且可进行相应的操作,图1.14是打开的中断观察窗。
注意: 当工程文件选择的目标51单片机不同时,根据其实际内部硬件模块,出现在Peripherals菜单中的外围器件对话框也不同。
(8)Keil μVision的Tools菜单主要应用于和第三方软件联合调试,如图1.15所示,其详细说明如下。
图1.14 中断观察窗
图1.15 Keil μVision的Tools菜单
① Setup PC-Lint:从Gimpel软件中配置PC-Lint。
② Lint:在当前编辑的文件中使用PC.Lint。
③ Lint All C Source Files:在项目所包含的C文件中使用PC.Lint。
④ Customize Tools Menu:在工具菜单中加入用户程序。
(9)Keil μVision的SVCS菜单主要用于对工程项目进行版本控制,选择其中的“Configure Version Control”项,会弹出相应的配置对话框,如图1.16所示。
图1.16 Keil μVision的版本控制设置对话框
(10)Keil μVision的Windows菜单主要用于提供窗口的视图管理,如图1.17所示,其详细说明如下。
① Cascade:使窗口交叠。
② Title Horizontally:横向平铺窗口。
③ Title Vertically:纵向平铺窗口。
④ Arrange Icons:在窗口底部排列图标。
⑤ Split:把当前窗口分割成2~4块。
⑥ Close All:关闭所有打开的窗口。
⑦ 1~9+窗口名:显示所选择的窗口。
(11)Keil μVision的Help菜单主要用于给使用者提供包括库函数查询在内的帮助管理,如图1.18所示,其详细说明如下。
图1.17 Keil μVision的Windows菜单
图1.18 Keil μVision的Help菜单
① μVision Help:打开Keil μVision的帮助主题。
② Open Books Window:打开Keil提供的参考书籍窗口。
③ Simulated Peripherals for:为所选择的51单片机内部集成资源说明文档。
④ Internet Support Knowledgebase:网络支持库。
⑤ Contract Support:联系Keil公司技术支持。
⑥ Check for Update:查看版本更新。
⑦ Tip of the Day:每日提醒,会在软件启动时给出一些Keil μVision使用的基本知识。
⑧ AboutμVision:Keil μVision的版本号。
库函数是指软件开发环境提供的一些可供用户调用的函数,这些函数一般被放在库里,源代码不可见,但是可通过头文件看到对外的接口。Keil的库函数并不是C51语言本身的一部分,它是由Keil根据一般用户的需要编制并提供给用户使用的一组程序,这些库函数极大地方便了用户,同时也补充了C51语言本身的不足。在编写C51语言程序时,应当尽可能多地使用库函数,这样既可以提高程序的运行效率,又可以提高编程的质量。
C51语言和标准C语言有很多共同的地方,其大部分库函数也和标准C语言兼容,但是其中部分函数为了能更好地发挥MCS51的结构特性做了少量的改动,主要是将函数的参数和返回值尽可能地使用体积最小的数据类型,如无符号数。
C51语言有6种编译时间库,参见表1.2,另外在Keil μVision的LIB目录下还有一些和硬件相关的低级输入/输出功能函数是以源文件形式提供的,可供用户根据自己的硬件环境修改这些文件替换函数库中对应的库函数,从而使得库函数能适应用户自己的硬件环境。
表1.2 C51语言的编译时间库
由于Keil μVision自带项目管理器,所以用户不需要在项目管理上花费过多的精力,只需要按照以下步骤操作即可建立一个属于自己的项目。
(1)启动Keil μVision,建立工程文件并且选择器件。
(2)建立源文件、头文件等相应的文件。
(3)将工程需要的源文件、头文件、库文件等添加到工程中。
(4)修改启动代码并且设置工程相关选项。
(5)编译并且生成HEX文件或者LIB文件。