华中科技大学微机接口课程设计实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《微机接口技术》课程设计报告
设计题:人工降雨系统
指导老师:谭支鹏、熊自立、陈永平
设计时间:2013.10.28 至2013.11.1
人工降雨系统设计
一、课程设计目的
1、掌握接口硬件开发平台的使用方法,利用现有的实验平台和PC机,组成一个微机模拟应用系统。
2、掌握基本接口电路的综合应用。
3、掌握接口电路的驱动程序和界面软件的设计与编制,学会调试与测试接口软件的一般方法。
4、微机接口技术及接口芯片的综合应用。
5、在干旱了一段时间后,进行人工降雨。
不同的季节,大自然不降雨对生活生产的影响不同,要控制好等待多久才进行人工降雨,以及降雨的量。
二、课程设计要求
设计一个模拟的微机应用系统。
要求该系统综合应用实验台上的多种资源(并行接口、串行接口及其它接口和传感器)设计满足选题要求的符合实际应用的硬件系统,编制主控程序;执行元件驱动程序;通信程序等相应的软件,实现主控中心微机与终端机的远距离传送以及远程控制或监测功能。
由一个主控机(上位机)和若干个下位机组成,上位机与下位机利用串行通讯接口进行连接,构成一个完整系统。
主控机负责数据处理,下位机负责接口访问,接口所需的芯片功能需要通过FPGA自己设计实现。
基于FPGA设计的芯片功能可以是一个完整的功能芯片,也可以只是你在应用需要的芯片某项功能即可。
验收的时候会根据实现的情况作出评价。
(1)主控机:在屏幕上用数字、图形、表格、曲线等方式直观地显示数据/状态处理的结果和过程。
(2)下位机:用实验台的声光部件描述当前监控/操作的工作状态,按主控机的命令驱动执行元件并返回状态和结果。
题目要求:
1.用实验台上的信号电源模拟湿度计的信号电压。
2.用实验台上的LED和扬声器模拟加湿动作及报警信号。
3.用实验台上的步进电机模拟水泵动作。
4.上位机实现图形监控。
(模拟)
三、课程设计内容及过程
1.系统总体结构图
1) 系统硬件由主控机(其中一台微机)、终端机(另一台位微机)和执行部件组成。
主控机与终端机通过串行通信线连接。
2) 执行部件:由接口电路等组成,将接收的数据送入到终端机或将终端机输出的数据送到执行部件。
3) 主控机:与所有终端机进行数据交换,必要时需建数据库,进行数据处理等。
4) 下位机:与主控机通信,控制执行部件。
5) 主控机程序:串行(RS232)通信程序,数据处理程序等。
6) 下位机程序:串行(RS232)通信程序,执行部件控制程序。
2.上位机与下位机原理介绍
下位机原理介绍:
下位机通过电阻调节得到当前降雨量,并将该数据传送至上位机。
下位机接受上位机传送来的应该降雨的天数,决定是否执行人工降雨。
LED 灯显示剩余的降雨天数,电动机显示是否在执行人工降雨。
上位机原理介绍:
上位机主要作用是决定人工降雨的天数。
它通过接受下位机反馈的当前降雨量,结合降雨天数算法,确定实际应该降雨的天数,并将主控机
下位机1 下位机n 下位机2 执行部件1 执行部件n 执行部件2
该结果传送至下位机。
3.人工降雨算法
累计降雨量降雨天数
>40% 0
40%~35% 1
35%~30% 2
30%~25% 3
25%~20% 4
20%~15% 5
15%~10% 6
10%~5% 7
5%~0% 8
4.总体设计图
上位机
8251串口通讯8253频率发生器
8251串口通讯8253频率发生器
我完成的部分即总体设计,并分模块将功能实现,以及调试
FPGA 部分的设计由组长完成,使用PFGA 代替8255芯片。
5.引脚连线
上位机连线: 8251控制:
8253_CS —— 280~287H
CLK0 —— 1MHZ
OUT0 —— TXCLK
OUT0 —— RXCLK
GATE0 —— +5V
8251CS —— 2B8~2BFH
INCLK —— 1MHZ
TXD8251 —— 下位机RXD8251
RXD8251 —— 下位机TXD8251
下位机连线:
8251控制:
8253_CS —— 280~287H
CLK0 —— 1MHZ
OUT0 —— TXCLK
OUT0 —— RXCLK
GATE0 —— +5V 下位机
0809数模转换 电阻 0832
8255 电动机
LED
8251CS ——2B8~2BFH
INCLK ——1MHZ
TXD8251 ——上位机RXD8251
RXD8251 ——上位机TXD8251 直流电机:
0832_CS ——290~297H
UB ——DCIN
电位器:
0809_CS ——298~29FH
IN0 ——SW1
LED灯:
8255_CS ——288~28FH
PA0~PA7 ——L0~L7
6.图形界面
上位机界面:
下位机界面:
四、主要分工
孙聆彬(组长):FPGA部分的设计以及连线
冯朋:MFC界面与代码链接、上位机完成
邹若兰:MFC界面设计、下位机完成
王捷玲:系统整体设计、方案规划、连线
五、系统调试
第一天:了解课程设计要求,选题,并搜集资料
第二天:系统整体功能设计,设备检查
第三天:MFC界面设计,上位机下位机设计
第四天:整体功能调试
第五天:检查验收
六、设计心得与体会
通过本次课程设计,掌握了接口硬件开发平台的使用方法。
掌握了基本接口电路的综合应
用。
掌握了接口电路的驱动程序和界面软件的设计与编制,学会了调试与测试接口软件的一般方法,微机接口技术及接口芯片的综合应用。
但是实验进行的并不顺利,虽然我们很早就把整体设计完成,并且完成了不使用FPGA
的设计,后来加入FPGA后实验就总是出现各种问题,过程中我们的8251芯片烧坏了好几个,所以又要找出解决方案,直到最后我们多跟同学交流,多尝试不同的方法才把问题解决。
实验的软件设计部分较为容易,因为电动机的转动实现、LED灯、串口通讯等都有实例代码,我们只需要将它修改嵌入到整体代码中即可,而较为核心的部分:降雨天数的算法也很容易实现。
七、附源程序代码
上位机:
3DLG.H
// 3Dlg.h : header file
//
#if !defined(AFX_3DLG_H__83A8EF20_2E24_4240_9700_0AEEF48707E0__INCLUDED_)
#define AFX_3DLG_H__83A8EF20_2E24_4240_9700_0AEEF48707E0__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/////////////////////////////////////////////////////////////////////////////
// CMy3Dlg dialog
class CMy3Dlg : public CDialog
{
// Construction
public:
CMy3Dlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DA TA(CMy3Dlg)
enum { IDD = IDD_MY3_DIALOG };
// NOTE: the ClassWizard will add data members here
//}}AFX_DA TA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMy3Dlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CMy3Dlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnTimer(UINT nIDEvent);
virtual void OnOK();
virtual void OnCancel();
afx_msg void OnButton();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCA TION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_3DLG_H__83A8EF20_2E24_4240_9700_0AEEF48707E0__INCLUDED_) 3DLG.CPP
// 3Dlg.cpp : implementation file
//
#include "stdafx.h"
#include "3.h"
#include "3Dlg.h"
#include <conio.h>
#include "..\\ApiEx.h"
#pragma comment(lib,"..\\ApiEx.lib")
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
int dayCount=0;
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DA TA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DA TA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DA TA_INIT(CAboutDlg)
//}}AFX_DA TA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DA TA_MAP(CAboutDlg)
//}}AFX_DA TA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMy3Dlg dialog
CMy3Dlg::CMy3Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CMy3Dlg::IDD, pParent)
{
//{{AFX_DA TA_INIT(CMy3Dlg)
// NOTE: the ClassWizard will add member initialization here //}}AFX_DA TA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMy3Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DA TA_MAP(CMy3Dlg)
// NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DA TA_MAP
}
BEGIN_MESSAGE_MAP(CMy3Dlg, CDialog)
//{{AFX_MSG_MAP(CMy3Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON, OnButton)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMy3Dlg message handlers
BOOL CMy3Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARA TOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
CProgressCtrl *pProgCtrl=(CProgressCtrl*)GetDlgItem(IDC_PROG);
CProgressCtrl *pProgCtrl0=(CProgressCtrl*)GetDlgItem(IDC_PROG0);
pProgCtrl->SetRange(0,100);//设置进度条范围
pProgCtrl0->SetRange(0,8);
//SetTimer(1,1000,NULL);//设置进度条更新时钟
//SetTimer(2,50,NULL);//发送数据时钟
return TRUE; // return TRUE unless you set the focus to a control
}
void CMy3Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CMy3Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CMy3Dlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CMy3Dlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CString a,b;
CProgressCtrl *pProgCtrl=(CProgressCtrl*)GetDlgItem(IDC_PROG);
CProgressCtrl *pProgCtrl0=(CProgressCtrl*)GetDlgItem(IDC_PROG0);
byte data;
int i,receivedData;
switch(nIDEvent)
{
case 1:
//初始化
if(!Startup())
{
return;
}
//读取下位机传来的数据
PortWriteByte(0x283,0x16);
PortWriteByte(0x280,52);
for(i=0;i<3;i++)
{
PortWriteByte(0x2b9,0);
}
PortWriteByte(0x2b9,0x40);
PortWriteByte(0x2b9,0x4e);
PortWriteByte(0x2b9,0x27);
PortReadByte(0x2b9,&data);
PortReadByte(0x2b8,&data);
receivedData=data;
//显示数据
pProgCtrl->SetPos(receivedData);//进度条随降雨量改变而改变
a.Format("%d",receivedData);
GetDlgItem(IDC_EDIT)->SetWindowText(a+"%");
/*
if(dayCount>0)
{
dayCount--;
((CButton *)GetDlgItem(IDC_RADIO2))->SetCheck(true);//正在人工降雨
}
else ((CButton *)GetDlgItem(IDC_RADIO2))->SetCheck(false);
//进行判断
if(receivedData<=40&&dayCount==0)
{
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(true);//干旱
dayCount=(40-receivedData)/5;
pProgCtrl0->SetPos(dayCount);
//b.Format("%d",dayCount);
//GetDlgItem(IDC_EDIT0)->SetWindowText(b+"天");
}
else if(receivedData>40&&dayCount==0)
{
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(false);
pProgCtrl0->SetPos(dayCount);
//GetDlgItem(IDC_EDIT0)->SetWindowText(dayCount+"天");
}
*/
//进行判断
if(dayCount>0)
{
dayCount--;
((CButton *)GetDlgItem(IDC_RADIO2))->SetCheck(true);//正在人工降雨}
else if(receivedData<=40)
{
if(receivedData<=40&&receivedData>=35) dayCount=1;
else dayCount=(40-receivedData)/5;
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(true);//干旱
((CButton *)GetDlgItem(IDC_RADIO2))->SetCheck(false);//没有人工降雨}
else if(receivedData>40)
{
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(false);//不干旱
((CButton *)GetDlgItem(IDC_RADIO2))->SetCheck(false);//没有人工降雨}
pProgCtrl0->SetPos(dayCount);
b.Format("%d",dayCount);
GetDlgItem(IDC_EDIT0)->SetWindowText(b+"天");
//结束
Cleanup();
break;
case 2://发送数据到下位机
if(!Startup())
{
printf("ERROR: Open Device Error!\n");
return;
}
PortWriteByte(0x283,0x16);
PortWriteByte(0x280,52);
for(i=0;i<3;i++)
{
PortWriteByte(0x2b9,0);
}
PortWriteByte(0x2b9,0x40);
PortWriteByte(0x2b9,0x4e);
PortWriteByte(0x2b9,0x27);
PortWriteByte(0x2b8,dayCount);
//PortReadByte(0x2b9,&data);
//PortReadByte(0x2b8,&data);
//printf("the received char is %c\n",data);
Cleanup();
break;
}
CDialog::OnTimer(nIDEvent);
}
void CMy3Dlg::OnOK()
{
// TODO: Add extra validation here
SetTimer(1,1000,NULL);//设置进度条更新时钟
SetTimer(2,50,NULL);//发送数据时钟
//CDialog::OnOK();
}
void CMy3Dlg::OnCancel()
{
// TODO: Add extra cleanup here
CDialog::OnCancel();
}
void CMy3Dlg::OnButton()
{
// TODO: Add your control notification handler code here
KillTimer(1);
KillTimer(2);
((CProgressCtrl*)GetDlgItem(IDC_PROG))->SetPos(0);
((CProgressCtrl*)GetDlgItem(IDC_PROG0))->SetPos(0);
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(false);
((CButton *)GetDlgItem(IDC_RADIO2))->SetCheck(false);
GetDlgItem(IDC_EDIT)->SetWindowText("已停止");
GetDlgItem(IDC_EDIT0)->SetWindowText("已停止");
}
下位机:
3DLG.H
// 3Dlg.h : header file
//
#if !defined(AFX_3DLG_H__83A8EF20_2E24_4240_9700_0AEEF48707E0__INCLUDED_) #define AFX_3DLG_H__83A8EF20_2E24_4240_9700_0AEEF48707E0__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/////////////////////////////////////////////////////////////////////////////
// CMy3Dlg dialog
class CMy3Dlg : public CDialog
{
// Construction
public:
CMy3Dlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DA TA(CMy3Dlg)
enum { IDD = IDD_MY3_DIALOG };
// NOTE: the ClassWizard will add data members here
//}}AFX_DA TA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMy3Dlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CMy3Dlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnTimer(UINT nIDEvent);
virtual void OnOK();
virtual void OnCancel();
afx_msg void OnButton1();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCA TION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_3DLG_H__83A8EF20_2E24_4240_9700_0AEEF48707E0__INCLUDED_)
3DLG.CPP
// 3Dlg.cpp : implementation file
#include "stdafx.h"
#include "3.h"
#include "3Dlg.h"
#include <conio.h>
#include "..\\ApiEx.h"
#pragma comment(lib,"..\\ApiEx.lib")
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define SET_FREQ 1000
int dayCount=0;
int rainData=0;
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DA TA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DA TA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DA TA_INIT(CAboutDlg)
//}}AFX_DA TA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DA TA_MAP(CAboutDlg)
//}}AFX_DA TA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMy3Dlg dialog
CMy3Dlg::CMy3Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CMy3Dlg::IDD, pParent)
{
//{{AFX_DA TA_INIT(CMy3Dlg)
// NOTE: the ClassWizard will add member initialization here //}}AFX_DA TA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMy3Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DA TA_MAP(CMy3Dlg)
// NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DA TA_MAP
}
BEGIN_MESSAGE_MAP(CMy3Dlg, CDialog)
//{{AFX_MSG_MAP(CMy3Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMy3Dlg message handlers
BOOL CMy3Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARA TOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
CProgressCtrl *pProgCtrl=(CProgressCtrl*)GetDlgItem(IDC_PROG);
pProgCtrl->SetRange(0,100);//设置进度条范围
CProgressCtrl *pProgCtrl0=(CProgressCtrl*)GetDlgItem(IDC_PROG0);
pProgCtrl0->SetRange(0,8);//设置进度条范围
return TRUE; // return TRUE unless you set the focus to a control
}
void CMy3Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CMy3Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CMy3Dlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CMy3Dlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CProgressCtrl *pProgCtrl=(CProgressCtrl*)GetDlgItem(IDC_PROG);
CProgressCtrl *pProgCtrl0=(CProgressCtrl*)GetDlgItem(IDC_PROG0);
byte data, receiveData;
CString a,b;
int i;
switch(nIDEvent)
{
case 1:
//初始化
if(!Startup())
{
return;
}
//读取模拟降雨量数据
PortWriteByte(0x298,0x00);
PortReadByte(0x298,&data);
rainData=data*100/255;//全局变量
pProgCtrl->SetPos(rainData);//进度条随降雨量改变而改变
a.Format("%d",rainData);
GetDlgItem(IDC_EDIT)->SetWindowText(a+"%");
//接收上位机传送来的数据
PortWriteByte(0x283,0x16);
PortWriteByte(0x280,52);
for(i=0;i<3;i++)
{
PortWriteByte(0x2b9,0);
}
PortWriteByte(0x2b9,0x40);
PortWriteByte(0x2b9,0x4e);
PortWriteByte(0x2b9,0x27);
PortReadByte(0x2b9,&receiveData);
PortReadByte(0x2b8,&receiveData);
//界面上显示状态
dayCount = receiveData;
switch(dayCount)
{
case 8:
pProgCtrl0->SetPos(dayCount);//进度条随降雨量改变而改变
b.Format("%d",dayCount);
GetDlgItem(IDC_EDIT0)->SetWindowText(b+"天");
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(true);
break;
case 7:
pProgCtrl0->SetPos(dayCount);//进度条随降雨量改变而改变
b.Format("%d",dayCount);
GetDlgItem(IDC_EDIT0)->SetWindowText(b+"天");
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(true);
break;
case 6:
pProgCtrl0->SetPos(dayCount);//进度条随降雨量改变而改变
b.Format("%d",dayCount);
GetDlgItem(IDC_EDIT0)->SetWindowText(b+"天");
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(true);
break;
case 5:
pProgCtrl0->SetPos(dayCount);//进度条随降雨量改变而改变
b.Format("%d",dayCount);
GetDlgItem(IDC_EDIT0)->SetWindowText(b+"天");
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(true);
break;
case 4:
pProgCtrl0->SetPos(dayCount);//进度条随降雨量改变而改变
b.Format("%d",dayCount);
GetDlgItem(IDC_EDIT0)->SetWindowText(b+"天");
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(true);
break;
case 3:
pProgCtrl0->SetPos(dayCount);//进度条随降雨量改变而改变
b.Format("%d",dayCount);
GetDlgItem(IDC_EDIT0)->SetWindowText(b+"天");
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(true);
break;
case 2:
pProgCtrl0->SetPos(dayCount);//进度条随降雨量改变而改变
b.Format("%d",dayCount);
GetDlgItem(IDC_EDIT0)->SetWindowText(b+"天");
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(true);
break;
case 1:
pProgCtrl0->SetPos(dayCount);//进度条随降雨量改变而改变
b.Format("%d",dayCount);
GetDlgItem(IDC_EDIT0)->SetWindowText(b+"天");
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(true);
break;
case 0:
pProgCtrl0->SetPos(dayCount);//进度条随降雨量改变而改变
b.Format("%d",dayCount);
GetDlgItem(IDC_EDIT0)->SetWindowText(b+"天");
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(false);
break;
default:
break;
}
//结束
Cleanup();
break;
case 2:
//发送给上位机
if(!Startup())
{
return;
}
switch(dayCount)
{
case 8:
PortWriteByte(0x28b,0x8b);
PortWriteByte(0x290,0xff);
PortWriteByte(0x288,0xff);//执行发光二极管数据
break;
case 7:
PortWriteByte(0x28b,0x8b);
PortWriteByte(0x290,0xff);
PortWriteByte(0x288,0x7f);//执行发光二极管数据
break;
case 6:
PortWriteByte(0x28b,0x8b);
PortWriteByte(0x290,0xff);
PortWriteByte(0x288,0x3f);//执行发光二极管数据
break;
case 5:
PortWriteByte(0x28b,0x8b);
PortWriteByte(0x290,0xff);
PortWriteByte(0x288,0x1f);//执行发光二极管数据
break;
case 4:
PortWriteByte(0x28b,0x8b);
PortWriteByte(0x290,0xff);
PortWriteByte(0x288,0x0f);//执行发光二极管数据
break;
case 3:
PortWriteByte(0x28b,0x8b);
PortWriteByte(0x290,0xff);
PortWriteByte(0x288,0x07);//执行发光二极管数据break;
case 2:
PortWriteByte(0x28b,0x8b);
PortWriteByte(0x290,0xff);
PortWriteByte(0x288,0x03);//执行发光二极管数据break;
case 1:
PortWriteByte(0x28b,0x8b);
PortWriteByte(0x290,0xff);
PortWriteByte(0x288,0x01);//执行发光二极管数据break;
case 0:
PortWriteByte(0x28b,0x8b);
PortWriteByte(0x290,0x80);
PortWriteByte(0x288,0x00);//执行发光二极管数据break;
default:
break;
}
PortWriteByte(0x283,0x16);
PortWriteByte(0x280,52);
for(i=0;i<3;i++)
{
PortWriteByte(0x2b9,0);
}
PortWriteByte(0x2b9,0x40);
PortWriteByte(0x2b9,0x4e);
PortWriteByte(0x2b9,0x27);
PortWriteByte(0x2b8,rainData);
Cleanup();
break;
default:
break;
}
CDialog::OnTimer(nIDEvent);
}
void CMy3Dlg::OnOK()
{
// TODO: Add extra validation here
SetTimer(1,SET_FREQ,NULL); //设置进度条更新时钟SetTimer(2,200,NULL); //发送数据
//CDialog::OnOK();
}
void CMy3Dlg::OnCancel()
{
// TODO: Add extra cleanup here
CDialog::OnCancel();
}
void CMy3Dlg::OnButton1()
{
// TODO: Add your control notification handler code here KillTimer(1);
KillTimer(2);
((CProgressCtrl*)GetDlgItem(IDC_PROG))->SetPos(0);
((CProgressCtrl*)GetDlgItem(IDC_PROG0))->SetPos(0);
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(false);
GetDlgItem(IDC_EDIT)->SetWindowText("已停止");
GetDlgItem(IDC_EDIT0)->SetWindowText("已停止");
}。