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
		
相关推荐
点灯小铭5 小时前
基于单片机的超声波人体感应PWM自动调光灯设计与实现
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
玄奕子9 小时前
F280049C学习笔记之EPWM
单片机·嵌入式硬件·dsp开发·ti c2000·f280049c
资料,小偿10 小时前
8086汇编语言定制,8086仿真proteus8086定制,emu8086汇编语言
汇编
三品吉他手会点灯11 小时前
stm32f103学习笔记-16-RCC(第2节)-讲解系统时钟配置函数SetSysClockTo72()
笔记·stm32·单片机·嵌入式硬件·学习
范纹杉想快点毕业12 小时前
100道关于STM32的问题解答共十万字回答,适用入门嵌入式软件初级工程师,筑牢基础,技术积累,校招面试。
驱动开发·单片机·嵌入式硬件·fpga开发·硬件工程
国科安芯13 小时前
多输出电压条件下同步整流效率测试与优化
网络·单片机·嵌入式硬件·安全
搞机械的假程序猿15 小时前
普中51单片机学习笔记-流水灯
笔记·学习·51单片机
李宥小哥15 小时前
创建型设计模式1
stm32·嵌入式硬件·设计模式
std8602115 小时前
嵌入式软件与单片机的核心技术与应用
单片机·嵌入式硬件