实 验 报 告
实验课程: 微波技术与天线
学生姓名:
学 号:
专业班级:
年月日
实验一 微波测量系统的认识及功率测量
一、实验目的
1. 熟悉基本微波测量仪器;
2. 了解各种常用微波元器件;
3. 学会功率的测量。
二、实验原理
1. 基本微波测量仪器
(1) 微波测量技术
主要包括微波信号特性测量和微波网络参数测量:
① 微波信号特性参量
包括微波信号的频率与波长、电平与功率、波形与频谱等;
② 微波网络参数
包括反射参量(如反射系数、驻波比)和传输参量(如[S]参数)。
(2) 微波测量方法
包括点频测量、扫频测量和时域测量三大类:
① 点频测量:信号只能工作在单一频点逐一进行测量;
② 扫频测量:在较宽的频带内测得被测量的频响特性,如加上自动网络分析仪,则可实现微波参数的自动测量与分析;
③ 时域测量:利用超高速脉冲发生器、采样示波器、时域自动网络分析仪等在时域进行测量,从而得到瞬态电磁特性。
(3) 微波测量系统
由微波信号源、调配器/ 衰减器/隔离器、波长/频率计、测量线、终端负载、选频放大器及小功率计等组成。
图 1微波测量系统
2. 常用微波元器件
实验室里常见的几种元器件:
(1) 检波器
(2) E-T 接头
(3) H-T 接头
(4) 双T 接头
(5) 波导弯曲
(6) 波导开关
(7) 可变短路器
(8) 匹配负载
(9) 吸收式衰减器
(10) 定向耦合器
(11) 隔离器
3. 功率测量
按图1所示连接微波测量系统,在终端处接上微波小功率计探头,接通电源开关,调整衰减器,观察微波功率计指示并作相应记录。
三、实验数据及处理
表格 1
图 2 衰减器指示与功率指示关系曲线
实验二 微波波导波长、频率的测量、分析和计算
一、实验目的
1. 学会微波测量线的使用;
2. 学会测量微波波导波长和信号源频率;
3. 分析和计算波导波长及微波频率。
二、实验原理
1. 系统调整
主要指信号源和测量线的调整,以及晶体检波器的校准:
(1) 信号源的调整
包括振荡频率、功率电平及调制方式等。本实验主要讨论微波测量线的调整和晶体检波器的校准。
(2) 测量线的调整
① 测量线组成
由一段开槽传输线、探头、传动装置三部分组成;
② 实验中测量线的调整
一般包括的探针深度调整和耦合输出匹配(即调谐探头)。
2. 晶体检波器的工作原理
在微波测量系统中,送至指示器的微波能量通常是经过晶体二极管检波后的直流或低频电流,指示器的读数是检波电流的有效值。
(1) 晶体二极管特性
二极管的电流I 与检波电压U 的一般关系为:I=CUn。式中,C 为常数,n 为检波律,U为检波电压。
检波电压U 与探针的耦合电场成正比。晶体管的检波律n 随检波电压U 改变。
弱信号工作情况下,近似为平方律检波,即n=2;
在大信号范围,n 近似等于1,即直线律。
(2) 测量晶体检波器校准曲线
最简便的方法是将测量线输出端短路,此时测量线上载纯驻波,其相对电压按正弦律分布,即:
(d 为离波节点的距离,Umax为波腹点电压,λg 为传输线上波长。)
传输线上晶体检波电流的表达式为:
根据上式得到晶体检波器的校准曲线:
图 3 晶体检波器的校准曲线
3. 波导波长的测量原理(测量线的基本测量原理)
(1) 原理
① 当负载与测量线匹配时测量线内是行波;
② 当负载为短路或开路时,传输线上为纯驻波,能量全部反射。
因此通过测量线上的驻波比,然后换算出反射系数模值,再利用驻波最小点位置zmin 便可得到反射系数的幅角以及微波信号特性、网络特性等。
(2) 测量
① 测得一组驻波最小点位置z1,z2,z3,z4 …
② 计算波导波长:
③ 计算工作波长:
λc 为截止波长。一般波导工作在主模状态,其λc =2a 。(波导型号为BJ-100,其宽边为a =22.86 mm。)
④ 信号源工作频率:
三、实验步骤
1. 开通测试系统
① 连接微波测量系统,终端接上短路负载;
② 打开信号源、选频放大器的电源,将信号源设置方波)状态,将衰减器调整到合适位置;
③ 调节整个探头,使内部探针耦合匹配(选频放大器输出指示最大)。
2. 波导波长测量
① 从负载端开始旋转测量线上整个探头位置,使选频放大器指示最小,此时即为测量线等效短路面,记录zmin0;
② 继续旋转探头,得到一组指示最小点位置z1,z2,z3,z4 ,反复测3次,记入表1;
③ 计算出波导波长λg,λ,f;
④ 用频率计测量信号源工作频率;
⑤ 对比工作频率的实际测量结果和计算值。
四、数据记录及处理
探针初始位置 zmin0 =78.10mm
表格 2
= 101.20mm =123.70mm =146.00mm
表格 3
=48.15mm
=33.15mm
f=9.05GHz
=9.423GHz
Δf=0.37GHz
实验三 微波驻波比、反射系数及阻抗特性测量、分析和计算
一、实验目的
1. 学会驻波比的测量、分析和计算;
2. 学会反射系数的测量、分析和计算;
3. 学会输入阻抗的测量、分析和计算。
二、实验原理
在任何的微波传输系统中,为了保证传输效率,减少传输损耗和避免大功率击穿,必须实现阻抗的匹配。
描述系统匹配程度的参数有电压驻波比和复反射系数。
1. 驻波比及反射系数的测量
(1) 驻波比
在平方律检波,即n = 2时
在n≠2时
(2) 终端复反射系数
① 模值|Γl|
② 相位φl
(3) 终端负载阻抗:
其中,
三、实验步骤
1. 等效参考面的选取与波导波长的测量
① 连接微波测量系统,终端接上短路负载;
② 打开信号源、选频放大器的电源,将信号源设置方波)状态,将衰减器调整到合适位置;
③ 调节整个探头,使内部探针耦合匹配(选频放大器输出指示最大);
④ 终端接短路片,从负载开始,旋转测量线上的探针位置,使选频放大器指示最小,此时即为测量线等效短路面,记录zmin0 ;
⑤ 测出波导波长。
2. 驻波比测量
① 终端接待测负载,探针从zmin0 开始向信号源方向旋转,依次得到指示最大值和最小值三次,记录相应的读数,即得相应的Imin 和Imax;
3. 反射系数的测量
① 终端接上待测负载,探针从zmin0 开始向信号源方向旋转,记录波节点的位置zmin。
四、实验数据及分析
zmin0 = 79.10mm
表格 4
表格 5
表格 6
ρ=4.07
|Γl|=0.61
=44.37mm
φl =5.26π
λ=23.08mm
ZTE10 =139.53π
β=86.66π
Zl=139.53π*(4.23+j3.056)
实验四 微波网络参数的测量、分析和计算
一、实验目的
1. 理解可变短路器实现开路的原理;
2. 学会不同负载下的反射系数的测量、分析和计算;
3. 学会利用三点法测量、分析和计算微波网络的[S]参数。
二、实验原理
1. [S] 参数
(1) 测量方法
三点测量法;
(2) 测量原理
对于互易双口网络有S12=S21 ,故只要测量求得S11 、S12及S21 三个量就可以。
图 4 双口网络
设终端接负载阻抗Zl ,令终端反射系数为Γl , 则有:a2 = Γlb2, 代入[S]参数定义式得:
于是输入端处的反射系数为:
解出:
在实际测量中,由于波导开口并不是真正的开路,故一般用精密可移动短路器实现终端等效开路(或用波导开口近视等效为开路),如图所示。
图 5
三、实验步骤
1. 将匹配负载接在测量线终端,并将测量线调整到最佳工作状态;
2. 将短路片接在测量线终端,从测量线终端向信源方向旋转探针位置,使选频放大器指示为零,此时的位置即为等效短路面,记作zmin0 ;
3. 接上可变短路器,在探针位置zmin0处,调节可变短路器使选频放大器指示为零,记下可变短路器的位置l1 ;
4. 继续调节可变短路器,使选频放大器再变为零,再记下可变短路器位置l2 ;
5. 接上待测网络,终端再接上匹配负载,测此时反射系数Γm ;
6. 终端换上可变短路器,并将其调到位置l1 ,测得此时的反射系数Γs ;
7. 将可变短路器调到等效开路位置l0=(l1+l2)/2 ,测得此时的反射系数Γo ;
8. 计算 [S]参数。
四、实验数据及处理
Zmin0=79.10mm l1=5.71mm l2=24.71mm
[s]系数:=0 =6.72 =-48.5
l 更多资料请见我的个人主页:www.baidu.com/p/落寂花溅泪
第二篇:南昌大学数据库实验报告(8)
一、 实验项目名称
使用ADO数据库编程
二、 实验目的
VC++是面向对象的可视化编程工具,通过ADO可以在vc中访问数据库。
三、 实验步骤及处理结果
1.为在Visual C++中使用ADO,需要在头文件中加入下面代码:
#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")
#import语句告诉编译器把此指令中的动态链接库文件引入到程序中,并从库中抽取出其中的对象的类的信息,并产生出两个头文件包含在工程中。其中的no_namespace用来对动态链接库的名称域进行隔离。最后的rename,把ADO中的EOF重新命名,避免和其他地方定义的EOF产生冲突。
2.创建新工程Ado
在基于对话框的新工程中添加新类:
3.定义连接数据库类 ADOConn
class ADOConn // ADOConn.h
{// 定义成员变量
public://添加一个指向Connection对象的指针:
_ConnectionPtr m_pConnection;
//添加一个指向Recordset对象的指针:
_RecordsetPtr m_pRecordset;
public:// 定义成员函数
ADOConn();
virtual ~ADOConn();
void OnInitADOConn(); // 初始化—连接数据库
_RecordsetPtr& GetRecordSet(_bstr_t bstrSQL); // 执行查询
// 执行SQL语句,Insert Update _variant_t
BOOL ExecuteSQL(_bstr_t bstrSQL);
void ExitConnect();
};
建立到数据源的连接
void ADOConn::OnInitADOConn()// ADOConn.cpp
{::CoInitialize(NULL); // 初始化OLE/COM库环境
try
{ // 创建Connection对象
m_pConnection.CreateInstance("ADODB.Connection");
// 设置连接字符串,必须是BSTR型或者_bstr_t类型
_bstr_t strConnect = "Provider=SQLOLEDB; Server=a5;Database=HrMan; uid=sa; pwd=;";
m_pConnection->Open(strConnect,"","",adModeUnknown);
}// 捕捉异常
catch(_com_error e)
{ // 显示错误信息
AfxMessageBox(e.Description());
}
}
取得表中的记录到记录集
_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)
{ try
{ // 连接数据库,如果Connection对象为空,则重新连接数据库
if(m_pConnection==NULL)
OnInitADOConn();
// 创建记录集对象
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 取得表中的记录
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}// 捕捉异常
catch(_com_error e)
{ // 显示错误信息
AfxMessageBox(e.Description());
} // 返回记录集
return m_pRecordset;
}
执行SQL语句
{// _variant_t RecordsAffected;
try{ // 是否已经连接数据库
if(m_pConnection == NULL)
OnInitADOConn();
// Connection对象的Execute方法:(_bstr_t CommandText,
// VARIANT * RecordsAffected, long Options )
// 其中CommandText是命令字串,通常是SQL命令。
// 参数RecordsAffected是操作完成后所影响的行数,
// 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名
// adCmdProc-存储过程;adCmdUnknown-未知
m_pConnection->Execute(bstrSQL,NULL,adCmdText);
return true; }
catch(_com_error e)
{ AfxMessageBox(e.Description());
return false;
} }
关闭连接
void ADOConn::ExitConnect()
{
// 关闭记录集和连接
if (m_pRecordset != NULL)
m_pRecordset->Close();
m_pConnection->Close();
// 释放环境
::CoUninitialize();
}
4.为表创建类
class CEmployees //Employees.h
{private:
int Emp_id;
CString Emp_name;
CString Sex;
CString Title;
float Wage;
int Dep_id;
public:
CEmployees();
virtual ~CEmployees();
//设置和读取成员变量值
int GetEmp_id();
void SetEmp_id(int vEmpId);
CString GetEmp_name();
void SetEmp_name(CString vEmpName);
CString GetSex();
void SetSex(CString vSex);
CString GetTitle();
void SetTitle(CString vTitle);
float GetWage();
void SetWage(float vWage);
int GetDep_id();
void SetDep_id(int vDepId);
//数据库操作
void sql_insert();
void sql_update(CString cEmpId);
void sql_delete(CString cEmpId);
//根据员工编号读取所有字段值
void GetData(CString cEmpId);
};
表类成员函数的实现
CEmployees::CEmployees()
{
Emp_id = 0;
Emp_name = "";
Sex = "";
Title = "";
Wage = 0;
Dep_id = 0;
}
int CEmployees::GetEmp_id()
{
return Emp_id;
}
void CEmployees::SetEmp_id(int vEmpId)
{
Emp_id = vEmpId;
}
CString CEmployees::GetEmp_name()
{ return Emp_name;
}
void CEmployees::SetEmp_name(CString vEmpName)
{ Emp_name = vEmpName;
}
CString CEmployees::GetSex()
{ return Sex;
}
void CEmployees::SetSex(CString vSex)
{
Sex = vSex;
}
CString CEmployees::GetTitle()
{
return Title;
}
void CEmployees::SetTitle(CString vTitle)
{
Title = vTitle;
}
float CEmployees::GetWage()
{
return Wage;
}
void CEmployees::SetWage(float vWage)
{
Wage = vWage;
}
int CEmployees::GetDep_id()
{
return Dep_id;
}
void CEmployees::SetDep_id(int vDepId)
{
Dep_id = vDepId;
}
5.表类成员插入函数
void CEmployees::sql_insert()
{ //连接数据库
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
//设置INSERT语句
CString strWage;
strWage.Format("%f", Wage);
_bstr_t vSQL;
vSQL = "INSERT INTO Employees (Emp_name, Sex, Title, Wage, Dep_id) VALUES('"+ Emp_name + "','" + Sex + "','" + Title + "'," + strWage + ", 1)";//执行INSERT语句
m_AdoConn.ExecuteSQL(vSQL); //断开与数据库的连接
m_AdoConn.ExitConnect();
}
void CEmployees::sql_update(CString cEmpId)
{ ADOConn m_AdoConn; //连接数据库
m_AdoConn.OnInitADOConn(); //设置UPDATE语句
CString strWage;
strWage.Format("%f", Wage);
_bstr_t vSQL;
vSQL = "UPDATE Employees SET Emp_name='" + Emp_name + "', Sex='" + Sex +"', Title='" + Title + "', Wage="
+ strWage + " WHERE Emp_id=" + cEmpId;
//执行UPDATE语句
m_AdoConn.ExecuteSQL(vSQL);
//断开与数据库的连接
m_AdoConn.ExitConnect();
}
表类成员删除函数
void CEmployees::sql_delete(CString cEmpId)
{
//连接数据库
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
_bstr_t vSQL; //设置DELETE语句
vSQL = "DELETE FROM Employees WHERE Emp_id=" + cEmpId;
//执行DELETE语句
m_AdoConn.ExecuteSQL(vSQL);
//断开与数据库的连接
m_AdoConn.ExitConnect();
}
读取员工信息
void CEmployees::GetData(CString cEmpId)
{ ADOConn m_AdoConn; //连接数据库
m_AdoConn.OnInitADOConn();
_bstr_t vSQL; //设置SELECT语句
vSQL = "SELECT * FROM Employees WHERE Emp_id=" + cEmpId;
_RecordsetPtr m_pRecordset; //执行SELETE语句
m_pRecordset = m_AdoConn.GetRecordSet(vSQL);
if (m_pRecordset->adoEOF == 1) //返回各列的值
CEmployees();
else
{ Emp_id = atoi(cEmpId);
Emp_name = (LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Emp_Name");
Sex = (LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Sex");
Title = (LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Title");
Wage = atof((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Wage"));
Dep_id = atoi((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Dep_id"));
}//断开与数据库的连接
m_AdoConn.ExitConnect();
}
添加:IDC_ADD_BUTTON
修改:IDC_MODI_BUTTON
删除:IDC_DEL_BUTTON
关闭:IDC_CLOSE_BUTTON
IDC_ADODC1
COMMANDTYPE 1-TEXT COMMANDTYPE
RecordSource SELECT* FROM Employees
IDC_DATAGRID1
CAPTION: 员工信息
DataSource: IDC_ADODC1
6.添加成员变量
添加成员函数
void CAdoDlg::RefreshData()
{ //设置ADO Data控件的数据源
m_adodc.SetRecordSource("SELECT Emp_id, Emp_name AS 员工姓名, Sex AS 性别, Title AS 职务, Wage AS 工资 FROM Employees");
m_adodc.Refresh(); //设置列宽度
_variant_t vIndex;
vIndex = long(0);
m_datagrid.GetColumns().GetItem(vIndex).SetWidth(0);
vIndex = long(1);
m_datagrid.GetColumns().GetItem(vIndex).SetWidth(100);
vIndex = long(2);
m_datagrid.GetColumns().GetItem(vIndex).SetWidth(80);
vIndex = long(3);
m_datagrid.GetColumns().GetItem(vIndex).SetWidth(100);
vIndex = long(4);
m_datagrid.GetColumns().GetItem(vIndex).SetWidth(90);
}
在AdoDlg.cpp中的成员函数OnInitDialog()中添加代码: RefreshData();
并在其中包括
#include "Columns.h"
#include "Column.h"
#include "COMDEF.H"
#include "EditDlg.h"
#include "_recordset.h"
#include "datagrid.h"
#include "Employees.h"
在datagrid.cpp中添加成员函数
CString CDataGrid::GetItem(int ColNum)
{ CColumns cols = GetColumns();
VARIANT v_ColNum, v_Value;
//设置列编号
v_ColNum.vt = VT_I2;
v_ColNum.iVal = ColNum;
//根据列编号返回CColumn对象
CColumn col = cols.GetItem(v_ColNum);
//读取列的
v_Value = col.GetValue();
return v_Value.bstrVal;
}
并添加#include "Column.h"
并在datagrid.h中声明
CString GetItem(int ColNum);
6.添加对话框资源IDD_DIALOG1 编辑员工信息。
为这个对话框创建新类CEditDlg。
为其添加成员变量:
public:
CString cEmpId;//员工号添加时为空
CString strSex;//员工性别
设置控件属性和连接成员变量
为CEditDlg成员变量初始化
CEditDlg::CEditDlg(CWnd* pParent /*=NULL*/)
: CDialog(CEditDlg::IDD, pParent)
{ //{{AFX_DATA_INIT(CEditDlg)
m_EmpName = _T("");
m_Title = _T("");
m_Wage = 0.0f;
//}}AFX_DATA_INIT
}
void CEditDlg::DoDataExchange(CDataExchange* pDX)
{ CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CEditDlg)
DDX_Control(pDX, IDC_SEX_COMBO, m_Sex);
DDX_Text(pDX, IDC_EMPNAME_EDIT, m_EmpName);
DDX_Text(pDX, IDC_TITLE_EDIT, m_Title);
DDX_Text(pDX, IDC_WAGE_EDIT, m_Wage);
//}}AFX_DATA_MAP
}
void CEditDlg::OnOK()
{ CEmployees emp; // TODO: Add extra validation here
UpdateData(true);
if (m_EmpName == "") //检查数据有效性
{ MessageBox("请输入员工姓名"); return;
} //对CEmployees对象赋值
m_Sex.GetLBText(m_Sex.GetCurSel(), strSex);
emp.SetEmp_name(m_EmpName);
emp.SetSex(strSex);
emp.SetTitle(m_Title);
emp.SetWage(m_Wage);
emp.SetDep_id(1);
//根据成员变量cEmpId的值,决定是插入数据,还是修改数据
if (cEmpId == "") //插入数据 emp.sql_insert();
else emp.sql_update(cEmpId);
CDialog::OnOK();
}
void CEditDlg::OnCancel()
{ CDialog::OnCancel(); // TODO: Add extra cleanup here
}
BOOL CEditDlg::OnInitDialog()
{ CDialog::OnInitDialog();
if (strSex == "男") // TODO: Add extra initialization here
m_Sex.SetCurSel(0);
else
m_Sex.SetCurSel(1);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
在EditDlg.cpp中添加
#include "Employees.h“
在Employees.cpp中添加
#include "ADOConn.h
在AdoDlg.cpp中添加成员函数
void CAdoDlg::OnAddButton()
{ // TODO: Add your control notification handler code here
CEditDlg dlg;
dlg.cEmpId = "";
dlg.strSex = "男";
if (dlg.DoModal() == IDOK)
RefreshData();
}
void CAdoDlg::OnCloseButton()
{ // TODO: Add your control notification handler code here
OnCancel();
}void CAdoDlg::OnModiButton()
{ // TODO: Add your control notification handler code here
if (m_adodc.GetRecordset().GetEof() == 1)
{ MessageBox("没有数据");
return;
}
CEditDlg dlg;
dlg.cEmpId = m_datagrid.GetItem(0);
dlg.m_EmpName = m_datagrid.GetItem(1);
dlg.strSex = m_datagrid.GetItem(2);
dlg.m_Title = m_datagrid.GetItem(3);
dlg.m_Wage = atof(m_datagrid.GetItem(4));
if (dlg.DoModal() == IDOK)
RefreshData();
}
void CAdoDlg::OnDelButton()
{ // TODO: Add your control notification handler code here
if (m_adodc.GetRecordset().GetEof() == 1)
{ MessageBox("请选择要删除的数据");
return;
}
if (MessageBox("是否删除当前记录?","请确认", MB_YESNO) == IDYES)
{ CEmployees emp;
emp.sql_delete(m_datagrid.GetItem(0));
RefreshData();
}
}
四、 思考讨论题或体会或对改进实验的建议
通过实验,获得哪些收获、体会?
通过使用基本了解vc通过ADO访问数据库的基本方法
五、 参考资料
明日科技 《SQL Server 2005开发技术大全》