分享一个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                                  
 
  
  
 资料仅供同学们学习使用  
 |