winnie 发表于 2009-5-21 09:48:55

用PIC编写的读DS18B20的程序

;---------------------------------
; 单线通信的温度IC
; DS1820
; 实用程序
;---------------------------------
ORG PIC54
GOTO MAIN
ORG 0
;----------------------
;----------------------------
DELAY22
MOVLW D'200' ; DELAY 2*250=500mS
MOVWF COUNT1
DE32 MOVLW D'250' ; 8*250=2mS
MOVWF COUNT2
DE42 NOP ; 1+2+1=5uS
DECFSZ COUNT2,1
GOTO DE42
DECFSZ COUNT1,1
GOTO DE32
RETLW 0
;--------------------------------
; 实用程序范例
;********************************
MAIN
MOVLW 0FFH
TRIS RA
LOOP
CALL CONVERT
CALL DELAY22
CALL DELAY22
CALL GET_TEMP
GOTO LOOP
;------------------------
GET_TEMP
CALL INI
MOVLW 0CCH
MOVWF COMD
CALL WR1820
MOVLW 0BEH
MOVWF COMD
CALL WR1820
CALL RE1820
MOVF TEM_DATE,W
MOVWF TEM_DATEL
CALL RE1820
MOVF TEM_DATE,W
MOVWF TEM_DATEH
RETLW 0
;------------------------
CONVERT
CALL INI
MOVLW 0CCH
MOVWF COMD
CALL WR1820
MOVLW 44H
MOVWF COMD
CALL WR1820
RETLW 0
;---------DS1820---------
INI
;MOVLW B'00100000'
MOVLW 0
TRIS RA
BSF RA,3
NOP
BCF RA,3
MOVLW D'200'
MOVWF COUNT1
L0
DECFSZ COUNT1,1
GOTO L0
;MOVLW B'01100000'
MOVLW 0FH
TRIS RA
MOVLW D'30'
MOVWF COUNT1
L1
DECFSZ COUNT1,1
GOTO L1
BTFSC RA,3
GOTO INI
L2
MOVLW D'80'
MOVWF COUNT1
L3
DECFSZ COUNT1,1
GOTO L3
BTFSS RA,3
GOTO L0
RETLW 0
;-------------------------
WR1820
MOVLW 8
MOVWF COUNT2
WR0
;MOVLW B'00100000'
MOVLW 0
TRIS RA
BCF RA,3
NOP
NOP
MOVLW 2
MOVWF COUNT1
WR1
DECFSZ COUNT1,1
GOTO WR1
;MOVLW B'01111111'
MOVLW 0FH
BTFSC COMD,0
BSF RA,3
BTFSC COMD,0
TRIS RA
BCF STATUS,C
RRF COMD,1
MOVLW D'20'
MOVWF COUNT1
WR2
DECFSZ COUNT1,1
GOTO WR2
BSF RA,3
;MOVLW B'01100000'
MOVLW 0FH
TRIS RA
DECFSZ COUNT2,1
GOTO WR0
RETLW 0
;--------------------------
RE1820
MOVLW 8
MOVWF COUNT2
RE0
;MOVLW B'00100000'
MOVLW 0
TRIS RA
BCF RA,3
MOVLW 2
MOVWF COUNT1
RE1
DECFSZ COUNT1,1
GOTO RE1
;MOVLW B'01100000'
MOVLW 0FH
TRIS RA
NOP
BTFSS RA,3
BCF STATUS,C
BTFSC RA,3
BSF STATUS,C
RRF TEM_DATE,1
MOVLW D'20'
MOVWF COUNT1
RE2
DECFSZ COUNT1,1
GOTO RE2
DECFSZ COUNT2,1
GOTO RE0
BSF RA,3
RETLW 0
;-------------------------
;****************************
;**************************
END

winnie 发表于 2009-5-21 09:49:22

**************************************************
;**************************************************
;2002.4.5更改ds18b20电源由RA4供电
;晶振16MHz
;**************************************************
;**************************************************
          INCLUDE "D:\PIC\P16XX.EQU"
   INCLUDE "D:\PIC\LGL.MAC"
;**************************************************
;**************************************************
;MACRO
;**************************************************
WriteBit macro bitsel
BANK1_
bcfTRISA,bitsel;RA,Data1 设置为输出
BANK0_
bcfRA,bitsel
movlw.5   ;dly 25us
callDl
btfscDs1820Fg,Do
bsfRA,bitsel
movlw.55   ;dly 45us
callDl
bsfRA,bitsel
endm
;**************************************************
;RA
Data1equ 0
Data2equ 1
;**************************************************

