分享一个DHT11程序,可以显示温度和湿度,只要买到正品DHT11模块,所得数据还是蛮准确的。 ;====================================================================================
;文件名: :
;日期: :
;文件版本号: :
;作者: :
;公司: :
;====================================================================================
;注释:RB0作DHT11的数据输入,RA0---RA3作为段选,RC0---RC6作为段选。 :
;====================================================================================
LIST P=16F72 ;列表伪指令。些处定义处理器等
#INCLUDE <P16F72.INC> ;包含标志头文件
__CONFIG(0x3F32) ;72的配置文件,选择晶体、全代码保护
;__DEBUG_OFF&_CP_ALL&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC;
;__CONFIG表示在.ASM文件里定义配置字,也就是配
;置字也被汇编成机器码文件,不需要在程序烧写时
;重新定义
#DEFINE DISP1 PORTA,0
#DEFINE DISP2 PORTA,1
#DEFINE DISP3 PORTA,2
#DEFINE DISP4 PORTA,3
;====================================================================================
SDHA EQU 20H
SDLA EQU 21H
WDHA EQU 22H
WDLA EQU 23H
T2JSQ EQU 24H
W_TEMP EQU 25H ;3个寄存器为中断用
STATUS_TEMP EQU 26H
PCLATH_TEMP EQU 27H ;
DATA_TMP EQU 28H
DL1 EQU 29H
DL2 EQU 30H
DL3 EQU 31H
COUNT EQU 32H
COUNT1 EQU 33H
COUNT2 EQU 34H
MSDA EQU 35H
LSDA EQU 36H
MSDB EQU 37H
LSDB EQU 38H
JSQ EQU 39H
;====================================================================================
ORG 0000H ;处理器复位向量,单片机复位后的程序入口
GOTO MAIN
ORG 0004H
GOTO ZD
;====================================主程序开始======================================
MAIN BSF STATUS,RP0
MOVLW B'00000000'
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB
MOVLW B'00000000' ;RC7为输出
MOVWF TRISC
MOVLW 0X06 ;将RA全数字化
MOVWF ADCON1
BSF PIE1,TMR2IE ;开TMR2中断
BCF STATUS,RP0
MOVLW B'11000000' ;开总中断外设中断
MOVWF INTCON
MOVLW B'00010000' ;对T2CON进行设置
MOVWF T2CON
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF T2JSQ
CLRF TMR2
CLRF DATA_TMP
CLRF COUNT2
CLRF JSQ
START
BSF PORTB,0
CALL DELAY1S ;
CALL DHT11_A
CALL BINBCD_A
CALL BINBCD_B
GOTO START
;===================================本机转换表=============================
CONVERT
ADDWF PCL,1
RETLW 0XC0 ;0 共阳1表示灭、共阴1表示亮
RETLW 0XF9 ;1
RETLW 0XA4 ;2
RETLW 0XB0 ;3
RETLW 0X99 ;4
RETLW 0X92 ;5
RETLW 0X82 ;6
RETLW 0XF8 ;7
RETLW 0X80 ;8
RETLW 0X90 ;9
;====================================传感器1的采集程序=================================
DHT11_A
BSF PORTB,0
MOVLW 0X04
MOVWF COUNT1
MOVLW 20H ;把一个寄存器的位置送给指针,必须指向当前寄存器
MOVWF FSR
BCF PORTB,0
CALL DELAY20MS ;主机给一个启动信号,大于18MS BSF PORTB,0
CALL DELAY30US ;主机给一个等待信号,在20-40US
BCF PORTB,0
BSF STATUS,RP0 ;主机由输出变成输入
MOVLW B'00000001' ;RB1为输入
MOVWF TRISB
BCF STATUS,RP0
BTFSC PORTB,0 ;检测RC7的电平,高则继续等待,高则延时80US
RETURN
CALL DELAY50US BTFSS PORTB,0 ;检测RC7的电平,低则继续等待,低则延时80US
RETURN
CALL DELAY80US
TESTA ;接收数据
MOVLW 0X08
MOVWF COUNT
BCF T2CON,TMR2ON
BCF T1CON,TMR1ON
LOOPA
BTFSC PORTB,0 ;当检测出高电平时则跳
GOTO $-1
CALL DELAY30US
BTFSS PORTB,0
GOTO $-1
CALL DELAY30US BTFSS PORTB,0 ;判断输入的数据是0还是1
GOTO $+3 ;是0则往DATA_TMP中移动一位0
BSF STATUS,C
GOTO $+2 ;是1则往DATA_TMP中移动一位1
BCF STATUS,C ;;;;;
RLF DATA_TMP
DECFSZ COUNT
GOTO LOOPA
MOVF DATA_TMP,W
MOVWF INDF ;这个是将DATA_TMP的数据映射到SDH等寄存器上
INCF FSR ;指向下一个寄存器
DECFSZ COUNT1,F ;循环4次
GOTO TESTA ;不到4次继续循环
BSF STATUS,RP0 ;采集完毕后主机由输入变成输入
CLRF TRISB
BCF STATUS,RP0
BSF T2CON,TMR2ON
BSF T1CON,TMR1ON
RETURN
;====================================湿度转换================================
BINBCD_A
BCF STATUS,C
MOVF SDHA,W
CLRF MSDA ;MSD指的是十进制的高位
MOVWF LSDA ;LSD指的是十进制的低位
GTENTH_A
MOVLW 0X0A
SUBWF LSDA,W
BTFSS STATUS,C
GOTO OVER_A
MOVWF LSDA
INCF MSDA
GOTO GTENTH_A
OVER_A
RETURN
;====================================温度转换================================
BINBCD_B
BCF STATUS,C
MOVF WDHA,W
CLRF MSDB ;MSD指的是十进制的高位
MOVWF LSDB ;LSD指的是十进制的低位
GTENTH_B
MOVLW 0X0A
SUBWF LSDB,W
BTFSS STATUS,C
GOTO OVER_B
MOVWF LSDB
INCF MSDB
GOTO GTENTH_B
OVER_B
RETURN
;==================================现场保护子程序====================================
PUSH
MOVWF W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP
MOVF PCLATH,W
MOVWF PCLATH_TEMP
RETURN
;==================================现场恢复子程序====================================
POP
MOVF PCLATH_TEMP,W
MOVWF PCLATH
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
;===================================中断代码写入=====================================
ZD
CALL PUSH ;进入现场保护子程序
BTFSC PIR1,TMR2IF
GOTO T2SET
GOTO POP
;=====================================中断显示======================================
T2SET
BCF PIR1,TMR2IF ;清位
BCF STATUS,Z
CLRF PORTA
INCF T2JSQ,F
CLRF TMR2
MOVF T2JSQ,W
XORLW 0X01
BTFSS STATUS,Z
GOTO $+6
BSF DISP1
MOVF MSDA,W
CALL CONVERT
MOVWF PORTC
GOTO POP
MOVF T2JSQ,W
XORLW 0X02
BTFSS STATUS,Z
GOTO $+6
BSF DISP2
MOVF LSDA,W
CALL CONVERT
MOVWF PORTC
GOTO POP
MOVF T2JSQ,W
XORLW 0X03
BTFSS STATUS,Z
GOTO $+6
BSF DISP3
MOVF MSDB,W
CALL CONVERT
MOVWF PORTC
GOTO POP
BCF STATUS,Z
MOVF T2JSQ,W
XORLW 0X04
BTFSS STATUS,Z
GOTO $+5
BSF DISP4
MOVF LSDB,W
CALL CONVERT
MOVWF PORTC
CLRF T2JSQ
GOTO POP
;==================================80uS延时========================================
DELAY80US
MOVLW 0X16
MOVWF DL1
CALL LOP
RETURN
;==================================50US延时========================================
DELAY50US
MOVLW 0X11
MOVWF DL1
CALL LOP
RETURN
;==================================30uS延时========================================
DELAY30US
MOVLW 0X08
MOVWF DL1
LOP DECFSZ DL1
GOTO LOP
RETURN
;==================================20ms延时========================================
DELAY20MS
MOVLW 20H
MOVWF DL1
LOP2 MOVLW 0D0H
MOVWF DL2
LOP1 DECFSZ DL2
GOTO LOP1
DECFSZ DL1
GOTO LOP2
RETURN
;==================================1秒延时========================================
DELAY1S
MOVLW 06H
MOVWF DL1
LOOP1
MOVLW 0EBH
MOVWF DL2
LOOP2
MOVLW 0ECH
MOVWF DL3
LOOP3
DECFSZ DL3
GOTO LOOP3
DECFSZ DL2
GOTO LOOP2
DECFSZ DL1
GOTO LOOP1
RETURN
END
资料仅供同学们学习使用
|