分享一个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 资料仅供同学们学习使用 |
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) | Powered by Discuz! X3.4 |