;**************************************************

;**************************************************
;**************************************************
W_TEMP EQU 0X20 ;(0XA0)
STATUS_TEMP EQU 0X21
;======================      
ACCAHEQU 22H
;TEMP1EQU ACCAH
ACCALEQU 23H
;TEMP2EQU ACCAL
ACCBHEQU 24H
TEMP3equ ACCBH
ACCBLEQU 25H
TEMP4equ ACCBL
ACCCHequ 26h
ACCCLequ 27h
TEMPequ 28h
fgEQU   29H
Sflagequ 2ah
TxBufequ 2bh
RxBufequ 2ch
KeyVal equ 2dh
KeyBak equ 2eh
KeyCnt equ 2fh
;=======================
BeepLen equ 30h
RunStep equ 31h
ScourMode equ 32h
FgOutequ 33h
RunSec equ 34h
PxTemper equ 35h
XdTemper equ 36h
JinShuiCnt equ 37h
AutoXdDly12s equ 38h
T500ms equ 39h
T1sequ 3ah
DspBuf1 equ 3bh
DspBuf2 equ 3ch
CNTequ 3dh
TEMP1equ 3eh
TEMP2equ 3fh
Ds1820Fg equ 40h
DspDly equ 41h
BeepDly equ 42h
FgAlmequ 43h
;======================
Tdata0 equ 50h
Tdata1 equ 51h
Tdata2 equ 52h
Tdata3 equ 53h
Tdata4 equ 54h
Tdata5 equ 55h
Tdata6 equ 56h
Tdata7 equ 57h
Tdata8 equ 58h
;======================

;**************************************************
;Sflag
fg500ms equ 0
fg1sequ 1
fg_1sequ 2
fgFlash equ 3
FgAutoXd EQU 4
;EnbHot equ 5
KeyRun equ 5
FgRunequ 6
Fg

;**************************************************

;**************************************************
;**************************************************
;Ds1820Fg
Diequ 0
Doequ 1
TimeOut equ 2
Okequ 3
FgPxErr equ 4
FgXdErr equ 5
;**************************************************
;**************************************************

;**************************************************
;**************************************************
;**************************************************
      ORG   0000H;
      GOTO    MAIN            ; Skip over interrupt vecter
;*********************************
      ORG   04H             ; Interrupt Vector
      GOTO    INTZ
;*********************************
      ORG   10H             ; Begining of Program space
;**************************************************
;**************************************************
;**************************************************
   
;**************************************************


;**************************************************

;**************************************************
MAIN:

callTemperTrans1
callTemperRead1
BMAIN
;**************************************************
;**************************************************

;**************************************************
;**************************************************
;**************************************************
;**************************************************
DspOff:
bsf RB,DspCom1
bsf RB,DspCom2
return
;**************************************************

;**************************************************
;**************************************************
Dsp:
;dsp1 dsp2 dsp3 dsp4

return
;**************************************************
;
;**************************************************
      
;**************************************************
;**************************************************
;**************************************************
;**************************************************
;**************************************************
;**************************************************
Dly1us:;dly (2+2)*0.25=1
return
;**************************************************
;**************************************************

