实验5、D/A转换实验

实验内容
基础部分:
1、编写程序,产生周期的锯齿波、矩形波、三角波和阶梯波,经D/A转换,显示在软件模拟示波器上。(要求:每种波形的周期数、阶梯波的阶梯数可通过参数设置。)
拓展部分:
2在软件模拟示波器上显示锯齿波、矩形波、三角波和阶梯波,并使用单脉冲开关KK1在四中波形间进行切换。

代码
基础

A0832 EQU 0600H  
  

CODE SEGMENT
    ASSUME  CS:CODE

START:
    ;产生锯齿波
    MOV CX, 07H       ;锯齿波周期数
JUCHI:
    MOV DX, A0832     ;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       ;矩形波周期数
JUXING:
    MOV DX, A0832
    MOV AL, 00H       ;先输出00H的波形
    OUT DX, AL
    CALL DELAY2       ;长延时
    MOV AL, 0FFH      ;再输出0FFH的波形
    OUT DX, AL
    CALL DELAY2       ;长延时
    LOOP JUXING

    ;产生三角波
    MOV CX, 05H     ;三角波周期数
SANJIAO:
SJ1:
    MOV DX, A0832
    OUT DX, AL
    CALL DELAY1       ;短延时
    CMP AX, 0FFH
    JE SJ2           
    INC AL            ;将AL从00H步加0FFH
    JMP SJ1
SJ2:
    MOV DX, A0832
    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, A0832
    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

拓展

DATA SEGMENT
    SIGN DB 00H  
DATA ENDS

CODE SEGMENT
    ASSUME  CS:CODE,DS:DATA
  
START:
	MOV AX,0000H        
    MOV DS,AX           ;设置数据段地址
      
    ;设置中断向量
    MOV AX,OFFSET MIR7
    MOV SI,003CH
    MOV [SI],AX
    MOV AX,CS
    MOV SI,003EH
    MOV [SI],AX
    
    CLI  ;关中断
	;设置ICW1~ICW4和OCW1
    MOV AL, 11H     
    OUT 20H, AL
    MOV AL, 08H
    OUT 21H, AL
    MOV AL, 04H
    OUT 21H, AL
    MOV AL, 07H
    OUT 21H, AL
    MOV AL, 2FH
    OUT 21H, AL
    STI  ;关中断
    
MAIN:
	CMP SIGN,00H
	JE JUCHI
	CMP SIGN,01H
	JE JUXING
	CMP SIGN,02H
	JE SANJIAO
	CMP SIGN,03H
	JE JIETI0
	JMP MAIN
    ;产生锯齿波
    
    
    MOV CX,05H
JUCHI:
	CMP SIGN,0H
    JNE MAIN
    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:
	CMP SIGN,01H
    JNE MAIN
    MOV DX, 0600H
    MOV AL, 00H       ;先输出00H的波形
    OUT DX, AL
    CALL DELAY2       ;长延时
    MOV AL, 0FFH      ;再输出0FFH的波形
    OUT DX, AL
    CALL DELAY2       ;长延时  
    LOOP JUXING

ZHONGJIAN:JMP MAIN

    ;产生三角波
    MOV CX, 05H     ;产生三角波的周期数为5次,如果想改变三角波产生周期请修改这里
SANJIAO:
SJ1:
	CMP SIGN,02H
    JNE MAIN
    MOV DX, 0600H
    OUT DX, AL
    
    CALL DELAY1       ;短延时
    CMP AL,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
  
    ;产生阶梯波
JIETI0:
    MOV CX, 05H     ;产生阶梯波的周期数为0FFFF次,如果想改变阶梯波产生周期请修改这里
    MOV AX, 0FEH       
    ;波形振幅最大值为0FFH
    ;考虑到8086的DIV除法可能会出现余数为负导致加起来之后的最大值大于0FFH,故使用0FEH作最大值
    MOV BL,05H         ;阶梯波中的阶梯数,如果想改变阶梯波中的阶梯数请修改这里
    DIV BL             ;用最大振幅除以阶梯数,得到每个台阶的高度
    MOV BL, AL         ;将上述除法的商保存在BL中
    MOV BH, 00H        ;BH置0
JIETI1:
	CMP SIGN,03H
    JNE ZHONGJIAN
    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 JIETI1
MIR7:
	PUSH AX
   	CMP SIGN,03H
   	JE SET0
   	INC SIGN
   	JMP QUIT
SET0:
	MOV SIGN,0H
QUIT:
	POP AX
	IRET


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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值