PIC16F877A控制DS18B20汇编程序
;**********************************************************
;延时200ms
;************************************************************
DELAY_MAX
MOVLW 0FFH
MOVWF Y1
MOVLW 0FFH
MOVWF Y2
DECFSZ Y2
GOTO $-1
DECFSZ Y1
GOTO $-5
RETLW 00H
;==========================================
;***************************************************
;延时6ms
;*****************************************************
DELAY
MOVLW 03FH
MOVWF Y1
MOVLW 020H
MOVWF Y2
DECFSZ Y2
GOTO $-1
DECFSZ Y1
GOTO $-5
RETLW 00H
;==============================================
;********************************************
;延时750us子程序
;**********************************************************
DELAY_750US
MOVLW 09H
MOVWF Y1
MOVLW 01AH
MOVWF Y2
DECFSZ Y2
GOTO $-1
DECFSZ Y1
GOTO $-5
RETLW 00H
;=========================================
;*******************************************************
;查表子程序,用于显示段码数字
;数码管为共阳数码管
;********************************************************
TABLE
ADDWF PCL,F
RETLW 0C0H ;"0"
RETLW 0F9H ;"1"
RETLW 0A4H ;"2"
RETLW 0B0H ;"3"
RETLW 99H ;"4"
RETLW 92H ;"5"
RETLW 82H ;"6"
RETLW 0F8H ;"7"
RETLW 80H ;"8"
RETLW 90H ;"9"
;===============================================
;***********************************************************
;DS18B20复位和应答子程序
;************************************************************
RESET BSF STATUS,RP0 ;使当前体为体1
BCF DIR ;使数据位为输出
BCF STATUS,RP0 ;使当前体为体0
BSF DQ ;拉高数据位
NOP ;空循环
BCF DQ ;拉低数据位
MOVLW D'200' ;延时600us
MOVWF Y1
DECFSZ Y1
GOTO $-1
BSF STATUS,RP0 ;使当前体为体1
BSF DIR ;使数据位为输入
BCF STATUS,RP0 ;使当前体为体0
MOVLW D'30' ;延时90us
MOVWF Y1
DECFSZ Y1
GOTO $-1
BTFSC DQ ;主机接收到低电平应答脉冲,跳转到下一句
GOTO RESET
MOVLW D'80' ;延时240us
MOVWF Y1
DECFSZ Y1
GOTO $-1
BTFSS DQ ;主机接收到高电平应答脉冲,跳转到下一句
GOTO RESET
RETLW 00H ;返回00H,复位应答结束
;=================================================
;***********************************************************
;写DS18B20子程序
;************************************************************
WR18B20
MOVWF COMD ;把要写的数据写到COMD内
MOVLW D'8'
MOVWF COUNT2 ;大循环8次
WR0 BSF STATUS,RP0 ;使当前体为体1
BCF DIR ;使数据位为输出
BCF STATUS,RP0 ;使当前体为体0
BCF DQ ;拉低数据线
NOP
NOP
MOVLW D'2'
MOVWF COUNT1 ;延时9us
WR1 DECFSZ COUNT1,1
GOTO WR1
BTFSC COMD,0 ;COMD最低位为0则跳转到下一句
BSF DQ ;拉高数据线
BTFSC COMD,0 ;COMD最低位为0则跳转到下一句
NOP
BCF STATUS,C ;进位位置0
RRF COMD,1 ;带进位位,COMD向右移一位
MOVLW D'20' ;延时60us
MOVWF COUNT1
WR2 DECFSZ COUNT1,1
GOTO WR2
BSF DQ ;拉高数据线,空闲状态
BSF STATUS,RP0 ;使当前体为体1
BSF DIR ;使数据位为输入
BCF STATUS,RP0 ;使当前体为体0
DECFSZ COUNT2,1 ;8次循环到了则跳出
GOTO WR0
RETLW 00H
;====================================================
******************
;读18B20子程序
;**********************************************************
RE18B20
MOVLW 8
MOVWF COUNT2
RE0 BSF STATUS,RP0 ;使当前体为体1
BCF DIR ;使数据位为输出
BCF STATUS,RP0 ;使当前体为体0
BCF DQ
MOVLW 2
MOVWF COUNT1
RE1 DECFSZ COUNT1,1
GOTO RE1
BSF STATUS,RP0 ;使当前体为体1
BSF DIR ;使数据位为输入
BCF STATUS,RP0 ;使当前体为体0
NOP
BTFSS DQ ;如果数据线为高电平,则C=1
BCF STATUS,C
BTFSC DQ ;如果数据线为低电平,则C=0
BSF STATUS,C
RRF DATE,1 ;数据依次存在DATE上
MOVLW D'20' ;延时60us
MOVWF COUNT1
RE2 DECFSZ COUNT1,1
GOTO RE2
DECFSZ COUNT2,1
GOTO RE0
BSF DQ
RETLW 00H
;======================================================
;==============================================
END ;程序结束
PIC16F877A DS18B20 汇编程序 相关文章:
- pic16f877a的电平变化中断(interrupt on change)使用误区(12-03)
- 用单片机pic16f877a实现鼠标数据的采集(12-03)
- PIC16F877A一路舵机参数化控制程序(12-02)
- PIC16F877A与PC机串行通信C语言源程序(12-02)
- PIC16F877A和AVR的单片机的PWM输出程序(12-02)
- PIC16F877的A/D模块(11-24)