任意波形发生器设计报告.docx
- 文档编号:4825148
- 上传时间:2022-12-09
- 格式:DOCX
- 页数:15
- 大小:757.27KB
任意波形发生器设计报告.docx
《任意波形发生器设计报告.docx》由会员分享,可在线阅读,更多相关《任意波形发生器设计报告.docx(15页珍藏版)》请在冰豆网上搜索。
任意波形发生器设计报告
2008级计算机科学与技术专业
微机接口
课程设计报告
2010-2011学年第一学期
项目名称:
任意波形发生器
姓名:
_学号:
成绩:
姓名:
学号:
成绩:
指导教师:
一、设计:
1、设计说明:
利用实验仪上的数模转换器DAC0832,将程序中的一组波形的数据转换为电压的变化曲线,并用示波器测量模数转换器的输出端,观察生成的波形
2、设计目标:
设计一个简易波形发生器,要求该系统能通过开关或按钮有选择性的输出正弦波、三角波、方波、及阶梯波等四种波形,并且这四种波形的频率均可通过输入电位器在一定范围内调节
3、实验电路图:
4、设计内容:
(1)主程序
(2)子程序:
方波程序、正弦波程序、锯齿波、三角波、键盘扫描与处理
各模块的流程图如下:
A、主程序和键盘扫描流程:
B、三角波、方波、正弦波、锯齿波解析如下:
三角波的产生较为简单,因为它的上升沿遵循数据加1的规律。
下降沿则按数据减1的规律产生。
所以在波形的上升沿只要判断上一次的数据是否为最大值FFH,如果不是最大值,将原数据加1输出;而在波形的下降沿只要判断上一次数据是否为0,如果不是0,则将原数据减1即可
方波只有两个值,可以采用两个极端值0和FFH
正弦波使用查表法产生查表法是事先将正弦波的数据计算出来,列表放在程序中,运行时直接调取数据
锯齿波与三角波类似,只是下降时直接降至0即可。
各流程图如下:
延时N
方波流程
锯齿波流程
三角波流程
二、程序模块代码:
.modelsmall
.stack
;***********定义8255有关参数******************
addrAEQU200h
addrBEQU201h
addrCEQU202h
CTRLEQU203h
addrDAEQU208h
;*******************定义8279有关的参数*******************
Z8279EQU212H;8279的控制口地址
D8279EQU210H;8279的数据口地址
LEDMODEQU00;左边输入,八位显示外部译码八位显示(8279的控制字)
LEDFEQEQU38H;8279扫描频率
;*************以上参数写在主程序开头*****************
.code
start:
moval,90h;方式0,A口输入,B、C口输出
movdx,CTRL
outdx,al
movax,cs
movds,ax
callCSH8279;调用子程序CSH8279
callSMXS;调用子程序SMXS
s:
callKeyPress;调用子程序keyscan
movdi,offsetKeyNum
movsi,offsetXSDATA
moval,[di];波形号
mov[si+6],al
moval,[di+1];暂存值
mov[si],al
moval,[di+2];幅度
mov[si+3],al
callSMXS
movdi,offsetKeyNum
moval,[di]
cmpal,1
jneC1
callA1;跳转到方波
jmps;无条件跳转s
C1:
cmpal,2
jneC2
callA2;跳转到锯齿波
jmps
C2:
cmpal,3
jneC3
callA3;跳转到三角波
jmps
C3:
cmpal,4
jneC4
callA4;跳转到正弦波
C4:
jmps
movah,4ch
int21h
KeyNumDB0,0,0;波形参数,第一个为波形号,第二个为暂存值,第三个为幅度参数
DMBIAODB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H
DB5EH,79H,71H,00h;段码表,1亮,0灭,可以根据需要再设计显示字符
;段中已有的显示字符是0--F和全灭。
数据16代表全灭。
XSDATADB8dup(16);显示缓冲区
;正弦波表
SINDB80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh,0ffh
DB0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h,80h
DB66h,4eh,38h,25h,15h,09h,04h,00h,04h,09h
DB15h,25h,38h,4eh,66h
;*************方波*****************
A1procnear
pushax
pushbx
pushcx
moval,KeyNum[2];求幅值
movbl,33h
mulbl
movdx,addrDA
movcx,255;延时设定
A1DL0:
outdx,al;高电平
loopA1DL0
moval,0
movcx,255;延时设定
A1DL1:
outdx,al;低电平
loopA1DL1
popcx
popbx
popax
Ret
A1endp
;*************锯齿波*****************
A2procnear
pushax
pushcx
pushbx
moval,KeyNum[2]
movbl,33h
mulbl;求幅值
movah,al;最大幅值赋ah
moval,0
movdx,addrDA
A21:
outdx,al;低电平最低点
movcl,al
mulcl
movch,0
A2DL:
nop
loopA2DL;延时
incal
cmpal,ah;是否达最大幅值点
jneA21
popbx
popcx
popax
Ret
A2endp
;*************三角波*****************
A3procnear
pushax
pushbx
moval,KeyNum[2]
movbl,33h
mulbl;求最大幅值
movah,al;传值ah
moval,0
movdx,addrDA
A31:
outdx,al;读取低电平
movcx,3;延时点
A3DL0:
nop
loopA3DL0
incal;线性自增
cmpal,ah;是否达最高点
jneA31;否循环读取
A32:
outdx,al;读取最高幅值
movcx,5;延时点
A3DL1:
nop
loopA3DL1
decal;线性自减
cmpal,0;是否为0
jneA32;否循环
popbx
popax
Ret
A3endp
;*************正弦波*****************
A4procnear
pushdx
pushcx
pushbx
movdx,addrDA
movbl,60
A40:
movcx,33
movdi,offsetSIN;波表首址
A41:
moval,[di];赋波表内容
outdx,al;读取
pushcx
movcx,10
A4DL:
nop
loopA4DL;延时
popcx
incdi;di减1,即逐个取波表内容
loopA41
decbl;波表循环60次
jnzA40
popbx
popcx
popdx
Ret
A4endp
;*************逐行扫描键盘*****************
keyscanPROCNEAR;键盘扫描,返回行码(bh)和列码(bl)
pushax
pushdx
movdx,addrB
moval,0;所有行赋0
outdx,al
movdx,addrA
inal,dx
cmpal,0ffh;列是否全1,判断列,即是否按键
jeKSQ
movcx,10
KDL0:
nop;有按键要消抖
loopKDL0;消抖延时
inal,dx
cmpal,0ffh;重新判断是否按键
jeKSQ
movcx,3
movbh,2ch;00101100,进行右移求三行行号
scan:
SARbh,1;右移一位
movdx,addrB
moval,bh
outdx,al
movdx,addrA
inal,dx
cmpal,0ffh;是否按键
jneKP
loopscan;重扫描下一行
KP:
movbl,al;列值存bl
********判断是否键松开*******
movdx,addrB
moval,0;所有行
outdx,al
movdx,addrA
inal,dx
cmpal,0ffh
jneKP
movcx,10
KDL1:
nop
loopKDL1;消抖延时
inal,dx
cmpal,0ffh
jneKP
KSQ:
andbh,07h
callKeyCtrl
popdx
popax
ret
keyscanEndp
;***********************************按键处理*********************************
KeyCtrlPROCNEAR;按键处理,参数:
行码(bh)和列码(bl)
pushax
pushdx
cmpbl,0ffh
jeKCQ
moval,0;计数值
movcx,08h;用作移位
K2:
SARbl,1
jcks;是否CF为0,是跳转ks
jncp;否,跳转p
ks:
incal;自增
loopK2;循环
p:
movbl,al
cmpbh,06h;第一行
jneR1
movKeyNum[1],bl;键值存入数组keyNum中第二位
R1:
cmpbh,05h;第二行
jneR2
addbl,08h;第二行键值加8
movKeyNum[1],bl;键值存入数组keyNum中第二位
R2:
cmpbh,03h;第三行
jneKCQ
*****按确定键值从数组第二位传给第一位********
cmpbl,5;确定
jnectrl1
moval,KeyNum[1]
movKeyNum,al
jmpKCQ
********幅值修改*********
ctrl1:
moval,KeyNum[2];数组第三位
cmpbl,3;加号
jnectrl2
cmpal,5;幅值是否为5
jeKCQ
incKeyNum[2];修改幅度值
jmpKCQ
ctrl2:
cmpbl,2;减号
jneKCQ
moval,KeyNum[2]
cmpal,0;幅值是否为0
jeKCQ
decKeyNum[2];修改幅度值
KCQ:
movbx,0ffffh
callSMXS
popdx
popax
ret
KeyCtrlEndp
;**********CSH8279子程序是对8279初始化,在主程序的开头调用**********
CSH8279PROCNEAR
PUSHAX
PUSHDX
PUSHDS
PUSHCS
POPDS
MOVDX,Z8279
MOVAL,LEDMOD
OUTDX,AL
MOVAL,LEDFEQ
OUTDX,AL
POPDS
POPDX
POPAX
RET
CSH8279ENDP
;**********SMXS子程序是将放在显示缓冲区XSDATA的数据显示在8个数码管上************
;入口条件:
将要显示的数字按从右到左的顺序事先存放在XSDATA中,最右边的数据放在地址最小的单元。
SMXSPROCNEAR
PUSHAX
PUSHDX
PUSHCX
PUSHBX
PUSHDI
PUSHDS
PUSHCS
POPDS
MOVDI,OFFSETXSDATA
MOVCX,8
DMB:
MOVAL,[DI];查表,将键码放入AL中
LEABX,DMBIAO
XLAT
MOVDX,D8279;将AL中内容写到数码管上
OUTDX,AL
INCDI
LOOPDMB
POPDS
POPDI
POPBX
POPCX
POPDX
POPAX
RET
SMXSENDP
endstart
三、小结
通过这次课程设计,使我得到了一次全面的运用所学的知识分析和解决问题。
加深了我对8255芯片和数模转换的了解以及在常用编程设计思路技巧(特别是汇编语言)的掌握方面都能向前迈了一大步。
在课程设计的一周,让我们再课堂上学习的理论能够付诸实践,在这个过程中,刚开始我们是迷茫的,不知从何做起,通脱老师的指导,同学间的互相学习帮助,逐渐有了清晰的概念,也对自己的课题有了全面系统的了解。
逐渐由被动转为主动,能够自己去实现一些局部功能,到完成整个课题的设计。
也使我们再课堂学习到的模糊的概念也转化为清晰的认识。
正所谓纸上得来终觉浅,绝知此事要躬行。
学会了如何把理论应用于实际,如何用我们所学的知识去解决正常生活中的问题。
在当今科技发展如此迅速的时代,计算机已经成为了必不可少的工具,它无处不在,学习掌握计算机的技能已成为一项必修课,想要在这个社会有一立足之处,就必须学好计算机,能准确的掌握计算机知识,并熟练的贯彻到生活之中。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 任意 波形 发生器 设计 报告