天堂草原最受欢迎的角色,天堂动漫,天堂在线,色天堂下载,天堂中文在线资源,亚洲男人天堂

技術熱線: 4007-888-234
設計開發

專注差異化嵌入式產品解決方案 給智能產品定制注入靈魂給予生命

開發工具

提供開發工具、應用測試 完善的開發代碼案例庫分享

技術支持

從全面的產品導入到強大技術支援服務 全程貼心伴隨服務,創造無限潛能!

新品推廣

提供新的芯片及解決方案,提升客戶產品競爭力

新聞中心

提供最新的單片機資訊,行業消息以及公司新聞動態

適合初學者的1BUS總線-DS18B20的小例子

更新時間: 2019-03-23
閱讀量:1693

十年專注單片機方案開發的方案公司英銳恩,分享適合初學者的1BUS總線-DS18B20的小例子。英銳恩現提供服務產品涉及主控芯片:8位單片機、16位單片機、32位單片機及各類運算放大器等。

#INCLUDE P16F877A.INC DAT_D EQU PORTA DAT_T EQU TRISA TMP0 EQU 30H PDBYTE EQU TMP0+1 COUNT EQU TMP0+2 IOBYTE EQU TMP0+3 WENDUH EQU TMP0+4 WENDUL EQU TMP0+5 DQ EQU 2 ORG 00H NOP NOP SETUP: BCF STATUS,RP0 BCF STATUS,GIE CLRF PORTC CLRF PORTA BSF STATUS,RP0 MOVLW H'07' MOVWF ADCON1 CLRF TRISC MOVLW H'0FF' MOVWF TRISA BCF STATUS,RP0 GOTO START START: BTFSS PORTA,DQ GOTO START CALL OW_RESET ;初始化DS18B20 BTFSS PDBYTE,0 GOTO ERROR_1 MOVLW H'0CC' ;直訪ROM指令 CALL DSTXBYTE MOVLW H'44' ;轉換溫度指令 CALL DSTXBYTE WAIT1: CALL DELAY CALL DELAY CALL OW_RESET ;初始化DS18B20 MOVLW H'0CC' CALL DSTXBYTE ;直訪ROM指令 MOVLW H'0BE' CALL DSTXBYTE ;讀取溫度命令 CALL DSRXBYTE NOP MOVF IOBYTE,W MOVWF PORTC ;顯示溫度低字節(二進制) GOTO START ERROR_1: NOP GOTO START

;************************************************************************************ OW_HIZ MACRO ;強制DQ變為高組態 BSF STATUS,RP0 ;選擇數據存儲器BANK1 BSF DAT_T,DQ ;使DQ引腳變為高阻態 BCF STATUS,RP0 ;選擇數據存儲器的BANK0 ENDM ;-------------------------------------------------------------------- OW_LO MACRO ;強制DQ變為邏輯低電平 BCF STATUS,RP0 ;選擇數據存儲器的BANK0 BCF DAT_D,DQ ;清除DQ位 BSF STATUS,RP0 ;選擇數據存儲器的BANK1 BCF DAT_T,DQ ;把DQ引腳作為輸出 BCF STATUS,RP0 ;選擇數據存儲器的BANK0 ENDM ;-------------------------------------------------------------------- WAIT MACRO TIME ;延時TIMEUS ;時間必須是5US的整數 MOVLW (TIME/5)-1 ;處理時間:1US MOVWF TMP0 ;處理時間:1US CALL WAIT5U ;處理時間:2US ENDM ;************************************************************************************ WAIT5U: ;需要5US來完成 NOP ;處理時間為1US NOP ;處理時間為1US DECFSZ TMP0,F ;如果不為零,處理時間為1US,如果為零,處理時間為2US GOTO WAIT5U ;處理時間為2US RETLW 0 ;處理時間為2US ;************************************************************************************ OW_RESET: OW_HIZ ;以口線為高電平開始 CLRF PDBYTE ;清除PD字節 OW_LO ; WAIT D'500' ;驅動器輸出低電平500US OW_HIZ ; WAIT D'70' ;釋放口線,等待PD脈沖70US BTFSS DAT_D,DQ ;讀PD脈沖 INCF PDBYTE,F ;如果檢測到了PD脈沖,就把PDBYTE置位1 WAIT D'430' ;在PD脈沖后等待430US RETLW 0 ; ;-------------------------------------------------------------------- DSTXBYTE: MOVWF IOBYTE ;要發送的字節從W開始 MOVLW D'8' ;從IOBYTE開始發送 MOVWF COUNT ;置COUNT為8,表示要發送的比特數 DSTXLP: OW_LO ; NOP ; NOP NOP ;口線變低電平5US NOP NOP RRF IOBYTE,F ;數據字節 BTFSC STATUS,C ;檢查IOBYTE的LSB是1還是0 BSF DAT_D,DQ ;如果LSB是1,線路為高電平 WAIT D'60' ;連續驅動線路60US OW_HIZ ;為了上拉,釋放口線 NOP NOP ;2US的恢復時間 DECFSZ COUNT,F ;位計數器減1 GOTO DSTXLP ; RETLW 

0 ; ;-------------------------------------------------------------------- DSRXBYTE: MOVLW D'8' ;讀入的字節保存入IOBYTE MOVWF COUNT ;把COUNT設為8,來進行位數計數 DSRXLP: OW_LO ; NOP NOP NOP ;把DQ變低6US NOP NOP NOP ; OW_HIZ ;變為HIZ,等待4US NOP NOP NOP NOP ; MOVF DAT_D,W ;讀DQ ANDLW B'00000100' ;屏蔽DQ位 ADDLW D'255' ;如果DQ=1,則C=1;如果DQ=0則C=0 RRF IOBYTE,F ;

把C移位至IOBYTE WAIT D'50' ;等50US直到時隙末 DECFSZ COUNT,F ;位計數器減1 GOTO DSRXLP ; RETLW 0 ;************************************************************************************ DELAY ;子程序名,也是子程序入口地址 movlw 0Ffh ;將外層循環參數值FFH經過W movwf H'20' ;送入用作外循環變量的20H單元 lp0 movlw 0Ffh ;將內層循環參數值FFH經過W movwf 21h ;送入用作內循環變量的21H單元 lp1 decfsz 21h,F ;變量21H內容遞減,若為0跳躍 goto lp1 ;跳轉到LP1處 decfsz 20h,F ;變量20H內容遞減,若為0跳躍 goto lp0 ;跳躍到LP0處 return ;返回主程序 END

(文源網絡,侵刪)

联系我们: 中阳县| 香格里拉县| 治多县| 延川县| 长治市| 华坪县| 荆州市| 大方县| 晋宁县| 盐城市| 廉江市| 灵寿县| 双鸭山市| 珠海市| 仙游县| 邵阳县| 广昌县| 伊金霍洛旗| 翁源县| 延川县| 内丘县| 宜丰县| 仪征市| 鄂伦春自治旗| 屯留县| 南丹县| 池州市| 西青区| 安溪县| 兴山县| 天峻县| 浙江省| 荆门市| 安康市| 忻城县| 阜南县| 塔河县| 读书| 皋兰县| 大兴区| 营山县|