微机实验综合课程设计.docx

上传人:b****8 文档编号:9226134 上传时间:2023-02-03 格式:DOCX 页数:24 大小:112.10KB
下载 相关 举报
微机实验综合课程设计.docx_第1页
第1页 / 共24页
微机实验综合课程设计.docx_第2页
第2页 / 共24页
微机实验综合课程设计.docx_第3页
第3页 / 共24页
微机实验综合课程设计.docx_第4页
第4页 / 共24页
微机实验综合课程设计.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

微机实验综合课程设计.docx

《微机实验综合课程设计.docx》由会员分享,可在线阅读,更多相关《微机实验综合课程设计.docx(24页珍藏版)》请在冰豆网上搜索。

微机实验综合课程设计.docx

微机实验综合课程设计

 

东南大学吴健雄学院

 

微机实验及课程设计报告

《参数可调波形发生器》

 

目录

一.设计目的和要求--------------------------------------------3

二.原理设计--------------------------------------------4

三.方案论证与实现--------------------------------------------6

四.设计思路及流程图-------------------------------------------------------------------7

五.编程实现------------------------------------------------------------------10

六.方案测试与结果分析--------------------------------------------18

六.改进与提高--------------------------------------------19

七.分析与总结--------------------------------------------19

 

一、设计要求

1)基本要求

编制1个参数在线可调的波形发生程序,由D/A输出,构成参数在线可调的波形发生器,并用示波器观察波形。

函数波形可选f(t)=asin(bt),其中a、b参数在线可调(也可自己选择,但要求至少2个参数可调且调节很明显)。

参数调节采用如下两种方式之一:

(1)两个可调电位器输出通过A/D转换后作为可调参数;

(2)参数通过实验装置上的键盘实时修改(调整);

(3)精确时间,开关选择标准信号输出(例如a=2V,b=100πRAD/s,即50Hz正弦波)。

2)设计提示

(1)当用电位器调节参数时,输出零不能对应相应的参数值就为零;

(2)当通过键盘修改参数时,先键入参数名如“a”,显示当前参数值,修改后再键入参数名,则修改参数完成,随后输出波形发生变化。

3)进一步设计要求

(1)分别采用两种参数调节方式在线调节参数;

(2)产生周期性三次可调函数f(t)=at3+bt2+ct+d。

 

二、原理设计

方案1参数通过实验装置上的键盘实时修改

运行程序后,程序首先显示一段字符串,提示输入相应的数字会得到不同的波形输出。

从键盘上敲入1后,程序会跳转到参数可调的正弦波发生器代码区域。

之后,显示输入可调参数a(0~255)、b(0~255)的信息。

输入a后,波形的幅度会发生相应的变化;输入b后,波形的频率会发生相应的变化。

从键盘上敲入0后,退出程序。

通过检测开关的状态,判断输出标准正弦波还是a,b值所对应的波形。

程序中的主要部分功能原理如下:

(1)程序中的a、b参数的输入

采用百位、十位、个位数字逐个读入的方法。

输入百位数字以后,由于a、b的取值范围在000~255之间、故要判断输入的数字是否小于’0’,大于’2’,若小于’0’或大于’2’,则重新输入。

输入的数若在'0'~'2'之间,将输入的数减去30h,有ASCII码值变为相应的数字,再将此数乘以100后存入c。

输入十位数字后,判断输入的数字是否小于’0’,大于’9’,若小于’0’或大于’9’,则重新输入。

输入的数若在'0'~'9'之间,将输入的数减去30h,有ASCII码值变为相应的数字,再将此数乘以10后存入d。

输入个位数字后,判断输入的数字是否小于’0’,大于’9’,若小于’0’或大于’9’,则重新输入。

输入的数若在'0'~'9'之间,将输入的数减去30h,有ASCII码值变为相应的数字,并将之存入e。

之后对c、d和e求和,从而得到a的值。

同样的可以得到b的值。

(2)正弦波幅度的改变

实验中所用的8位D/A转换器DAC0832的输入数据与输出电压的关系为:

表示参考电压,N表示输入数据)。

产生正弦波是根据正弦函数建立一个正弦数字量表,取值范围为一个周期,此正弦数据表的输出幅度为5V。

读取一个正弦数据表中的数据后,将此数据乘以a后再除以255,这样就相当于将输出正弦波的幅度变为原来的a/255倍。

(3)正弦波频率的改变

正弦波频率的改变是通过改变读取正弦数据表中的两个相邻数据的时间间隔实现的。

输入的数据b加上10表示应调用的延时子程序的次数,设延时子程序的延时时间为t,那么读取正弦数据表中的两个相邻数据的时间间隔为b*t。

