3.4 基于Proteus的单片机系统仿真
单片机系统的开发除了需要购置诸如仿真器、编程器、示波器等价格不菲的电子设备外,开发过程也较烦琐。如图3.28所示,用户程序需要在硬件完成的情况下才能进行软硬件联合调试,如果在调试过程中发现硬件错误需修改硬件,则要重新设计硬件目标板的PCB(Printed CircuitBoard,印制电路板)并焊接元器件。因此无论从硬件成本还是从开发周期来看,其高风险、低效率的特性显而易见。
printf函数是极为方便的信息输出函数,能将程序中的各种变量的值快速格式化并输出到控制台,在程序调试和测试中无处不在,C语言教材,例子程序中经常要用到它作为输出。
英国Labcenter Electronics公司推出的Proteus套件,可以对基于微控制器的设计连同所有的周围电子器件一起仿真调试,用户甚至可以实时采用诸如LED/LCD、键盘、RS232终端等动态外设模型来对设计进行交互仿真调试,只要原理图设计完成,软件设计者就可以开始他们的工作,不用等待一个实际的硬件物理原型的出现。Proteus支持的微处理芯片(Microprocessors ICs)包括8051系列、AVR系列、PIC系列、HC11系列、ARM7/LPC2000系列以及Z80等。
ProteusVSM包含了大量的虚拟仪器,包括示波器、逻辑分析仪函数发生器、数字信号图案发生器、时钟计数器、虚拟终端及简单的电压表和电流表,为仿真调试提供了强有力的支持。
图3.29为基于Proteus ISIS仿真软件的单片机系统设计流程,它极大地简化了设计工作,并有效地降低了成本和风险,得到众多单片机工程师的青睐。
图3.28 传统的单片机嵌入式系统开发设计流程
图3.29 基于Proteus ISIS仿真软件的单片机系统设计流程
在PC上安装Proteus软件后,即可完成单片机系统原理图电路绘制、PCB设计,更为显著的特点是可以与µVision2 IDE工具软件结合进行编程仿真调试。本节以Proteus 7 Professional为例介绍Proteus在单片机系统设计中的应用。
Proteus 7.5 Professional软件主要包括ISIS 7 Professional和ARES 7 Professional,其中ISIS 7 Professional用于绘制原理图并可进行电路仿真(SPICE仿真),ARES 7 Professional用于PCB设计。本书只介绍前者。
3.4.1 Proteus 7 Professional界面介绍
安装完 Proteus后,运行ISIS 7 Professional,会出现如图3.30所示的窗口界面。
窗口内各部分的功能用中文做了标注。ISIS大部分操作与Windows的操作类似。下面简单介绍其各部分的功能。
1.原理图编辑窗口(The Editing Window)
顾名思义,它是用来绘制原理图的。蓝色方框内为可编辑区,元器件要放到里面。与其他Windows应用软件不同,这个窗口是没有滚动条的,可以用左上角的导航窗口来改变原理图的可视范围。
2.预览窗口(The Overview Window)
它可以显示两个内容:在元器件列表中选择一个元器件时,它会显示该元器件的预览图;当鼠标焦点落在原理图编辑窗口时(即放置元器件到原理图编辑窗口后或在原理图编辑窗口中单击鼠标后),就变成原理图的导航窗口,会显示整张原理图的缩略图,并会显示一个绿色的方框,绿色方框里面的内容就是当前原理图窗口中显示的内容,因此可以用鼠标在上面单击来改变绿色方框的位置,从而改变原理图的可视范围。
图3.30 Proteus ISIS 7的编辑环境
3.模型选择元器件栏(Mode Selector Toolbar)
主要模型(Main Modes)由上向下功能如下。
配件(Gadgets)由上向下功能如下。
2D图形(2D Graphics)由上向下功能如下。
4.元器件列表区(The Object Selector)
用于挑选元器件(Components)、终端接口(Terminals)、信号发生器(Generators)、仿真图表(Graph)等。例如,当选择“元器件”(Components),单击P按钮会打开挑选元器件对话框,选择了一个元器件后(单击了OK按钮后),该元器件会在元器件列表中显示,以后要用到该元器件时,只需在元器件列表区中选择即可。
5.方向工具栏(Orientation Toolbar)
旋转:旋转角度只能是90的整倍数。
翻转:水平翻转和垂直翻转。
使用方法:先右键单击所选元件,再选择相应的旋转图标。
6.仿真工具栏
仿真控制按钮由左向右功能分别为:运行、单步运行、暂停、停止。
3.4.2 绘制电路原理图
下面通过一个简单的示例说明绘制原理图过程。
1.将所需元器件加入到对象选择器窗口
单击对象选择器按钮,在弹出的Pick Devices窗口中,使用搜索引擎,在Keywords栏中分别输入AT89C52.BUS、BUTTON、SW-SPDT和7SEG-BCD,在搜索结果Results栏中找到该对象,并将其添加到对象选择器窗口,如图3.31所示。
图3.31 把元器件加入到对象选择器
2.放置元器件至图形编辑窗口
将AT89C52.BUS、BUTTON、SW-SPDT和7SEG-BCD放置到图形编辑窗口,如图3.32所示。
图3.32 放置元器件至图形编辑窗口
3.放置总线至图形编辑窗口
单击绘图工具栏中的总线按钮,使之处于选中状态。将鼠标置于图形编辑窗口,绘制出如图3.33所示的总线。
图3.33 放置总线至图形编辑窗口
在绘制总线的过程中,应注意:
① 当鼠标的指针靠近对象的连接点时,鼠标的指针会出现一个“×”号,表明总线可以接至该点;
② 在绘制多段连续总线时,只需要在拐点处单击鼠标左键,其他步骤与绘制一段总线相同。
4.添加电源和接地引脚
单击绘图工具栏中的Inter-sheet Terminal按钮,在对象选择器窗口,选中对象POWER和GROUND,如图3.34所示,将其放置到图形编辑窗口。
5.元器件之间的连线Wiring Up Components on the Schematic
在图形编辑窗口,完成各对象间的连线,如图3.35所示。
图3.34 添加电源和接地引脚
图3.35 完成各对象的连线后的界面
在此过程中请注意:当线路出现交叉点时,若出现实心小黑圆点,表明导线接通,否则表明导线无接通关系。当然,也可以通过绘图工具栏中的连接点按钮,完成两交叉线的接通。
6.给导线或总线加标签
单击绘图工具栏中的导线标签按钮,在图形编辑窗口,完成导线或总线的标注,如图3.36所示。
图3.36 给导线或总线加标签
在此过程中请注意:
① 总线的命名可以与单片机的总线名相同,也可不同。但方括号内的数字却赋予了特定的含义。例如,总线命名为P2[0..7],意味着此总线可以分为8条彼此独立的命名为P20、P21、P22、P23、P24、P25、P26、P27的导线,若该总线一旦标注完成,则系统自动在导线标签编辑页面的String栏的下拉菜单中加入以上8组导线名,今后在标注与之相联的导线名时,如P20,要直接从导线标签编辑页面的String栏的下拉菜单中选取,如图3.37所示。
② 若标注名为,直接在导线标签编辑页面的String栏中输入$WR$即可,也就是说可以用两个$符号来表示字母上面的横线。
图3.37 从下拉菜单中选取标签
7.添加电压探针
单击绘图工具栏中的电压探针按钮,在图形编辑窗口,完成电压探针的添加,如图3.38所示。
图3.38 添加电压探针
在此过程中,电压探针名默认为“?”,当电压探针的连接点与导线或者总线连接后,电压探针名自动更改为已标注的导线名、总线名,或者与该导线连接的设备引脚名。
图3.39 添加文字标注
8.添加文字标注
单击绘图工具栏中的文字标注按钮,在图形编辑窗口,完成文字标注的添加,如图3.39所示,此处添加“加1按钮”、“减1按钮”、“清零按钮”。
9.添加虚拟仪器
单击绘图工具栏中的文字标注按钮,选择VIRTUAL TERMINAL,完成虚拟终端的添加和接线,如图3.40所示。
图3.40 添加虚拟仪器
10.修改AT89C52属性并加载程序文件
双击U1-AT89C52,打开Edit Component对话框,如图3.41所示。在Program File中选择3.3.3节示例项目HelloWorld生成的hex文件HelloWorld.hex。
在Clock Frequency文本框中填入11.0592MHz,其他为选项默认,单击OK按钮退出。
从“文件”下拉菜单选择“保存”项,出现如图3.42所示的对话框,提示输入文件名,图中设文件名为80C51VSM.DSN,单击“保存”按钮。至此,便完成了整个电路图的绘制。
11.调试运行
单击仿真运行开始按钮,能清楚地观察到:①引脚的电频变化,红色代表高电平,蓝色代表低电平,灰色代表未接入信号,或者为高阻态;②连到单根信号线上的电压探针的高低电平值在周期性的变化,连到总线上的电压探针的值显示的是总线数据。图3.43所示的程序运行情况与图3.27所示的“程序连续运行时的窗口显示”情况完全符合,但更直观。图3.44所示的虚拟终端窗口显示了printf的打印信息。单击仿真运行结束按钮,仿真结束。
图3.41 修改AT89C52属性并加载程序文件
图3.42 保存文件对话框
图3.43 调试运行窗口
图3.44 虚拟终端窗口
3.4.3 ProteusVSM与µVision2的联调
ProteusVSM能够提供的CPU仿真模型有ARM7、PIC、Atmel AVR、Motorola HCXX及8051/8052系列。支持单片机系统的仿真是PROTEUSVSM的一大特色。ProteusVSM将源代码的编辑和编译整合到同一设计环境中,这样使得用户可以在设计中直接编辑代码,并可容易地查看到用户对源程序修改后对仿真结果的影响。但对于80C51/80C52系列,目前ProteusVSM只嵌入了8051汇编器,尚不支持高级语言的调试。但ProteusVSM支持第三方集成开发环境IDE,目前支持的第三方80C51IDE有IAR Embedded Workbench、Keil µVision2 IDE。本文以Keil µVision2 IDE为例介绍ProteusVSM与µVision2 IDE的联调。
对于proteus 6.9或更高的版本,在安装盘里有vdmagdi插件,或者可以到LABCENTER公司下载该插件,安装该插件后即可实现与Keil µVision2 IDE的联调。
下面的叙述是假定已经分别安装了如下软件:
① Proteus 7 Professional
② Keil µVision2 IDE
③Vdmagdi.exe
1.ProteusVSM的设置
进入Proteus的ISIS,打开一个原理图文件(如在3.4.2节所绘制电路原理图文件80C51VSM.DSN),鼠标左键单击菜单Debug,选中use romote debuger monitor,如图3.45所示,便可实现µVision2 IDE与Proteus连接调试。
2.µVision2 IDE设置
(1)设置option for target/Debug选项
打开µVision2,建立或打开一个工程,假设打开在3.3.3节所建立的项目HelloWorld。打开“Project菜单/Options for Target 'Target 1'”选项,在弹出的窗口中单击Debug按钮,出现如图3.46所示对话框。
图3.45 Proteus的设置
图3.46 µVision2 IDE开发环境option for target/Debug选项设置
在该对话框中,在右栏上部的下拉菜单里选中ProteusVSM Simulator,并单击一下Use前面表明选中的小圆点。如果所调试的Proteus文件不是装在本机上,要单击Setting按钮,设置通信接口,在Host后面默认是本机IP地址127.0.0.1。如果使用的不是同一台计算机,则需要在这里添上另一台计算机的IP地址(另一台计算机也应安装Proteus)。在Port后面添加8000。设置好的情形如图所示,最后单击OK按钮即可。
(2)设置option for target/Output选项
接着上述设置,打开Output标签页,将Create HEX File项打勾选中,如图3.47所示。
图3.47 µVision2 IDE开发环境option for target/Output选项设置
3.ProteusVSM与µVision2的联调
在µVision2环境下,首先按F7键产生该项目的HEX文件,然后单击进入µVision2调试模式,为了在ProteusVSM环境下能观察到程序连续运行情况,单击取消目前项目中所有断点。单击或按F5键进入全速运行,然后切换到ProteusVSM环境,可以看到同图3.43调试运行窗口完全一致的运行画面。此时ProteusVSM的运行完全依赖于外部调试器µVision2。
由3.3.3节中的项目HelloWorld的运行情况可知,µVision2 ID只支持AT89C52片内的外围部件,如图3.27所示,对AT89C52片外的外围部件的仿真无能为力。但现在配合ProteusVSM可仿真AT89C52片外的外围部件。利用图3.43中接在U1-AT89C52单片机P1.0和P1.3的元器件单刀双掷开关SW-SPDT和P1.6的元器件按钮BUTTON可说明如何仿真AT89C52片外的外围部件。
要求在图3.43中,当单刀双掷开关SW-SPDT接到P1.0,单片机P2口输出进行加法计数,当单刀双掷开关SW-SPDT接到P1.3,单片机P2口输出进行减法计数。当按钮BUTTON按下时超过1秒,单片机P2口的计数输出清零。
为此修改项目HelloWorld中的文件HelloWorld.c,修改后的源程序如下:
#include <REG52.H>//片内寄存器定义 #include <stdio.h>//输入/输出函数库 sbit inc_BUTTON=P1^0;//加1按钮 sbit dec_BUTTON=P1^3;//减1按钮 sbit clr_BUTTON=P1^6;//清0按钮 void initUart(void);/*初始化串口波特率,使用定时器1*/ /***********mAin C **************/ voidmAin (void) { unsigned long ulTimer;//延时设定的循环次数 unsigned char ucCounter=0;//打印输出计数 initUart();//为了使用printf语句,要初始化串口 while (1){ P2=ucCounter; printf ("%bx ",ucCounter);/* Print ucCounter */ printf ("Hello World!");/* Print "Hello World" */ if(inc_BUTTON==0)ucCounter++;//加1 if(dec_BUTTON==0)ucCounter--;//减1 if(clr_BUTTON==0)ucCounter=0;//清0 for (ulTimer=0; ulTimer<2000; ulTimer++){}//延时 } } /********** 初始化串口波特率 ************/ //为了使用串行口带格式输出函数printf,串口必须初始化 void initUart(void)/*初始化串口波特率,使用定时器1*/ { /* Setup the serial port for 9600Baud at 11.0592MHz */ SCON=0x50;/* SCON: mode 1,8-bit UART,enable rcvr */ TMOD |=0x20;/* TMOD: timer 1,mode 2,8-bit reload */ TH1=0xfd;/* TH1: reloadValue for 9600Baud @ 11.0592MHz*/ TR1=1;/* TR1: timer 1 run */ TI=1;/* TI: set TI to send first char of UART */ }
在µVision2 IDE环境下重新编译该项目。单击进入µVision2调试模式,单击或按F5键进入全速运行。然后切换到ProteusVSM环境。可以分别单击“加1按钮”、“减1按钮”和“清零按钮”观察程序单片机外围部件仿真运行情况。
单击,可以在程序中设置断点,可以观察到在µVision2环境下,断点运行和单步运行时在ProteusVSM环境下原理图的变化情况,如图3.48所示。
图3.48 ProteusVSM与µVision2 IDE实现联调
ProteusVSM与µVision2联调时,ProteusVSM的U1-AT89C52可以不加载任何程序文件。但笔者还是建议,要加载程序文件,且选择当前在µVision2环境下所调试程序生成的HEX文件。这样无论是否联调,ProteusVSM的运行情况总是一致的。
3.4.4 ProteusVSM中的电源、复位与时钟
ProteusVSM中绘制原理图时,总是默认微处理器电路已经配置了电源与复位电路。电源与复位总是有效,仿真电路可以省略电源与复位电路。
时钟电路同样可以省略,时钟固有频率以在微处理器的属性中所做设置为准。
为了节省版面,后面章节的电路中有时会省略电源、复位与时钟电路。但在实际的工程实践中,这些部分缺一不可!