![51单片机应用开发25例](https://wfqqreader-1252317822.image.myqcloud.com/cover/751/653751/b_653751.jpg)
1.5 呼吸灯应用系统的仿真与总结
在Proteus中绘制如图1.20的电路,其中所涉及的典型器件参见表1.4。
表1.4 Proteus电路器件列表
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0037_0001.jpg?sign=1739256860-SrEWeV69VVCFWhovxdtmX9VsJiJcmnsw-0-d407fa9248e2c5af02fe25c9465f256b)
1.使用Proteus和Keil μVision对51单片机进行仿真
使用Proteus和Keil μVision对51单片机进行仿真的流程如下。
(1)新建一个Proteus ISIS电路图文件,并绘制对应的电路。
(2)在Keil μVision中新建一个新的工程文件,输入对应的C语言代码,并且编译生成对应的.hex文件。
(3)双击Proteus电路中的AT89C52,弹出如图1.31所示的属性设置对话框,在Program File中选择上一步中生成的.hex文件。
(4)单击运行。
在51单片机应用系统的开发过程中,如果希望对51单片机的运行情况进行进一步的调试(例如跟踪某个变量,某个寄存器的内容),此时可以在Keil μVision中启动Proteus进行调试,其详细操作步骤如下。
(1)检查计算机的TCP/IP协议是否正常安装(通常来说是没有问题的)。
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0038_0001.jpg?sign=1739256860-JPAU8ck0Q0gmuK2JLCHmNUyAnrDB1VRD-0-39b527ce539f1f6d6f24841c8a7eeafd)
图1.31 AT89C52单片机的属性设置
(2)将Proteus安装目录MODELS文件夹里的VDM51.dll文件复制到Keil μVision的安装目录的keilc/C51/bin目录下,如图1.32所示。
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0038_0002.jpg?sign=1739256860-NaaYdzsONnvXH7Cd42Tgo8sYSbB0VApR-0-fcae6392d9f391a517f4fc283d343269)
图1.32 复制对应的驱动文件
注意:新版本的Proteus的安装目录下可能没有提供VDM51.dll文件,此时可以从官方网站上自行下载。
(3)打开Keil μVision安装目录下的Tools.ini配置文件,查找“TDRV”字符串,在最后一行下添加TDRV+编号=BIN\VDM51.DLL字符串(“Proteus Emulator”),如图1.33所示。
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0039_0001.jpg?sign=1739256860-qK9bKJDtsjwL1dFOdFNt4wkt5x3IvIOc-0-c2b961a6af204601ab84c11d091d13d0)
图1.33 修改Keil μVision的配置文件
注意:TDRV用于标注Keil μVision下的仿真器类型,TDRV后的数字标号由Keil μVision下安装了多少个仿真器决定;等号后面的字符串用于指定对应的驱动文件VDM51.DLL的路径;括号里的字符串是对应的Proteus ISIS仿真器名称,这个可以由用户自行设置。
(4)选中Proteus ISIS的Debug菜单下的“Use Remote Debug Monitor”选项,允许使用外部的仿真器,如图1.34所示。
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0039_0002.jpg?sign=1739256860-crjdEorhf3mspYBCkVhUotjZUUmSQu3y-0-460bbe096b1dc7f21adf36c18bcc99fb)
图1.34 设置外部仿真器
(5)在Keil μVision的Project/Options for Target1的Debug菜单中选择“Use Proteus Emulator”选项,如图1.35所示。
此时在Keil μVision下启动Debug或者在Proteus中启动仿真,可以调用相应的Debug工具,而这些工具的快捷菜单位于Proteus的Debug菜单项下,如图1.36所示。
注意:相应的一些仿真菜单只会在启动仿真之后才会出现。
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0039_0003.jpg?sign=1739256860-a4Yj9ohwpOC5RHpx5gIniLfz74Qx5CXU-0-272113c04243021f4de87d44eb19026e)
图1.35 在Keil μVision中选择仿真器
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0039_0004.jpg?sign=1739256860-s0GzzzjUK1GBwlm3TCTaf1dps042lPZH-0-7be057653dfa096dfd96c91a81afcb3d)
图1.36 Proteus ISIS的Debug菜单
仿真的运行控制包括“Start/Restart Debugging”(启动仿真)、“Pause Animation”(暂停仿真)、“Stop Animation”(停止仿真),同时也可以使用快捷工具栏中的相应按键来控制仿真,如图1.37所示,这四个按钮功能分别是:启动仿真、单步运行、暂停仿真和停止仿真。
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0040_0001.jpg?sign=1739256860-H99Rsxi6IR0oPMiA286qZe7seEg8YNcv-0-e346c24726b7eb47e884e1eac088f257)
图1.37 快捷工具栏中的仿真运行控制
选择Debug菜单下的“Simulation Log”选项,会弹出如图1.38的记录窗体,其中记录了仿真中的一些相关信息,如果在仿真中出现错误或者警告,也会在其中体现出来。用户也可以通过单击仿真运行控制快捷工具栏的右侧“Messages”按钮来调出该记录窗体。
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0040_0002.jpg?sign=1739256860-PQaE2fGeR1fDztVN6K2ZWSKoMl2Z3n5J-0-9f82f53ee836580cd3468d2d3378daa2)
图1.38 仿真的记录窗体
在仿真过程中常常希望观察单片机中的某些寄存器或者相应端口的运行情况,此时可以使用Debug菜单中的“Watch Window”选项,调出仿真观察窗体如图1.39所示。
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0040_0003.jpg?sign=1739256860-y5ZftxIt5SqYghsjtg1MjY0v6ba5c6U9-0-e4a6f773a77757ef6e233cc49252c1b7)
图1.39 仿真的观察窗体
在观察窗体上单击鼠标右键,会出现相应的操作菜单,如图1.40所示,其中各个选项说明如下。
(1)Add Items(By Name):按照名称添加观察对象,如图1.41所示,这些观察对象均为51单片机的内部寄存器,双击列表中对应的寄存器名称即可把需要观察的寄存器添加到观察窗体中。
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0040_0004.jpg?sign=1739256860-jwhAaBZiomptqcrowYCEmIMqX42xAQ2Q-0-fa6b6daf7f29f16fde0de80a6c13d73c)
图1.40 右键操作菜单
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0040_0005.jpg?sign=1739256860-oROB6YY6VlbUWGQcPo0uG0YqBHuFmNyl-0-cb8869ce14f712047486cffd772a4712)
图1.41 添加观察对象
(2)Add Items(By Address):按照地址添加观察对象,如图1.42所示,用户可以在对话框中直接输入待观察的对象地址即可把需要观察的对象添加到观察窗体中。
添加了观察对象的观察窗体如图1.43所示,添加了51单片机的I/O寄存器P2和一个内部地址0x54。
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0041_0001.jpg?sign=1739256860-jBc6u92vzt4uwYpTRatYCPnV6idJm192-0-7f0cfc1a6c8f67f29820aa4a683e670a)
图1.42 添加观察对象
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0041_0002.jpg?sign=1739256860-0cRm828TxpnnZdW4W9Kmq1h8IVwbPcNA-0-8a86e12255a6bc67f3cc715103258614)
图1.43 添加了观察对象的观察窗体
可以在观察窗体的“Value”列中看到观察项的当前值。
(3)Watchpoint Condition:断点条件设置,在图1.44对话框中设置仿真进入断点的条件,在后面两个选项中可以设置与观察项有关的条件表达式,例如可以设置当内存地址单元0x54内的值大于0x34时进入断点。
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0041_0003.jpg?sign=1739256860-JtKX4EZ5j77MiWkQ8EraHK60vxx2JZXS-0-f46cb979b33d33ac4e16fd96edc13e6d)
图1.44 断点条件设置
注意:断点是调试器的功能之一,可以让程序中断在需要的地方,从而方便分析,也可以在一次调试中设置断点,下一次只需让程序自动运行到设置断点位置,便可在上次设置断点的位置中断下来,极大地方便了操作,同时节省了时间。
(4)Select All:选择所有观察项。
(5)Rename Item:修改观察项的名称。
(6)Copy to Clipboard:复制到粘贴板。
(7)Delete Item:删除观察项。
(8)Find Item:查找观察项。
(9)Data Type:设置观察项的数据类型,包括字节类型、字类型、双字节类型和浮点类型等,如图1.45所示。
(10)Display Format:设置观察项的数据格式,包括二进制、十进制、十六进制等,如图1.46所示。
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0041_0004.jpg?sign=1739256860-o6ijQeDuJtXZcvPV40L2D1bJDGDBUcNM-0-a6bd663ded68ba67a5af756442845e49)
图1.45 观察项的数据类型
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0041_0005.jpg?sign=1739256860-JYbrbIreffBLuJS9tBZNrFqqmmXDFB0A-0-c7ff807de5b37c3e07241241ef2f95de)
图1.46 观察项的数据格式
(11)Show Addresses:显示地址栏。
(12)Show Types:显示数据类型栏。
(13)Show Previous Value:显示以前的观察项数值。
(14)Show Watch Expressions:显示断点表达式。
(15)Show Gridlines:显示分栏网格。
(16)Minimum:最小化,将观察窗体尽可能的变小。
(17)Set Font:设置观察窗体的字体。
(18)Set Colours:设置观察窗体的颜色。
(19)一个“完整的”观察窗体如图1.47所示,添加了尽可能多的列。
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0042_0001.jpg?sign=1739256860-uLvEEuQqeat0tdrFHP1WiB1rBpF5ovfn-0-7ff64c38f2bb9a14bfa58b897f343b10)
图1.47 “完整的”观察窗体
在Debug菜单项中可以选择观察51单片机CPU内部的数据,包括寄存器空间(Registers)、特殊寄存器空间(SFR Memory)和内部数据空间(Internal(IDATA)Memory),如图1.48所示。
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0042_0002.jpg?sign=1739256860-PMnwlIzmJCTGu9jFBmxlw28LFnnmLJf4-0-e40a12b886b46613783509928010acd5)
图1.48 51单片机的内部资源观察
图1.49是51单片机的Registers观察窗体,包括内部的常用寄存器数值,它会随着仿真的运行发生相应的改变,同时该显示窗口还会显示出当前正在执行的指令,如图中的“SJMP 0033”。
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0042_0003.jpg?sign=1739256860-y6pGgJzgBb07j3snnQlqYwHM1RWTa5jM-0-a90b45eae693d825529e22518d18f89b)
图1.49 51单片机的Registers观察窗体
图1.50是51单片机的SFR特殊功能寄存器观察窗体,它也会随着仿真的运行反映出变化。
图1.51是51单片机的内部数据存储器(IDATA)的观察窗体,它同样会随着仿真的运行反映出变化。
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0042_0004.jpg?sign=1739256860-1lEyhXNB3aYWUqj2ODR7yxPHh9d4uJKz-0-9d0d55293a36af4131e43824c9c62f85)
图1.50 SFR特殊功能寄存器观察窗体
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0042_0005.jpg?sign=1739256860-QyA8bSmext8ibjnpwGsHIZ3XI8PJCFN4-0-3a822b30edcdbe48a35f9e68e62ee56a)
图1.51 内部数据寄存器(IDATA)的观察窗体
2.Proteus中的虚拟示波器
虚拟示波器(OSCILLOSCOPE)是用来观察当前电路某个点的波形变化的仪器,是Proteus仿真中最常用的虚拟仪器。
在Proteus中单击工具箱中的“”按钮图标,此时当前窗口会出现包括虚拟示波器的所有虚拟仪器的列表,在该列表中选择虚拟示波器后,接着在电路图中单击则可放置虚拟示波器,如图1.52所示。
在仿真运行下,单击Debug菜单下的“Digital Oscilloscope”选项可以打开虚拟示波器的窗体,其可以分为波形输出区域、触发(Trigger)设置区域、水平(Horizontal)设置区域和通道(通道A~通道D)设置区域,如图1.53所示。
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0043_0002.jpg?sign=1739256860-KGo8REOdLlqGSOsTnGcdgns7K6wJ5C9j-0-ef365b085f07f4a3c99523d50580d45f)
图1.52 虚拟仪器列表
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0043_0003.jpg?sign=1739256860-pSS6ze3tuMB7E3OHrPp39GqPExEdZIAp-0-37c0317fd11dda36d147cec47d641bb5)
图1.53 虚拟示波器的窗体
(1)波形输出区域用于显示待输出波形,可以显示单通道到最多四个通道的输出波形。
(2)触发设置区域的相关按键、波轮和开关等用于设置所有通道信号的触发方式,其包括水平参考线位置设置(Level)、触发信号交/直流设置(AC/DC)、触发方式设置、光标设置(Cursors)和触发源设置。
① 水平参考线位置设置:用于设置当前水平参考线的位置,通过拖动波轮可以使其在-210~210之间移动,同时波形输出区域的水平参考线将上下移动。
② 触发信号交/直流设置:用于设置待监视信号是交流还是直流信号,有“AC”和“DC”两个开关选项,。
③ 触发方式设置:当设置为“Auto”时,随着输入信号的刷新,虚拟示波器的输出波形会自动跟随刷新;当设置为“One-Shot”时则只捕捉一帧波形,然后保持。
④ 光标设置:当该按钮被按下时,会在虚拟示波器的波形输出区域跟随鼠标状态放置一些参考线显示对应点的电压、时间信息等,并且可以拖动。
⑤ 触发源设置:将虚拟示波器的触发源分别设置为通道A~通道D,在完成设置之后水平参考线会出现在当前选择通道上。
(3)水平设置区域的相关按键、波轮和开关等用于设置所有通道信号输出的水平显示参数,包括参考源(Source)设置、位置设置(Position)和显示时间刻度设置。
① 参考源设置:用于设置在显示区域中显示波形的相对参考位置,包括水平、A、B、C、D5个不同选项,通常来说选择水平即可,。
② 位置设置:用于控制显示波形左右移动。
③ 显示时间刻度设置:用于调整波形输出区域一个刻度所代表的时间长度,取值范围为0.5μs~200ms,下方的大箭头用于整刻度调整,上面的小箭头用于较小刻度的调整。
(4)通道设置区域用于设置各个通道的相关参数,分为通道A~通道D,通道A~通道D的设置区域是完全相同的,包括位置设置(Position)、触发设置、特殊功能开关和电压刻度设置。
① 位置设置:用于设置该通道在波形输出显示区域的位置,该波轮和水平参考线位置设置波轮使用方法类似,通过调节该波轮可以使对应的输出信号(A~D)在显示输出区域中移动。
② 触发设置:单独设置该通道的触发信号,包括交流(AC)、直流(DC)、地(GND)和关闭(OFF)。
③ 特殊功能开关:包括翻转(Invert)和重叠,前者将对应的波形翻转,后者将两个波形重叠,只有通道A和通道C具有该开关,分别对应“A+B”和“C+D”。
注意:在使用“A+B”或者“C+D”功能时,对应的通道B或者通道D的波形就不会输出了。
④ 电压刻度设置:和显示时间刻度设置类似,该波轮用于修改调整波形输出区域一个刻度所代表的电压宽度,取值范围为20V~2mV,同样是大、小箭头配合使用。
3. 呼吸灯的仿真
在增加两个电压探针和一个虚拟示波器后,单击运行,可以看到发光二极管以“呼吸”效果点亮和熄灭,同时在电压探针上可以看到对应的电压变化,如图1.54所示。
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0044_0001.jpg?sign=1739256860-ZOlPT6hPA8RIX7DCTHefLkeRYp1lGAMD-0-e0d1973c6823d4a8d16ff64afc4d24e6)
图1.54 呼吸灯的Proteus仿真
调节示波器,可以看到51单片机P2.0引脚输出的波形,如图1.55所示,这是一个高电平宽度连续变化的波形。
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0044_0002.jpg?sign=1739256860-6wU2iA5EADcfpo5Z4sZFTiNtDWFmJpcL-0-f923d091224df26b4ade3a25d0661b73)
图1.55 呼吸灯系统的PWM驱动波形
可以使用基于图表的仿真方式得到系统中RCL电路的响应曲线,如图1.56所示,从中可看到发光二极管上的电流变化情况与呼吸灯效果正好吻合。
![](https://epubservercos.yuewen.com/577A61/3591109404403801/epubprivate/OEBPS/Images/figure_0045_0001.jpg?sign=1739256860-kLtvCFFzyWraGu8N4oZbaPLB4Y9RRhvS-0-a1ca5e8a2788ef0006c4fe09ceb1e611)
图1.56 呼吸灯的RCL电路响应曲线
总结:在实际应用中,可以通过两种方式来调整呼吸灯的效果变化,第一种是修改51单片机输出的PWM驱动波形,另外一种是修改RCL电路中电阻、电容和电阻的大小,通常来说,前一种方式更方便一些,所以其应用更加广泛。具体到本实例中,只需要修改应用代码中的MAX和MIN这两个宏定义对应的数值即可。