实验内容
基础部分:
1、编写程序,产生周期的锯齿波、矩形波、三角波和阶梯波,经D/A转换,显示在软件模拟示波器上。(要求:每种波形的周期数、阶梯波的阶梯数可通过参数设置。)
拓展部分:
2在软件模拟示波器上显示锯齿波、矩形波、三角波和阶梯波,并使用单脉冲开关KK1在四中波形间进行切换。
代码
基础
A0832 EQU 0600H CODE SEGMENTASSUME CS:CODESTART:;产生锯齿波MOV CX, 07H ;锯齿波周期数
JUCHI:MOV DX, A0832 ;DAC0832接IOY0,0600H为控制端口地址MOV AL, 00H ;AL为数字量
JC1: OUT DX, AL ;转换为模拟量CALL DELAY1 ;延时,此为短延时CMP AL ,0FFHJE JC2INC AL ;AL步加1,直到等于0FFHJMP JC1
JC2:LOOP JUCHI;产生矩形波MOV CX, 05H ;矩形波周期数
JUXING:MOV DX, A0832MOV AL, 00H ;先输出00H的波形OUT DX, ALCALL DELAY2 ;长延时MOV AL, 0FFH ;再输出0FFH的波形OUT DX, ALCALL DELAY2 ;长延时LOOP JUXING;产生三角波MOV CX, 05H ;三角波周期数
SANJIAO:
SJ1:MOV DX, A0832OUT DX, ALCALL DELAY1 ;短延时CMP AX, 0FFHJE SJ2 INC AL ;将AL从00H步加0FFHJMP SJ1
SJ2:MOV DX, A0832OUT DX, ALCALL DELAY1 ;短延时CMP AL, 00HJE SJ3DEC AL ;将AL从0FFH步减至00HJMP 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, A0832OUT DX, ALCMP AX, 00FFH ;判断AX是否达到幅度上线JAE JT2 ;达到上限,表示一次阶梯波完整生成,开始新一次生成CALL DELAY2 ;长延时ADD AX, BX ;用当前解体高度加上每个阶梯的高度得到下一阶梯的高度JMP JT1
JT2: LOOP JIETIDELAY1: ;短延时PUSH CXMOV CX, 01FFH
D1: PUSH AXPOP AXLOOP D1POP CXRETDELAY2: ;长延时PUSH CXMOV CX, 0FFFFH
D2: PUSH AXPOP AXLOOP D2POP CXRETCODE ENDSEND START
拓展
DATA SEGMENTSIGN DB 00H
DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,0000H MOV DS,AX ;设置数据段地址;设置中断向量MOV AX,OFFSET MIR7MOV SI,003CHMOV [SI],AXMOV AX,CSMOV SI,003EHMOV [SI],AXCLI ;关中断;设置ICW1~ICW4和OCW1MOV AL, 11H OUT 20H, ALMOV AL, 08HOUT 21H, ALMOV AL, 04HOUT 21H, ALMOV AL, 07HOUT 21H, ALMOV AL, 2FHOUT 21H, ALSTI ;关中断MAIN:CMP SIGN,00HJE JUCHICMP SIGN,01HJE JUXINGCMP SIGN,02HJE SANJIAOCMP SIGN,03HJE JIETI0JMP MAIN;产生锯齿波MOV CX,05H
JUCHI:CMP SIGN,0HJNE MAINMOV DX, 0600H ;DAC0832接IOY0,0600H为控制端口地址MOV AL, 00H ;AL为数字量
JC1: OUT DX, AL ;转换为模拟量CALL DELAY1 ;延时,此为短延时CMP AL ,0FFHJE JC2 INC AL ;AL步加1,直到等于0FFHJMP JC1
JC2:LOOP JUCHI;产生矩形波MOV CX, 05H ;产生矩形波的周期数为5次,如果想改变三角波产生周期请修改这里
JUXING:CMP SIGN,01HJNE MAINMOV DX, 0600HMOV AL, 00H ;先输出00H的波形OUT DX, ALCALL DELAY2 ;长延时MOV AL, 0FFH ;再输出0FFH的波形OUT DX, ALCALL DELAY2 ;长延时 LOOP JUXINGZHONGJIAN:JMP MAIN;产生三角波MOV CX, 05H ;产生三角波的周期数为5次,如果想改变三角波产生周期请修改这里
SANJIAO:
SJ1:CMP SIGN,02HJNE MAINMOV DX, 0600HOUT DX, ALCALL DELAY1 ;短延时CMP AL,0FFHJE SJ2 INC AL ;将AL从00H步加0FFHJMP SJ1
SJ2:MOV DX, 0600HOUT DX, ALCALL DELAY1 ;短延时CMP AL,00HJE SJ3 DEC AL ;将AL从0FFH步减至00HJMP 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,03HJNE ZHONGJIANMOV AX,0000H ;AX初始化0000H
JT1:MOV DX, 0600HOUT DX, ALCMP AX, 00FFH ;判断AX是否达到幅度上线JAE JT2 ;达到上限,表示一次阶梯波完整生成,开始新一次生成CALL DELAY2 ;长延时ADD AX, BX ;用当前解体高度加上每个阶梯的高度得到下一阶梯的高度JMP JT1
JT2: LOOP JIETI1
MIR7:PUSH AXCMP SIGN,03HJE SET0INC SIGNJMP QUIT
SET0:MOV SIGN,0H
QUIT:POP AXIRETDELAY1: ;短延时PUSH CXMOV CX, 01FFH
D1: PUSH AXPOP AXLOOP D1POP CXRETDELAY2: ;长延时PUSH CXMOV CX, 0FFFFH
D2: PUSH AXPOP AXLOOP D2POP CXRETCODE ENDSEND START