源代码
(先开源,介绍后面再补,考完试有时间再说)
cpp
ORG 00H
SMGPTR DATA 30H
DISDATA DATA 31H
//DISDATA: 31H - 36H (DATA Arr)
SMGBIN DATA 40H
TEMP1 DATA 41H
TEMP2 DATA 42H
TEMP3 DATA 43H
SEC DATA 50H
COUNT1 DATA 51H
COUNT2 DATA 52H
COUNT3 DATA 53H
DHT11_TIME_CNT DATA 55H
DHT11_BYTE DATA 57H
DHT11_BIT DATA 58H
DHT11_DATA BIT P1.7
DHT11_UPDATE_FLAG DATA 59H
DHT11_DATA_ARR DATA 60H //Hum_H Hum_L Tem_H Tem_L Calc
//40bit -> 5Byte
//60H - 64H
LJMP START
ORG 000BH
LJMP T0M1_ISR
ORG 30H
START:
MOV SEC,#0
MOV COUNT1,#0
MOV COUNT2,#0
MOV COUNT3,#0
MOV DISDATA+0,#10
MOV DISDATA+1,#10
MOV DISDATA+2,#10
MOV DISDATA+3,#10
MOV DISDATA+4,#10
MOV DISDATA+5,#10
LCALL T0M1_INIT
MOV DHT11_UPDATE_FLAG,#1
LOOP:
LCALL DHT11_DATAGET
LCALL DISPLAY
SJMP LOOP
SJMP START
/////////////////////////////////////////////////////////
DHT11_START:
CLR DHT11_DATA
LCALL DELAY_20MS
SETB DHT11_DATA
LCALL DELAY_40US
JNB DHT11_DATA,$
JB DHT11_DATA,$
//START data Send Finish
;LCALL LED_TEST
DHT11_START_RET:
RET
DHT11_READ_BIT:
JNB DHT11_DATA,$
LCALL DELAY_30US
JB DHT11_DATA,DHT11_DHT11_BIT1
MOV DHT11_BIT,#0
SJMP DHT11_READ_BIT_RET
DHT11_DHT11_BIT1:MOV DHT11_BIT,#1
JB DHT11_DATA,$
DHT11_READ_BIT_RET:
RET
DHT11_READ:
MOV TEMP1,#0 //0-8
MOV DHT11_BYTE,#0
DHT11_READ_1:
MOV A,DHT11_BYTE
RL A
LCALL DHT11_READ_BIT
ADD A,DHT11_BIT
MOV DHT11_BYTE,A
INC TEMP1
MOV A,TEMP1
CJNE A,#8,DHT11_READ_1
DHT11_READ_RET:
RET
DHT11_DATAGET:
MOV A,DHT11_UPDATE_FLAG
CJNE A,#1,DHT11_DATAGET_RET
MOV DHT11_UPDATE_FLAG,#0
;LCALL DELAY_1S
LCALL DHT11_START
LCALL DHT11_READ
MOV A,DHT11_BYTE
MOV B,#10
DIV AB
MOV DISDATA+0,A
MOV DISDATA+1,B
LCALL DHT11_READ
LCALL DHT11_READ
MOV A,DHT11_BYTE
MOV B,#10
DIV AB
MOV DISDATA+4,A
MOV DISDATA+5,B
LCALL DHT11_READ
DHT11_DATAGET_RET:
RET
/////////////////////////////////////////////////////////
//TIMER0 MODE1
T0M1_INIT:
MOV TMOD,#01H
MOV TH0,#(65535-50000)/256
MOV TL0,#(65535-50000)MOD 256
SETB EA
SETB ET0
SETB TR0
RET
T0M1_ISR:
MOV TH0,#(65535-50000)/256
MOV TL0,#(65536-50000)MOD 256
INC COUNT1
MOV A,COUNT1
CJNE A,#4,T0M1_NEXT //50ms*4=200ms
MOV COUNT1,#0
INC COUNT2
MOV A,COUNT2
CJNE A,#5,T0M1_NEXT //200ms*5=1s
MOV COUNT2,#0
INC DHT11_TIME_CNT
MOV A,DHT11_TIME_CNT
CJNE A,#3,T0M1_ISR_1
MOV DHT11_TIME_CNT,#0
MOV DHT11_UPDATE_FLAG,#1
T0M1_ISR_1:
INC SEC
MOV A,SEC
CJNE A,#100,T0M1_NEXT
MOV SEC,#0
T0M1_NEXT:RETI
/////////////////////////////////////////////////////////
DISPLAY:
MOV SMGBIN,#01111111B
MOV SMGPTR,#0
DIS1:
MOV A,SMGBIN
RL A
MOV SMGBIN,A
MOV P2,SMGBIN //BIT CHOICE
MOV A,SMGPTR
ADD A,#DISDATA
MOV R0, A
MOV TEMP1,@R0 //DATA CHOICE
MOV DPTR,#TAB
MOV A,TEMP1
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY_1MS
INC SMGPTR
MOV A,SMGPTR
CJNE A,#6,DIS1
RET
/////////////////////////
DELAY_1MS:
MOV R5,#2
DELAY3:
MOV R6,#248
DELAY2:
DJNZ R6,DELAY2
DJNZ R5,DELAY3
RET
////////////////////////
DELAY_20MS:
MOV R4,#20
DELAY_20MS_1:
LCALL DELAY_1MS
DJNZ R4,DELAY_20MS_1
RET
////////////////////////
DELAY_20US:
MOV R7,#9
DELAY_20US_1:
DJNZ R7,DELAY_20US_1
RET
//////////////////////////
DELAY_30US:
MOV R7,#13
DELAY_30US_1:
DJNZ R7,DELAY_30US_1
RET
////////////////////////
DELAY_40US:
MOV R7, #19
DELAY_40US_1:
DJNZ R7, DELAY_40US_1
RET
////////////////////////
DELAY_3S:
MOV R3,#30
DELAY_3S_2:MOV R4,#100
DELAY_3S_1:
LCALL DELAY_1MS
DJNZ R4,DELAY_3S_1
DJNZ R3,DELAY_3S_2
RET
////////////////////////
DELAY_1S:
MOV R3,#10
DELAY_1S_2:MOV R4,#100
DELAY_1S_1:
LCALL DELAY_1MS
DJNZ R4,DELAY_1S_1
DJNZ R3,DELAY_1S_2
RET
////////////////////////
LED_TEST:
MOV R0,#100
LED_TEST_1:
CLR P1.1
;CLR P1.1
;LCALL DELAY_20MS
;SETB P1.1
;LCALL DELAY_20MS
;DJNZ R0,LED_TEST_1
RET
///////////////////////
TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
电路图

