任意波形发生.docx
《任意波形发生.docx》由会员分享,可在线阅读,更多相关《任意波形发生.docx(13页珍藏版)》请在冰豆网上搜索。
任意波形发生
泉州师范学院
2008年-2009年第二学期
2006级通信工程专业
微机接口课程设计报告
项目名称:
_______任意波形发生器
(2)_______
姓名:
___________学号:
成绩:
______
姓名:
学号:
成绩:
_____
指导教师:
(高级工程师)
引言
微机原理和接口技术是一门实践性强的学科,其中很多的原理、规则、现象等仅仅靠学习教科书是无法完全掌握的,必须通过实践才能比较直观和深刻的理解。
在进行课程设计的过程中,可以让学生体验分析问题、提出解决方案、通过编程等手段实现解决方案、不断调试最终达到设计要求的全过程,从而帮助学生系统地掌握微机原理的接口技术的相关知识,达到将知识融会贯通的目的。
微机原理课程设计是机械设计制造及其自动化专业的一门重要的专业实践课程。
本课程设计以MCS-51系列单片机为核心,综合运用微机原理、数字电路及微机接口技术的知识,使学生掌握微型计算机接口的方法和原理,具备一定的微机应用开发的实践能力。
一、项目内容
1、利用实验仪上的数模转换器DAC0832,将程序中的一组波形的数据转换为电
压的变化曲线,并用示波器测量模数转换器的输出端,观察生成的波形。
2、随机用键盘输入波形数据。
要求每个输入的数据要显示在8个发光管上。
3、已输入的波形数据可以用键盘上的按键查看和更改。
并令数据从数模转换器上
输出。
输出的最大幅度要达到5V,最小幅度为0V。
4、在输出波形的同时可以用数字按键输入波形的频率。
频率的范围自己设定。
二、电路原理分析
(1)键值读取的方法:
键值的得到可以用扫描法得到。
各个键的键值:
键名
(行码)
Y2Y1Y0
(列码)
RL7RL6RL5RL4RL3RL2RL1RL0
0
110
1
110
2
110
3
110
4
110
5
110
6
110
7
110
01111111
8
101
9
101
A
101
B
101
C
101
D
101
E
101
F
101
01111111
.
011
011
-
011
+
011
:
011
REG
011
011
011
01111111
读出的键值分别存在两个字节中,一字节行码,一字节列码。
如果测出是第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
outdx,al;使所有行线为零
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
movdx,porta;扫描该行有无按键按下,有则将列值保存到al
inal,dx
cmpal,0ffh
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
movdx,porta;读出A口将键值保存起来
outdx,al
notal
movcl,4
rolal,cl;将按键值左移4位
pushax;将按键值压栈保护
freekey:
movdx,portc;按键释放处理
moval,00h
outdx,al
movdx,porta
inal,dx
cmpal,0ffh
jzkey
jmpfreekey
m1:
jmpsm1
k0:
movch,0;归零
callswitch
cmpal,19;显示下一个数值键,比较按下键值是否等于19
jznext;是则跳转
cmpal,18;判断是否显示上一个数值
jzback
cmpal,17;判断按下值是否为17
jzsm1;是则进行跳转延续,进行数摸转换
cmpal,16;频率按键
jzpl
movdl,al
popax
addal,dl;键值组装
notal
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
jmpsm1
next:
;显示后一个值
pushbx
movbx,offsetdata2
incsi
moval,[bx+si]
notal
movdx,portb
outdx,al
popbx
calldelay65
jmpkey
back:
pushbx;显示前一个值
movbx,offsetdata2
decsi
moval,[bx+si]
notal
movdx,portb
outdx,al
popbx
calldelay65
jmpkey
sm1:
pushbx
movbx,offsetdata2
moval,[bx+di]
calldac;调用数摸转换子程序
calldelay
incdi
cmpdi,30
jzm2
jmpsm1
popbx
m2:
jmpkey
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
notal
moval,data3
delay1:
decal
cmpal,0
jnzdelay1
ret
delayendp
dacprocnear
movdx,208h
outdx,al
ret
dacendp
codeends
endstart
五、总结
1、跳转指令无效。
解决:
由于跳转范围太远无法,需在适当位置加一中转点进行接力