华科大 微机接口课设 报告 源码.docx
- 文档编号:17621672
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:23
- 大小:175.22KB
华科大 微机接口课设 报告 源码.docx
《华科大 微机接口课设 报告 源码.docx》由会员分享,可在线阅读,更多相关《华科大 微机接口课设 报告 源码.docx(23页珍藏版)》请在冰点文库上搜索。
华科大微机接口课设报告源码
《微机接口技术》课程设计报告
设计题:
光控路灯系统
--硬件设计
指导老师:
王桦
学生姓名:
xxx
学生学号:
U2009xxx
所在班级:
计算机0904班
同组成员:
xx
xx
xx
设计时间:
2012.10.29至2012.11.04
目录
一、设计目的3
二、设计要求3
三、设计内容3
四、设计过程3
五、系统调试3
六、设计心得与体会3
七、附录3
八、参考文献3
一、设计目的
设计一个光控路灯模拟系统:
A/D采集数据代表光度,超过170代表天亮,则自动关灯。
低于170,代表天黑。
灯自动开并保持亮
基本要求:
1.用实验台上的A/D模拟光线信号。
2.用实验台上的LED模拟灯泡。
3.用实验台上DIP开关控制路灯线路。
4.上位机图形化监控。
二、设计要求
结合一个实际的接口技术问题,在实验台上模拟实现相应的应用系统。
由一个主控机(上位机)和若干个被控终端设备(下位机)组成,上位机与下位机利用串行通讯接口进行连接,构成一个完整系统。
主控机负责终端设备的运行、状态和数据处理,终端设备负责驱动执行元件/部件。
设计一个模拟的微机应用系统。
要求该系统综合应用实验台上的多种资源(并行接口、串行接口及其它接口和传感器)设计满足选题要求的符合实际应用的硬件系统,编制主控程序;执行元件驱动程序;通信程序等相应的软件,实现主控中心微机与终端机的远距离传送以及远程控制或监测功能。
1)主控机:
在屏幕上用数字、图形、表格、曲线等方式直观地显示数据/状态处理的结果和过程。
2)终端机:
用实验台的声光部件描述当前监控/操作的工作状态,按主控机的命令驱动执行元件并返回状态和结果。
三、设计内容
系统总体结构图如图2.1.
1)系统硬件由主控机(其中一台微机)、终端机(另一台位微机)和执行部件组成。
主控机与终端机通过串行通信线连接。
2)执行部件:
由接口电路等组成,将接收的数据送入到终端机或将终端机输出的数据送到执行部件。
图2.1
3)主控机:
与所有终端机进行数据交换,必要时需建数据库,进行数据处理等。
4)终端机:
与主控机通信,控制执行部件。
5)主控机程序:
串行(RS232)通信程序,数据处理程序等。
6)终端机程序:
串行(RS232)通信程序,执行部件控制程序。
本次课设我负责下位机的主程序部分。
图3.1
首先需要与界面设计负责组员协商显示界面,然后对界面上的控件做一些初始化,显示最原始的内容。
如图3.1:
可以看到,界面上的控件不少,当然,界面上的控件我不尽然会用,就需要查找相关资料,这一方面,同组成员负责连线与查阅资料这一部分的起了十分重要的作用。
我的程序需要从作为执行部件的试验台上获取亮度信息,然后发送给上位机,上位机程序处理之后,给下位机返回一个灯亮或不亮的信号,我的程序根据这个信号来决定灯亮或者灭。
无论是上位机程序还是下位机程序,都需要设计一个循环来响应不断变化的数据,根据程序设计的原理,我们知道,主程序的死循环是不允许的,那么就需要用到子程来分担,子线程在主线程结束后自动结束。
四、设计过程
1.设计前的准备工作:
1)根据要求自己拟定具体设计题
2)熟悉实验台上接口电路、复习《接口课程》上有关的接口原理
3)确定设计方案,明确设计目的,要求和内容
4)落实小组分工,明确任务与责任
2.总体方案设计
1)系统功能设计
下位机执行部件(实验台)上通过电位器获取模拟量输出到ADC0809模数转换器中,下位机程序读取模数转换器中的内容作为亮度大小,通过串口通信芯片8251传送至上位机串口通信芯片8251,上位机从芯片中读取由下位机传送过来的数据,与亮度边界值(本题目设定为170)进行比较,并将比较之后的结果通过下位机执行部件上的8251发送到下位机执行部件,下位机程序从中读出数据并给8255芯片写入数据,控制灯亮与灯灭。
本次设计,我们加入了其他的一些特征量,来美化设计:
(1).状态显示(白天或者黑夜)
(2).持续时间显示(只要没有超过亮度边界,则累计时间,一旦状态改变(例如黑夜变成白天),则清零从新计时)
(3).亮度强度图形显示(用进度条显示,设置其范围为0—255,可以直观的看到亮度的变化程度)
(4).亮度强度数值显示(对应图形显示,更加具体)
(5).黑夜白天交更次数显示(每次从黑夜变白天,关灯次数统计加一,白天变黑夜,开灯次数统计加一)
2)系统总体设计
系统总功能图:
(图3.2)
图3.2
3)接口电路框图设计(图3.3)。
图3.3(虚线表示内部电源互联)
下位机程序总流程图:
(图3.4)
图3.4
3.程序设计
1)功能模块划分
分为上位机与下位机
都含有:
(1).界面设计与初始化模块
使用VC++6.0的MFC框架,根据需要拖动空间到主对话框中,在程序的OnInitDialog()函数中初始化控件信息(见图3.1)
(2).消息循环模块(接收数据,处理数据)
采用多线程机制,消息循环在一个子线程中进行,这样,主对话框上面的控件才可操作,在关闭主对话框后子线程也关闭.
图3.5
(3).消息响应模块(在界面上相应空间显示数据)
因为子线程函数并非窗口类的成员,所以不能操作主对话框的控件,采用消息回传机制就可以操作界面控件,显示相关信息了.
图3.6
2)按功能模块编写程序并调试
4.系统总调试(在实验台上进行)
1)程序连接与调试。
2)软/硬件联调、修改、完善。
五、系统调试
首先按照接口电路框图连接好导线线,打开开关,系统自动安装USB驱动,驱动装好之后,编译程序.旋转电位器旋钮,同时看到上位机与下位机界面显示相似的内容(因为界面设计风格与编程者爱好相关,所以不尽相同).
黑夜灯亮状态(图3.7):
白天黑夜交界状态(图3.8,图3.9):
白天灯灭状态(图3.10):
图3.7
图3.8
图3.9
图3.10
六、设计心得与体会
本次实验加深了我对微机接口知识的理解,实际的操作中遇到了一些问题,但是最后在大家的共同努力下都圆满解决了,所以说,在学习的过程中不仅收获了知识,更收获了快乐。
整个设计过程花了3天时间,实现花了一天时间,从这个时间比例也可以看到,设计相比于实现更为困难。
主要原因在于设计需要理清思路,设计框架等一系列的问题,当所有的那些疑惑解除之后,其实实现也就非常简单了。
“万事开头难”差不多也是这个道理。
以后不管做什么事情,都可以以此为借鉴,只要准备工作做得充分了,后面的就水到渠成了。
七、附录
源代码:
//KGMain_ctrlDlg.cpp:
implementationfile
//
#include"stdafx.h"
#include"KGMain_ctrl.h"
#include"KGMain_ctrlDlg.h"
#include"time.h"
#include"C:
\\VC实验程序\\ApiEx.h"
#pragmacomment(lib,"C:
\\VC实验程序\\ApiEx.lib")
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
CStringcstrLigBarry("170");
BYTEdataNew,dataOld,dayTimes=0,nigTimes=0;
time_ttimeNow=0,timeOld=0;
CStringlight_str;
typedefstruct{
BYTEflag;
BYTEdata;
}dataStr;
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CKGMain_ctrlDlgdialog
CKGMain_ctrlDlg:
:
CKGMain_ctrlDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CKGMain_ctrlDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CKGMain_ctrlDlg)
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCKGMain_ctrlDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CKGMain_ctrlDlg)
DDX_Control(pDX,ID_STAYTIME,m_staytime);
DDX_Control(pDX,ID_STATE,m_state);
DDX_Control(pDX,ID_NIGTIMES,m_nigTimes);
DDX_Control(pDX,ID_DAYTIMES,m_dayTimes);
DDX_Control(pDX,ID_CLIGHT,m_clight);
DDX_Control(pDX,ID_LIGHTPLAY,m_ligPlay);
DDX_Control(pDX,ID_LIGBARRY,m_ligBarry);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CKGMain_ctrlDlg,CDialog)
//{{AFX_MSG_MAP(CKGMain_ctrlDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_START,OnStart)
ON_MESSAGE(USER_THREAD_MSG,ThreadMsgBack)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CKGMain_ctrlDlgmessagehandlers
BOOLCKGMain_ctrlDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//TODO:
Addextrainitializationhere
m_ligBarry.SetWindowText(cstrLigBarry);
m_clight.SetWindowText("0");
m_dayTimes.SetWindowText("0");
m_nigTimes.SetWindowText("0");
m_staytime.SetWindowText("0");
m_state.SetWindowText("无");
m_ligPlay.SetRange(0,255);
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCKGMain_ctrlDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
voidCKGMain_ctrlDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog:
:
OnPaint();
}
}
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCKGMain_ctrlDlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
voidCKGMain_ctrlDlg:
:
OnStart()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
GetDlgItem(IDC_START)->EnableWindow(false);
CWinThread*pThread;
pThread=AfxBeginThread(OnThread,this,THREAD_PRIORITY_NORMAL,0,0,NULL);
pThread->m_bAutoDelete=false;
}
UINTCKGMain_ctrlDlg:
:
OnThread(LPVOIDlpParam){
CKGMain_ctrlDlg*pHwnd=(CKGMain_ctrlDlg*)lpParam;
BYTEflag;
dataStr*pDataType=(dataStr*)malloc(sizeof(dataStr));
if(!
Startup())
{
printf("ERROR:
OpenDeviceError!
\n");
return1;
}
PortWriteByte(0x28b,0x89);//设置8255控制字10001001;A口方式0输出,C口输入,B口方式0输出,
PortWriteByte(0x283,0x16);//0号计数器第八位计数,工作方式3,二进制编码
Sleep(100);
PortWriteByte(0x280,52);//初始化计数器0的计数初值
Sleep(100);
for(inti=0;i<3;i++)
{
PortWriteByte(0x2b9,0);//向8251A控制端口送3个0
Sleep(100);
}
PortWriteByte(0x2b9,0x40);//向8251控制端口送40H,使其复位
Sleep(100);
PortWriteByte(0x2b9,0x4e);//设置为1个停止位,8个数据位,波特率因子为16
Sleep(100);
PortWriteByte(0x2b9,0x27);//向8251送控制字允许其发送和接收
Sleep(100);
for(;;)
{
do{
//PortReadByte(0x28a,&dataNew);//从8255C口读入数据
PortWriteByte(0x298,0x00);
Sleep(100);
PortReadByte(0x298,&dataNew);
}while(!
dataNew);
//CStringstr;
//str.Format("%d",(int)data);
//AfxMessageBox(str);
pDataType->flag=0;
pDataType->data=dataNew;
:
:
PostMessage(pHwnd->m_hWnd,USER_THREAD_MSG,WPARAM(pDataType),NULL);
do{
PortReadByte(0x2b9,&flag);
}while(!
(flag&0x01));//发送准备好
PortWriteByte(0x2b8,dataNew);
do{
PortReadByte(0x2b9,&flag);
}while(!
(flag&0x02));//接收准备好
PortReadByte(0x2b8,&dataNew);
PortWriteByte(0x288,!
dataNew);
time(&timeNow);
if((dayTimes+nigTimes)==0){
dataOld=dataNew;
timeOld=timeNow;
if(dataNew)
{
dayTimes++;
pDataType->flag=1;
pDataType->data=dayTimes;
}
else{
nigTimes++;
pDataType->flag=2;
pDataType->data=nigTimes;
}
}
elseif(dataNew!
=dataOld){
timeOld=timeNow;
if(dataNew)
{
dayTimes++;
pDataType->flag=1;
pDataType->data=dayTimes;
}
else{
nigTimes++;
pDataType->flag=2;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华科大 微机接口 课设 报告 源码 微机 接口