51单片机实验板DS18B20测温程序
/***********************************************
** 实验名:51单片机实验板温度测量(DS18B20)
** 创建人: 谢军洋
** 描 述:P3.7口输入,输出数据。
**------------------------------------------------------------------
** CPU:MCS-51
** 语言:汇编
** Fosc=12M
此次试验的仿真图
***************************************************/
GE_BIT EQU 30H
SHI_BIT EQU 31H
BAI_BIT EQU 32H
DI_8BIT EQU 33H
GAO_8BIT EQU 34H
DQ EQU P3.7
ORG 0000H
LJMP START
ORG 0020H
START:
MOV SP,#60H
LCALL ZHUANHUAN ;调用读温度子程序
LCALL CHULI
LCALL DISPLAY ;调用数码管显示子程序
LJMP START
;-------------------------------------------------
;这是DS18B20复位初始化子程序
INIT_1820:
SETB DQ
NOP
CLR DQ ;主机发出延时537微秒的复位低脉冲
MOV R1,#3
DU_1:
MOV R0,#107
DJNZ R0,$
DJNZ R1,DU_1
SETB DQ ;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
DU_2:JNB DQ,DU_3 ;等待DS18B20回应
DJNZ R0,DU_2
LJMP DU_4 ;延时
DU_3:SETB F0 ;置标志位,表示DS1820存在
LJMP DU_5
DU_4:CLR F0 ;清标志位,表示DS1820不存在
LJMP DU_7
DU_5:MOV R0,#117
DU_6:DJNZ R0,DU_6 ;时序要求延时一段时间
DU_7:SETB DQ
RET
;-------------------------------------------------
;写DS18B20的子程序(有具体的时序要求)
WRITE_1820:MOV R2,#8 ;一共8位数据
CLR C
WR1:CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
;-------------------------------------------------
;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_1820:MOV R4,#2 ;将温度高位和低位从DS18B20中读出
MOV R1,#DI_8BIT ;低位存入DI_8BIT,高位存入GAO_8BIT
RE0:MOV R2,#8 ;数据一共有8位
RE1:CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#9
RE2:DJNZ R3,RE2
MOV C,DQ
MOV R3,#23
RE3:DJNZ R3,RE3
RRC A
DJNZ R2,RE1
MOV @R1,A
INC R1
DJNZ R4,RE0
/* DEC R1
MOV A,GAO_8BIT
XCHD A,@R1
XCH A,@R1
MOV GAO_8BIT,A
MOV A,@R1
SWAP A
MOV @R1,A */
RET
;-------------------------------------------------
;读出后转换的温度值
ZHUANHUAN:
//SETB DQ
LCALL INIT_1820 ;先复位DS18B20
JB F0,ZH1
RET ;判断DS1820是否存在?若DS18B20不存在则返回
ZH1:MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ;发出温度转换命令
LCALL WRITE_1820
LCALL DISPLAY ;等待AD转换结束,12位的话750微秒
LCALL INIT_1820 ;准备读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCALL READ_1820
RET
;-------------------------------------------------
;数据处理子程序
CHULI:
MOV P0,GAO_8BIT
MOV P2,DI_8BIT
MOV A,GAO_8BIT
JB ACC.7,FU
MOV A,DI_8BIT
MOV B,#16
div AB
MOV 35H,A ;将DI_8BIT的高四位右移四位,存入35H中(温度值)
MOV A,B ;将TEMPER_L的低四位X10/16得小数后一位数.
MOV B,#10
MUL AB
MOV B,#16
div AB
MOV 36H,A ;将小数后一位数.存入36H中
MOV A,GAO_8BIT ;TEMPER_H中存放高8位数,权重16
MOV B,#16
MUL AB
ADD A,35H ;35H中存入温度值的整数部分
MOV B,#10
div AB
MOV GE_BIT,B ;个位存入30H中
MOV B,#10 ;
div AB ;
MOV SHI_BIT,B ;十位存入31H中
MOV B,#10 ;
div AB ;
MOV BAI_BIT,B ;百位存入32H中
MOV A,GAO_8BIT
MOV 37H,#10H ;
JB ACC.7,EXIT
MOV 37H,#00H
SJMP EXIT
FU:
MOV A,DI_8BIT
CPL A
ADD A,#1
MOV B,#16
div AB
MOV 35H,A ;将DI_8BIT的高四位右移四位,存入35H中(温度值)
MOV A,B ;将TEMPER_L的低四位X10/16得小数后一位数.
MOV B,#10
MUL AB
MOV B,#16
div AB
// MOV 36H,A ;将小数后一位数.存入36H中
// MOV A,GAO_8BIT ;TEMPER_H中存放高8位数,权重16
MOV B,#16
MUL AB
ADD A,35H ;35H中存入温度值的整数部分
MOV B,#10
div AB
MOV GE_BIT,B ;个位存入30H中
MOV B,#10 ;
div AB ;
MOV SHI_BIT,B ;十位存入31H中
MOV B,#10 ;
div AB ;
MOV BAI_BIT,B ;百位存入32H中
MOV A,GAO_8BIT
MOV 37H,#10H ;
JB ACC.7,EXIT
MOV 37H,#00H
SJMP EXIT
EXIT:RET
;-------------------------------------------------
;注:此次ds18b20温度测量实验在51hei单片机实验板http://www.51hei.com上进行,测试一切ok,下面是数据显示子程序
CL0:INC A
AJMP CL1
CHULI:MOV A,DI_8BIT
MOV B,#16
div AB
JB B.3,CL0
CL1:MOV 35H,A ;将DI_8BIT的高四位右移四位,存入35H中(温度值)
MOV A,B ;将TEMPER_L的低四位X10/16得小数后一位数.
MOV B,#10
MUL AB
MOV B,#16
div AB
MOV 36H,A ;将小数后一位数.存入36H中
MOV A,GAO_8BIT ;TEMPER_H中存放高8位数,权重16
MOV B,#16
MUL AB
ADD A,35H ;35H中存入温度值的整数部分
MOV B,#10
div AB
MOV GE_BIT,B ;个位存入30H中
MOV B,#10 ;
div AB ;
MOV SHI_BIT,B ;十位存入31H中
MOV B,#10 ;
div AB ;
MOV BAI_BIT,B ;百位存入32H中
MOV A,GAO_8BIT
MOV 37H,#10H ;
JB ACC.7,EXIT
MOV 37H,#00H
EXIT: RET */
- 关于RTX51 TINY的分析与探讨(05-30)
- 浅析8051模块化编程技巧(05-28)
- 基于DSP和单片机通信的液晶显示设计方案(07-20)
- 锁相环控制及初始化简析(08-27)
- 基于MSP430自动胀管控制器的研究(09-07)
- 嵌入式C实现延时程序的不同变量的区别(03-01)