PIC16F877A控制DS18B20匯編程序
;***********************************************
;功能實現(xiàn):通過DS18B20來讀取溫度,顯示在2位LED上,精確到1度
;硬件連接:(1)RC0-RC7接共陽數(shù)碼管的段碼A-H
; RA0-RA3接共陽數(shù)碼管的位碼DIG0-DIG3
;***************************************************
;****************************************************
;定義單片機型號為PIC16F877A
;程序包含文件:P16F877A.INC
;定義配置字
;*********************************************************
LIST P=16F877A ;定義本程序所使用的芯片為PIC16F877A
#INCLUDE "P16F877A.INC" ;定義本程序包含該文件
__CONFIG 3F72H ;晶振配置HS,看門狗禁止,上電延時使能,掉電復(fù)位使能
;低電壓編程禁止,代碼不保護(hù)
#DEFINE DQ PORTB,2
#DEFINE DIR TRISB,2
CBLOCK 20H
Y1
Y2
COUNT1
COUNT2
COMD
DATE
BIN_L ;要進(jìn)行轉(zhuǎn)換的字節(jié)
GE ;轉(zhuǎn)換后的個位
SHI ;轉(zhuǎn)換后的十位
DATE_L
DATE_H
ENDC
;*****************************************************
;復(fù)位矢量定義(對于16F877A)
;***************************************************
ORG 0000H ;復(fù)位矢量地址
GOTO MAIN ;程序跳轉(zhuǎn)到MAIN主程序
;----------------------------------------------------------------------
;***************************************************
;主程序區(qū)
;************************************************
ORG 0005H
MAIN
NOP
CALL INTIAL
START BTFSS DQ ;數(shù)據(jù)線空閑狀態(tài)為高電平
GOTO $-1
CALL RESET ;復(fù)位DS18B20
MOVLW 0CCH ;跳過讀ROM命令
CALL WR18B20
MOVLW 44H ;溫度轉(zhuǎn)換
CALL WR18B20
CALL DELAY_750US ;延時750us
CALL RESET ;復(fù)位DS18B20
MOVLW 0CCH ;跳過讀ROM命令
CALL WR18B20
MOVLW 0BEH ;讀內(nèi)部RAM中的9字節(jié)內(nèi)容
CALL WR18B20
NOP
CALL RE18B20 ;讀數(shù)據(jù)
MOVF DATE,W
MOVWF DATE_L ;讀低8位
CALL RE18B20 ;讀數(shù)據(jù)
MOVF DATE,W
MOVWF DATE_H ;讀高8位
MOVF DATE_L,W
;------------------------顯示處理--------------------------------------
RRF DATE_H,F
RRF DATE_L,F
RRF DATE_H,F
RRF DATE_L,F
RRF DATE_H,F
RRF DATE_L,F
RRF DATE_H,F
RRF DATE_L,F
MOVF DATE_L,W
MOVWF BIN_L ;把高8位的低4位和低8位的高4位組合起來
CALL DISPLAY ;調(diào)用數(shù)碼管顯示程序
GOTO START
;=================================================
;************************************************
;初始化和消影
;***********************************************************
INTIAL BSF STATUS,RP0 ;定義當(dāng)前體為體1,對方向寄存器進(jìn)行修改
MOVLW 07H
MOVWF ADCON1 ;關(guān)閉A口的模擬通道
MOVLW 00H
MOVWF TRISC ;段碼顯示口為輸出口
MOVLW 0F0H
ANDWF TRISA,1 ;使位碼(RA0-RA3)為輸出口
BSF DIR ;使數(shù)據(jù)線為輸入
BCF STATUS,RP0 ;使當(dāng)前體為體0
MOVLW 0FFH ;關(guān)閉段碼
MOVWF PORTC
MOVLW 0FFH ;關(guān)閉位碼
MOVWF PORTA
BTFSS DQ ;數(shù)據(jù)線空閑狀態(tài)為高電平
GOTO $-1
CALL RESET ;復(fù)位DS18B20
MOVLW 0CCH ;跳過讀ROM命令
CALL WR18B20
MOVLW 44H ;溫度轉(zhuǎn)換
CALL WR18B20
CALL DELAY_750US ;延時750us
CALL RESET ;復(fù)位DS18B20
MOVLW 0CCH ;跳過讀ROM命令
CALL WR18B20
MOVLW 0BEH ;讀內(nèi)部RAM中的9字節(jié)內(nèi)容
CALL WR18B20
NOP
NOP
CALL RE18B20 ;讀數(shù)據(jù)
CALL RE18B20 ;讀數(shù)據(jù)
CALL DELAY_MAX ;延時600ms
CALL DELAY_MAX
CALL DELAY_MAX
RETLW 00H
;===================================================
;**************************************************
;顯示所測得的溫度子程序
;**********************************************
DISPLAY
CALL _BCD
MOVF SHI,W
ANDLW 0FH
CALL TABLE ;調(diào)用查表指令
MOVWF PORTC ;顯示十位段碼
BCF PORTA,0 ;選通十位顯示位碼
CALL DELAY
BSF PORTA,0 ;關(guān)閉十位顯示位碼
MOVF GE,W
ANDLW 0FH
CALL TABLE ;調(diào)用查表指令
MOVWF PORTC ;顯示個位段碼
BCF PORTA,1 ;選通個位顯示位碼
CALL DELAY
BSF PORTA,1 ;關(guān)閉個位顯示位碼
RETLW 00H
評論