石家庄经济学院信息工程学院
电子信息工程与通信工程专业
电子技术课程设计报告
题目:多种波形发生器
姓 名 朱慧娟
学 号 41010060325
班 级 4101090603
指导教师 曹海燕
20##年 7 月4 日
课程设计任务书
课程设计报告
注:此表可加附页
注:此表可加附页
课程设计验收
要求:
1.指导教师按照课程设计大纲要求完成学生课程设计指导工作。
2.课程设计任务书由指导教师照大纲要求填写,内容要全面。
3.课程设计报告由参加本学生填写。课程设计结束时交指导教师。(打印稿一份,电子稿一份)
4.指导教师要根据每一位学生课程设计任务完成情况,认真审核设计报告,并在课程设计结束时,给出客观、准确的评语和成绩。
5.课程设计任务书和报告要语言流畅,图表正确规范。
6.本表要用钢笔、圆柱笔填写或打印,字迹工整。
第二篇:任意波形发生器设计报告
2008级计算机科学与技术专业
微 机 接 口
课 程 设 计 报 告
2010-2011学年 第一学期
项目名称:任意波形发生器
姓名: 学号: 姓名: 学号: 成绩:
指导教师:
一、设计:
1、设计说明:
利用实验仪上的数模转换器DAC0832,将程序中的一组波形的数据转换为电压的变化曲线,并用示波器测量模数转换器的输出端,观察生成的波形
2、设计目标:
设计一个简易波形发生器,要求该系统能通过开关或按钮有选择性的输出正弦波、三角波、方波、及阶梯波等四种波形,并且这四种波形的频率均可通过输入电位器在一定范围内调节
3、实验电路图:
4、设计内容:
(1)主程序
(2)子程序:方波程序、正弦波程序、锯齿波、三角波、键盘扫描与处理 各模块的流程图如下:
A、 主程序和键盘扫描流程:
主程序处理流程 键盘扫描流程
B、 三角波、方波、正弦波、锯齿波解析如下:
三角波的产生较为简单,因为它的上升沿遵循数据加1的规律。下降沿则按数据减1的规律产生。所以在波形的上升沿只要判断上一次的数据是否为最大值FFH,如果不是最大值,将原数据加1输出;而在波形的下降沿只要判断上一次数据是否为0,如果不是0,则将原数据减1即可
方波只有两个值,可以采用两个极端值0和FFH
正弦波使用查表法产生查表法是事先将正弦波的数据计算出来,列表放在程序中,运行时直接调取数据
锯齿波与三角波类似,只是下降时直接降至0即可。各流程图如下:
延时N
方波流程
三角波流程
锯齿波流程
二、程序模块代码: .model small .stack
;***********定义8255有关参数****************** addrA EQU 200h addrB EQU 201h addrC EQU 202h CTRL EQU 203h addrDA EQU 208h
;*******************定义8279有关的参数*******************
Z8279 EQU 212H ; 8279的控制口地址
D8279 EQU 210H ; 8279的数据口地址
LEDMOD EQU 00 ;左边输入,八位显示外部译码八位显示(8279的控制字) LEDFEQ EQU 38H ;8279 扫描频率
;*************以上参数写在主程序开头*****************
.code
start:mov al,90h ;方式0,A口输入,B、C口输出
mov dx,CTRL
out dx,al
mov ax,cs
mov ds,ax
call CSH8279 ;调用子程序CSH8279
call SMXS ;调用子程序SMXS
s:call KeyPress;调用子程序keyscan
mov di,offset KeyNum
mov si,offset XSDATA
mov al,[di] ;波形号
mov [si+6],al
mov al,[di+1] ;暂存值
mov [si],al
mov al,[di+2] ;幅度
mov [si+3],al
call SMXS
mov di,offset KeyNum
mov al,[di]
cmp al,1
jne C1
call A1 ;跳转到方波
jmp s ;无条件跳转s
C1:cmp al,2
jne C2
call A2 ;跳转到锯齿波
jmp s
C2:cmp al,3
jne C3
call A3 ;跳转到三角波
jmp s
C3:cmp al,4
jne C4
call A4 ;跳转到正弦波
C4:jmp s
mov ah,4ch
int 21h
KeyNum DB 0,0,0 ;波形参数,第一个为波形号,第二个为暂存值,第三个为幅度参数 DMBIAO DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H DB 5EH,79H,71H,00h ;段码表,1亮,0灭,可以根据需要再设计显示字符 ;段中已有的显示字符是0--F和全灭。数据16代表全灭。 XSDATA DB 8 dup(16) ;显示缓冲区
;正弦波表
SIN DB 80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh,0ffh
DB 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h,80h
DB 66h,4eh,38h,25h,15h,09h,04h,00h,04h,09h
DB 15h,25h,38h,4eh,66h
;*************方波*****************
A1 proc near
push ax
push bx
push cx
mov al,KeyNum[2] ;求幅值 mov bl,33h
mul bl
mov dx,addrDA
mov cx,255 ;延时设定 A1DL0: out dx,al ;高电平 loop A1DL0
mov al,0
mov cx,255 ;延时设定 A1DL1: out dx,al ;低电平 loop A1DL1
pop cx
pop bx
pop ax
Ret
A1 endp
;*************锯齿波***************** A2 proc near
push ax
push cx
push bx
mov al,KeyNum[2]
mov bl,33h
mul bl ;求幅值
mov ah,al ;最大幅值赋ah mov al,0
mov dx,addrDA
A21:out dx,al ;低电平最低点 mov cl,al
mul cl
mov ch,0
A2DL:nop
loop A2DL ;延时
inc al
cmp al,ah ;是否达最大幅值点 jne A21
pop bx
pop cx
pop ax
Ret
A2 endp
;*************三角波***************** A3 proc near
push ax
push bx
mov al,KeyNum[2]
mov bl,33h
mul bl ;求最大幅值
mov ah,al ;传值ah mov al,0
mov dx,addrDA
A31: out dx,al ;读取低电平
mov cx,3 ;延时点
A3DL0: nop
loop A3DL0
inc al ;线性自增
cmp al,ah ;是否达最高点
jne A31 ;否循环读取
A32: out dx,al ;读取最高幅值
mov cx,5 ;延时点
A3DL1: nop
loop A3DL1
dec al ;线性自减
cmp al,0 ;是否为0
jne A32 ;否循环
pop bx
pop ax
Ret
A3 endp
;*************正弦波*****************
A4 proc near
push dx
push cx
push bx
mov dx,addrDA
mov bl,60
A40: mov cx,33
mov di,offset SIN ;波表首址
A41: mov al,[di] ;赋波表内容
out dx,al ;读取
push cx
mov cx,10
A4DL: nop
loop A4DL ;延时
pop cx
inc di ;di减1,即逐个取波表内容 loop A41
dec bl ;波表循环60次
jnz A40
pop bx
pop cx
pop dx
Ret
A4 endp
;*************逐行扫描键盘*****************
keyscan PROC NEAR;键盘扫描,返回行码(bh)和列码(bl)
push ax
push dx
mov dx,addrB
mov al,0 ;所有行赋0
out dx,al
mov dx,addrA
in al,dx
cmp al,0ffh ;列是否全1,判断列,即是否按键 je KSQ
mov cx,10
KDL0: nop ;有按键要消抖
loop KDL0 ;消抖延时
in al,dx
cmp al,0ffh ;重新判断是否按键
je KSQ
mov cx,3
mov bh,2ch ;00101100,进行右移求三行行号
scan: SAR bh,1 ;右移一位
mov dx,addrB
mov al,bh
out dx,al
mov dx,addrA
in al,dx
cmp al,0ffh ;是否按键
jne KP
loop scan ;重扫描下一行
KP: mov bl,al ;列值存bl
********判断是否键松开*******
mov dx,addrB
mov al,0 ;所有行
out dx,al
mov dx,addrA
in al,dx
cmp al,0ffh
jne KP
mov cx,10
KDL1: nop
loop KDL1 ;消抖延时
in al,dx
cmp al,0ffh
jne KP
KSQ:and bh,07h
call KeyCtrl
pop dx
pop ax
ret
keyscan Endp
;***********************************按键处理********************************* KeyCtrl PROC NEAR ;按键处理,参数:行码(bh)和列码(bl)
push ax
push dx
cmp bl,0ffh
je KCQ
mov al,0 ;计数值
mov cx,08h ;用作移位
K2:SAR bl,1
jc ks ;是否CF为0,是跳转ks
jnc p ;否,跳转p
ks:inc al ;自增
loop K2 ;循环
p:mov bl,al
cmp bh,06h;第一行
jne R1
mov KeyNum[1],bl ;键值存入数组keyNum中第二位
R1:cmp bh,05h;第二行
jne R2
add bl,08h ;第二行键值加8
mov KeyNum[1],bl ;键值存入数组keyNum中第二位
R2: cmp bh,03h ;第三行
jne KCQ
*****按确定键值从数组第二位传给第一位********
cmp bl,5 ;确定
jne ctrl1
mov al,KeyNum[1]
mov KeyNum,al
jmp KCQ
********幅值修改*********
ctrl1:mov al,KeyNum[2] ;数组第三位
cmp bl,3 ;加号
jne ctrl2
cmp al,5 ;幅值是否为5
je KCQ
inc KeyNum[2] ;修改幅度值
jmp KCQ
ctrl2:cmp bl,2 ;减号
jne KCQ
mov al,KeyNum[2]
cmp al,0 ;幅值是否为0
je KCQ
dec KeyNum[2] ;修改幅度值
KCQ:mov bx,0ffffh
call SMXS
pop dx
pop ax
ret
KeyCtrl Endp
;**********CSH8279子程序是对8279初始化,在主程序的开头调用**********
CSH8279 PROC NEAR
PUSH AX
PUSH DX
PUSH DS
PUSH CS
POP DS
MOV DX,Z8279
MOV AL,LEDMOD
OUT DX,AL
MOV AL,LEDFEQ
OUT DX,AL
POP DS
POP DX
POP AX
RET
CSH8279 ENDP
;**********SMXS子程序是将放在显示缓冲区XSDATA的数据显示在8个数码管上************
;入口条件:将要显示的数字按从右到左的顺序事先存放在XSDATA中,最右边的数据放在地址最小的单元。
SMXS PROC NEAR
PUSH AX
PUSH DX
PUSH CX
PUSH BX
PUSH DI
PUSH DS
PUSH CS
POP DS
MOV DI,OFFSET XSDATA
MOV CX,8
DMB: MOV AL,[DI] ;查表,将键码放入AL中
LEA BX,DMBIAO
XLAT
MOV DX,D8279 ;将AL中内容写到数码管上
OUT DX,AL
INC DI
LOOP DMB
POP DS
POP DI
POP BX
POP CX
POP DX
POP AX
RET
SMXS ENDP
end start
三、小结
通过这次课程设计,使我得到了一次全面的运用所学的知识分析和解决问题。加深了我对8255芯片和数模转换的了解以及在常用编程设计思路技巧(特别是汇编语言)的掌握方面都能向前迈了一大步。
在课程设计的一周,让我们再课堂上学习的理论能够付诸实践,在这个过程中,刚开始我们是迷茫的,不知从何做起,通脱老师的指导,同学间的互相学习帮助,逐渐有了清晰的概念,也对自己的课题有了全面系统 的了解。逐渐由被动转为主动,能够自己去实现一些局部功能,到完成整个课题的设计。也使我们再课堂学习到的模糊的概念也转化为清晰的认识。
正所谓纸上得来终觉浅,绝知此事要躬行。学会了如何把理论应用于实际,如何用我们所学的知识去解决正常生活中的问题。
在当今科技发展如此迅速的时代,计算机已经成为了必不可少的工具,它无处不在,学习掌握计算机的技能已成为一项必修课,想要在这个社会有一立足之处,就必须学好计算机,能准确的掌握计算机知识,并熟练的贯彻到生活之中。