将D/A(实验箱自带)温度实时地显示在数码管显示器上,数码管3位,显示(-20~60)间的温度值。温度传感器的输出用实验箱上的旋钮模拟给出。
旋钮的输出是0-5V的,可以利用ADC0809将输出转换为0-255的数字,将0-255显示为-20到60,我是先将数字减去60再除以3产生新的数字,如果新的数字超过60,则显示60。设ADC0809转换的数字为x,则温度t=min(x/3,60),这里的除是整除。
关于数码管,我们其实就是用每个数码管显示一位数,所以要先对温度t进行拆分,拆分为3位数存到数组里,对于显示多个数字,只需要加个延时即可。
这里的ADC0809无法仿真,所以只仿真了其他部分,0809就是个摆设(emm,好像可以用0808代替,但是我的版本依然不行)。
; 端口改成实际的端口,例如我所使用的实验箱上的IOY0的地址为首0600H
; 则APORT地址则为0600H,BPORT:0602H,CPORT:0604H,CTRLP:0600H
APORT EQU 0000H
BPORT EQU 0002H
CPORT EQU 0004H
CTRLP EQU 0006H
DATA SEGMENT
OBUF DB 0,0,0,0,0,0,0
; 分别代表-,0,1,2,3,4,5,6,7,8,9在数码管上的显示
NUMS DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,79H,40H
WHICH DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV SI,DATA
MOV DS,SI
;设置控制字
MOV AL,89H
MOV DX,CTRLP
OUT DX,AL
READ:
MOV DX,CPORT
IN AL,DX
MOV AH,0H
MOV CX,3
MOV DX,0
DIV CX
; 判断正负
CMP AX,20
JAE CHAI
JMP CHAI1
;CALL BTOAD
;CALL PRINT
;JMP READ
; 计算正数
CHAI:
SUB AX,20
CMP AX,60
JB YYY
XXX:
MOV AX,60
YYY:
MOV BX,03H
MOV CX,10
MOV DI,OFFSET OBUF+3
LOOP1:
MOV DX,0
DIV CX
MOV DS:[DI],DL
DEC DI
DEC BX
JNZ LOOP1
JMP KEY1
; 计算负数,基本上和正数一样
CHAI1:
MOV DX,20
SUB DX,AX
MOV AX,DX
MOV DI,OFFSET OBUF+1
MOV DX,0BH
MOV DS:[DI],DX
MOV BX,02H
MOV CX,10
MOV DI,OFFSET OBUF+3
LOOP2:
MOV DX,0
DIV CX
MOV DS:[DI],DL
DEC DI
DEC BX
JNZ LOOP2
JMP KEY1
; 显示数字
; 设置延时
MOV CX,0FH
KEY1:
MOV SI,DATA
MOV DS,SI
MOV BX,03H
; 控制数码管显示的位置
MOV AL,11111011B
MOV DI,OFFSET WHICH
MOV DS:[DI],AL
KEY11:
MOV DX,BPORT
MOV AL,11111111B
OUT DX,AL
MOV AH,0H
MOV DI,OFFSET OBUF
ADD DI,BX
MOV AL,DS:[DI]
MOV SI,DATA
MOV DI,OFFSET NUMS
ADD DI,AX
MOV DS,SI
MOV AL,DS:[DI]
MOV DX,APORT
OUT DX,AL
MOV DX,BPORT
MOV DI,OFFSET WHICH
MOV AL,DS:[DI]
OUT DX,AL
ROR AL,1
MOV DS:[DI],AL
DEC BX
JNZ KEY11
DEC CX
JNZ KEY1
JMP READ
;RET
;PRINT ENDP
CODE ENDS
END START