;**************************************************
;**************************************************
;**************************************************
;;入口:比特值在acc中
;**************************************************
Dl:
movwfTEMP1   ;dly
nop
decfsz TEMP1,f;
b$-2
return
;**************************************************
;**************************************************
;**************************************************
;**************************************************
WriteBit1:
WriteBit Data1
return
;**************************************************
;ds1820 比特读
;出口:比特值在Ds1820Fg,Di中
;**************************************************
ReadBit1:
BANK1_
bcfTRISA,Data1 ;RA,Data1 设置为输出
BANK0_
bcfRA,Data1 ;
bcfDs1820Fg,Di
callDly1us ;保持低电平至少1us
callDly1us
callDly1us
callDly1us
callDly1us
BANK1_
bsfTRISA,Data1 ;RA,Data1 设置为输入
BANK0_
movlw .6
call Dl
btfscRA,Data1
bsfDs1820Fg,Di
movlw.50
callDl
return
;**************************************************
;**************************************************
;ds1820 比特读
;出口:比特值在Ds1820Fg,Di中
;**************************************************
ReadBit2:
BANK1_
bcfTRISA,Data2 ;RA,Data2 设置为输出
BANK0_
bcfRA,Data2 ;
bcfDs1820Fg,Di
callDly1us ;保持低电平至少1us
callDly1us
callDly1us
callDly1us
callDly1us
BANK1_
bsfTRISA,Data2 ;RA,Data2 设置为输入
BANK0_
movlw .6
call Dl
btfscRA,Data2
bsfDs1820Fg,Di
movlw.50
callDl
return
;**************************************************
;**************************************************
;ds1820 字节读
;出口:比特值在RxBuf中
;**************************************************
ReadByte1:
bcf         INTCON,GIE ;关所有中断
clrfRxBuf
movlw.8
movwfTEMP
RxLoop1:
callReadBit1
CLRC
btfscDs1820Fg,Di
SETC
rrfRxBuf,f
decfsz TEMP,f
bRxLoop1
bsf         INTCON,GIE ;开所有中断
return
;**************************************************
;**************************************************
;**************************************************
;**************************************************
;ds1820 字节写
;入口:字节在acc中
;**************************************************
WriteByte1:
movwfTxBuf
bcf         INTCON,GIE ;关所有中断
movlw.8
movwfTEMP
WriteLoop1:
bcf   Ds1820Fg,Do
btfscTxBuf,0
bsfDs1820Fg,Do
callWriteBit1
rrfTxBuf,f
decfsz TEMP,f
bWriteLoop1
bsf         INTCON,GIE ;开所有中断
return
;**************************************************
;**************************************************
;;**************************************************
;**************************************************
;初始化ds1820
;如初始化成功则Ds1820Fg,Ok=1
;否则Ds1820Fg,Ok=0
;**************************************************
Ds1820Init1:
movlw.100
movwfTEMP
BANK1_
bcfTRISA,Data1 ;RA,Data1 设置为输出
BANK0_
bsfRA,Data1
movlw.10
callDl
bcfRA,Data1
movlw.200
callDl
movlw.200
callDl
movlw.200
callDl
BANK1_
bsfTRISA,Data1 ;RA,Data1 设置为输入
BANK0_
movlw.80
callDl
WaitLow:
btfssRA,Data1 ;等待Ds1820 拉低
bWaitHi
callDly1us
decfsz TEMP,f
bWaitLow
;BANK1_   ;超时释放总线
;bcfTRISA,Data1 ;RA,Data1 设置为输出
;BANK0_
bsfRA,Data1
bcfDs1820Fg,Ok ;
return
WaitHi:
movlw.100
movwfTEMP
WaitHi1:
btfscRA,Data1
bDs1820InitOk
callDly1us
decfsz TEMP,f
bWaitHi1
bsfRA,Data1 ;超时释放总线
bcfDs1820Fg,Ok
return
Ds1820InitOk:
bsfDs1820Fg,Ok
return
;**************************************************

;**************************************************
;**************************************************
;发送温度转换指令
;如成功则Ds1820Fg,Ok=1
;否则Ds1820Fg,Ok=0
;**************************************************
TemperTrans1:
callDsp
callDs1820Init1
btfscDs1820Fg,Ok
bTransOk
callDsp
callDly1ms
callDsp
callDly1ms
callDsp
callDly1ms
bcfDs1820Fg,Ok
return
TransOk:
movlw0xcc
callWriteByte1
callDsp
movlw0x44
callWriteByte1
movlw.200
movwfTEMP1
TransLoop:
decfsz TEMP1,f
bTransLoop1
bcfDs1820Fg,Ok
return
TransLoop1:
CLRWDT   
callDsp
callReadByte1
movlw0xff
xorwfRxBuf,w
btfssstatus,z
bTransLoop
bsfDs1820Fg,Ok
return
;**************************************************

;**************************************************
;**************************************************
Dly1ms:
movlw.200
callDl
movlw.200
callDl
movlw.200
callDl
movlw.200
callDl
movlw.200
callDl
return
;**************************************************
;**************************************************
TemperRead1:
callDsp
callDs1820Init1
btfscDs1820Fg,Ok
bReadInit1Ok
CLRWDT   
callDsp
callDly1ms
callDsp
callDly1ms

bcfDs1820Fg,Ok
return
ReadInit1Ok:
CLRWDT   
movlw0xcc
callWriteByte1
callDsp
movlw0xbe
callWriteByte1
callReadByte1
movfRxBuf,w
movwfTdata0
;=======================
callDsp
callReadByte1
movfRxBuf,w
movwfTdata1

bsfDs1820Fg,Ok
return
;**************************************************
;**************************************************
页: [1]
查看完整版本: 用PIC编写的读DS18B20的程序