方案2两个可调电位器输出通过A/D转换后作为可调参数

先读正弦波数据的首地址和一周期取值数,然后按偏移值取出正弦波数据。

启动ADC0809模/数转换器,读入IN0的值(IN0的值可以通过调节滑动变阻器1来实现),将取出的正弦波数据乘以此数据除以255,再将得到的数据赋值给DAC0832,调用延时子程序,之后将数据表偏移量加一,一周期剩余取值数减一。

判断一周期内取值是否结束,若没有结束则继续按偏移值取出正弦波数据,若结束则返回到读正弦波数据的首地址和一周期取值数。

三、方案论证与实现

针对设计思路,我们用到的硬件资源有:

、0832、8255、1个LED灯和1个逻辑电平开关、0809和2个电位器。

各个硬件的主要作用和工作方式如下:

1)0832

根据键盘输入或者电位器调节得到的参数a、b,改变正弦波形数据表的数据,将得到的新数据输出给DAC0832,,用示波器观察双极性输出端Ub输出正弦波形。

2)8255、1个LED灯与1个逻辑电平开关

8255的C口接逻辑电平开关,作为输入,用来选择是否要输出标准正弦波形;A口接LED灯,作为输出,用来显示此时输出波形是否为标准正弦波形。

3)0809和2个电位器

通过实验台的两个电位器输出0~5V电压分别送入ADC0809的通道0和1(IN0、IN1),通过A/D转换,得到参数a和b。

;CS_AD-----2A0H,CS_DA-----298H;V1-----IN0,V2-----IN1,Ub-----示波器;C0-----K1(开关),A0-----LED灯

ioportequ0EC00H-0280h;TPC的io地址

adcsequioport+2A0h;CS_AD,ADC0809片选地址

adcs1equioport+2A1h

dacsequioport+298h;CS_DA,DAC0809片选地址

io8255aequioport+288h;8255A口地址

io8255bequioport+28bh;8255控制寄存器端口地址

io8255cequioport+28ah;08255C口地

四、设计思路及流程图

原理设计清晰了我的设计思路,我将整个整个程序分为了五个部分,分别为主程序设计、参数调整子程序(键盘输入及电位器调节),调幅及调频子程序设计、正弦波输出子程序、延时子程序。

1.主程序设计:

主要功能有

1)控制整个程序的流程及程序跳转;

2)通过检测开关的状态,判断输出标准正弦波还是当前a,b值所对应的波形;

3)判断参数调节的方式是键盘输入还是电位器调节。

2.参数调整程序设计:

略。

(原理设计中已详细解释)

3.调幅及调频子程序设计:

略。

注:

需要输出标准正弦波时,将相应的a,b值修改,并保存之前的a,b值。

4.正弦波输出子程序设计:

正弦波输出子程序的主要功能有:

1)读取正弦波数据表的数据并利用数模转换显示;

2)每显示一次数据后需要调用延时子程序;

3)数据表偏移地址加1,读取下一数据,重复以上步骤。

5.延时子程序设计:

延时子程序的主要功能有:

1)通过b值的改变得到相应的第一层延时参数;

2)延时子程序内嵌套第二层延时程序;

延时部分主要流程:

延时程序涉及到嵌套延时,loop指令根据CX的值是否为0确定是否接着执行此指令,因而需要用到两次CX,且相互之间不能影响,因而先将外层CX堆栈(b值不同则外层延时的CX不同),给内层CX赋值(1FFH,此值不能改变),执行lOOP指令,直到CX=0;然后将外层CX弹出减1后堆栈;接着执行内层延时,重复上述步骤,直到外层CX=0。

4、编程实现

1、主程序设计

message1db0dh,0ah,0dh,0ah

db'PRESS1FORSINWAVEMODIFIYWITHTHEPCKEYBOARD.',0dh,0ah

db'PRESS2FORSINWAVEMODIFIYWITHTHE

VARIABLERESISTANCE.',0DH,0AH

db'PRESS0FORQUITTODOS.',0DH,0AH,'$'

db0dh,0ah

message2db0dh,0ah,0dh,0ah

db'Sinwave[f=asin(bt)]ismodifiedbythePCkeyboard.',0DH,0AH

db'-DirectlypressAorBtoviewtheparameter.',0DH,0AH

db'-Inputnum(0-17)+Aor(0-9)Btomodifytheparameter.',0DH,0AH

db'Input0quittothebegin',0dh,0ah,'$'

db0dh,0ah

message3db0dh,0ah,0dh,0ah

db'Sinwave[f=asin(bt)]modifiedbythe

