Proteus软件是英国Labcenter Electronics公司的一款电路设计与仿真软件,它包括ISIS、ARES等软件模块,ARES模块主要用来完成PCB的设计; ISIS模块用来完成电路原理图的布图和仿真。它可以进行模拟电路仿真、数字电路仿真,也可以进行单片机及其外围电路组成的系统的仿真;软件提供了各种虚拟仪器,如示波器、逻辑分析仪、信号发生器、电压表、电流表等。和其它仿真软件相比,Proteus ISIS最大特色是对单片机系统的仿真,目前支持的单片机类型有: 68000系列、8051系列、ARM系列、AVR系列、PIC系列、Z80系列、HC11系列等。本文主要介绍Proteus软件在单片机方面的仿真功能,即ISIS模块的用法。
在单片机学习开发的过程中,程序的调试是一个很重要的环节,要安装电路进行实验,而且电路在调试过程中往往要进行调整和改变,这不紧增加了费用和难度,而且也影响了学习和开发的进度,这也成了一些初学者学习的障碍。如果使用Proteus 软件就可以大大节省时间和开发费用,可以在软件仿真通过后再制作印刷电路板进行电路实验。
一、Proteus ISIS软件的工作环境和一些基本使用方法
下面通过一个流水灯的实例来说明Proteus的基本使用方法,使用的软件版本是Proteus.Professional 7.1 SP2。
流水灯使用AT89C51单片机,用P2口作输出口。先在Keil uVision编译器中输入下列程序:
#include
void Delay1ms(unsigned int count)//延时子程序
{
unsigned int i,j;
for(i=0;i for(j=0;j<120;j++);
}
main() //主程序
{
unsigned char LEDIndex = 0;
bit LEDDirection = 1;
while(1)
{
if(LEDDirection)
P2 = ~(0x01 else
P2 = ~(0x80>>LEDIndex);
if(LEDIndex==7)
LEDDirection = !LEDDirection;
LEDIndex = (LEDIndex+1)%8;
Delay1ms(200);
}
}
将上述程序编译生成目标文件LED.hex。
然后按下列步骤进行:
1. 运行Proteus 7 Professional(ISIS 7 Professional)
出现如图1所示的界面:
这是一种标准的Windows界面,包括标题栏、主菜单、标准工具栏、绘图工具栏、状态栏、对象选择按钮、预览对象方位控制按钮、仿真进程控制按钮、预览窗口、对象选择器窗口、图形编辑窗口。
2.添加元件到对象选择器元件列表中
单击绘图工具栏中的按钮,再单击对象选择按钮P,出现挑选元件对话框,见图2。按表1添加本例所用的元件。
表1
名称 | 元件 | 种类(Category) | 子种类(Sub-category) |
单片机 | AT89C51 | Microprocessor ICs | 8051 Family |
按钮开关 | BUTTON | Switches & Relays | Switches |
电容器 | CAP | Capacitors | Generic |
电解电容器 | CAP-ELEC | Capacitors | Generic |
电阻器 | RES | Resistors | Generic |
发光二极管 | LED-RED | Optoelectronics | LEDs |
晶振 | CRYSTAL | Miscellaneous | |
如果一开始对种类不熟悉,可直接在对话框的KEYWORDS中输入元件的名称如AT89C51、CAP等,就可以直接找到所需的元件,如图3。
添加好元件的对象选择器元件列表见图4。
3.放置元件
在元件列表中左键选取AT89C51,在原理图编辑窗口中适当的位置单击左键,这样AT89C51就被放到原理图编辑窗口中了,同样放置其它元件。两次右击可以删除放置的元件,右击选中元件后按方向控制按钮可改变元件的方向。右击选中元件后再按住左键可移动元件位置。
4.放置“地”、“电源”
添加“地”:左键选择模型选择工具栏中的 图标,在图5中左键选择
GROUND,并在原理图编辑窗口中左击,这样“地”就被放置到原理图编辑窗口中了。
同样地,选择POWER可放置“电源”。
5.编辑元件的属性
右击选元件后再左击即可编辑元件的属性,也可以右击后在快捷菜单中选择命令Edit Prorerties。如R1的属性窗口如图6。
在对AT89C51的属性进行编辑时要加入仿真文件,在Program File中单击出现文件浏览对话框,找出LED.hex文件,单击确定完成添加文件,单击OK退出。
6.连线
在要连线的一个点左击,移动鼠标到到另一个点再左击即可画好一条连线,按 放置导线连接结点,画好连线的仿真电路图见图7。
AT89C51的VSS、VDD不需要连线,默认VSS=0V、VDD=+5V、GND=0V。
7.仿真
单击仿真进程控制按钮中的开始仿真,我们可看到发光二极管分别按两个方向依次点亮。输出端的小方点红色代表高点平,蓝色代表低电平,灰色代表不确定电平。
在仿真时单片机的晶振电路和复位电路可以省略不画,时钟频率可以在AT89C51的属性中设置,默认值为12MHz。
对于设计好的文件可以保存以便下次调用。
二、单片机仿真实例
上面通过一个简单的例子介绍了Proteus ISIS的基本使用方法,下面再通过笔者设计的几个实例进一步介绍Proteus ISIS的使用方法和技巧,同时也能够使大家看到几个单片机应用的实例。
1.电感测试仪
电感测试仪以电感加上电压后电流增加的规律作为测量依据,因为电感加上电压后电流增加的速度与电感量相关,通过测量电流达到某一预定值所花的时间就能测量出电感的电感量。单片机使用AT89C2051,测量电路如图8所示,A为
AT89C2051内部构造的电压比较器,利用电压比较器测量电感中电流的变化,合上开关后电源电压E+ 加在电感LX和电阻R的串联回路上,这时回路中电流IL由零开始逐渐增加,在电阻R两端电压从0升到0.632E+的过程中,P3.6口输出为0,当电阻R两端电压一旦超过0.632E+后,P3.6口输出电平即变为1。以P3.6口的输出状态为依据,用AT89C2051内部的定时器T0对时间进行计数,再将计数结果显示出来即得出测量结果。量程可分为多档,采用两位半数码管显示,单位为mH。我们只要仿真其中的一档即可,这里取×10档进行仿真,即读数乘以10为实际电感量。
电感测试仪的源程序如下:
#include
unsigned char j,m,n,t,DispBuf[3];
unsigned int L;
unsigned char code
BitTab[3]={0xdf,0xef,0xf7};//位驱动码
unsigned char code
DispTab[11]={0x41,0xcf,0x52,0x46,0xcc,0x64,0x60,0x4f,0x40,0x44,0xff};//字形码
sbit P1_2=P1^2;
sbit P3_6=P3^6;
void Delay1ms(unsigned int count) //延时程序
{
for(n=0;n for(m=0;m<250;m++);
}
void main() //主程序
{ TMOD=0x01;//定时器T0方式1
while(1) //无限循环
{
t=BitTab[j];//取位值
P1=P1|0x38;//P1.3-P1.5送1
P1=P1&t; //P1.3-P1.5输出取出的位值
t=DispBuf[j];//取出待显示的数
t=DispTab[t];//取字形码
P3=t; //字型码由P3输出显示
Delay1ms(5);
j++; //j作为数码管的计数器,取值0-2,显示程序通过它确认显示哪个数码管
if(j==3)
j=0;
TH0=0;
TL0=0;
P1_2=0;//测试开始
TR0=1; //开定时器T0
for(;P3_6==0;);//判断电阻上的电压上升到参考电压否
TR0=0;//电压达到参考电压,关定时器T0
P1_2=1;
L=TL0|(TH0<8);//取定时器T0中的数值
L=L-3;
if(L>=200)
{
DispBuf[2]=10;
DispBuf[1]=10;
DispBuf[0]=1; //超量程,百位数显示1,个位、十位不显示(灭)
}
else //不超量程,取各位数值
{
DispBuf[2]=L;//取个位数
L=L/10;
DispBuf[1]=L;//取十位数
DispBuf[0]=L/10;//取百位数
}
}
}
用Keil uVision将上述程序编译生成目标文件DGZS.hex。
电路中所使用的元件见表2。
表2