;************************************************************************
;<<温度计-基于DS18B20>>
;时间:2006.3.6
;程序文件名:“DS18B20.asm”
;功能实现:通过DS18B20来读取温度,显示在2位LED上,精确到1度
;硬件连接:(1)RC0-RC7接共阳数码管的段码A-H
; RA0-RA3接共阳数码管的位码DIG0-DIG3
;***********************************************************************
;***********************************************************************
;定义单片机型号为PIC16F877A
;程序包含文件:P16F877A.INC
;定义配置字
;***********************************************************************
LIST P=16F877A ;定义本程序所使用的芯片为PIC16F877A
#INCLUDE "P16F877A.INC" ;定义本程序包含该文件
__CONFIG 3F72H ;晶振配置HS,看门狗禁止,上电延时使能,掉电复位使能
;低电压编程禁止,代码不保护
#DEFINE DQ PORTB,2
#DEFINE DIR TRISB,2
CBLOCK 20H
Y1
Y2
COUNT1
COUNT2
COMD
DATE
BIN_L ;要进行转换的字节
GE ;转换后的个位
__CONFIG 3F72H ;晶振配置HS,看门狗禁止,上电延时使能,掉电复位使能
;低电压编程禁止,代码不保护
#DEFINE DQ PORTB,2
#DEFINE DIR TRISB,2
CBLOCK 20H
Y1
Y2
COUNT1
COUNT2
COMD
DATE
BIN_L ;要进行转换的字节
GE ;转换后的个位
__CONFIG 3F72H ;晶振配置HS,看门狗禁止,上电延时使能,掉电复位使能
;低电压编程禁止,代码不保护
#DEFINE DQ PORTB,2
#DEFINE DIR TRISB,2
CBLOCK 20H
Y1
Y2
COUNT1
COUNT2
COMD
DATE
BIN_L ;要进行转换的字节
GE ;转换后的个位
MOVLW 0BEH ;读内部RAM中的9字节内容
CALL WR18B20
NOP
CALL RE18B20 ;读数据
MOVF DATE,W
MOVWF DATE_L ;读低8位
CALL RE18B20 ;读数据
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 ;调用数码管显示程序
GOTO START
;=======================================================================
;***********************************************************************
;初始化和消影
;***********************************************************************
INTIAL BSF STATUS,RP0 ;定义当前体为体1,对方向寄存器进行修改
MOVLW 07H
MOVWF ADCON1 ;关闭A口的模拟通道
MOVLW 00H
MOVWF TRISC ;段码显示口为输出口
MOVLW 0F0H
ANDWF TRISA,1 ;使位码(RA0-RA3)为输出口
BSF DIR ;使数据线为输入
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 ;调用数码管显示程序
GOTO START
;=======================================================================
;***********************************************************************
;初始化和消影
;***********************************************************************
INTIAL BSF STATUS,RP0 ;定义当前体为体1,对方向寄存器进行修改
MOVLW 07H
MOVWF ADCON1 ;关闭A口的模拟通道
MOVLW 00H
MOVWF TRISC ;段码显示口为输出口
MOVLW 0F0H
ANDWF TRISA,1 ;使位码(RA0-RA3)为输出口
BSF DIR ;使数据线为输入
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 ;程序结束