Login
升级VIP 登录 注册 安全退出
当前位置: 首页 > word文档 > 其他文档 > Proteus-自建元件库,proteus自建元件库

Proteus-自建元件库,proteus自建元件库

收藏

本作品内容为Proteus-自建元件库,格式为 doc ,大小 576552 KB ,页数为 17页

Proteus-自建元件库


('一、ProteusVSM仿真模型简介在使用Proteus仿真单片机系统的过程中,经常找不到所需的元件,这就需要自己编写。ProteusVSM的一个主要特色是使用基于DLL组件模型的可扩展性。这些模型分为两类:电气模型(ElectricalModel)和绘图模型(GraphicalModel)。电气模型实现元件的电气特性,按规定的时序接收数据和输出数据;绘图模型实现仿真时与用户的交互,例如LCD的显示。一个元件可以只实现电气模型,也可以都实现电气和绘图模型。Proteus为VSM模型提供了一些C++抽象类接口,用户创建元件时需要在DLL中实现相应的抽象类。VSM模型和Proteus系统通信的原理如下图:[url=http://www.dzkf.cn/upimg/allimg/0612/1_05124036.JPG]0&&image.height>0){if(image.width>=510){this.width=510;this.height=image.height510/image.width;}}"border="0">[/url]绘图模型接口抽象类:ICOMPONENT――ISIS内部一个活动组件对象,为VSM模型提供在原理图上绘图和用户交互的服务。IACTIVEMODEL――用户实现的VSM绘图模型要继承此类,并实现相应的绘图和键盘鼠标事件处理。电气模型接口抽象类:IINSTANCE――一个PROSPICE仿真原始模型,为VSM模型提供访问属性、模拟节点和数据引脚的服务,还允许模型通过仿真日志发出警告和错误信息。ISPICECKT(模拟)――SPICE拥有的模拟元件,提供的服务:访问、创建和删除节点,在稀疏矩阵上分配空间,同时还允许模型在给定时刻强制仿真时刻点的发生和挂起仿真。ISPICEMODEL(模拟)――用户实现的VSM模拟元件要继承此类,并实现相应的载入数据,在完成的时间点处理数据等。IDSIMCKT(数字)――DSIM拥有的数字元件,提供的服务:访问数字系统的变量,创建回调函数和挂起仿真。IDSIMMODEL(数字)――用户实现的VSM数字元件要继承此类,并实现相应的引脚状态变化的判断和回调事件的处理。IDSIMPIN(数字)――数字组件的引脚,提供检测引脚状态和创建输出事务事件的服务。IDBUSPIN(数字)――数字组件的数据或地址总线,提供检测总线状态和创建总线输出事务事件的服务。IMIXEDMODEL(混合)――同时继承了ISPICEMODEL和IDSIMMODEL,元件既有模拟特性,又有数字特性。为了让Proteus访问用户模型中的成员函数,必须创建用户模型的一个实例。这不能通过类的接口来实现,只能通过从DLL中导出几个C函数来实现,在用户模型中必须实现这些C函数,达到构造和析构用户模型实例的效果。(1)构造和析构绘图模型实例:IACTIVEMODELcreateactivemodel(CHARdevice,ILICENCESERVERils)VOIDdeleteactivemodel(IACTIVEMODELmodel)(2)构造和析构模拟电气模型实例:ISPICEMODELcreatespicemodel(CHARdevice,ILICENCESERVERils)VOIDdeletespicemodel(ISPICEMODELmodel)(3)构造和析构数字电气模型实例:IDSIMMODELcreatedsimmodel(CHARdevice,ILICENCESERVERils)VOIDdeletedsimmodel(IDSIMMODELmodel)(4)构造和析构混合电气模型实例:IMIXEDMODELcreatemixedmodel(CHARdevice,ILICENCESERVERils)VOIDdeletemixedmodel(IDSIMMODELmodel)二、ProteusVSM仿真模型开发流程1.绘制元件图形、引脚和相关符号。2.制作元件,设置元件属性。3.用C++编写元件,实现电气和绘图模型,编译生成DLL。4.搭建电路仿真测试。三、VSM模型开发实例下面以TG19264A点阵式液晶显示元件的开发为实例详细讲解开发过程。1.打开Proteus,选择菜单查看>>Snap10th,选择左边绘图工具栏的2Dgraphicsbox,绘制如图所示的三个图形。[url=http://www.dzkf.cn/upimg/allimg/0612/1_05133657_lit.JPG]0&&image.height>0){if(image.width>=510){this.width=510;this.height=image.height510/image.width;}}"border="0">[/url]2.选择2Dgraphicsline,给出两条直线,设置width为36th,颜色为灰色。选择2Dgraphicscircle,给四个角绘制安装孔。选择Markersforcomponentorigin,给三个图形分别绘图符号原点(图中红色部分)。[url=http://www.dzkf.cn/upimg/allimg/0612/1_05133821_lit.JPG]0&&image.height>0){if(image.width>=510){this.width=510;this.height=image.height510/image.width;}}"border="0">[/url]3.选择Devicepin,顺时针旋转90度,放置20个引脚,如图所示。GND、VCC、V0、Vee、LED+的电气类型选择PP-PowerPin,D/I、R/W、E、CS1、RET、CS2、CS3的电气类型选择IP-Input,D0~D7的电气类型选择IO-Bidirectional。[url=http://www.dzkf.cn/upimg/allimg/0612/1_05133914_lit.JPG]0&&image.height>0){if(image.width>=510){this.width=510;this.height=image.height510/image.width;}}"border="0">[/url]4.右键拖出选择框选择第一个符号,选择菜单库>>制作符号,命名为LCD19264A_C,确定。同理,第二和第三个分别命名为LCD19264A_1和LCD19264A_0。当用户调用drawsymbol(-1),将绘制LCD19264A_C,调用drawsymbol(1),将绘制LCD19264A_1,调用drawsymbol(0),将绘制LCD19264A_0。[url=http://www.dzkf.cn/upimg/allimg/0612/1_05134000_lit.JPG]0&&image.height>0){if(image.width>=510){this.width=510;this.height=image.height510/image.width;}}"border="0">[/url]5.右键拖出选择框选择符号LCD19264A_C,选择菜单库>>制作元件,DeviceProperties设置如图,[url=http://www.dzkf.cn/upimg/allimg/0612/1_05134213.JPG]0&&image.height>0){if(image.width>=510){this.width=510;this.height=image.height510/image.width;}}"border="0">[/url]点击Next>。跳过封装设置,点击Next>。组件属性设置如图,[url=http://www.dzkf.cn/upimg/allimg/0612/1_05134248.JPG]0&&image.height>0){if(image.width>=510){this.width=510;this.height=image.height510/image.width;}}"border="0">[/url][url=http://www.dzkf.cn/upimg/allimg/0612/1_05134322.JPG]0&&image.height>0){if(image.width>=510){this.width=510;this.height=image.height510/image.width;}}"border="0">[/url]点击Next>。选择数据手册(可选),点击Next>。选择器件库,点击OK。6.打开VC,新建工程,选择Win32Dynamic-LinkLibrary,给工程命名,建立空的DLL工程。从Proteus安装目录的INCLUDE文件夹中将VSM.HPP复制到当前工程目录,新建文件LCD19264A.H和LCD19264A.CPP,编写如下代码。CODE:/文件:LCD19264A.H说明:不支持以下特性(1)不支持显示开关控制(2)不支持设置显示起始行/#include"vsm.hpp"//LCD常量#defineLCD_BLK_NUM3//lcdblocknumber#defineLCD_BLK_LEN64//lcdblocklength#defineLCD_LINE_NUM8//lcdlinenumber#defineLCD_LENGTH(LCD_BLK_LENLCD_BLK_NUM)//lcdlength#defineLCD_WIDTH64//lcdwidth#defineBLANK_WIDTH50//thewidthofblank#defineSYM_LINEWIDTH28//thewidthofsymbolline//LCD命令掩码#defineCMD_MASK0xc0//LCD命令#defineDISP_ONOFF0x00//开关背光#defineSET_STARTLINE0xc0//设置起始行#defineSET_XADDRESS0x80//设置X地址#defineSET_YADDRESS0x40//设置Y地址//延时常量#defineDELAY_1s1000000000000#defineDELAY_1ms1000000000#defineDELAY_1us1000000#defineDELAY_1ns1000#defineDELAY_1ps1/LCD元件既有数字电气特性,也有绘图特性,所以要继承IACTIVEMODEL和IDSIMMODELclassLCD19264A:publicIACTIVEMODEL,publicIDSIMMODEL{public:/电气模型成员函数//数字电路总是返回TRUEINTisdigital(CHARpinname);//当创建模型实例时被调用,做初始化工作VOIDsetup(IINSTANCEinst,IDSIMCKTdsim);//仿真运行模式控制,交互仿真中每帧开始时被调用VOIDrunctrl(RUNMODESmode);//交互仿真时用户改变按键等的状态时被调用VOIDactuate(REALTIMEtime,ACTIVESTATEnewstate);//交互仿真时每帧结束时被调用,通过传递ACTIVEDATA数据与绘图模型通信,从而调用animate()进行绘图BOOLindicate(REALTIMEtime,ACTIVEDATAdata);//当引脚状态变化时被调用,主要用来处理数据输入和输出VOIDsimulate(ABSTIMEtime,DSIMMODESmode);//可通过setcallback()设置在给定时间调用的回调函数VOIDcallback(ABSTIMEtime,EVENTIDeventid);/绘图模型成员函数//当创建模型实例时被调用,做初始化工作VOIDinitialize(ICOMPONENTcpt);//被PROSPICE调用,返回模拟电气模型ISPICEMODELgetspicemodel(CHARdevice);//被PROSPICE调用,返回数字电气模型IDSIMMODELgetdsimmodel(CHARdevice);//当原理图需要重绘时被调用VOIDplot(ACTIVESTATEstate);//当相应的电气模型产生活动事件时被调用,常用来更新图形VOIDanimate(INTelement,ACTIVEDATAnewstate);//用来处理键盘和鼠标事件BOOLactuate(WORDkey,INTx,INTy,DWORDflags);private:IINSTANCEinstance;//PROSPICE仿真原始模型IDSIMCKTckt;//DSIM的数字元件ICOMPONENTcomponent;//ISIS内部一个活动组件对象//引脚定义IDSIMPINdi;//D/IIDSIMPINrw;//R/WIDSIMPINen;//EIDSIMPINcs1;//CS1IDSIMPINcs2;//CS2IDSIMPINcs3;//CS3IDSIMPINd[8];//D0~D7IBUSPINdatabus;//D[0..7]//LCD参数BYTEx_addr;//X地址(见手册)BYTEy_addr;//Y地址(见手册)BYTEstatus;//状态(见手册)BYTEcur_blk;//当前块号(总共分3块,见手册)BYTEDDRAM[LCD_BLK_NUM][LCD_BLK_LENLCD_WIDTH/8];//LCD显示RAMBOOLnew_flag;//新数据到达标志//显示参数BOXlcdarea;//LCD显示区域floatpix_width,pix_height;//每象素对应矩形的宽和高};CODE:/文件:LCD19264A.CPP说明:不支持以下特性(1)不支持显示开关控制(2)不支持设置显示起始行/#include#include"LCD19264A.h"//----------------------------------------------------------------------------//电气模型的实现//构造数字电气模型实例extern"C"IDSIMMODEL__declspec(dllexport)createdsimmodel(CHARdevice,ILICENCESERVERils){//授权认证ils->authorize(0x88888888,0x69);//版本为6.9returnnewLCD19264A;//创建模型实例}//析构数字电气模型实例extern"C"VOID__declspec(dllexport)deletedsimmodel(IDSIMMODELmodel){delete(LCD19264A)model;//删除模型实例}//数字电路总是返回TRUEINTLCD19264A::isdigital(CHARpinname){return1;}//当创建模型实例时被调用,做初始化工作VOIDLCD19264A::setup(IINSTANCEinst,IDSIMCKTdsim){instance=inst;//PROSPICE仿真原始模型ckt=dsim;//DSIM的数字元件//获取引脚di=instance->getdsimpin("D/I,d/i",true);di->setstate(FLT);//FLOATrw=instance->getdsimpin("R/W,r/w",true);rw->setstate(FLT);en=instance->getdsimpin("E,e",true);en->setstate(FLT);cs1=instance->getdsimpin("CS1,cs1",true);cs1->setstate(FLT);cs2=instance->getdsimpin("CS2,cs2",true);cs2->setstate(FLT);cs3=instance->getdsimpin("CS3,cs3",true);cs3->setstate(FLT);d[0]=instance->getdsimpin("D0,d0",true);d[0]->setstate(FLT);d[1]=instance->getdsimpin("D1,d1",true);d[1]->setstate(FLT);d[2]=instance->getdsimpin("D2,d2",true);d[2]->setstate(FLT);d[3]=instance->getdsimpin("D3,d3",true);d[3]->setstate(FLT);d[4]=instance->getdsimpin("D4,d4",true);d[4]->setstate(FLT);d[5]=instance->getdsimpin("D5,d5",true);d[5]->setstate(FLT);d[6]=instance->getdsimpin("D6,d6",true);d[6]->setstate(FLT);d[7]=instance->getdsimpin("D7,d7",true);d[7]->setstate(FLT);//为方便操作,将D0~D7映射为8位总线databus=instance->getbuspin("LCD_DBUS",d,8);databus->settiming(100,100,100);//设置时间延迟databus->setstates(SHI,SLO,FLT);//设置总线逻辑为[1,0,三态]时的驱动状态//lcdmodelx_addr=0;//X地址(见手册)y_addr=0;//Y地址(见手册)status=0;//状态(见手册)new_flag=TRUE;//新数据到达标志}//仿真运行模式控制,交互仿真中每帧开始时被调用VOIDLCD19264A::runctrl(RUNMODESmode){}//交互仿真时用户改变按键等的状态时被调用VOIDLCD19264A::actuate(REALTIMEtime,ACTIVESTATEnewstate){}//交互仿真时每帧结束时被调用,通过传递ACTIVEDATA数据与绘图模型通信,从而调用animate()进行绘图BOOLLCD19264A::indicate(REALTIMEtime,ACTIVEDATAdata){if(new_flag){//有新数据到达data->type=ADT_REAL;//callbackanimate()torefreshlcddata->realval=(float)timeDSIMTICK;}returnTRUE;}//当引脚状态变化时被调用,主要用来处理数据输入和输出VOIDLCD19264A::simulate(ABSTIMEtime,DSIMMODESmode){BYTEdata;if(en->isnegedge()){//E的下降沿到达if((rw->istate()==SLO)(rw->istate()==WLO)){//R/W为低表示写//读块选择if((cs1->istate()==SLO)(cs1->istate()==WLO))cur_blk=0;elseif((cs2->istate()==SLO)(cs2->istate()==WLO))cur_blk=1;elseif((cs3->istate()==SLO)(cs3->istate()==WLO))cur_blk=2;elsereturn;//notselectblockdata=(BYTE)databus->getbusvalue();//读数据if((di->istate()==SHI)(di->istate()==WHI)){//D/I为高表示数据DDRAM[cur_blk][x_addrLCD_BLK_LEN+y_addr]=data;//写入数据new_flag=TRUE;//新数据到达标志y_addr=((y_addr+1)%LCD_BLK_LEN);//y地址自动加1if(y_addr==0)x_addr=((x_addr+1)%LCD_LINE_NUM);//自动换行}else{//D/I为低表示命令switch(data&CMD_MASK){caseDISP_ONOFF://开关背光break;caseSET_STARTLINE://设置起始行break;caseSET_XADDRESS://设置X地址x_addr=(data&0x07);//bit2~bit0break;caseSET_YADDRESS://设置Y地址y_addr=(data&0x3f);//bit5~bit0break;default:break;}}}else{//E的下降沿到达,R/W为高表示读结束databus->drivetristate(time);//驱动总线为三态}}elseif(en->isposedge()//E的上升沿到达&&((rw->istate()==SHI)(rw->istate()==WHI))){//R/W为高表示读if((di->istate()==SHI)(di->istate()==WHI)){//D/I为高表示数据//读块选择if((cs1->istate()==SLO)(cs1->istate()==WLO))cur_blk=0;elseif((cs2->istate()==SLO)(cs2->istate()==WLO))cur_blk=1;elseif((cs3->istate()==SLO)(cs3->istate()==WLO))cur_blk=2;elsereturn;//notselectblockdata=DDRAM[cur_blk][x_addrLCD_BLK_LEN+y_addr];databus->drivebusvalue(time,data);//输出数据y_addr=((y_addr+1)%LCD_BLK_LEN);//y地址自动加1if(y_addr==0)x_addr=((x_addr+1)%LCD_LINE_NUM);//自动换行}else{//D/I为低表示命令databus->drivebusvalue(time,status);//输出状态}}}//可通过setcallback()设置在给定时间调用的回调函数VOIDLCD19264A::callback(ABSTIMEtime,EVENTIDeventid){}//----------------------------------------------------------------------------//绘图模型的实现//Exportedconstructorforactivecomponentmodels.extern"C"IACTIVEMODEL__declspec(dllexport)createactivemodel(CHARdevice,ILICENCESERVERils){ils->authorize(0x88888888,0x69);//6.9returnnewLCD19264A;}//Exporteddestructorforactivecomponentmodels.extern"C"VOID__declspec(dllexport)deleteactivemodel(IACTIVEMODELmodel){delete(LCD19264A)model;}//当创建模型实例时被调用,做初始化工作VOIDLCD19264A::initialize(ICOMPONENTcpt){//获取ICOMPONENT接口和初始化component=cpt;component->setpenwidth(0);component->setpencolour(BLACK);component->setbrushcolour(BLACK);//获取显示区域component->getsymbolarea(0,&lcdarea);//计算每象素对应矩形的宽和高pix_width=(float)(lcdarea.x2-lcdarea.x1-BLANK_WIDTH2-SYM_LINEWIDTH2)/LCD_LENGTH;pix_height=(float)(lcdarea.y2-lcdarea.y1-BLANK_WIDTH2-SYM_LINEWIDTH2)/LCD_WIDTH;}//被PROSPICE调用,返回模拟电气模型ISPICEMODELLCD19264A::getspicemodel(CHAR){returnNULL;}//被PROSPICE调用,返回数字电气模型IDSIMMODELLCD19264A::getdsimmodel(CHAR){returnthis;}//当原理图需要重绘时被调用VOIDLCD19264A::plot(ACTIVESTATEstate){//绘制LCD19264A_C元件基本图形component->drawsymbol(-1);//刷新LCD数据显示new_flag=TRUE;animate(0,NULL);}//当相应的电气模型产生活动事件时被调用,常用来更新图形VOIDLCD19264A::animate(INTelement,ACTIVEDATAdata){BOXpix;BYTEdat,block,line,byte_off,bit_off;if(new_flag){//当有新数据到达new_flag=FALSE;component->begincache(lcdarea);//打开缓冲component->drawsymbol(1);//显示LCD19264_1符号//显示各点数据for(block=0;blockdrawbox(pix);//绘制1个象素点}}}}}component->endcache();//结束缓冲,显示数据}}//用来处理键盘和鼠标事件BOOLLCD19264A::actuate(WORDkey,INTx,INTy,DWORDflags){returnFALSE;}7.搭建电路如下电路,新建KeilC工程,编写代码测试元件。如下图:',)


  • 编号:1700743945
  • 分类:其他文档
  • 软件: wps,office word
  • 大小:17页
  • 格式:docx
  • 风格:商务
  • PPT页数:576552 KB
  • 标签:

广告位推荐

相关其他文档更多>