微机系统课程实验报告.doc_第1页
微机系统课程实验报告.doc_第2页
微机系统课程实验报告.doc_第3页
微机系统课程实验报告.doc_第4页
微机系统课程实验报告.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

微机系统与应用实 验 报 告实验题目成绩常用函数波形发生器的设计评 语:教 师:年 月 日班 级: 030812 学 号: 03081180 姓 名: 陈 双 实验地点: E-312 实验时间: 2011.8.9-9.4 一、应用系统设计方案l 课程设计目的1、掌握微机系统总线与各芯片管脚连接方法,提高接口扩展硬件电路的连接能力。 2、加深对和D/A 芯片的工作方式的理解,学会编写程序,使D/A 转换输出函数的 方法。 3、掌握通过A/D 转换进行实时数据采集与处理的设计思路和实现方法。l 实验原理1、DAC0832芯片的原理DAC0832各引脚功能:D0D7:8位数据输入线,TTL电平,有效时间应大于90ns(否则锁存器的数据会出错); ILE:数据锁存允许控制信号输入线,高电平有效; CS:片选信号输入线(选通数据锁存器),低电平有效; WR1:数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。由ILE、CS、WR1的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存;XFER:数据传输控制信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效;WR2:DAC寄存器选通输入线,负脉冲(脉宽应大于500ns)有效。由WR2、XFER的逻辑组合产生LE2,当LE2为高电平时,DAC寄存器的输出随寄存器的输入而变化,LE2的负跳变时将数据锁存器的内容打入DAC寄存器并开始D/A转换。 IOUT1:电流输出端1,其值随DAC寄存器的内容线性变化; IOUT2:电流输出端2,其值与IOUT1值之和为一常数; Rfb:反馈信号输入线,改变Rfb端外接电阻值可调整转换满量程精度; Vcc:电源输入端,Vcc的范围为+5V+15V; VREF:基准电压输入线,VREF的范围为-10V+10V; AGND:模拟信号地 DGND:数字信号地2、ADC0809芯片的原理主要特性:1)8路输入通道,8位A/D转换器,即分辨率为8位。 2)具有转换起停控制端。 3)转换时间为100s(时钟为640kHz时),130s(时钟为500kHz时) 4)单个+5V电源供电 5)模拟输入电压范围0+5V,不需零点和满刻度校准。 6)工作温度范围为-40+85摄氏度 7)低功耗,约15mW。ADC0809各引脚功能:IN0IN7:8路模拟量输入端。 2-12-8:8位数字量输出端。 ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路 ALE:地址锁存允许信号,输入,高电平有效。 START: A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。 EOC: A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。 OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。 CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ。 REF(+)、REF(-):基准电压。 Vcc:电源,单一+5V。 GND:地。3、波形发生器原理要求能输出方波、锯齿波、三角波和正弦波。波形的发生使用汇编语言来实现的。下面分别详述每一个波具体实现过程: 方波:首先赋给AL 00H,然后执行OUT指令输出,然后延时一段,在赋给AL 0FFH,执行OUT指令输出,同样延时一段,一直循环下去,就可以得到方波。利用程序界面按钮,选中方波点开始就可以产生方波。 三角波:首先赋给AL 00H,然后执行OUT指令输出,在执行INC自动增1,然后判断AL是否加满,未满则继续,已满,AL置全“1”,然后输出数据减1,然后判断AL是否减到“0”,不为0则继续,就这样一直循环下去,就可得到连续的三角波。利用程序界面按钮,选中三角波点开始就可以产生三角波。 锯齿波:首先赋给AL 00H,然后执行OUT指令输出,在执行INC自动增1,判断AL是否加满,未满则继续,已满,则继续赋给AL 00H并继续判断,就这样循环下去,就可以得到连续的锯齿波。利用程序界面按钮,选中锯齿波点开始就可以产生锯齿波。正弦波:首先利用正弦函数算出各个点,一共取64个点,存放在内存(SIN)中,用AL指向内存首地址,取第一个数,然后输出,接着内存地址加1,延时一段时间,再取下一个数,就这样一直下去,直到读完64个数,并依次暑促每一个点,就可以得到正弦波。利用程序界面按钮,选中正弦波点开始就可以产生正弦波。l 课程设计实验环境: 1. 硬件配置: 微机一台 (Pentium 4) 微机接口技术实验箱 一个 ISA PCI 转接卡 一块 连接电缆 一条 万用表 一块 微机接口技术实验讲义 一本 导线、剥线钳等 2. 软件环境: Windows XP 平台 Visual C+ 6.0 编译器l 课程实验内容一、软件部分/ drawgDlg.cpp : implementation file/#include stdafx.h#include drawg.h#include drawgDlg.h#include math.h#include stdio.h#include PCI9052Dll.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif#define pi 3.141592653int it=-1;int icy=60;int icx=120;int x=70,y=480,a=0;int fudu=1;int stb=0;double zhankongbi=0.5;double pinlv=1;int ox=100,oy=400;/原点的横纵座标int xstep=40,ystep=40;/x轴的间隔,y轴的间隔/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic:CAboutDlg();/ Dialog Data/AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBOX ;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:/AFX_MSG(CAboutDlg)/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAPEND_MESSAGE_MAP()/ CDrawgDlg dialogCDrawgDlg:CDrawgDlg(CWnd* pParent /*=NULL*/): CDialog(CDrawgDlg:IDD, pParent)/AFX_DATA_INIT(CDrawgDlg)/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CDrawgDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CDrawgDlg)DDX_Control(pDX, IDC_fudu, m_fudu);DDX_Control(pDX, IDC_zhankongbi, m_zhankongbi);DDX_Control(pDX, IDC_pinlv, m_pinlv);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CDrawgDlg, CDialog)/AFX_MSG_MAP(CDrawgDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_begin, Onbegin)ON_WM_MOUSEMOVE()ON_BN_CLICKED(IDC_fangbo, Onfangbo)ON_BN_CLICKED(IDC_juchibo, Onjuchibo)ON_BN_CLICKED(IDC_zhengxuanbo, Onzhengxuanbo)ON_BN_CLICKED(IDC_end, Onend)ON_WM_TIMER()ON_BN_CLICKED(IDC_dianwei, Ondianwei)ON_BN_CLICKED(IDC_select, Onselect)ON_EN_CHANGE(IDC_pinlv, OnChangepinlv)ON_EN_CHANGE(IDC_fudu, OnChangefudu)ON_EN_CHANGE(IDC_zhankongbi, OnChangezhankongbi)ON_BN_CLICKED(IDC_yzhou, Onyzhou)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CDrawgDlg message handlersBOOL CDrawgDlg: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 AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization hereSetDlgItemText(IDC_select,请选择波形);/对输出波形进行选择show();return TRUE; / return TRUE unless you set the focus to a controlvoid CDrawgDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog: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 CDrawgDlg:OnPaint() if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;/获得矩形框的中心x坐标int y = (rect.Height() - cyIcon + 1) / 2;/获得矩形框的中心y坐标/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();/ The system calls this to obtain the cursor to display while the user drags/ the minimized window.HCURSOR CDrawgDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;int re=1;int timeq=20;void CDrawgDlg:Onbegin() show();shen();re=1;char str25;m_fudu.GetWindowText(str,25);if(atoi(str)3 | atoi(str)=1 | atof(str)2 | atof(str)0.5)MessageBox(请重新输入频率!范围0.5-2,错误,MB_ICONEXCLAMATION);m_pinlv.SetSel(0,-1);m_pinlv.ReplaceSel();m_pinlv.SetWindowText(1);/设置默认频率为1hzelsepinlv=atof(str);SetDlgItemText(IDC_xy,O); SetDlgItemText(IDC_yzhou,y轴);/画y轴CClientDC initdc(this);initdc.MoveTo(ox,oy-4*ystep);initdc.LineTo(ox,oy+4*ystep);initdc.MoveTo(ox-5,oy-4*ystep+5);/y轴方向的上箭头initdc.LineTo(ox,oy-4*ystep);initdc.LineTo(ox+5,oy-4*ystep+5);initdc.MoveTo(ox-5,oy+4*ystep-5);/y轴方向的下箭头initdc.LineTo(ox,oy+4*ystep);initdc.LineTo(ox+5,oy+4*ystep-5);SetDlgItemText(IDC_xzhou,x轴);/画x轴initdc.MoveTo(ox,oy);initdc.LineTo(ox+10*xstep,oy);initdc.MoveTo(ox+10*xstep-5,oy-5);/x轴方向的箭头initdc.LineTo(ox+10*xstep,oy);initdc.LineTo(ox+10*xstep-5,oy+5);for(int i=1;i=7;i+)/标注y轴,40个像素一个格initdc.MoveTo(ox,oy+4*ystep-ystep*i);initdc.LineTo(ox+5,oy+4*ystep-ystep*i);for(i=1;i=9;i+)/标注x轴,40个像素一个格initdc.MoveTo(ox+xstep*i,oy);initdc.LineTo(ox+xstep*i,oy-5);if(-1=it)/未对产生波形进行选择MessageBox(请选择波形!,警告,MB_ICONEXCLAMATION);else if(0=it)/矩形波SetTimer(1,timeq,0);x=ox,y=oy,a=0;else if(1=it)/锯齿波SetTimer(2,timeq,0);x=ox,y=oy,a=0;else if(2=it)/正弦波SetTimer(3,timeq,0);x=ox,y=oy;else/电位器SetTimer(4,timeq,0);x=ox;int ky=0;void CDrawgDlg:OnMouseMove(UINT nFlags, CPoint point) if(ky=0)m_pinlv.SetSel(0,-1);m_pinlv.ReplaceSel();m_fudu.SetSel(0,-1);m_fudu.ReplaceSel();m_pinlv.SetWindowText(1);m_fudu.SetWindowText(1);m_zhankongbi.SetWindowText(0.5);ky=-1;CDialog:OnMouseMove(nFlags, point);void CDrawgDlg:Onfangbo() show(); Onend(); it=0;SetDlgItemText(IDC_select,方波);void CDrawgDlg:Onjuchibo() show();Onend();it=1;SetDlgItemText(IDC_select,锯齿波);void CDrawgDlg:Onzhengxuanbo() show();Onend();it=2;SetDlgItemText(IDC_select,正弦波);void CDrawgDlg:Onend() if(0=it)KillTimer(1);else if(1=it)KillTimer(2);else if(2=it)KillTimer(3);elseKillTimer(4);void CDrawgDlg:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaultswitch(nIDEvent)case 1:/方波CClientDC idc(this);idc.MoveTo(x,y);/从上次的终点开始画图if(a%(int)(2*xstep/pinlv)*zhankongbi)=0 &re=0)/矩形波的正波形/x轴的两个格代表1sif(y=oy)y=oy-fudu*ystep;/y轴的一个格代表1Velsey=oy;idc.LineTo(x,y);a=0;/对点的计数进行复位re=1;/用于标识是正波形还是负波形,0代表正波形,1代表负波形else if(a%(int)(2*xstep/pinlv)-(int)(2*xstep/pinlv)*zhankongbi)=0 & re=1)/矩形波的负波形if(y=oy)y=oy-fudu*ystep;elsey=oy;idc.LineTo(x,y);a=0;re=0;elseCPoint pp;pp.x=x;pp.y=DA_AD(unsigned char)(y-(oy-fudu*ystep)+(oy-fudu*ystep);idc.SetPixel(pp,(0,255,255);x+;a+;break;case 2:/锯齿波CClientDC idc(this);idc.MoveTo(x,y);if(a%(2*xstep)=0)/画竖线y=oy;idc.LineTo(x,y);else/画斜线CPoint pp;pp.x=x;pp.y=DA_AD(unsigned char)(y-(oy-fudu*ystep)+(oy-fudu*ystep);/pp.y=DA_AD(unsigned char)(y-200)+200;idc.SetPixel(pp,(0,255,255);/x+=(int)(2.0/pinlv);y-=fudu;a+=2;/;break;case 3:/正弦波CClientDC idc(this);CPoint pp;pp.x=x;pp.y=DA_AD(unsigned char)(y-(oy-ystep*fudu)+(oy-ystep*fudu);/保证前边输入的值为正值 idc.SetPixel(pp,(0,255,255);y=(int)(-sin(x-ox)*pi/xstep*pinlv)*ystep*fudu+oy);x+=1;break;case 4:CClientDC idc(this);CPoint pp;pp.x=x;pp.y=-DA_AD(0)/6*fudu+oy;/幅度值最小为0,最大为幅值idc.SetPixel(pp,(0,255,255);x+=1;break;CDialog:OnTimer(nIDEvent);void CDrawgDlg:show()static CRect fullRect;GetWindowRect(&fullRect);SetWindowPos(NULL,0,0,840,310,SWP_NOMOVE|SWP_NOZORDER);void CDrawgDlg:shen()static CRect fullRect;GetWindowRect(&fullRect);SetWindowPos(NULL,0,0,840,600,SWP_NOMOVE|SWP_NOZORDER);void CDrawgDlg:Ondianwei() show();Onend();it=3;SetDlgItemText(IDC_select,电位器);unsigned char CDrawgDlg:DA_AD(unsigned char tochange)unsigned short BASE_ADDR, P_ADDR, DA_ADDR; unsigned char data, Idata;OpenDevice(); GetIoBase(&BASE_ADDR);P_ADDR = BASE_ADDR + 0x00;DA_ADDR = BASE_ADDR + 0x08;/8255初始化data = 0x91;/ 都是方式0,A口输输入,B输出OutByte(P_ADDR+3, data);data = 0x00;/ PC0 清零OutByte(P_ADDR+3, data);data = tochange;OutByte(DA_ADDR, data);/进行DA转换/PB2PB0表示 START EN(OE) ALEdata = 4;/data = 00000100,准备AD转换,EN(OE)=0,ALE=0,START=1OutByte(P_ADDR+1, data);data = 5;/data = 00000101,锁存选路,EN(OE)=0,ALE=1,上升沿,START=1OutByte(P_ADDR+1, data);data = 1;/data = 00000001,开始AD转换,EN(OE)=0,ALE=1,START=0,下降沿OutByte(P_ADDR+1, data);for(;)InByte(P_ADDR+2, &Idata);/读PC0,当转换结束时,PC0=1,将数据输出Idata &= 1;if(Idata = 1)break;data = 3;OutByte(P_ADDR+1, data);/data = 00000011,EN(OE)=1,开始读准备InByte(P_ADDR, &Idata);/读PA口数据,返回IdataCloseDevice();ret

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论