下面是DHT11部分的函数
DHT11_START是起始信号发送函数
DHT_READ_BIT是读取一bit位的函数
DHT_READ是读取一字节(8bit)的函数
DHT_DATAGET是样例函数,要放在主循环里面跑的,但是不会一直调用,要调用MOV DHT11_UPDATE_FLAG,#1才会刷新一次, 我把这个放在了定时器里面,数据手册里面说大概要2s调用一次,我这里就是3s调用一次,调用一次就会刷新一次
cpp
DHT11_START:
CLR DHT11_DATA
LCALL DELAY_20MS
SETB DHT11_DATA
LCALL DELAY_40US
JNB DHT11_DATA,$
JB DHT11_DATA,$
//START data Send Finish
;LCALL LED_TEST
DHT11_START_RET:
RET
DHT11_READ_BIT:
JNB DHT11_DATA,$
LCALL DELAY_30US
JB DHT11_DATA,DHT11_DHT11_BIT1
MOV DHT11_BIT,#0
SJMP DHT11_READ_BIT_RET
DHT11_DHT11_BIT1:MOV DHT11_BIT,#1
JB DHT11_DATA,$
DHT11_READ_BIT_RET:
RET
DHT11_READ:
MOV TEMP1,#0 //0-8
MOV DHT11_BYTE,#0
DHT11_READ_1:
MOV A,DHT11_BYTE
RL A
LCALL DHT11_READ_BIT
ADD A,DHT11_BIT
MOV DHT11_BYTE,A
INC TEMP1
MOV A,TEMP1
CJNE A,#8,DHT11_READ_1
DHT11_READ_RET:
RET
DHT11_DATAGET:
MOV A,DHT11_UPDATE_FLAG
CJNE A,#1,DHT11_DATAGET_RET
MOV DHT11_UPDATE_FLAG,#0
;LCALL DELAY_1S
LCALL DHT11_START
LCALL DHT11_READ
MOV A,DHT11_BYTE
MOV B,#10
DIV AB
MOV DISDATA+0,A
MOV DISDATA+1,B
LCALL DHT11_READ
LCALL DHT11_READ
MOV A,DHT11_BYTE
MOV B,#10
DIV AB
MOV DISDATA+4,A
MOV DISDATA+5,B
LCALL DHT11_READ
DHT11_DATAGET_RET:
RET