Proteus软件仿真教程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
我的毕业论文(二):Keil软件的基本用法
2007年07月02日星期一 13:11
Keil μVision是Keil公司(ARM子公司)开发的一款用于MCS-51单片机开发的应用十分广泛的编译和调试软件。
该软件可以编辑、编译汇编语言、C51语言,连接定位目标文件和库文件,创建HEX文件,调试目标程序等。
Keil软件功能强大,包含很多部分,本文我们主要使用Keil μVision来开发C51项目、调试程序并生成HEX文件来用于单片机开发。
Keil μVision是一款在Windows 下使用的集成开发环境,目前最新版本为V3,本文中我们为了简便选用V2.0。
下面我们就来熟悉一下Keil软件。
首先安装软件,它的安装与MedWin一样简单,我们不做过多介绍。
安装完成后,我们就可以使用软件了,打开软件,我们可以看到其界面,如下图所示:
下面我们就来使用Keil软件开发我们的第一个项目。
点击“Project”(工程)菜单下面的“New Project”(新建工程),我们来新建一个工程。
软件弹出“Create New Project”(创建新工程)窗口。
如下图所示:
我们为工程输入文件名后,点击“保存”按钮,软件将弹出“Select Device for Tar get”(选择MCU)窗口,如下图所示。
我们只需根据自己工程的需要选择相应的MCU,然后点击“确定”按钮就可以了。
在这里我们选择Atmel公司的AT89C51,这种类型的单片机与Intel 的8051单片机完全兼容,但是它内含4KB Flash存储器,使用非常方
便,而且在我国也较为流行。
事实上,目前AT89C51已经被AT89S51所淘汰,因为AT89S51加入了ISP(在线可编程)功能,通过Atmel 公司或者自制的下载线就可以对片内Flash进行编程,使用更为方便。
然而AT89S51与AT89C51除了ISP以外完全兼容,而且下面我们要说明的Proteus软件目前只能支持AT89C51,所以本文将以AT89C51来代替8051使用,请大家注意。
选择好相应的MCU,点击窗口中的“确定”按钮以后,软件会弹出一个窗口询问是否将8051启动代码加入工程(如下图),由于我们不需要这段代码,所以我们点击“否”跳过就可以了。
至此,我们完成了整个工程的初步建立。
下面我们需要做的就是创建源文件并将我们的源文件加入工程。
首先点击“File”下面的“New”菜单,或者直接点击工具栏中的新建按钮,软件将弹出源文件编辑窗口,我们可以在窗口中编辑源文件。
编辑好的源文件如下图所示。
接下来的操作有两点需要注意:
1、加入AT89C51的头文件(当然,如果你选择了其他的MCU,则加
入相应的头文件):
在要加入头文件的地方(一般是文件开头),点击右键,选择点击弹出菜单(如下图)中的“Insert …#include <REGX51.H>‟”即完成了头文件的添加。
我们可以看到源文件中多了一行头文件包含代码“#include <REGX51.H>”。
2、保存源文件:
注意保存源文件时所书写的源文件扩展名决定了源文件的类型
(C51文件或者汇编语言源文件)。
这里我们将源文件保存为“main.c”。
你可以看出在源文件保存以后,文件中的关键字已经高亮显示,可以帮助我们及时发现错误。
源文件编辑好以后,我们就可以将其添加到工程中了。
如下图所示,右键点击“Project Workspace”窗口中的“Source Group 1”(如果你不能看到这个项目,你可以点击一下图中“Target 1”前面的“+”号展开文件夹),这时软件将弹出如图所示的菜单。
我们选择“Add Files to Group …Source Group 1‟”,软件弹出添加源文件窗口,我们就可以将相应的源文件加入到工程了。
下面我们还需要对工程作一些设置,以使其满足我们的要求。
右键点击上图中的“Target 1”,软件将弹出工程菜单,如下图所示。
我们选
择点击“Options for Target …Target1‟”,软件将弹出工程设置窗口。
在工程设置中其他的我们暂时不管,只需将“Output”选项卡下面的“Create HEX File”选中就可以了,如下图所示。
这样,当我们调试工程项目时,软件将能够生成HEX文件,用来装入单片机,使之运行我们的指令。
设置好以后,我们就可以编译、链接、调试我们的工程项目了。
首先让我们来熟悉一下调试工具栏。
在这个工具栏中我们只需了解左边的三个按钮。
其中,调试工具栏中最左侧的按钮是“Translate current file”按钮,即编译按钮,用来编译当前文件;中间的按钮是“Build target”按钮,即建立工程按钮,用来编译、连接当前的工程,产生相应的工程目标文件,比如HEX文件;最右侧的按钮是“Rebuild all target files”按钮,即全部重建按钮,主要在工程文件有改动时使用,作用是全部重建整个工程,产生相应的目标文件。
在整个工程生成HEX文件以后,我们在Keil中的任务就算完成了。
当然,你可以在Keil中进行各种调试。
事实上,Keil的功能十分强大,它能仿真单片机的各种功能。
但是我们在此并不讨论它的这些功能。
如果你想深入地学习Keil的各种功能和使用方法,请参阅相关参考文献。
我的毕业论文(三):Proteus软件使用简介
Proteus软件是Labcenter Electronics公司的一款电路设计与仿真软件,它包括ISIS、ARES等软件模块,ARES模块主要用来完成PCB的设计,而ISIS模块用来完成电路原理图的布图与仿真。
Proteus的软件仿真基于VSM技术,它与其他软件最大的不同也是最大的优势就在于它能仿真大量的单片机芯片,比如MCS-51系列、PIC系列等等,以及单片机外围电路,比如键盘、LED、LCD等等。
通过Proteus软件的使用我们能够轻易地获得一个功能齐全、实用方便的单片机实验室。
本文中由于我们主要使用Proteus软件在单片机方面的仿真功能,所以我们重点研究ISIS模块的用法,在下面的内容中,如不特别说明,我们所说的Proteus软件特指其ISIS模块。
在进行下面的操作前,我先说明一点:我的Proteus版本是7.1,如果你使用的是6.9以前的版本,可能你发现在鼠标操作上会略有不同。
这主要表现在6.9以前的版本鼠标左右键的作用与一般软件刚好相反,而7.0以后已经完全改过。
下面我们首先来熟悉一下Proteus的界面。
Proteus是一个标准的Windows窗口程序,和大多数程序一样,没有太大区别,其启动界面如下图所示:
如图中所示,区域①为菜单及工具栏,区域②为预览区,区域③为元器件浏览区,区域④为编辑窗口,区域⑤为对象拾取区,区域⑥为元器件调整工具栏,区域⑦为运行工具条。
下面我们就以建立一个和我们在Keil简介中所讲的工程项目相配套的Proteus工程为例来详细讲述Proteus的操作方法以及注意事项。
首先点击启动界面区域③中的“P”按钮(Pick Devices,拾取元器件)来打开“Pick Devices”(拾取元器件)对话框从元件库中拾取所需的元器件。
对话框如下图所示:
在对话框中的“Keywords”里面输入我们要检索的元器件的关键词,比如我们要选择项目中使用的AT89C51,就可以直接输入。
输入以后我们能够在中间的“Results”结果栏里面看到我们搜索的元器件的结果。
在对话框的右侧,我们还能够看到我们选择的元器件的仿真模型、引脚以及PCB参数。
这里有一点需要注意,可能有时候我们选择的元器件并没有仿真模型,对话框将在仿真模型和引脚一栏中显示“No Simulator Model”(无仿真模型)。
那么我们就不能够用该元器件进行仿真了,或者我们只能做它的PCB板,或者我们选择其他的与其功能类似而且具有仿真模型的元器件。
搜索到所需的元器件以后,我们可以双击元器件名来将相应的元器件加入到我们的文档中,那么接着我们还可以用相同的方法来搜索并加入其他的元器件。
当我们已经将所需的元器件全部加入到文档中时,我们可以点击“OK”按钮来完成元器件的添加。
添加好元器件以后,下面我们所需要做的就是将元器件按照我们的需要连接成电路。
首先在元器件浏览区中点击我们需要添加到文档中的元器件,这时我们就可以在浏览区看到我们所选择的元器件的形状与方向,如果其方向不符合你的要求,你可以通过点击元器件调整工具栏中的工具来任意进行调整,调整完成之后在文档中单击并选定好需要放置的位置即可。
接着按相同的操作即可完成所有元器件的布置,接下来是连线。
事实上Proteus的自动布线功能是如此的完美以至于我们在做布线时从来都不会觉得这是一项任务,而通常像是在享受布线的乐趣。
布线时我们只需要单击选择起点,然后在需要转弯的地方单击一下,按照你所需走线的方向移动鼠标到线的终点单击即可。
本例我们布线的结果如下图所示(仿真我们在上面的Keil操作介绍中的简单例子)。
因为该工程十分简单,我们没有必要加上复位电路,所以这点在图中予以忽略,请大家注意。
除此以外,你可能还发现,单片机系统没有晶振,这一点你需注意。
事实上在Proteus中单片机的晶振可以省略,系统默认为12MHz,而且很多时候,当然也为了方便,我们只需要取默认值就可以了。
下面我们来添加电源。
先说明一点,Proteus中单片机芯片默认已经添加电源与地,所以我们可以省略。
然后在添加电源与地以前,我们先来看一下上面第一个图中区域⑤的对象拾取区,我们在这里只说明本文中可能会用得到的以及比较重要的工具。
l:(Selection Mode)。
选择模式,通常情况下我们都需要选中它,比如布局时和布线时。
l:(Component Mode)。
组件模式,点击该按钮,能够显示出区域③中的元器件,以便我们选择。
l:(Wire Label Mode)。
线路标签模式,选中它并单击文档区电路连线能够为连线添加标签。
经常与总线配合使用。
l:(Text Script Mode)。
文本模式,选中它能够为文档添加文本。
l:(Buses Mode)。
总线模式,选中它能够在电路中画总线。
关于总线画法的详细步骤与注意事项我们在下面会进行专门讲解。
l:(Terminals Mode)。
终端模式,选中它能够为电路添加各种终端,比如输入、输出、电源、地等等。
l:(Virtual Instruments Mode)。
虚拟仪器模式,选中它我们能够在区域③中看到很多虚拟仪器,比如示波器、电压表、电流表等等。
关于它们的用法我们会在后面的相应章节中详细讲述。
好了,下面我们就来添加电源。
首先点击,选择终端模式,然后在元器件浏览区中点击POWER(电源)来选中电源,通过区域⑥中的元器件调整工具进行适当的调整,然后就可以在文档区中单击放置电源了。
放置并连接好线路的电路图一部分如下图:
连接好电路图以后我们还需要做一些修改。
由上图我们可以看出,图中的R1电阻值为10k,这个电阻作为限流电阻显然太大,将使发光二极管D1亮度很低或者根本就不亮,影响我们的仿真结果。
所以我们要进行修改。
修改方法如下:首先我们双击电阻图标,这时软件将弹出“Edit Component”对话框(见下图所示的对话框),对话框中的“Component Referer”是组件标签之意,可以随便填写,也可以取默认,
但要注意在同一文档中不能有两个组件标签相同;“Resistance”就是电阻值了,我们可以在其后的框中根据需要填入相应的电阻值。
填写时需注意其格式,如果直接填写数字,则单位默认为Ω;如果在数字后面加上K或者k,则表示kΩ之意。
这里我们填入270,表示270Ω。
修改好各组件属性以后就要将程序(HEX文件)载入单片机了。
首先双击单片机图标,系统同样会弹出“Edit Component”对话框,如下图。
在这个对话框中我们点击“Program files”框右侧的,来打开选择程序代码窗口,选中相应的HEX文件后返回,这时,按钮左侧的框中就填入了相应的HEX文件,我们点击对话框的“OK”按钮,回到文档,程序文件就添加完毕了。
装载好程序,我们就可以进行仿真了。
首先来熟悉一下上面第一个图中区域⑦的运行工具条。
因为比较简单,我们只作一下介绍。
工具条从左到右依次是“Play”、“Step”、“Pause”、“Stop”按钮,即运行、步进、暂停、停止。
下面我们点击“Play”按钮来仿真运行,效果如下图所示,可以看到系统按照我们的程序在运行着,而且我们还能看到其高低电平的实时变化。
如果我们已经观察到了结果就可以点击“Stop”来停止运行。
我的毕业论文(四):计算机仿真辅助单片机指令系统的学习
2007年07月04日星期三 14:41
计算机仿真对单片机指令系统的学习的帮助主要在于帮助理解,加强记忆,适当应用。
能够在单片机指令系统学习中的软件主要是MedWin,因为其操作简单,而且可以直观地看到结果。
1.数据传送指令:
数据传送类指令主要包括:MOV、MOVX、MOVC、PUSH、POP、XCH等。
下面我们通过一个简单的汇编程序来学习这些指令。
例1.汇编语言源文件如下图所示:
在MedWin中编辑好源文件以后,以“.asm”为后缀保存为汇编源文件。
然后进行编译、汇编并将代码装入内存进行仿真。
由于本程序对寄存器、特殊功能寄存器、内部存储器、外部数据存储器都进行了操作,所以需要首先点击“查看”菜单下的相应子菜单打开相应的窗口,即寄存器、特殊功能寄存器、数据区IData、数据区XData,并可以根据需要点击“窗口”菜单下的选项来横向或纵向平铺窗口。
因为本程序需要一步一步地详细查看相应指令执行的结果,所以我们需要在执行指令时点击“指令跟踪(F7)”或“指令单步(F8)”按钮来单步执行。
指令执行中的一个画面如下图所示:
从图中我们能够清晰地观察到每一条指令执行的每一个结果,从而加深我们对这些指令的理解与记忆。
除以上实例程序中所书写的以外,我们还可以使用其他的指令书写程序并在MedWin中仿真,比如PUSH、POP、MOVC等,相信你会得到一个很好的结果,而且MedWin肯定会提高你学习指令的兴趣。
2.算术操作类指令
算术操作类指令主要有:ADD、ADDC、DA A、SUB、INC、DEC、MUL、DIV等。
算术操作类指令比较复杂,掌握起来比较困难,但在实际的单片机项目应用中很少涉及,尤其是MUL、DIV两条指令,在51系列单片机
中更是被束之高阁,很少使用。
此处,我们不再像上节那样逐条书写并仿真课本上的程序,如果感兴趣,你可以仿照上节自己书写程序并进行仿真,观察并体会每一条指令执行的结果以及对系统的影响。
这里我们通过一个比较实用的例子来演示仿真算术类指令的操作。
例2.两个压缩BCD码求和:将两个BCD码(每个占4位)分别放在一个字节的高4位和低4位即组成压缩BCD码。
本例中有两个压缩BCD码数字,都是四位数,第一个数的高两位放在20H,低两位放在21H中;第二个高低位分别放在30H、31H中。
要求所得结果放在40H、41H中。
汇编源程序如下图:
在MedWin中编辑好源文件后,以“.asm”为后缀将其保存为汇编文
件,然后进行编译、汇编并将代码装入内存进行仿真。
你可以像上例那样步进观察其详细执行过程,分析原因;当然也可以在“ljmp$”处设置断点,然后全速运行。
需要注意程序中使用到了内部存储器,所以你需要将数据区“IData”窗口调出来进行观察。
运行的最后结果如下图所示:
从图中我们能够很清楚地看到内部存储器相应单元的内容,进而观察到程序执行的结果,即:2097+4559=6656。
3.逻辑运算指令、控制转移类指令
逻辑运算指令,顾名思义,是用于逻辑运算的指令。
主要包括:CLR、CPL、ANL、ORL、XRL等常用逻辑指令以及循环移位指令如:RL、RLC、RR、RRC等。
控制转移类指令是指在程序中根据具体的条件(或者没有条件)使程序转移到相应的入口的指令。
它主要包括三类指令:一是无条件转移指令,比如:AJMP、SJMP、LJMP等;二是条件转移指令,比如:JZ、CJNE、DJNZ等;三是子程序调用返回指令,比如:ACALL、LCALL、RET、RETI等。
鉴于单独针对逻辑运算指令进行的仿真十分简单(事实上与数据传
送类指令相同),可以很容易、很方便地自己针对相应的指令设计程序来观察结果,进行学习。
所以此处不再针对逻辑运算指令举例仿真。
而控制转移类指令又不可能单独使用,往往与其他指令结合使用来组成相应的程序,所以也无法单独进行仿真。
所以下面我们就将逻辑运算类指令与控制转移类指令相结合来编写仿真程序,通过一个实例同时来仿真这两类指令的应用。
例3.十六进制整数转化为BCD码整数:4位十六进制整数高低位依次放在R3、R4中,要求转换后的BCD整数按高低位顺序放在R5、R6、R7中。
程序源文件如下图:
在MedWin中编辑好源文件以后,将其以“.asm”为后缀保存为汇编源文件,然后编译、汇编并将产生的代码装入内存进行仿真调试。
仿真前需要注意首先输入R3、R4设置十六进制初始值,具体设置方法如下。
首先调出寄存器窗口,然后在需要修改的寄存器名称或者数值上双击,这时其内容将变为可修改,我们在其中填入需要设置的数值(字母大小写均可)即可,如下图所示:
设置好初始值以后,你可以单步观察几步以便明白其原理,然后就可以设置一个断点全速运行了,最后就可以看到所得到的结果,比如我们输入8FD6,将得到结果:R5=03,R6=68,R7=22。
4.位操作指令
位操作比较简单,我们也不再写实例进行仿真,如果你感兴趣,可以自己写一些针对相应指令的小程序来仿真之。
这里我们主要说明一下仿真位操作指令与其他指令的不同及注意事项。
位操作指令是对单片机内部存储器的位地址空间进行的相应操作,所以我们查看相应结果时应该打开相应窗口。
单片机的位地址空间可以
这样来打开:点击“查看”菜单下面的“数据区Bit”子菜单。
位地址空间窗口如下图所示:
除此之外,在相应的位操作中如果我们需要查看各种位标志时,可以点击上图中下侧的“位”标签,将“字节”标签换过来进行查看。
我的毕业论文(五):Proteus仿真辅助定时器/计数器的学习
2007年07月05日星期四 14:23
MCS-51系列单片机内部有两个定时器/计数器T0、T1,它们都具有两种工作模式(定时器和计数器)以及四种工作方式(方式0、1、2、3)。
定时器/计数器T0由特殊功能寄存器TH0和TL0构成,T1由特殊功能寄存器TH1和TL1构成。
除此之外,与定时器/计数器有关的特殊功能寄存器还有工作方式控制寄存器TMOD和控制寄存器TCON。
关于它们的详细内容和具体应用请参阅相关参考文献,此处不做探讨。
由于定时器/计数器T0与T1用法几乎完全相同,所以下面的例子中我们将全部使用T0。
而且定时器/计数器方式0和方式3较少使用,
因此我们也将主要仿真说明其方式1和2的用法,另外我们还会给出一种其计数器的用法。
例1.定时器/计数器T0工作于定时器模式方式1,在P1.0端口产生周期为100ms的方波。
首先计算计数初值:周期为100ms,定时应为50ms(半个周期)。
一个计算公式为:
计数初值=216-t×f/12
其中t为定时时间(单位为s),f为单片机的时钟频率(单位为MHz)。
所以,计数初值为216-0.05×12M/12=15536=3CB0H。
因此,TH0的初值应为3CH,TL0的初值应为B0H。
因此,此例的源代码如下图:
在MedWin中将源文件编辑完成以后,保存为汇编源文件并编译、
汇编产生源代码(.HEX文件)。
下面我们在Proteus中设计电路,此例电路也比较简单,只需在AT89C51单片机的P1.0口连上一个示波器来观察产生的相应波形就可以了。
选择示波器时要注意首先在前面的文章“我的毕业论文(三):Proteus软件的基本用法”中第一个图:Proteus界面里面的区域⑤点击按钮选择虚拟仪器模式,然后在区域③中选择“OSCILLOSCOPE”(示波器)。
完成的电路图如下图所示:
构建好电路图以后,下面就可以为单片机添加程序代码(.HEX文件)了。
双击单片机图标,添加上面的源文件所生成的程序代码,添加好以后,接着就可以进行下面的仿真。
点击运行按钮,系统就运行了起来,我们可以适当调整示波器面板上的按钮来使波形最有利于我们观察。
调整好以后,系统产生的波形效果如下图所示:
如果你的Proteus版本是7.0以前的版本,那么你的示波器和波形效果可能与图中略有不同,但并不影响仿真效果;如果是最新版本,则应该完全相同。
从图中我们能够看出,波形的周期为100ms,这与我们设定的目标相一致;而其幅值则近似为5V。
例2.设计一个延时程序,延时500ms。
为了能够清晰地看到延时效果,我们设计在P1.0口连接一个LED发光二极管,使其使用该延时程序每500ms闪烁一次。
通常情况下,为了简便,人们会使用软件延时,即通过执行一段没有意义的程序来达到延时的目的。
但那样做会浪费系统资源,使得系统在延时过程中不能响应任何外部或内部事件。
所以,人们对其做了改进,
而通过定时器/计数器定时来进行延时。
由于方式2定时时间过短(12MHz下最大250μs左右),所以,此处我们仍然选用方式1。
但方式1在12MHz下的最大定时时间也只有60多ms,仍然不能满足延时要求。
所以,延时程序需要软硬件协作。
即我们可以这样去做,通过硬件T0延时50ms,然后设置一个计数器,当计数器计到10时,我们延时的目标就达到了。
源程序如下图:(计数器初值计算与上例相同)
将上面的源文件保存为汇编文件,然后进行编译/汇编,并生产源代码装入内存在MedWin中仿真运行看延时效果(可以通过指令单步执
行“lcall dly500”一句观察指令执行时间,则实际执行时间就是延时时间)。
结果发现,实际执行中该延时程序比我们的要求多延时了87μs,这是因为延时程序中还插入了其他指令(比如设置T0模式等),所以我们的延时程序不是十分精确,实际应用中我们可以通过调整T0初值来稍作调整,但此处对延时要求并不精确,所以我们就不再做调整了。
下面我们可以在Proteus中构建电路来观察我们的延时效果。
电路图十分简单,如下图所示:
注意LED的阴阳极不要接反,图中的限流电阻在模拟时可以略去,但如果添加上的话,最好阻值不要设置的过大,以免LED发光太弱,影响观察效果。
设置好电路图以及各元器件的属性以后,我们就可以点击仿真按钮来观察效果了。
可以看到,LED按照大约0.5s的周期开始闪烁。
例3.定时器/计数器的计数功能。
本例使用T1对外部脉冲进行计数,每计数一次,与P1口相连的8个LED发光二极管的亮灯个数和位
置就按照它们的顺序所表示的BCD码(亮灯代表1,灭灯为0)做加法。
比如开始为29(00101001),计数一次以后,对应的数字变为30(00110000)。
这里我们用按键来模拟外部脉冲,每按一次,表示产生一个脉冲。
显然,根据要求,我们可以使T1工作于计数器方式2,而且我们可以设置其初值为FF,这样,外部产生一个脉冲,T1检查到就会发生中断,然后我们在中断子程序中按要求进行处理。
其源程序如下图所示:
将上面在MedWin中编辑好的源文件保存为汇编文件,然后进行编译/汇编,并产生相应的源代码(.HEX文件)。
注意因为Proteus仿真电路的按键为理想按键,所以程序设计时并没有考虑按键的抖动,但在实际应用中应该注意,否则将可能实现不了预期目的。
另外,本例为了。