Proteus和Keil的使用与联调

2019-04-15 12:42发布

  Proteus7.0 是目前最好的模拟单片机外围器件的工具,非常不错。可以仿真 51 系列、AVR,PIC 等常用的 MCU 及其外围电路(如LCD,RAM,ROM,键盘,马达,LED,AD/DA,部分SPI器件,部分IIC 器件等等),虽然有那么多优点和长处,但还是与实际情况有不少的差别。如果条件允许,还是买一块单片机开发板或自己做一个单片机应用系统,实实在在的学习和体会一下,仿真毕竟还是仿真,不能代替实际操作,许多实际问题是在仿真中碰不到的。当然,条件不允许,我们可以采用仿真,达到学习的目的。 如果学习和使用单片机,除了灵活应用Protel等绘制原理图和PCB图以外,那么Keil C51 软件应该要掌握,我们要通过它来编写和调试单片机程序。Keil C51 软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编,PLM 语言和 C 语言的程序设计,界面友好,易学易用。下面就三个问题分别进行介绍。 一、 proteus的使用 1. 软件打开 双击桌面上的ISIS 7 Professional图标或者单击屏幕左下方的“开始”→“程序”→“Proteus 7 Professional” →“ISIS 7 Professional”,出现如图1-1所示界面,随后就进入了Proteus ISIS集成环境。 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图1-1 启动时的界面 2. 工作界面 Proteus ISIS的工作界面是一种标准的Windows界面,如图1-2所示。包括:标题栏、主菜单、标准工具栏、绘图工具栏、状态栏、对象选择按钮、预览对象方位控制按钮、仿真进程控制按钮、预览窗口、对象选择器窗口、图形编辑窗口。 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图1-2  Proteus ISIS的工作界面 关于该软件的使用,与学习其他软件的方法没有多大区别,当然我们也不是每个功能都使用,没必要逐一介绍,再说下面有例子,呵呵,相信自己的能力吧。        3. 跑马灯实例设计 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图1-3  跑马灯实例 ①将所需元器件加入到对象选择器窗口。Picking Components into the Schematic单击对象选择器按钮 ,如图1-4所示 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图1-4 添加元器件 弹出“Pick Devices”页面,在“Keywords”输入AT89C,系统在对象库中进行搜索查找,并将搜索结果显示在“Results”中,如图1-5所示。 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图1-5  搜索查找元器件 在“Results”栏中的列表项中,双击“AT89C52”,则可将“AT89C52”添加至对象选择器窗口。     接着在“Keywords”栏中重新输入LED,如图所示。双击“LED-BLUE”,则可将“LED-BLUE”(LED数码管)添加至对象选择器窗口,使用同样的方法,把10WATT470R电阻添加至对象选择器窗口。 经过以上操作,在对象选择器窗口中,已有了AT89C52、LED-BLUE、10WATT470R三个元器件对象,若单击AT89C52,在预览窗口中,见到AT89C51的实物图,单击其他两个器件,都能浏览到实物图。此时,我们已注意到在绘图工具栏中的元器件按钮 处于选中状态。 ②放置元器件至图形编辑窗口Placing Components onto the Schematic 在对象选择器窗口中,选中AT89C52,将鼠标置于图形编辑窗口该对象的欲放位置、单击鼠标左键,该对象被完成放置,如图1-6所示。。同理,将LED-BLUE和10WATT470R放置到图形编辑窗口中。 若对象位置需要移动,将鼠标移到该对象上,单击鼠标右键,此时我们已经注意到,该对象的颜 {MOD}已变至红 {MOD},表明该对象已被选中,按下鼠标左键,拖动鼠标,将对象移至新位置后,松开鼠标,完成移动操作。 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图1-6  放置到图形编辑窗口 ③放置总线至图形编辑窗口 单击绘图工具栏中的总线按钮 ,使之处于选中状态。将鼠标置于图形编辑窗口,单击鼠标左键,确定总线的起始位置;移动鼠标,屏幕出现粉红 {MOD}细直线,找到总线的终了位置,单击鼠标左键,再单击鼠标右键,以表示确认并结束画总线操作。此后,粉红 {MOD}细直线被蓝 {MOD}的粗直线所替代,如图1-3蓝 {MOD}线所示。 ④元器件之间的连线Wiring Up Components on the Schematic Proteus的智能化可以在你想要画线的时候进行自动检测。下面,我们来操作将电阻R1的上端连接到D1数码管下端。当鼠标的指针靠近R1上端的连接点时,跟着鼠标的指针就会出现一个“×”号,表明找到了R1的连接点,单击鼠标左键,移动鼠标(不用拖动鼠标),将鼠标的指针靠近D1的下端的连接点时,跟着鼠标的指针就会出现一个“×”号,表明找到了D1的连接点,同时屏幕上出现了粉红 {MOD}的连接,单击鼠标左键,粉红 {MOD}的连接线变成了深绿 {MOD},那么,就完成了本次连线。 Proteus具有线路自动路径功能(简称WAR),当选中两个连接点后,WAR将选择一个合适的路径连线。WAR可通过使用标准工具栏里的“WAR”命令按钮 来关闭或打开,也可以在菜单栏的“Tools”下找到这个图标。 同理,我们可以完成其它连线。在此过程的任何时刻,都可以按ESC键或者单击鼠标的右键来放弃画线。 ⑤元器件与总线连接 单击绘图工具栏中的导线标签按钮 ,使之处于选中状态。将鼠标置于图形编辑窗口的元件的一端,移动鼠标,然后连接到总线上,在接着移动鼠标到元件与总线连接线上的某一点,将会出现一个“×”号,如图所示。 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图1-7  元器件与总线的连接 表明找到了可以标注的导线,单击鼠标左键,弹出编辑导线标签窗口,如图1-8所示。 在“string”栏中,输入标签名称(如P2.7),单击“OK”按钮,结束对该导线的标签标定。同理,可以标注其它导线的标签,完成连线之后如图1-3所示。注意,在标定导线标签的过程中,相互接通的导线必须标注相同的标签名。我们知道,具有相同的标号,电气是连接的,这一点在protel绘制原理图时,体现得尤为明显。 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图1-8  导线标签窗口 至此,我们便完成了整个电路图的绘制。   二.Keil C51 的使用 1. 软件的打开 双击桌面上的Keil uVision2 图标或者单击屏幕左下方的“开始”→“程序”→“Keil uVision2”,出现如图2-1所示界面,随后就进入了Keil uVision2 集成环境。   Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图2-1 启动Keil uVision2时的界面 2. 工作界面 Keil uVision2的工作界面是一种标准的Windows界面,如图2-2所示,包括:标题栏、主菜单、标准工具栏、代码窗口等,如图2-2所示。 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图2-2  工作界面 关于该软件的使用,与学习其他软件的方法没有多大区别,当然我们也不是每个功能都使用,没必要逐一介绍,下面举一个例子说明使用就行了,如果想详细了解,请搜索其详细使用资料。 3. 跑马灯实例程序设计 ①建立一个新工程 单击Project菜单,在弹出的下拉菜单中选中New Project选项,如图2-3所示。 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图2-3  选择建立工程菜单 ②确定之后选择你要保存的路径,输入工程文件的名字,比如保存到“跑马灯”目录里,工程文件的名字为“跑马灯”如下图2-4所示,然后点击保存。 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图2-4  创建工程 ③随后会弹出一个对话框,要求你选择单片机的型号,你可以根据你使用的单片机来选择,KeilC51几乎支持所有的52核的单片机,由于Proteus选用AT89C52原理图,那么选择AT89C52之后,右边栏是对这个单片机的基本的说明,然后点击确定即可,如图2-5所示。 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图2-5  选择单片机的型号 ④)完成上一步骤后,工程到此就已经创建起来了,其屏幕如下图2-6所示。 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图2-6  已创建好的工程 ⑤工程虽然已经创建好,即已经建立好了一个工程来管理跑马灯这样一个项目,但我们还没写一行程序,因此还需要建立相应的C文件或汇编文件。下面我们就来新建一个C文件,新建之后并保存,如图2-7所示。 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图2-7  新建C文件并保存 ⑥添加文件到工程 把刚才新建的led.c添加到工程来,其方法如图2-8所示,添加后的界面如图2-9所示 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图2-8  添加文件到工程菜单 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图2-9  添加完成后的界面 ⑦打开led.c文件,输入C代码,完成之后如图2-10所示 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图2-10  输入源代码 ⑧单击“Project”菜单,再在下拉菜单中单击“ ” 在下图中,单击“Output”中单击“Create HEX File” 选项,使程序编译后产生HEX代码,以便在Proteus里加载可执行代码,并单击“Target”选项,更改晶振频率(本例使用12M晶振),其如图2-11所示。 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图2-11  修改晶振频率 到此,设置工作已完成,下面我们将编译、链接、转换成可执行文件(.HEX的文件)。     ⑨编译、链接、生成可执行文件 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图2-12  编译、链接、生成可执行文件图标 依次单击上述图2-12所示图标,如果没有语法错误,将会生成可执行文件,即本例可执行文件为“跑马灯.hex”。   三. Proteus和Keil的联调 1. 假若Keil C51与Proteus均已正确安装在D:Program Files的目录里,把D:Program FilesLabcenter ElectronicsProteus 7 ProfessionalMODELSVDM51.dll复制到D:Program FileskeilCC51BIN目录中,如果没有“VDM51.dll”文件,那么去网上下载一个。 2. 用记事本打开D:Program FileskeilCC51TOOLS.INI文件,在[C51]栏目下加入: TDRV5=BINVDM51.DLL ("Proteus VSM Monitor-51 Driver") 其中“TDRV5”中的“5”要根据实际情况写,不要和原来的重复即可。 (步骤1和2只需在初次使用设置。) 3. 需要设置KeilC的选项 单击“Project菜单/Options for Target”选项或者点击工具栏的“option for ta rget”按钮 ,弹出窗口,点击“Debug”按钮,出现如图3-1所示页面。 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图3-1  Keil uVision2 选项设置 在出现的对话框里在右栏上部的下拉菜单里选中“Proteus VSM Monitor一51 Driver”。并且还要点击一下“Use”前面表明选中的小圆点。 再点击“Setting”按钮,设置通信接口,在“Host”后面添上“127.0.0.1”,如果使用的不是同一台电脑,则需要在这里添上另一台电脑的IP地址(另一台电脑也应安装Proteus)。在“Port”后面添加“8000”。设置好的情形如图所示,然后点击“OK”按钮。最后将工程编译,进入调试状态,并运行。设置完之后,请重新编译、链接、生成可执行文件。 4.Proteus的设置 进入Proteus的ISIS,鼠标左键点击菜单“Debug”, 选中“use romote debuger monitor”, 如图3-2所示。此后,便可实现KeilC与Proteus连接调试。 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客    图3-2  选项设置 5.Proteus里加载可执行文件        左键双击AT89C52原理图,将弹出如下图3-3,点击加载可执行文件“跑马灯.HEX” Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图3-3  选择加载可执行文件 6、KeilC与Proteus连接仿真调试      单击仿真运行开始按钮 ,我们能清楚地观察到每一个引脚的电频变化,红 {MOD}代表高电频,蓝 {MOD}代表低电频。其运行情况如图3-4所示。 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 Proteus和Keil的使用与联调 - suxy163 - suxy163的博客 图3-4  仿真运行效果   附跑马灯源代码:   #include "reg51.h" int Led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};  //1111,                                                               //11101111,11001111,1000  ------ int   i,j; char Display[]={0x00,0x81,0xc3,0xe7,0xff,0xe7,0xc3,0x81};  //0000,0000  1000,                                                 //0001  1100,0011  1110,0111   1111,1111  ------      //void Led_Display(void); void delay10ms(void) {   unsigned char i,j;   for(i=20;i>0;i--)   for(j=248;j>0;j--); } void delay02s(void) {   unsigned char i;   for(i=20;i>0;i--)     {delay10ms();     } } void main() {  P2=0xff;  while(1)  {    for(j=0;j<6;j++)    {   for(i=0;i<8;i++)   {    P2=Display[i];    delay02s();     }       }       for(j=0;j<3;j++)    {   for(i=0;i<8;i++)   {    P2=Led[i];    delay02s();      }      for(i=0;i<8;i++)   {             P2=Led[7-i];    delay02s();    }      }    }         }