51单片机汇编实现DHT11读取温湿度
源代码
(先开源,介绍后面再补,考完试有时间再说)
ORG 00HSMGPTR DATA 30HDISDATA DATA 31H//DISDATA: 31H - 36H (DATA Arr)SMGBIN DATA 40HTEMP1 DATA 41HTEMP2 DATA 42HTEMP3 DATA 43HSEC DATA 50HCOUNT1 DATA 51HCOUNT2 DATA 52HCOUNT3 DATA 53HDHT11_TIME_CNT DATA 55HDHT11_BYTE DATA 57H DHT11_BIT DATA 58HDHT11_DATA BIT P1.7DHT11_UPDATE_FLAG DATA 59HDHT11_DATA_ARR DATA 60H //Hum_H Hum_L Tem_H Tem_L Calc//40bit -> 5Byte//60H - 64HLJMP STARTORG 000BHLJMP T0M1_ISRORG 30HSTART:MOV SEC,#0MOV COUNT1,#0MOV COUNT2,#0MOV COUNT3,#0MOV DISDATA+0,#10MOV DISDATA+1,#10MOV DISDATA+2,#10MOV DISDATA+3,#10MOV DISDATA+4,#10MOV DISDATA+5,#10LCALL T0M1_INITMOV DHT11_UPDATE_FLAG,#1LOOP:LCALL DHT11_DATAGETLCALL DISPLAYSJMP LOOPSJMP START/////////////////////////////////////////////////////////DHT11_START:CLR DHT11_DATALCALL DELAY_20MSSETB DHT11_DATALCALL DELAY_40USJNB DHT11_DATA,$JB DHT11_DATA,$//START data Send Finish;LCALL LED_TESTDHT11_START_RET:RETDHT11_READ_BIT:JNB DHT11_DATA,$LCALL DELAY_30USJB DHT11_DATA,DHT11_DHT11_BIT1MOV DHT11_BIT,#0SJMP DHT11_READ_BIT_RETDHT11_DHT11_BIT1:MOV DHT11_BIT,#1JB DHT11_DATA,$DHT11_READ_BIT_RET:RETDHT11_READ:MOV TEMP1,#0 //0-8MOV DHT11_BYTE,#0DHT11_READ_1:MOV A,DHT11_BYTERL ALCALL DHT11_READ_BITADD A,DHT11_BITMOV DHT11_BYTE,AINC TEMP1MOV A,TEMP1CJNE A,#8,DHT11_READ_1DHT11_READ_RET:RETDHT11_DATAGET:MOV A,DHT11_UPDATE_FLAGCJNE A,#1,DHT11_DATAGET_RETMOV DHT11_UPDATE_FLAG,#0;LCALL DELAY_1SLCALL DHT11_STARTLCALL DHT11_READMOV A,DHT11_BYTEMOV B,#10DIV ABMOV DISDATA+0,AMOV DISDATA+1,BLCALL DHT11_READLCALL DHT11_READMOV A,DHT11_BYTEMOV B,#10DIV ABMOV DISDATA+4,AMOV DISDATA+5,BLCALL DHT11_READDHT11_DATAGET_RET:RET///////////////////////////////////////////////////////////TIMER0 MODE1T0M1_INIT:MOV TMOD,#01HMOV TH0,#(65535-50000)/256MOV TL0,#(65535-50000)MOD 256SETB EASETB ET0SETB TR0RETT0M1_ISR:MOV TH0,#(65535-50000)/256MOV TL0,#(65536-50000)MOD 256INC COUNT1MOV A,COUNT1CJNE A,#4,T0M1_NEXT //50ms*4=200msMOV COUNT1,#0INC COUNT2MOV A,COUNT2CJNE A,#5,T0M1_NEXT //200ms*5=1sMOV COUNT2,#0INC DHT11_TIME_CNTMOV A,DHT11_TIME_CNTCJNE A,#3,T0M1_ISR_1MOV DHT11_TIME_CNT,#0MOV DHT11_UPDATE_FLAG,#1T0M1_ISR_1:INC SECMOV A,SECCJNE A,#100,T0M1_NEXTMOV SEC,#0T0M1_NEXT:RETI/////////////////////////////////////////////////////////DISPLAY:MOV SMGBIN,#01111111BMOV SMGPTR,#0DIS1:MOV A,SMGBINRL AMOV SMGBIN,AMOV P2,SMGBIN //BIT CHOICEMOV A,SMGPTRADD A,#DISDATAMOV R0, AMOV TEMP1,@R0 //DATA CHOICEMOV DPTR,#TABMOV A,TEMP1MOVC A,@A+DPTRMOV P0,ALCALL DELAY_1MSINC SMGPTRMOV A,SMGPTRCJNE A,#6,DIS1RET/////////////////////////DELAY_1MS:MOV R5,#2 DELAY3:MOV R6,#248 DELAY2:DJNZ R6,DELAY2 DJNZ R5,DELAY3 RET ////////////////////////DELAY_20MS:MOV R4,#20DELAY_20MS_1:LCALL DELAY_1MSDJNZ R4,DELAY_20MS_1RET////////////////////////DELAY_20US:MOV R7,#9DELAY_20US_1:DJNZ R7,DELAY_20US_1RET//////////////////////////DELAY_30US:MOV R7,#13DELAY_30US_1:DJNZ R7,DELAY_30US_1RET////////////////////////DELAY_40US:MOV R7, #19 DELAY_40US_1:DJNZ R7, DELAY_40US_1 RET ////////////////////////DELAY_3S:MOV R3,#30DELAY_3S_2:MOV R4,#100DELAY_3S_1:LCALL DELAY_1MSDJNZ R4,DELAY_3S_1DJNZ R3,DELAY_3S_2RET////////////////////////DELAY_1S:MOV R3,#10DELAY_1S_2:MOV R4,#100DELAY_1S_1:LCALL DELAY_1MSDJNZ R4,DELAY_1S_1DJNZ R3,DELAY_1S_2RET////////////////////////LED_TEST:MOV R0,#100LED_TEST_1:CLR P1.1;CLR P1.1;LCALL DELAY_20MS;SETB P1.1;LCALL DELAY_20MS;DJNZ R0,LED_TEST_1RET///////////////////////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调用一次,调用一次就会刷新一次
DHT11_START:CLR DHT11_DATALCALL DELAY_20MSSETB DHT11_DATALCALL DELAY_40USJNB DHT11_DATA,$JB DHT11_DATA,$//START data Send Finish;LCALL LED_TESTDHT11_START_RET:RETDHT11_READ_BIT:JNB DHT11_DATA,$LCALL DELAY_30USJB DHT11_DATA,DHT11_DHT11_BIT1MOV DHT11_BIT,#0SJMP DHT11_READ_BIT_RETDHT11_DHT11_BIT1:MOV DHT11_BIT,#1JB DHT11_DATA,$DHT11_READ_BIT_RET:RETDHT11_READ:MOV TEMP1,#0 //0-8MOV DHT11_BYTE,#0DHT11_READ_1:MOV A,DHT11_BYTERL ALCALL DHT11_READ_BITADD A,DHT11_BITMOV DHT11_BYTE,AINC TEMP1MOV A,TEMP1CJNE A,#8,DHT11_READ_1DHT11_READ_RET:RETDHT11_DATAGET:MOV A,DHT11_UPDATE_FLAGCJNE A,#1,DHT11_DATAGET_RETMOV DHT11_UPDATE_FLAG,#0;LCALL DELAY_1SLCALL DHT11_STARTLCALL DHT11_READMOV A,DHT11_BYTEMOV B,#10DIV ABMOV DISDATA+0,AMOV DISDATA+1,BLCALL DHT11_READLCALL DHT11_READMOV A,DHT11_BYTEMOV B,#10DIV ABMOV DISDATA+4,AMOV DISDATA+5,BLCALL DHT11_READDHT11_DATAGET_RET:RET