variableresistance.',0DH,0AH

db'PressanykeyonthePCkeyboardtoreturnto

thebegin.',0dh,0ah,'$'

db0dh,0ah

message4db0dh,0ah

db'pleaseinputnum!

',0dh,0ah,'$'

db0dh,0ah

adb1h;可调参数a

bdb1h;可调参数b

cdb'1';c为百位数字f乘以100

ddb'1';d为十位数字g乘以10

edb'1';e为个位数字h乘以1

fdb'0';参数a的百位f

gdb'0';参数a的十位g

hdb'1';参数a的各位h

idb'1';i为百位数字l乘以100

jdb'1';j为十位数字m乘以10

kdb'1';k为个位数字n乘以1

ldb'0';参数b的百位l

mdb'0';参数b的十位m

ndb'1';参数b的各位n

dataends

begin:

movax,data;开机显示message1

movds,ax

movax,stacks

movss,ax

leadx,message1

movah,09h

int21h

judge1:

movdx,0ffh

movah,07h

int21h

cmpal,'1';按下'1',则键盘输入

jzstart

cmpal,'2';按下'2',则电位器调节

jzsinvr1

cmpal,'0'

jnzbegin;不是'0',重新选择

jmpqit;按下'0',则退出DOS

 

sinvr1:

jmpsinvr

start:

leadx,message2

movah,09h

int21h

2、参数调整程序设计

(1)键盘输入

l1:

callsinout;每次调用sinout,必须要有键盘输入,才会接着往下执行

movdl,0ah

movah,02h

int21h

movah,08h

int21h

cmpal,'a'

jnzccc;若不是a,跳转比较是否为b

jmpddd;是a,则跳转到a处理代码

ccc:

jmpl2;若不是a,跳转比较是否为b

ddd:

movdl,al;输入是a,a处理代码

movah,02h

int21h

movdl,0ah

movah,02h

int21h;输出回车

moval,f;输出a的百位f

movdl,al

movah,02h

int21h

moval,g;输出a的十位g

movdl,al

movah,02h

int21h

moval,h;输出a的个位h

movdl,al

movah,02h

int21h

ggg:

leadx,message4;输出“请输入修改后a的参数值”.

movah,09h

int21h

movah,08h;输入

int21h

cmpal,'0'

jbggg

cmpal,'2'

jaggg

movf,al;显示输入的百位f

movdl,al

movah,02h

int21h

subal,30h

movbl,64h

mulbl

movc,al;c为百位数字f乘以100

movah,08h

int21h

cmpal,'0'

jbggg

cmpal,'9'

jaggg

movg,al;显示输入的十位g

movdl,al

movah,02h

int21h

subal,30h

movbl,0ah

mulbl

movd,al;d为十位数字g乘以10

movah,08h

int21h

cmpal,'0'

jbggg

cmpal,'9'

jaggg

movh,al;显示输入的个位h

movdl,al

movah,02h

int21h

subal,30h

movbl,01h

mulbl

move,al;e为个位数字h乘以1

moval,e

addal,d;求和

addal,c

cmpal,0ffh;若输入数字大于255则重新输入

jaggg

mova,al;将最终输入得到的值赋给参数a

jmpl1;得到a的数值后重新跳到输入界面,

l2:

cmpal,'b'

jnzeee;若不是a,b跳转比较是否为0

jmpfff

eee:

jmpl3;若不是a,b跳转比较是否为0

fff:

...;与输入a时主要思想一致,不再给出具体代码

hhh:

...

l3:

cmpal,'0';输入为零返回

jnzl4;若不是a,b,0,跳转到start重新等待键盘输入

jmpbegin;输入为0,返回上一级,即程序主界面的功能选择

l4:

jmpstart;若不是a,b,0,跳转到start重新等待键盘输入

(2)电位器调节参数

sinvr:

leadx,message3;使用电位器设置正弦波参数

movah,09h

int21h

leadx,mess2

int21h;去掉返回功能

sin1:

callsinout

leadx,messab;装入地址

movah,09h;显示字符串

int21h

moval,00h

movdx,adcs

outdx,al

inal,dx;从A/D读入修改的幅度

CMPAL,'0'

JEABA

A1:

mova,al;幅度存到a

moval,00h;moomyu修改

movdx,adcs1

outdx,al

inal,dx;从A/D读入修改的频率

CMPAL,'0'

JEABB

B1:

movb,al;频率存到b

callsinout;修改幅度和频率后重新调用sinout

movah,08h

int21h

jzsin1

jmpbg

leadx,message2;装入地址

movah,09h;显示字符串

int21h

movah,08h

int21h

cmpal,'q'

