东南大学自动化学院微机实验及课程设计报告《参数可调波形发生器》姓名:学号:专业:实验室:组别:同组人员:设计时间:评定成绩:审阅教师:目录一.设计目的和要求--------------------------------------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的输入数据与输出电压的关系为:52562-⨯=N U U REFo (REF U 表示参考电压,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灯ioport equ 0EC00H-0280h ;TPC的io地址adcs equ ioport+2A0h ;CS_AD,ADC0809片选地址adcs1 equ ioport+2A1hdacs equ ioport+298h ;CS_DA,DAC0809片选地址io8255a equ ioport+288h ;8255A口地址io8255b equ ioport+28bh ;8255控制寄存器端口地址io8255c equ ioport+28ah ;08255C口地四、设计思路及流程图原理设计清晰了我的设计思路,我将整个整个程序分为了五个部分,分别为主程序设计、参数调整子程序(键盘输入及电位器调节),调幅及调频子程序设计、正弦波输出子程序、延时子程序。
1. 主程序设计:主要功能有1) 控制整个程序的流程及程序跳转;2) 通过检测开关的状态,判断输出标准正弦波还是当前a ,b 值所对应的波形;3) 判断参数调节的方式是键盘输入还是电位器调节。
____CSPA0PA1PA2PA3PA4PA5PA6PA7PC0PC1PC2PC3PC4PC5PC6PC7K0()逻辑电平开关LED8255288H~28FH)电位器)电位器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。
四、编程实现1、主程序设计message1 db 0dh,0ah,0dh,0ahdb ' PRESS 1 FOR SINWAVE MODIFIY WITH THE PC KEYBOARD.',0dh,0ah db ' PRESS 2 FOR SINWAVE MODIFIY WITH THEVARIABLE RESISTANCE.',0DH,0AHdb ' PRESS 0 FOR QUIT TO DOS.',0DH,0AH,'$'db 0dh,0ahmessage2 db 0dh,0ah,0dh,0ahdb 'Sinwave [f=a sin(b t)] is modified by the PC keyboard .',0DH,0AH db '-Directly press A or B to view the parameter .',0DH,0AHdb '-Input num(0-17)+A or(0-9) B to modify the parameter .',0DH,0AH db 'Input 0 quit to the begin',0dh,0ah,'$'db 0dh,0ahmessage3 db 0dh,0ah,0dh,0ahdb 'Sin wave [f=a sin(b t)] modified by thevariable resistance .',0DH,0AHdb 'Press anykey on the PC keyboard to return tothe begin.',0dh,0ah,'$'db 0dh,0ahmessage4 db 0dh,0ahdb 'please input num!',0dh,0ah,'$'db 0dh,0aha db 1h ;可调参数ab db 1h ;可调参数bc db '1' ;c为百位数字f乘以100d db '1' ;d为十位数字g乘以10e db '1' ;e为个位数字h乘以1f db '0' ;参数a的百位fg db '0' ;参数a的十位gh db '1' ;参数a的各位hi db '1' ;i为百位数字l乘以100j db '1' ;j为十位数字m乘以10k db '1' ;k为个位数字n乘以1l db '0' ;参数b的百位lm db '0' ;参数b的十位mn db '1' ;参数b的各位ndata endsbegin: mov ax,data ;开机显示message1mov ds,axmov ax,stacksmov ss,axlea dx,message1mov ah,09hint 21hjudge1: mov dx,0ffhmov ah,07hint 21hcmp al,'1' ;按下'1',则键盘输入jz startcmp al,'2' ;按下'2',则电位器调节jz sinvr1cmp al,'0'jnz begin ;不是'0',重新选择jmp qit ;按下'0',则退出DOSsinvr1: jmp sinvrstart: lea dx,message2mov ah,09hint 21h2、参数调整程序设计(1)键盘输入l1: call sinout ;每次调用sinout,必须要有键盘输入,才会接着往下执行mov dl,0ahmov ah,02hint 21hmov ah,08hint 21hcmp al,'a'jnz ccc ;若不是a,跳转比较是否为bjmp ddd ;是a,则跳转到a处理代码ccc: jmp l2 ;若不是a,跳转比较是否为bddd: mov dl,al ;输入是a,a处理代码mov ah,02hint 21hmov dl,0ahmov ah,02hint 21h ;输出回车mov al,f ;输出a的百位fmov dl,almov ah,02hint 21hmov al,g ;输出a的十位gmov dl,almov ah,02hint 21hmov al,h ;输出a的个位hmov dl,almov ah,02hint 21hggg: lea dx,message4 ;输出“请输入修改后a的参数值”.mov ah,09hint 21hmov ah,08h ;输入int 21hcmp al,'0'jb gggcmp al,'2'ja gggmov f,al ;显示输入的百位fmov dl,almov ah,02hint 21hsub al,30hmov bl,64hmul blmov c,al ;c为百位数字f乘以100mov ah,08hint 21hcmp al,'0'jb gggcmp al,'9'ja gggmov g,al ;显示输入的十位gmov dl,almov ah,02hint 21hsub al,30hmov bl,0ahmul blmov d,al ;d为十位数字g乘以10mov ah,08hint 21hcmp al,'0'jb gggcmp al,'9'ja gggmov h,al ;显示输入的个位hmov dl,almov ah,02hint 21hsub al,30hmov bl,01hmul blmov e,al ;e为个位数字h乘以1mov al,eadd al,d ;求和add al,ccmp al,0ffh ;若输入数字大于255则重新输入ja gggmov a,al ;将最终输入得到的值赋给参数ajmp l1 ;得到a的数值后重新跳到输入界面,l2: cmp al,'b'jnz eee ;若不是a,b跳转比较是否为0jmp fffeee: jmp l3 ;若不是a,b跳转比较是否为0fff: ... ;与输入a时主要思想一致,不再给出具体代码hhh: ...l3: cmp al,'0' ;输入为零返回jnz l4 ;若不是a,b,0,跳转到start重新等待键盘输入jmp begin ;输入为0,返回上一级,即程序主界面的功能选择l4: jmp start ;若不是a,b,0,跳转到start重新等待键盘输入(2)电位器调节参数sinvr: lea dx,message3 ;使用电位器设置正弦波参数mov ah,09hint 21hlea dx,mess2int 21h ;去掉返回功能sin1:call sinoutlea dx,messab ;装入地址mov ah,09h ;显示字符串int 21hmov al,00hmov dx,adcsout dx,alin al,dx ;从A/D读入修改的幅度CMP AL,'0'JE ABAA1: mov a,al ;幅度存到amov al,00h ;moomyu修改mov dx,adcs1out dx,alin al,dx ;从A/D读入修改的频率CMP AL,'0'JE ABBB1: mov b,al ;频率存到bcall sinout ;修改幅度和频率后重新调用sinoutmov ah,08hint 21hjz sin1jmp bglea dx,message2 ;装入地址mov ah,09h ;显示字符串int 21hmov ah,08hint 21hcmp al,'q'jnz sin1jmp bgABA:inc aljmp A1ABB:inc aljmp B14、正弦波输出设计;正弦波数据表SIN DB 128D,135D,141D,148D,155D,161D,167D,174D,180D,186D DB 192D,198D,203D,209D,214D,219D,223D,227D,231D,235DDB 239D,242D,245D,248D,250D,252D,253D,254D,255DDB 255D,254D,253D,252D,250D,248D,245D,242D,239DDB 235D,231D,227D,223D,219D,214D,209D,203D,198D,192DDB 186D,180D,174D,167D,161D,155D,148D,141D,135D,128DDB 121D,115D,108D,101D, 95D, 89D, 82D, 76D, 70DDB 64D, 58D, 53D, 47D, 42D, 37D, 33D, 29D, 25D, 21DDB 17D, 14D, 11D, 08D, 06D, 04D, 03D, 02D, 01D, 00DDB 00D, 01D, 02D, 03D, 04D, 06D, 08D, 11D, 14D, 17DDB 21D, 25D, 29D, 33D, 37D, 42D, 47D, 53D, 58D, 64DDB 70D, 76D, 82D, 89D, 95D,101D,108D,115D,121Dsinout proc near ;输出正弦波push axpush bxpush cxpush dxpush simov ax,1hsub cx,cxmov cl,bcmp cl,0je S_OUT0mov SI,0hjudge2: mov dx,io8255b ;设8255为C口输入,A口输出mov al,8bhout dx,almov dx,io8255c ;从C口输入一数据in al,dxmov dx,io8255aout dx,aland al,00000001hmov ah,0 ;判断开关状态mov c,alcmp c,1jnz S_OUT2jmp stadardS_OUT2: mov dl,0ffh ;幅度mov ah,06hint 21hjnz S_ENDmov al,SIN[SI] ;从正弦波数据表中取数据mov bl,acmp bl,0je S_OUT0mov ah,00hmov ah,00hmul bl ;乘以amov bl,255Ddiv bl ;除以255push cxneg cladd cl,10 ;b+10作为调用子程序的次数S_OUT1: call sin_delay1 ;频率loop S_OUT1pop cxmov dx,dacsout dx,al ;输出数据到dac0832inc sicmp si,116 ;共116个数据jne S_OUT2mov si,0hjmp S_OUT2S_END:pop SIpop dxpop cxpop bxpop axretS_OUT0:sub ax,axmov dx,dacsout dx,al ;S_OUT0输出的是空信号,输出都为零jmp S_ENDsinout ENDPstadard: mov a,08h ;输出标准正弦波mov b,01hcall sinoutjmp judge25、延时子程序设计sin_delay1 proc nearpush cxmov cx,0f00hloop $pop cxretsin_delay1 endp五、方案测试与结果分析将程序运行,可以达到预期的效果。