您好,欢迎来到保捱科技网。
搜索
您的当前位置:首页DS18B20测温程序

DS18B20测温程序

来源:保捱科技网
DS18B20测温程序(16F877A)

[日期:2008-03-04 ] [来源:net 作者:安步当车] [字体:大 中 小] (投递新闻)

;************************************************************************ ;<<温度计-基于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 ;转换后的个位 SHI ;转换后的十位 DATE_L

DATE_H ENDC

;*********************************************************************** ;复位矢量定义(对于16F877A)

;*********************************************************************** ORG 0000H ;复位矢量地址

GOTO MAIN ;程序跳转到MAIN主程序 ;----------------------------------------------------------------------

;*********************************************************************** ;主程序区

;*********************************************************************** ORG 0005H MAIN

NOP

CALL INTIAL

START BTFSS DQ ;数据线空闲状态为高电平 GOTO $-1

CALL RESET ;复位DS18B20

MOVLW 0CCH ;跳过读ROM命令 CALL WR18B20

MOVLW 44H ;温度转换 CALL WR18B20

CALL DELAY_750US ;延时750us CALL RESET ;复位DS18B20

MOVLW 0CCH ;跳过读ROM命令 CALL WR18B20

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 ;使数据线为输入 BCF STATUS,RP0 ;使当前体为体0 MOVLW 0FFH ;关闭段码 MOVWF PORTC

MOVLW 0FFH ;关闭位码 MOVWF PORTA

BTFSS DQ ;数据线空闲状态为高电平 GOTO $-1

CALL RESET ;复位DS18B20

MOVLW 0CCH ;跳过读ROM命令 CALL WR18B20

MOVLW 44H ;温度转换 CALL WR18B20

CALL DELAY_750US ;延时750us CALL RESET ;复位DS18B20

MOVLW 0CCH ;跳过读ROM命令 CALL WR18B20

MOVLW 0BEH ;读内部RAM中的9字节内容 CALL WR18B20 NOP NOP

CALL RE18B20 ;读数据 CALL RE18B20 ;读数据 CALL DELAY_MAX ;延时600ms CALL DELAY_MAX CALL DELAY_MAX RETLW 00H

;=======================================================================

;*********************************************************************** ;显示所测得的温度子程序

;*********************************************************************** DISPLAY

CALL _BCD MOVF SHI,W ANDLW 0FH

CALL TABLE ;调用查表指令 MOVWF PORTC ;显示十位段码 BCF PORTA,0 ;选通十位显示位码 CALL DELAY

BSF PORTA,0 ;关闭十位显示位码 MOVF GE,W ANDLW 0FH

CALL TABLE ;调用查表指令 MOVWF PORTC ;显示个位段码 BCF PORTA,1 ;选通个位显示位码 CALL DELAY

BSF PORTA,1 ;关闭个位显示位码 RETLW 00H

;=======================================================================

;*********************************************************************** ;二进制转BCD码

;*********************************************************************** _BCD CLRF SHI ;保存地址清零 CLRF GE

MOVF BIN_L,F ;组合码自己给自己赋值,测试是否为0

SKPNZ ;不为0则跳到下一步 RETLW 00H SHI_ MOVLW D'10'

SUBWF BIN_L,W ;BIN_L减10,结果存到W寄存器 BTFSS STATUS,C ;执行减法后,如果无借位 GOTO GE_ MOVWF BIN_L INCF SHI GOTO SHI_ GE_ MOVF BIN_L,W MOVWF GE

RETLW 00H

;=======================================================================

;*********************************************************************** ;延时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 ;程序结束

参考链接:http://www.picavr.com/news/2008-03/4532.htm

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baoaiwan.cn 版权所有 赣ICP备2024042794号-3

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务