2016-04-11

微机系统与接口实验(五)—D/A转换实验

1. 实验目的

  • 学习数模转换芯片DAC0832的硬件连接和编程方法。
  • 掌握将一组数据通过数模转换为各种波形的方法。
  • 学习软件模拟示波器的使用方法。

2. 实验内容

  • 题目:编写程序,产生周期的锯齿波、矩形波、梯形波和阶梯波,经DA转换,显示在软件模拟示波器上。
  • 要求:每种波形的周期数、阶梯波中的阶梯数等可通过参数设置。

3. 实验说明

  • 老师临时要求加入三角波,去掉梯形波,故将锯齿波、矩形波、三角波、阶梯波写在一个程序里方便观察现象。
  • 考虑有的班可能要求梯形波,将梯形波单独写了一个程序。

4. 锯齿波、矩形波、三角波、阶梯波

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
STACK SEGMENT STACK
    DW 32 DUP(?)
STACK ENDS
 
CODE SEGMENT
    ASSUME  CS:CODE, SS:STACK
 
START:
    ;产生锯齿波
    MOV CX, 07H       ;产生锯齿波的周期数为7次,如果想改变锯齿波产生周期请修改这里
JUCHI:
    MOV DX, 0600H     ;DAC0832接IOY0,0600H为控制端口地址
    MOV AL, 00H       ;AL为数字量
JC1: 
    OUT DX, AL        ;转换为模拟量
    CALL DELAY1       ;延时,此为短延时
    CMP AL ,0FFH
    JE JC2
    INC AL            ;AL步加1,直到等于0FFH
    JMP JC1
JC2:
    LOOP JUCHI
 
    ;产生矩形波
    MOV CX, 05H       ;产生矩形波的周期数为5次,如果想改变三角波产生周期请修改这里
JUXING:
    MOV DX, 0600H
    MOV AL, 00H       ;先输出00H的波形
    OUT DX, AL
    CALL DELAY2       ;长延时
    MOV AL, 0FFH      ;再输出0FFH的波形
    OUT DX, AL
    CALL DELAY2       ;长延时
    LOOP JUXING
 
    ;产生三角波
    MOV CX, 05H     ;产生三角波的周期数为5次,如果想改变三角波产生周期请修改这里
SANJIAO:
SJ1:
    MOV DX, 0600H
    OUT DX, AL
    CALL DELAY1       ;短延时
    CMP AX, 0FFH
    JE SJ2           
    INC AL            ;将AL从00H步加0FFH
    JMP SJ1
SJ2:
    MOV DX, 0600H
    OUT DX, AL
    CALL DELAY1       ;短延时
    CMP AL, 00H
    JE SJ3
    DEC AL            ;将AL从0FFH步减至00H
    JMP SJ2
SJ3:
    LOOP SANJIAO
 
    ;产生阶梯波
    MOV CX, 0FFFFH     ;产生阶梯波的周期数为0FFFF次,如果想改变阶梯波产生周期请修改这里
    MOV AX, 0FEH       
    ;波形振幅最大值为0FFH
    ;考虑到8086的DIV除法可能会出现余数为负导致加起来之后的最大值大于0FFH,故使用0FEH作最大值
    MOV BL,05H         ;阶梯波中的阶梯数,如果想改变阶梯波中的阶梯数请修改这里
    DIV BL             ;用最大振幅除以阶梯数,得到每个台阶的高度
    MOV BL, AL         ;将上述除法的商保存在BL中
    MOV BH, 00H        ;BH置0
JIETI:
    MOV AX,0000H       ;AX初始化0000H
JT1:
    MOV DX, 0600H
    OUT DX, AL
    CMP AX, 00FFH      ;判断AX是否达到幅度上线
    JAE JT2            ;达到上限,表示一次阶梯波完整生成,开始新一次生成
    CALL DELAY2        ;长延时
    ADD AX, BX         ;用当前解体高度加上每个阶梯的高度得到下一阶梯的高度
    JMP JT1
JT2:    
    LOOP JIETI
 
 
DELAY1:                ;短延时
    PUSH CX
    MOV CX, 01FFH
D1: 
    PUSH AX
    POP AX
    LOOP D1
    POP CX
    RET
 
DELAY2:               ;长延时
    PUSH CX
    MOV CX, 0FFFFH
D2: 
    PUSH AX
    POP AX
    LOOP D2
    POP CX
    RET
 
CODE ENDS
    END START

4. 梯形波

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
STACK SEGMENT STACK
    DW 32 DUP(?)
STACK ENDS
 
CODE SEGMENT
    ASSUME  CS:CODE, SS:STACK
 
START:
    MOV CX, 0FH
AA1: 
    MOV DX, 0600H     ;梯形波的底边00H
    MOV AL, 00H
    OUT DX, AL
    CALL DELAY2
 
AA2:
    MOV DX, 0600H     ;梯形波从00H上升到0FFH
    OUT DX, AL
    CALL DELAY1
    CMP AL, 0FFH
    JE AA3
    INC AL
    JMP AA2
 
AA3:
    MOV DX, 0600H     ;梯形波的最上边0FFH
    MOV AL, 0FFH
    OUT DX, AL
    CALL DELAY2
 
AA4:
    MOV DX, 0600H     ;梯形波从0FFH下降到00H
    OUT DX, AL
    CALL DELAY1
    CMP AL, 00H
    JE AA1
    DEC AL
    JMP AA4           ;一个梯形波周期由上述四个部分组成,循环往复
 
DELAY1:  
    PUSH CX
    MOV CX, 0FFH
AA5: 
    PUSH AX
    POP AX
    LOOP AA5
    POP CX
    RET
 
DELAY2:  
    PUSH CX
    MOV CX, 0FFFFH
AA6: 
    PUSH AX
    POP AX
    LOOP AA6
    POP CX
    RET
 
CODE ENDS
    END START
Share

You may also like...

6 Responses

  1. 好多鱼说道:

    ????????????????????????????????????

  2. 玥玥啦啦啦说道:

    棒棒哒

  3. ADC0832说道:

    思考题捏(T ^ T)

  4. 有关部门说道:

    同学你好,你的代码受到广大人民群众的好评,你已被评选为中国十大优秀程序猿,速来领奖!

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据