jnzsin1

jmpbg

ABA:

incal

jmpA1

ABB:

incal

jmpB1

4、正弦波输出设计

;正弦波数据表

SINDB128D,135D,141D,148D,155D,161D,167D,174D,180D,186D

DB192D,198D,203D,209D,214D,219D,223D,227D,231D,235D

DB239D,242D,245D,248D,250D,252D,253D,254D,255D

DB255D,254D,253D,252D,250D,248D,245D,242D,239D

DB235D,231D,227D,223D,219D,214D,209D,203D,198D,192D

DB186D,180D,174D,167D,161D,155D,148D,141D,135D,128D

DB121D,115D,108D,101D,95D,89D,82D,76D,70D

DB64D,58D,53D,47D,42D,37D,33D,29D,25D,21D

DB17D,14D,11D,08D,06D,04D,03D,02D,01D,00D

DB00D,01D,02D,03D,04D,06D,08D,11D,14D,17D

DB21D,25D,29D,33D,37D,42D,47D,53D,58D,64D

DB70D,76D,82D,89D,95D,101D,108D,115D,121D

sinoutprocnear;输出正弦波

pushax

pushbx

pushcx

pushdx

pushsi

movax,1h

subcx,cx

movcl,b

cmpcl,0

jeS_OUT0

movSI,0h

judge2:

movdx,io8255b;设8255为C口输入,A口输出

moval,8bh

outdx,al

movdx,io8255c;从C口输入一数据

inal,dx

movdx,io8255a

outdx,al

andal,00000001h

movah,0;判断开关状态

movc,al

cmpc,1

jnzS_OUT2

jmpstadard

S_OUT2:

movdl,0ffh;幅度

movah,06h

int21h

jnzS_END

moval,SIN[SI];从正弦波数据表中取数据

movbl,a

cmpbl,0

jeS_OUT0

movah,00h

movah,00h

mulbl;乘以a

movbl,255D

divbl;除以255

pushcx

negcl

addcl,10;b+10作为调用子程序的次数

S_OUT1:

callsin_delay1;频率

loopS_OUT1

popcx

movdx,dacs

outdx,al;输出数据到dac0832

incsi

cmpsi,116;共116个数据

jneS_OUT2

movsi,0h

jmpS_OUT2

S_END:

popSI

popdx

popcx

popbx

popax

ret

S_OUT0:

subax,ax

movdx,dacs

outdx,al;S_OUT0输出的是空信号,输出都为零

jmpS_END

sinoutENDP

stadard:

mova,08h;输出标准正弦波

movb,01h

callsinout

jmpjudge2

 

5、延时子程序设计

sin_delay1procnear

pushcx

movcx,0f00h

loop$

popcx

ret

sin_delay1endp

五、方案测试与结果分析

将程序运行,可以达到预期的效果。

当用键盘输入调节参数时,正弦波形幅度可以从0~5V以每0.3V为间隔连续调节,频率调节明显,先键入参数名如“a”,显示当前参数值,修改后再键入参数名,则修改参数完成,随后输出波形会发生变化;以电位器调节参数时,幅度、频率变化比较明显;标准波形满足2V,50Hz要求。

在运行代码的过程中也遇到了一些问题,主要的问题及解决思路如下:

1.堆栈问题

问题描述:

在延时程序嵌套子延时,用到两次CX值,为保存原始的CX,因而要进行三次堆栈及弹出,过程中发现堆栈和弹出的顺序错乱使得CX发生值的突变,使得延时环节发生错误。

解决方法:

主要在程序中随时将需要保护的寄存器内容推入堆栈进行保护,同时要注意先进先出,保证堆栈与出栈一一对应。

2.频率调节某些情况无法实现

问题描述:

b值大小与延时环节的时间t成反比,此时需要用到出发来决定延时程序最外层的CX值大小,即CX=T(程序中设定)/b;发现利用除法效果不明显,且因为除法较为复杂,不容易实现。

解决方法:

利用NEG函数指令,对b求补,可以转化为乘法,及CX=T×(NEG(b)+20H),可以满足b值越大,延时越小,但不能准确满足延时环节的时间t与b值大小的反比关系。

实验表明,频率调节较为明显,基本上满足要求。

六、改进与提高

通过修改代码基本上实现了波形可调发生器的设计,包括基本功能和一部分扩展功能,但是通过实验,有很多需要改进的地方。

1、一部分功能不够完善,例如在利用电位器调节参数时,幅度及频率不是实时改变的,只有改变电位器后,按ENTER键才可以看到变化。

2、频率调节,对b值采用求补方法来确定延时时间,不能满足

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1