51单片机汇编实现DHT11读取温湿度

源代码

(先开源,介绍后面再补,考完试有时间再说)

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
		
相关推荐
许商28 分钟前
【stm32】cmake脚本(一)
stm32·单片机·嵌入式硬件
polarislove021430 分钟前
8.1 时钟树-嵌入式铁头山羊STM32笔记
笔记·stm32·嵌入式硬件
染予1 小时前
对开漏输出的理解
单片机·嵌入式硬件
风行男孩1 小时前
stm32基础学习——OLED显示屏的基本使用
stm32·嵌入式硬件·学习
养一回月亮!2 小时前
FreeRTOS任务延迟:vTaskDelay与vTaskDelayUntil的深度对比
stm32·单片机·嵌入式硬件
悠哉悠哉愿意4 小时前
【EDA学习笔记】电子技术基础知识:基本元件
笔记·嵌入式硬件·学习·eda
宇宙realman_9995 小时前
Flash2833x_API的cmd文件与map文件对应关系
嵌入式硬件
Coder_Boy_5 小时前
基于 MQTT 的单片机与 Java 业务端双向通信全流程
java·单片机·嵌入式硬件
就是蠢啊5 小时前
51单片机——DAC数模转换实验(二)
单片机·嵌入式硬件·51单片机
boneStudent6 小时前
Day39:智能家居环境监测系统
stm32·单片机·嵌入式硬件·智能家居