A8255 EQU 0000H ;8255各端口地址
B8255 EQU 0002H
C8255 EQU 0004H
Q8255 EQU 0006H
CODE SEGMENT 'CODE' ;代码段
ASSUME DS:DATA,CS:CODE,SS:STACK
START: ;程序起始点
MOV AX,STACK ;初始化堆栈段
MOV SS,AX
MOV AX,TOP
MOV SP,AX
MOV AX,DATA ;初始化数据段
MOV DS,AX
MOV AL,80H ;8255初始化
MOV DX,Q8255
OUT DX,AL
RUN:
CALL DIGIT ;数位分离
CALL DISP ;数码管显示
INC COUNT
CMP COUNT,100
JB RUN
MOV COUNT,0
CALL READ_DHT11 ;读取DHT11数据
CALL BIJIAO
JMP RUN
READ_DHT11 PROC ;读取DHT11数据
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV AL,80H ;8255初始化
MOV DX,Q8255
OUT DX,AL
MOV DX,C8255 ;DHT11开始信号
MOV AL,1
OUT DX,AL
MOV AL,0
OUT DX,AL
CALL DELAY_18MS
MOV AL,1
OUT DX,AL
MOV AL,89H ;8255C口输入
MOV DX,Q8255
OUT DX,AL
MOV DX,C8255
MOV CX,1000
WAIT_LOW:
IN AL,DX
TEST AL,1 ;是否到80us低电平
JZ LOW_DET
LOOP WAIT_LOW
JMP TIMEOUT_ERROR
LOW_DET:
MOV CX,1000
WAIT_HIGH:
IN AL,DX
TEST AL,1 ;是否到80us高电平
JNZ HIGH_DET
LOOP WAIT_HIGH
JMP TIMEOUT_ERROR
HIGH_DET:
LEA DI,DATA_BUF
MOV CX,5 ;5个字节数据
READ_BYTE:
MOV BH,8 ;8位
MOV BL,0 ;临时储存
WAIT_START:
IN AL,DX
TEST AL,1
JNZ WAIT_START
READ_BIT:
MOV AH,0
WAIT_H: ;数据发送前50微秒低电平
IN AL,DX
TEST AL,1
JZ WAIT_H
CNT_HIGH:
INC AH ;记录脉冲宽度
IN AL,DX
TEST AL,1
JZ HIGH_END
CMP AH,16
JB CNT_HIGH
HIGH_END:
CMP AH,6 ;短于40微秒为0,长于则为1
JB BIT_0
STC
JMP BIT_END
BIT_0:
CLC
BIT_END:
RCL BL,1
DEC BH
JNZ READ_BIT
MOV [DI],BL
INC DI
LOOP READ_BYTE
MOV AL,[DATA_BUF]
ADD AL,[DATA_BUF+1]
ADD AL,[DATA_BUF+2]
ADD AL,[DATA_BUF+3]
CMP AL,[DATA_BUF+4]
JNZ CRC_ERROR
CLC ;CF清零
JMP FIN
TIMEOUT_ERROR:
MOV ERROR,0FFH
STC
JMP FIN
CRC_ERROR:
MOV ERROR,0FEH
STC
FIN:
POP DI
POP DX
POP CX
POP BX
POP AX
RET
READ_DHT11 ENDP
DISP PROC ;显示温湿度
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
LEA BX,LED_TAB
LEA SI,LED_BUF
MOV CX,4
MOV AH,11111110B
LOP0:
MOV AL,[SI]
XLAT
ADD BYTE PTR AL,BUZZER
MOV DX,A8255
OUT DX,AL ;段码值送8255A口
MOV AL,AH
MOV DX,B8255
OUT DX,AL ;LED位选送8255B口
CALL DELAY_50US
MOV AL,0FFH
OUT DX,AL
INC SI
ROL AH,1
LOOP LOP0
POP SI
POP DX
POP CX
POP BX
POP AX
RET
DISP ENDP
DIGIT PROC ;分离出个位和十位并存入数位暂存区
PUSH AX
PUSH BX
PUSH SI
PUSH DI
MOV BL,2
LEA DI,LED_BUF
LEA SI,DATA_BUF
NEXT:
MOV AL,[SI]
ADD SI,2
MOV AH,0
MOV BH,10
DIV BH
MOV BYTE PTR [DI],AH
INC DI
MOV BYTE PTR [DI],AL
INC DI
DEC BL
JNZ NEXT
POP DI
POP SI
POP BX
POP AX
RET
DIGIT ENDP
BIJIAO PROC
PUSH SI
PUSH AX
LEA SI,DATA_BUF
MOV AL,RH
CMP BYTE PTR [SI],AL
JA JING
ADD SI,2
MOV AL,RT
CMP BYTE PTR [SI],AL
JA JING
MOV BUZZER,0
JMP FIN0
JING:
MOV BUZZER,80H
FIN0:
POP AX
POP SI
RET
BIJIAO ENDP
DELAY_50US PROC ;50微秒延时
PUSH CX
MOV CX,10
WAIT0:
LOOP WAIT0
POP CX
RET
DELAY_50US ENDP
DELAY_18MS PROC ;18毫秒延时
PUSH CX
MOV CX,5000
WAIT0:
LOOP WAIT0
POP CX
RET
DELAY_18MS ENDP
CODE ENDS
DATA SEGMENT ;定义数据段
;LED段码
LED_TAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
DATA_BUF DB 0,0,0,0,0 ;湿度整数&小数、温度整数&小数、校验码
LED_BUF DB 0,0,0,0 ;数位暂存区
RH DB 50
RT DB 20
BUZZER DB 0
ERROR DB 0 ;错误码
COUNT DB 0
DATA ENDS
STACK SEGMENT 'STACK' ;定义堆栈段
SSF DB 1000 DUP(?)
TOP EQU LENGTH SSF
STACK ENDS
END START
最新发布