![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
微机汇编程序高手! 设计任务 信号发生器产生梯形波 源程序要使用汇编语言 程序今晚要 符合要求悬赏可以加 50
要求1从键盘输入四位密码,若相符则ADC0809开始采集数据,ADC0809通道0外接0~5V电压,转换数字量,在七段LED数码管上显示,若0<数字量<15H,则DAC0...
要求1从键盘输入四位密码,若相符则ADC0809开始采集数据,ADC0809通道0外接0~5V电压,转换数字量,在七段LED数码管上显示,若0<数字量<15H,则DAC0832输出每阶为1V的阶梯波。若15H<数字量<80H,则DAC0832输出正弦波。若80H<数字量<0A0H,则DAC0832输出梯形波。若0A0H<数字量<0C0H,则8254计数器0输出500HZ的方波。若0C0H<数字量<0FFH,8254计数器0输出1000HZ的方波。要求有较好的人机对话界面;在数据采集过程中,若键盘有键按下,则停止运行,当键盘有键按下值是“E”时,返回DOS。
总体设计:ADC0809通道0外接电位器上的0~5V电压,作为控制波形发生器产生波形信息的依据。
8254用来产生方波并为0809提供CLK时钟脉冲
DAC0832用来产生阶梯波 正弦波 梯形波
8255用来检测ADC0809的转换结束信息,同时控制七段LED数码管显示。键盘输入四位密码,若密码相符,则ADC0809开始采集数据,若键入“E"返回DOS;否则则在主菜单下显示密码错误信息;为保证ADC0809数据采集正确性,用当前采集数据二十次的平均值,作为产生波信息的控制依据。在程序运行中,若键盘有键按下,停止当前所产生的波形,当键盘重新输入正确密码,重新开始数据采集。
主程序流程如下,第一步保护现场显示信息——>第二步BX=10H,AL=0,从D/A输出AL——>第三步AL=51——》D/A输出AL,AL=AL+1——》AL=0FFH?若N。返回上一步,若Y——》延时——》D/A输出,AL=AL-1——》AL=33H?,若N,返回上一步,若Y——》BX=0?,若N返回第二步,若Y——》主键盘是否有键按下,若N,返回第三步,若Y——》恢复现场——》返回 展开
总体设计:ADC0809通道0外接电位器上的0~5V电压,作为控制波形发生器产生波形信息的依据。
8254用来产生方波并为0809提供CLK时钟脉冲
DAC0832用来产生阶梯波 正弦波 梯形波
8255用来检测ADC0809的转换结束信息,同时控制七段LED数码管显示。键盘输入四位密码,若密码相符,则ADC0809开始采集数据,若键入“E"返回DOS;否则则在主菜单下显示密码错误信息;为保证ADC0809数据采集正确性,用当前采集数据二十次的平均值,作为产生波信息的控制依据。在程序运行中,若键盘有键按下,停止当前所产生的波形,当键盘重新输入正确密码,重新开始数据采集。
主程序流程如下,第一步保护现场显示信息——>第二步BX=10H,AL=0,从D/A输出AL——>第三步AL=51——》D/A输出AL,AL=AL+1——》AL=0FFH?若N。返回上一步,若Y——》延时——》D/A输出,AL=AL-1——》AL=33H?,若N,返回上一步,若Y——》BX=0?,若N返回第二步,若Y——》主键盘是否有键按下,若N,返回第三步,若Y——》恢复现场——》返回 展开
1个回答
2011-06-13
展开全部
;***********Editor by zzy***********************
;***********v.1.1.23
;********************************************
IOY0 EQU 0D400H ;片选IOY0端口始地址
IOY1 EQU 0D440H ;片选IOY1端口始地址
IOY2 EQU 0D480H ;片选IOY2端口始地址
IOY3 EQU 0D4C0H ;片选IOY3端口始地址
;********************************************
ADC0809 EQU IOY0+00H ;ADC0809端口地址
PA55 EQU IOY1+00H ;8255的A口地址
PB55 EQU IOY1+04H ;8255的B口地址
PC55 EQU IOY1+08H ;8255的C口地址
PCTL EQU IOY1+0CH ;8255的控制寄存器地址
DAC0832 EQU IOY2+00H ;DAC0832端口地址
TIMER0 EQU IOY3+00H ;8254计数器0端口地址
TIMER1 EQU IOY3+04H ;8254计数器1端口地址
TIMER2 EQU IOY3+08H ;8254计数器2端口地址
TCTL EQU IOY3+0CH ;8254控制寄存器端口地址
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT
STR1 DB 'Please input password:',0AH,0DH,'$'
STR2 DB 'The password is not right !!!Please try again!!!',0AH,0DH,'$'
STR3 DB 'Welcome to the signal creat machine',0AH,0DH,'Loading ADC0809.....',0AH,0DH,'$'
STR4 DB 'DIS',0AH,0DH,'$'
DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H ;7段数码管的段位值
STABLE DB 80H,8CH,98H,0A5H,0B0H,0BCH,0C7H,0D1H,0DAH,0E2H,0EAH,0F0H,0F6H,0FAH,0FDH,0FFH,0FFH,0FDH,0FAH,0F6H,0F0H,0EAH,0E2H,0DAH,0D1H,0C7H,0BCH,0B0H,0A5H,98H,8CH,80H,7FH,73H,67H,5AH,4FH,43H,38H,2EH,25H,1DH,15H,0FH,09H,05H,02H,00H,00H,02H,05H,09H,0FH,15H,1DH,25H,2EH,38H,43H,4FH,5AH,67H,73H,7FH
AD DB ? ; 保存ad转换结果
PASSWORD DB 41H,42H,43H,44H ;预设密码 要改!!!!
PW DB 4 DUP (?) ;密码预留
YU DB 20 DUP (?) ;预留20个空间存放数据
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
L0: MOV DX,OFFSET STR1 ;显示提示信息
MOV AH,9
INT 21H
MOV SI,OFFSET PW
MOV CX,4
SCAN: MOV AH,01H
INT 21H
CMP AL,'E'
JZ QUIT
MOV [SI],AL
INC SI
LOOP SCAN
CALL COMP;看不懂
CMP AL,4
JB ERRO;什么意思
JMP RIGHT
ERRO: MOV DX,OFFSET STR2 ;显示提示信息
MOV AH,9
INT 21H
JMP L0
RIGHT: MOV DX,OFFSET STR3 ;显示提示信息
MOV AH,9
INT 21H
CALL CLK ;ADC0809 CLK输入 ,启动8254
MOV DX,PCTL ;初始化8255工作方式
MOV AL,88H ;1000 1000方式0,A口,B口输出,C口高四位输入
OUT DX,AL ;
DISAD: CALL AD0809
MOV DL,0FFH ;判断主键盘有无键按下
MOV AH,6
INT 21H
JZ DISAD
CMP AD,15H
JNB M1
CALL JIETI
JMP L0
M1: CMP AD,80H
JNB M2
CALL SIN
JMP L0
M2: CMP AD,0A0H
JNB M3
CALL TIXING
JMP L0
M3: CMP AD,0C0H
JNB M4
CALL FANG500
JMP L0
M4: CALL FANG1K
JMP L0
QUIT: MOV AX,4C00H ;结束程序退出
INT 21H
COMP PROC NEAR
MOV AL,0 ;初始化al,AL中保存相同字符的个数
MOV SI,OFFSET PW
MOV DI,OFFSET PASSWORD
MOV CX,4
COMPLOOP:
MOV AH,[DI]
CMP [SI],AH
JZ COMPS1
JMP COMPS2
COMPS1:INC AL
COMPS2:INC SI
INC DI
LOOP COMPLOOP
RET
COMP ENDP
DIS PROC NEAR ;显示键值子程序
PUSH AX ;以缓冲区存放的键值为键值表偏移找到键值并显示
MOV SI,3000H
MOV DL,0FDH
MOV AL,DL
AGAIN: PUSH DX
MOV DX,PA55
OUT DX,AL ;设置X1~X4,选通一个数码管
MOV AL,[SI] ;取出缓冲区中存放键值
MOV BX,OFFSET DTABLE
AND AX,00FFH
ADD BX,AX
MOV AL,[BX] ;将键值作为偏移和键值基地址相加得到相应的键值
MOV DX,PB55
OUT DX,AL ;写入数码管A~Dp
CALL DALLY
INC SI ;取下一个键值
POP DX
MOV AL,DL
TEST AL,01H ;判断是否显示完?
JZ OUT1 ;显示完,返回
ROR AL,1
MOV DL,AL
JMP AGAIN ;未显示完,跳回继续
OUT1: POP AX
RET
DIS ENDP
AD0809 PROC NEAR ;将IN0结果保存于bl中
MOV DX,ADC0809 ;启动0809的IN0
OUT DX,AL
AD1: MOV DX,PC55
IN AL,DX
CMP AL,80H
JB AD1
MOV DX,ADC0809
IN AL,DX
MOV AD,AL
MOV AH,AL
AND AL,0FH
MOV SI,3000H
MOV [SI],AL
MOV CL,4
SHR AH,CL
MOV [SI+1],AH
CALL DIS
RET
AD0809 ENDP
CLK PROC NEAR ;方波CLK时钟18.432K子程序
;****初始化8254计数器0工作在方式3,以十进制计数,初值为100*******
PUSH DX ;保护现场
PUSH AX ;保护现场
MOV DX,TCTL
MOV AL,17H ;0001 0111B
OUT DX,AL
MOV DX,TIMER0 ;装初值100
MOV AL,100D
OUT DX,AL
POP AX ;恢复现场
POP DX ;恢复现场
RET
CLK ENDP
FANG1K PROC NEAR ;方波1KHz子程序
;***初始化8254计数器1工作在方式3,以十进制计数; 踔滴?84******
PUSH DX ;保护现场
PUSH AX ;保护现场
MOV DX,TCTL
MOV AL,56H ;0101 0110B
OUT DX,AL
MOV DX,TIMER1
MOV AL,184
OUT DX,AL
MOV DL,0FFH ;判断主键盘有无键按下
MOV AH,6
INT 21H
POP AX ;恢复现场
POP DX ;恢复现场
RET
FANG1K ENDP
FANG500 PROC NEAR ;方波500Hz子程序
;***初始化8254计数器1工作在方式3,以十进制计数,初值为368******
PUSH DX ;保护现场
PUSH AX ;保护现场
MOV DX,TCTL
MOV AL,76H ;0111 0110B
OUT DX,AL
MOV DX,TIMER1
MOV AL,70H ;368D分高低位写入
OUT DX,AL
MOV AL,01H
OUT DX,AL
MOV DL,0FFH ;判断主键盘有无键按下
MOV AH,6
INT 21H
POP AX ;恢复现场
POP DX ;恢复现场
RET
FANG500 ENDP
JIETI PROC NEAR ;阶梯波子程序
PUSH DX
PUSH AX
J0: MOV AL,00H
J1: MOV DX,DAC0832
OUT DX,AL
CALL JIETIDALLY
ADD AL,33H
CMP AL,0FFH
JNE J1
MOV DL,0FFH ;判断主键盘有无键按下
MOV AH,6
INT 21H
JZ J0
POP AX
POP DX
RET
JIETI ENDP
SIN PROC NEAR ;正弦波子程序
PUSH AX
PUSH BX
PUSH DX
S1: MOV SI,OFFSET STABLE
MOV CX,64D
S2: MOV AL,[SI]
MOV DX,DAC0832
OUT DX,AL
INC SI
LOOP S2
MOV DL,0FFH ;判断主键盘有无键按下
MOV AH,6
INT 21H
JZ S1
POP DX
POP BX
POP AX
RET
SIN ENDP
TIXING PROC NEAR ;梯形波子程序
T : MOV AL,7FH
MOV DX,DAC0832
OUT DX,AL
CALL TIXINGDALLY
T2:
MOV DX,DAC0832
OUT DX,AL
DEC AL
CMP AL,00H
JNZ T2
T3:
MOV DX,DAC0832
OUT DX,AL
INC AL
CMP AL,7FH
JNZ T3
MOV DL,0FFH ;判断主键盘有无键按下
MOV AH,6
INT 21H
JZ T
RET
TIXING ENDP
;****延时子程序**********************
DALLY PROC NEAR
PUSH CX
PUSH AX
MOV CX,4000H
D1: MOV AX,0600H
D2: DEC AX
JNZ D2
LOOP D1
POP AX
POP CX
RET
DALLY ENDP
JIETIDALLY PROC NEAR
PUSH CX
PUSH AX
MOV CX,1000H
DD1: MOV AX,10H
DD2: DEC AX
JNZ DD2
LOOP DD1
POP AX
POP CX
RET
JIETIDALLY ENDP
TIXINGDALLY PROC NEAR
PUSH CX
PUSH AX
MOV CX,1000H
DDD1: MOV AX,0FFH
DDD2: DEC AX
JNZ DDD2
LOOP DDD1
POP AX
POP CX
RET
TIXINGDALLY ENDP
CODE ENDS
END START
;***********v.1.1.23
;********************************************
IOY0 EQU 0D400H ;片选IOY0端口始地址
IOY1 EQU 0D440H ;片选IOY1端口始地址
IOY2 EQU 0D480H ;片选IOY2端口始地址
IOY3 EQU 0D4C0H ;片选IOY3端口始地址
;********************************************
ADC0809 EQU IOY0+00H ;ADC0809端口地址
PA55 EQU IOY1+00H ;8255的A口地址
PB55 EQU IOY1+04H ;8255的B口地址
PC55 EQU IOY1+08H ;8255的C口地址
PCTL EQU IOY1+0CH ;8255的控制寄存器地址
DAC0832 EQU IOY2+00H ;DAC0832端口地址
TIMER0 EQU IOY3+00H ;8254计数器0端口地址
TIMER1 EQU IOY3+04H ;8254计数器1端口地址
TIMER2 EQU IOY3+08H ;8254计数器2端口地址
TCTL EQU IOY3+0CH ;8254控制寄存器端口地址
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT
STR1 DB 'Please input password:',0AH,0DH,'$'
STR2 DB 'The password is not right !!!Please try again!!!',0AH,0DH,'$'
STR3 DB 'Welcome to the signal creat machine',0AH,0DH,'Loading ADC0809.....',0AH,0DH,'$'
STR4 DB 'DIS',0AH,0DH,'$'
DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H ;7段数码管的段位值
STABLE DB 80H,8CH,98H,0A5H,0B0H,0BCH,0C7H,0D1H,0DAH,0E2H,0EAH,0F0H,0F6H,0FAH,0FDH,0FFH,0FFH,0FDH,0FAH,0F6H,0F0H,0EAH,0E2H,0DAH,0D1H,0C7H,0BCH,0B0H,0A5H,98H,8CH,80H,7FH,73H,67H,5AH,4FH,43H,38H,2EH,25H,1DH,15H,0FH,09H,05H,02H,00H,00H,02H,05H,09H,0FH,15H,1DH,25H,2EH,38H,43H,4FH,5AH,67H,73H,7FH
AD DB ? ; 保存ad转换结果
PASSWORD DB 41H,42H,43H,44H ;预设密码 要改!!!!
PW DB 4 DUP (?) ;密码预留
YU DB 20 DUP (?) ;预留20个空间存放数据
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
L0: MOV DX,OFFSET STR1 ;显示提示信息
MOV AH,9
INT 21H
MOV SI,OFFSET PW
MOV CX,4
SCAN: MOV AH,01H
INT 21H
CMP AL,'E'
JZ QUIT
MOV [SI],AL
INC SI
LOOP SCAN
CALL COMP;看不懂
CMP AL,4
JB ERRO;什么意思
JMP RIGHT
ERRO: MOV DX,OFFSET STR2 ;显示提示信息
MOV AH,9
INT 21H
JMP L0
RIGHT: MOV DX,OFFSET STR3 ;显示提示信息
MOV AH,9
INT 21H
CALL CLK ;ADC0809 CLK输入 ,启动8254
MOV DX,PCTL ;初始化8255工作方式
MOV AL,88H ;1000 1000方式0,A口,B口输出,C口高四位输入
OUT DX,AL ;
DISAD: CALL AD0809
MOV DL,0FFH ;判断主键盘有无键按下
MOV AH,6
INT 21H
JZ DISAD
CMP AD,15H
JNB M1
CALL JIETI
JMP L0
M1: CMP AD,80H
JNB M2
CALL SIN
JMP L0
M2: CMP AD,0A0H
JNB M3
CALL TIXING
JMP L0
M3: CMP AD,0C0H
JNB M4
CALL FANG500
JMP L0
M4: CALL FANG1K
JMP L0
QUIT: MOV AX,4C00H ;结束程序退出
INT 21H
COMP PROC NEAR
MOV AL,0 ;初始化al,AL中保存相同字符的个数
MOV SI,OFFSET PW
MOV DI,OFFSET PASSWORD
MOV CX,4
COMPLOOP:
MOV AH,[DI]
CMP [SI],AH
JZ COMPS1
JMP COMPS2
COMPS1:INC AL
COMPS2:INC SI
INC DI
LOOP COMPLOOP
RET
COMP ENDP
DIS PROC NEAR ;显示键值子程序
PUSH AX ;以缓冲区存放的键值为键值表偏移找到键值并显示
MOV SI,3000H
MOV DL,0FDH
MOV AL,DL
AGAIN: PUSH DX
MOV DX,PA55
OUT DX,AL ;设置X1~X4,选通一个数码管
MOV AL,[SI] ;取出缓冲区中存放键值
MOV BX,OFFSET DTABLE
AND AX,00FFH
ADD BX,AX
MOV AL,[BX] ;将键值作为偏移和键值基地址相加得到相应的键值
MOV DX,PB55
OUT DX,AL ;写入数码管A~Dp
CALL DALLY
INC SI ;取下一个键值
POP DX
MOV AL,DL
TEST AL,01H ;判断是否显示完?
JZ OUT1 ;显示完,返回
ROR AL,1
MOV DL,AL
JMP AGAIN ;未显示完,跳回继续
OUT1: POP AX
RET
DIS ENDP
AD0809 PROC NEAR ;将IN0结果保存于bl中
MOV DX,ADC0809 ;启动0809的IN0
OUT DX,AL
AD1: MOV DX,PC55
IN AL,DX
CMP AL,80H
JB AD1
MOV DX,ADC0809
IN AL,DX
MOV AD,AL
MOV AH,AL
AND AL,0FH
MOV SI,3000H
MOV [SI],AL
MOV CL,4
SHR AH,CL
MOV [SI+1],AH
CALL DIS
RET
AD0809 ENDP
CLK PROC NEAR ;方波CLK时钟18.432K子程序
;****初始化8254计数器0工作在方式3,以十进制计数,初值为100*******
PUSH DX ;保护现场
PUSH AX ;保护现场
MOV DX,TCTL
MOV AL,17H ;0001 0111B
OUT DX,AL
MOV DX,TIMER0 ;装初值100
MOV AL,100D
OUT DX,AL
POP AX ;恢复现场
POP DX ;恢复现场
RET
CLK ENDP
FANG1K PROC NEAR ;方波1KHz子程序
;***初始化8254计数器1工作在方式3,以十进制计数; 踔滴?84******
PUSH DX ;保护现场
PUSH AX ;保护现场
MOV DX,TCTL
MOV AL,56H ;0101 0110B
OUT DX,AL
MOV DX,TIMER1
MOV AL,184
OUT DX,AL
MOV DL,0FFH ;判断主键盘有无键按下
MOV AH,6
INT 21H
POP AX ;恢复现场
POP DX ;恢复现场
RET
FANG1K ENDP
FANG500 PROC NEAR ;方波500Hz子程序
;***初始化8254计数器1工作在方式3,以十进制计数,初值为368******
PUSH DX ;保护现场
PUSH AX ;保护现场
MOV DX,TCTL
MOV AL,76H ;0111 0110B
OUT DX,AL
MOV DX,TIMER1
MOV AL,70H ;368D分高低位写入
OUT DX,AL
MOV AL,01H
OUT DX,AL
MOV DL,0FFH ;判断主键盘有无键按下
MOV AH,6
INT 21H
POP AX ;恢复现场
POP DX ;恢复现场
RET
FANG500 ENDP
JIETI PROC NEAR ;阶梯波子程序
PUSH DX
PUSH AX
J0: MOV AL,00H
J1: MOV DX,DAC0832
OUT DX,AL
CALL JIETIDALLY
ADD AL,33H
CMP AL,0FFH
JNE J1
MOV DL,0FFH ;判断主键盘有无键按下
MOV AH,6
INT 21H
JZ J0
POP AX
POP DX
RET
JIETI ENDP
SIN PROC NEAR ;正弦波子程序
PUSH AX
PUSH BX
PUSH DX
S1: MOV SI,OFFSET STABLE
MOV CX,64D
S2: MOV AL,[SI]
MOV DX,DAC0832
OUT DX,AL
INC SI
LOOP S2
MOV DL,0FFH ;判断主键盘有无键按下
MOV AH,6
INT 21H
JZ S1
POP DX
POP BX
POP AX
RET
SIN ENDP
TIXING PROC NEAR ;梯形波子程序
T : MOV AL,7FH
MOV DX,DAC0832
OUT DX,AL
CALL TIXINGDALLY
T2:
MOV DX,DAC0832
OUT DX,AL
DEC AL
CMP AL,00H
JNZ T2
T3:
MOV DX,DAC0832
OUT DX,AL
INC AL
CMP AL,7FH
JNZ T3
MOV DL,0FFH ;判断主键盘有无键按下
MOV AH,6
INT 21H
JZ T
RET
TIXING ENDP
;****延时子程序**********************
DALLY PROC NEAR
PUSH CX
PUSH AX
MOV CX,4000H
D1: MOV AX,0600H
D2: DEC AX
JNZ D2
LOOP D1
POP AX
POP CX
RET
DALLY ENDP
JIETIDALLY PROC NEAR
PUSH CX
PUSH AX
MOV CX,1000H
DD1: MOV AX,10H
DD2: DEC AX
JNZ DD2
LOOP DD1
POP AX
POP CX
RET
JIETIDALLY ENDP
TIXINGDALLY PROC NEAR
PUSH CX
PUSH AX
MOV CX,1000H
DDD1: MOV AX,0FFH
DDD2: DEC AX
JNZ DDD2
LOOP DDD1
POP AX
POP CX
RET
TIXINGDALLY ENDP
CODE ENDS
END START
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询