微机实验综合课程设计.docx
《微机实验综合课程设计.docx》由会员分享,可在线阅读,更多相关《微机实验综合课程设计.docx(24页珍藏版)》请在冰豆网上搜索。
微机实验综合课程设计
东南大学吴健雄学院
微机实验及课程设计报告
《参数可调波形发生器》
目录
一.设计目的和要求--------------------------------------------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值采用求补方法来确定延时时间,不能满足