查看: 749|回复: 0
打印 上一主题 下一主题

分享一个DHT11程序,可以显示温度和湿度

[复制链接]
跳转到指定楼层
沙发
发表于 2016-3-20 22:01:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

分享一个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  
                              



资料仅供同学们学习使用


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表