067_人机接口设备—LED类部件
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
4 系统的总体设计
4.1 要实现的功能
LED类部件的功能说起来比较简单,就是从信号输入管脚输入一个或一组信号,将这个或这一组信号直观的用亮灭来表现出来。为了力图仿真的效果,这里加入了响应时间的因素,以达到接近真实的情况。如图1,可以看出LED类部件不是一下就达到正常亮度,也不是一下就完全熄灭的,其亮度是经过了中间无数个状态才达到正常亮度或熄灭的,这样仿真的解决方法是在点亮和熄灭的过程加入几个中间色作为过度,以达到对真实情况的模拟。
4.2 工程的建立
打开Visual C++6.0操作界面,建立工程类型为MFC AppWizard[dll]的对话框文档的新工程,系统自动为用户创建CDLed2DLLApp这个类。创建过程如图2-图4所示(这里以普通单色LED工程的建立为例)。
图2 DLL工程的建立1
图3 DLL工程的建立2
工程建立完成后把VisualexDoc、DComponent和line两个类及他们各自的头文件VisualexDoc.h、DComponent.h和line.h拷贝到DLed2DLL当中,然后在FileView中在Source Files文件夹点击右键选择“Add File to Folder..”一项,将VisualexDoc.cpp、DComponent.cpp和line.cpp填加到文件夹中,并在Header Files文件夹点击右键选择“Add File to Folder..”一项,将VisualexDoc.h、DComponent.h和line.h填加到文件夹中,这样就把以前有的器件基类、VisualexDoc类和Cline类填加到工程中了。 【买计算机毕业论文就到www.think58.com】
本文来自think58 [来源:http://think58.com]
然后再建立一个DLed2类。方法如下:菜单栏中选择“Insert”——>“New Class ...”,就会出现如下的对话框,“Class type”中选择Generic Class 名称为DLed2,然后点击确定就会出现DLed2类和他的的头文件DLed2.h了。 本文来自think58
[来源:http://think58.com]
图4 类的建立
这样工程就已经建立了,用来编写代码以实现LED的功能。
4.3 主要类和函数介绍
4.3.1 主要的类
DComponent类,是器件类的基类,所有器件都是由它派生出来的。
VisualexDoc类,用于实现可视化功能。
line类,用于对电路图中的线进行操作,如在不同器件的管脚间连线等。
Dled2类,从基类中派生的普通单色LED灯的类。
Dled8类,从基类中派生的“8”字灯的类。
4.3.2 主要的函数
ReadInfo(FILE* file,CVisualexDoc* pDoc):
是负责读取保存在文本文档中器件的状态的,例如器件信息(名称,位置,大小,引脚数等),引脚信息(引脚号,位置,名称等)等描述器件状态的。属于器件类的成员函数。
DrawObject(CDC* pDC):
是负责画器件的,就是根据ReadInfo函数所读取的信息,将这些信息具体的在平面图中展示出来,实验时能让人们清晰的看清楚它是什么样子的,每个位置都是什么样子的。
DrawObject(CDC* pDC)函数部分主要代码(以普通单色LED为例)如下:
DrawObject(CDC* pDC):
{
……
if(lc==0)
col=60;
else if(lc==1)
col=200; think58好,好think58
[版权所有:http://think58.com]
CBrush brush2,*oldbrush2;
brush2.CreateSolidBrush(RGB(col,0,0));
oldbrush2 = pDC->SelectObject(&brush2);
pDC->Ellipse(Position.x,Position.y,Position.x+cx, Position.y + cy);
pDC->SelectObject(oldbrush2);
pDC->FillPath();
// delete brush;
pDC->SelectObject(oldFont);
pDC->SelectObject(oldBrush);
……
}
DispMsg(CString s):
负责显示当前状态,在特定的文本框中输出文本信息,显示现在在执行的动作。属于VisualexDoc的成员函数。
OutSig(int iPinNo,int iSigval):
外部通过OutSig给器件某引脚一个信号值,并将引脚号和信号值传给SetPin函数。是器件类的成员函数。
SetPin(int iPinNo,int iSigVal):
根据引脚号和信号值来判断下一步的工作。是器件类的成员函数。
Dled2::JudDet(int iSigVal):
根据参数的信号值与上次显示的信号值是否相等来判断会不会产生响应时间。
Dled8::JudDet(int LedsNum ,int Value):
参数为“8”字灯7个小灯的编号,和该小灯将显示的状态,根据判断该小灯状态是否会变化来判断会不会有响应时间。 think58.com
Dled8::SigProc(int PinVcc):
信号处理函数,首先判断引脚PinVcc是否为高电平,否则返回,是就把4跟数据引脚上的数据转换成要显示的10进制的数,并根据这个数字来判断“8”字灯中各小灯的状态,并调用7次Dled8::JudDet(int LedsNum ,int Value)函数来判断各小灯的是否回有响应时间。
Dled8::SigProc(int PinVcc)函数部分主要代码(以普通单色LED为例)如下:
Dled8::SigProc(int PinVcc):
{
……
for (int i=0;i<4;i++)
{
if (PinLDS[i])
num+=2^i ;
}
……
switch(num)
{
case 0 :
JudDet(0 , 1);
JudDet(1 , 1);
JudDet(2 , 1);
JudDet(3 , 1);
JudDet(4 , 1);
JudDet(5 , 0);
JudDet(6 , 1);
break;
……
case 9 :
JudDet(0 , 1);
JudDet(1 , 0);
JudDet(2 , 1);
JudDet(3 , 1);
JudDet(4 , 1);
JudDet(5 , 1);
JudDet(6 , 1);
break;
default :
num = -1;
msg.Format("错误:请输入正确数值!");
think58.com [资料来源:THINK58.com]
pParent->DispMsg(msg);
}
……
}
OnTimer(CDC *pDC):
由加载DLL文件的应用程序(测试程序)每隔一定时间调用该函数,用来实现延迟过程(中间色的变化)。
OnTimer(CDC *pDC)函数部分主要代码(以普通单色LED为例)如下:
OnTimer(CDC *pDC):
{
……
if(lc == 3 )
{
col += 20;
if(col >= 200)
{
lc -= 2 ;
pParent->DispMsg("点亮延迟结束");
}
DrawObject(pDC) ;
}
else if(lc == 2)
{
col -= 10;
if(col <= 60)
{
lc -= 2 ;
pParent->DispMsg("熄灭延迟结束");
DrawObject(pDC) ;
}
}
……
}
Dled2::Detention(int iSigVal):
响应时间产生函数,当LED状态发生变化后,在很短的时间里,LED的亮度是经过了中间无数个状态才达到正常亮度或熄灭的,根据信号值判断产生了那种响应时间,并通过OnTimer函数来实现中间色的转换。并返回一个状态值(3为点亮延迟,2为熄灭延迟)。