单片机虚拟实验中仿真电路的建立方法
2013-07-12底群
底 群
(西安职业技术学院,西安 710032)
0 引言
在以教学为目的的单片机虚拟实验中仿真电路的建立是仿真软件的核心组成部分。建立仿真电路的主界面对于用户而言,它提供了一个可视的虚拟的单片机实验平台,用户通过这一平台建立仿真的实验电路;当用户仿真运行实验程序时,又将通过这一平台进行相关操作和观察实验现象。对于系统内部,仿真电路对用户建立的电路进行元件的记录,对电路连接情况进行分析,计算元件(包括单片机端口)的状态,通过发送消息与仿真运行子系统交互。最终达到在全软件仿真的环境中让用户完成单片机教学实验,并获得与真实实验条件下相同的实验结果。对于仿真电路的建立通过五个环节进行设计:
1 仿真元件的设计
1.1 元件的选择
元件是电路建立的基础,分析实际教学实验过程,列出实验中用到的电器元件主要有51系列单片机89S51、电阻、电容、发光二极管、三极管、数码管、拨动开关、按钮开关、逻辑门电路(与门、或门、非门)、八D锁存器(74LS373)、译码器(74Ls138)、存储器芯片等。另外将电源、接地、导线、节点也作为元件进行设计。对应各元件设计元件类。
1.2 元件的简化
元件以简化的图形表现,在设计元件时为简化软件的设计,将部分元件以单元模块的形式进行设计,例如对于发光二极管根据单片机I/O口的驱动方式设计两种单元模块,如图1所示。
图1 发光二极管单元模块
这样的设计只考虑单片机I/O口驱动发光二极管时发光二极管的状态即,导通发光或截止熄灭,实质上是以单元模块电路的形式将模拟元件简化为数字逻辑单元。忽略了电路及元件具体的电流电压等模拟特性。这种简化的设计形式可使学生在做仿真实验时将注意力集中在程序的编写和程序的运行过程上,同时,对单片机电路设计中元件常用的连接方法有更加深刻的认识,当然对于为什么这样连接及元件的具体参数,学生可以通过老师的讲解或查阅资料来进一步学习。这样的设计也非常符合实际教学的需求。
类似的单元模块有,复位模块、振荡电路模块、数码管模块、开关模块。
1.3 元件的属性和方法
元件设计时,首先要考虑元件的相关属性,例如:在窗口中的位置、元件的线条及填充颜色、元件管脚断点的坐标、管脚的连接信息和所属的节点号、管脚的状态(高电平或低电平)、元件的名称、元件的状态等。其次,对元件操作时的方法,例如:元件的绘制和对其它属性进行设置等。
1.4 元件类的定义及关系
元件设计时首先设计出CYuanJian类,它继承自CObject类。对于Cline类和CConnectDot类以外的其它元件类都由CYuanJian类继承而来。元件在仿真时会具有一些共同的属性和方法,依据面向对象的设计方法,将这些属性和方法在父类中定义并实现。本软件中的CYuanJian类定义了元件共有的基本属性及方法。
为了让元件对象能方便的以数据文件的形式在存储器中存储和读取,将CYuanJian类的父类定义为VC++ MFC提供的基类CObject类。这样就可使用CObject类的成员函数Serialize()对元件对象进行串行化。
CYuanJian类成员变量的访问特性设为Protected以保护类的数据。成员函数的访问特性设为Public,通过成员函数完成类的操作。子类的继承特性采用Public。由于每个元件的外形均不相同,对元件进行绘制的Draw()函数和元件移动函数Move()定义为虚函数,利用VC++的多态性在子类中实现。同时这使得CYuanJian类成为了抽象类,CYuanJian类仅用来派生子类,不能实例化。
1.5 元件的具体设计
单片机仿真实验软件中元件类的设计方法一致,由于元件类较多这里仅以低电平点亮发光二极管单元模块为例,具体说明它的设计过程。
CLENl类的定义结构如图2所示。
图2 CLENl类的结构
CLENl类在继承CYuanJian类的基础上,添加了自己特有的属性和方法。属性有:二极管的状态m_State、导通时的颜色m_BOColor、可连接的管脚端点坐标m_EndPoint、管脚的电平m_EndPointValue、管脚连接的节点号m_NodeNum。方法有:构造函数LENl()、元件绘制函数Draw()、元件移动函数Move()、元件默认名设置函数SetDefName()、设置及获取导通时颜色函数SetBOColor()和GetBOColor()、设置及获取节点号函数SetNodeNum()、设置管脚值函数SetEPValue()、获取管脚端点坐标函数GetEndPoint()。
对每一个元件或单元模块都根据上述方法建立对应的类。由于篇幅限制不在详细叙述。
2 元件基本操作的设计
在元件类建立完成的基础上,仿真实验电路建立的第一步就是元件的添加、移动、删除、设置元件属性等基本操作。
在单片机虚拟实验中通过菜单中各菜单项及工具栏按钮向用户提供操作类型选择。用户首先选择操作类型(如果用户未选择,系统将操作类型设置为预设的默认值);之后,用户通过键盘和鼠标进行操作,系统获得Windows消息判断出鼠标和键盘事件再结合操作类型以决定程序的执行。
以新添加元件为例,首先,通过菜单或工具栏按钮判断出用户选择了添加元件操作及所需添加元件的类型;其次,用该元件类的构造函数新建立一个对象并将对象存入一个集合类中;再次,设置元件的默认属性(如:根据鼠标当前位置确定元件的坐标);最后,调用元件绘制函数Draw()绘制函数。这样一个虚拟的电子元件就以图形的形式显示在显示器上,用户可以直观的观察并进一步进行移动、删除、设置元件属性等基本操作。
3 元件连接的设计
当用户添加了所需的元件后就需要进行元件的连接,进而建立出用户所希望得到的实验电路。此时,用户需要先选中元件连接菜单或工具栏按钮,系统判断用户的操作,从鼠标单击某元件的管脚端点或连接点开始,并通过单击鼠标左键确定连线的轨迹,最终当鼠标左键单击另一管脚端点或连接点时结束。
系统获取起始点对应元件信息同时创建一个Cline类(导线类)对象并将其存入集合类;在用户进行元件连接的同时系统记录连接信息并参考起始点和终点的连接信息计算更新结点表。结点表记录了用户所建立的实验电路的连接信息,它是进行电路仿真时计算电路状态(包括各个元件状态)的依据。
4 电路初始状态的计算
电路初始状态的计算的主要目的是根据仿真电路中的具体元件和连接信息计算出电路各结点的逻辑电平,进而计算各元件管脚的逻辑电平,最终决定各元件的状态。
在这里将元件管脚分为输入型、输出型和双向型三类,并设置优先度。例如:接地是输出型,优先度最高为10;电源是输出型,优先度为8;开关元件是输出型,优先度为9;单片机的P0、P1、P2、P3为双向型,优先度为7;发光二极管单元模块是输入型,优先度为最低0(不能主动改变结点表)。建立结点表时会将元件管脚的优先度传递给结点,但电路元件状态发生改变更新结点表时,对某一结点的改变要参考优先度决定结点值。
在电路状态计算时设计了一组规则以保证电路计算的正确性。规则较多在此列表列举部分进行说明。
表1.1电路连接及状态说明规则
编号 规则类型 规则说明
1 连接规则 电源和接地不能直接连接。
2 连接规则 仿真电路中只能包含一个CSCM类的实例。
3 连接规则 电源不能和双向型元件管脚直接连接。
4 连接规则 输出型元件管脚不能直接连接。
5 连接规则 同一元件的输入型管脚和输出型管脚不能直接连接。
6 计算规则 0表示低电平、1表示高电平、5表示无信号
7 计算规则 直接连接的电路连线及连接点在电气特性上视为同一结点
8 计算规则 节点表的内容与电路连线及连接点的信息保持一致。
9 计算规则 结点表更新时结点值改变必须遵守新值的优先度>=原优先度
电路初始状态计算时发现仿真电路违反连接规则时停止计算提示用户修改。否则遵循表1.1所列计算规则进行计算。电路初始状态计算的算法如下。
①按照接地→电源→单片机→开关→其它元件的顺序,遍历元件输出型管脚,将与之连接的结点值和优先度进行修改,更新结点表。注:某些元件在初始时输出无法确定将其值设为5表示无信号。
②对结点表中结点值不等于5的结点,修改其连接的元件管脚值。元件会立刻自动计算自身状态改变及输出。
③按照单片机→其它元件的顺序(不包含接地、电源、开关和纯输入型元件),遍历元件输出型管脚,将与之连接的结点值和优先度进行修改,更新结点表。判断结点表是否改变。若节点表发生改变,返回第②步;若结点表未改变,向下执行第④步。
④电路初始状态计算完毕。对仿真电路窗口进行重绘。
通过以上算法经过若干次循环后可计算出电路初始状态,计算的复杂度与电路中元件数量和元件的级联层数有关。在教学过程中的实验其电路都较为简单,元件的数量一般为十几个到几十个,级联层数也不会超过五层,所以该算法是可行的。
5 电路状态跟踪的设计
与现实中的单片机实验一样,在用户进行仿真运行时有两种情况会改变仿真电路的状态,一是:正在运行的用户程序改变了单片机的I/O口。二是:用户通过鼠标操作改变了电路中按钮开关或拨动开关的状态。
在设计时定义两个函数IOchange()和SWchange(),在上述两种情况发生时,分别调用对应函数进行处理。函数采用与电路初始状态计算相似的算法计算当前电路状态。实现实时更新仿真电路状态,使电路状态与程序的执行或用户对电路的操作保持一致。
6 结束语
本文主要阐述单片机虚拟实验电路建立的方法和过程。讨论了仿真元件的设计方法以及使用面向对象方法进行元件类的设计过程,并以CYuanJian类和CLENl类为例说明各元件的定义。其次讨论了电路仿真设计思路,元件相关操作的设计方法,其中关键问题为元件连接信息的获取即结点表的维护和电路状态的计算方法。
[1]邵春波,张涛.单片机虚拟实验平台的设计与实现[J].台州学院学报,2008,(6).
[2]辛允东.虚拟实验和真实实验的比较研究[J].科技教育创新中国科技信息,2008 ,(10).
[3]黄慕雄.高校教学型虚拟实验室建设的现状与建议[J].电化教育研究, 2005,(9).
[4]张学军,马彦芬.EWB仿真在实验教学中的应用[J].河北工程技术高等专科学校学报,2011,(1)
[5]田军营,韩建海,单片机实验的虚拟化改革[J].实验室科学,2008,(6).
[6]JoséM Garrido.Object - oriented discrete- event simulation with Java ∶ a practical introduction [M].Kluwer Academic/ Plenum Publishers , 2001.
[7]M.J.Harrold.Testing∶ A Roadmap In the Future of Software Engineering [J].Anthony Finkelstein (ED.), pp.63-71,ACM Press 2000