任意波形发生Word下载.docx
《任意波形发生Word下载.docx》由会员分享,可在线阅读,更多相关《任意波形发生Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
![任意波形发生Word下载.docx](https://file1.bdocx.com/fileroot1/2023-1/28/f8e34056-c2d1-4569-b466-7088bbddf8d0/f8e34056-c2d1-4569-b466-7088bbddf8d01.gif)
输出。
输出的最大幅度要达到5V,最小幅度为0V。
4、在输出波形的同时可以用数字按键输入波形的频率。
频率的范围自己设定。
二、电路原理分析
(1)键值读取的方法:
键值的得到可以用扫描法得到。
各个键的键值:
键名
(行码)
Y2Y1Y0
(列码)
RL7RL6RL5RL4RL3RL2RL1RL0
110
1
2
3
4
5
6
7
01111111
8
101
9
A
B
C
D
E
F
.
011
-
+
:
REG
读出的键值分别存在两个字节中,一字节行码,一字节列码。
如果测出是第1和第2行的键按下,就调用数字键处理程序子程序。
在数字键处理程序中,将列码向右位(用SAR指令),每移一次计数一次,移出的是0,就停止计数。
这个计数值就是键值,如0的行码中,最右边的一位就是0,所以计数值应是0。
子程序返回键值。
可以得到键上的数字。
注意第2行的键值比第1行多了8,要记得加上。
第3行的键,可以用来做功能键,如果测出是第3行键,可调用另一个功能键子程序,在子程序中可以采用跳跃表的方法转向各键的处理程序。
可以先预留出各个功能键的分支,在分支的标号后面加一条RET指令,待需要时再加上相应的键处理子程序。
(2)电路图
D/A转换模块电路
连线情况:
•PA0-PA7接到RL0-RL7八列键的列值。
•PC0,PC1,PC2接到Y0Y2Y3三行键的行码。
•PB0-PB7接到DL1-DL8,显示数/模转换的数值。
三、设计方案及分析
(1)随机用键盘输入波形数据,通过A\D转换把数值数字
显示在数码管上显示出,并将数值保存在预先划定的内存空间,以便后面使用。
功能键设置方面:
当检测到键值为19时,数码管显示下一个保存值,为18时显示前一个数值,若是17则进行数模转换,在示波器上输出波形,当按下键17时从之前保存的数值取出更改输出波形的频率。
(2)程序框图
主程序:
键扫描:
键盘扫描
有键按下?
设置行号cl=0ffh
判断该行有键按下?
保存键值
判断三行扫完?
消抖
初始化
功能键:
四、源程序
datasegment
data1db1,2
data2db30dup(?
)
data3db0
dataends
codesegment
assumecs:
code
portaequ200h
portbequ201h
portcequ202h
pctrlequ203h
start:
moval,90h;
设置工作方式零,A端口输入,B,C端口输出
movdx,pctrl
outdx,al;
设置完成
movch,0;
判断是第几次按键
movsi,0;
si初始化
movdi,0;
指针初始化
key:
movdx,portc;
moval,00h
使所有行线为零
movdx,porta;
通过A端口读入列值
inal,dx
cmpal,0ffh;
判断有无按键按下
jzkey;
没有,则继续扫描判断
movbx,0ffh
dey:
decbx;
延时消抖
jnzdey
inal,dx;
重新判断来确定有无按键按下
cmpal,0ffh
jzkey
movcl,0feh;
设置行号
x0:
movdx,portc
moval,cl
outdx,al
扫描该行有无按键按下,有则将列值保存到al
jnzx2
x1:
rolcl,1;
判断三行是否扫描完,是,则保存键的位置;
否,则继续扫描
jcx0
jmpkey
x2:
movah,cl;
保存行值到ah中
cmpch,1
jzk0;
若是第二次按键,则跳转,不是,则向下进行
incch;
ch自增1
callswitch;
键值转换
cmpal,19
jznext;
cmpal,17;
判断按下值是否为17
jzm1;
是则进行跳转延续,进行数摸转换
cmpal,18;
功能键显示替换前一个数值
jzback1
cmpal,16;
输出频率按键
jzpl
notal
读出A口将键值保存起来
movcl,4
rolal,cl;
将按键值左移4位
pushax;
将按键值压栈保护
freekey:
按键释放处理
movdx,porta
jmpfreekey
m1:
jmpsm1
k0:
归零
callswitch
cmpal,19;
显示下一个数值键,比较按下键值是否等于19
是则跳转
判断是否显示上一个数值
jzback
jzsm1;
频率按键
movdl,al
popax
addal,dl;
键值组装
movdx,portb;
outdx,al
pushbx
savedata:
movbx,offsetdata2;
存入数据调用单元data2
notal
mov[bx+si],al
incsi
cmpsi,30;
指针超过则清零
jzsi0
popbx
x3:
jmpfreekey;
二次按键释放处理
si0:
movsi,0
jmpx3
back1:
jmpback
pl:
movbx,offsetdata2
decsi
moval,[bx+si]
movdata3,al
next:
;
显示后一个值
pushbx
movdx,portb
popbx
calldelay65
back:
pushbx;
显示前一个值
jmpkey
sm1:
movbx,offsetdata2
moval,[bx+di]
calldac;
调用数摸转换子程序
calldelay
incdi
cmpdi,30
jzm2
jmpsm1
m2:
switchprocnear;
键值转化子程序
movbl,-1
s1:
incbl
roral,1
jcs1
s2:
rorah,1
jncs3
addbl,8
jmps2
s3:
moval,bl
ret
switchendp
delay65PROCNEAR;
延时650ms子程序
pushcx
movcx,65500
L:
nop
nop
loopL
popcx
ret
delay65ENDP
delayprocnear
moval,data3
delay1:
decal
cmpal,0
jnzdelay1
ret
delayendp
dacprocnear
movdx,208h
dacendp
codeends
endstart
五、总结
1、跳转指令无效。
解决:
由于跳转范围太远无法,需在适当位置加一中转点进行接力