您好,欢迎来到尚车旅游网。
搜索
您的当前位置:首页DS18B20温度测量程序(汇编)

DS18B20温度测量程序(汇编)

来源:尚车旅游网


ORG 0000H

;单片机内存分配申明!

TEMPER_L EQU 29H;用于保存读出温度的低8位

TEMPER_H EQU 28H;用于保存读出温度的高8位

FLAG1 EQU 38H;是否检测到DS18B20标志位

a_bit equ 20h ;数码管个位数存放内存位置

b_bit equ 21h ;数码管十位数存放内存位置

;进行温度显示,这里我们考虑用网站提供的两位数码管来显示温度

;显示范围00到99度,显示精度为1度

;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位

;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度

;这个转化温度的方法非常简洁无需乘于0.0625系数

MAIN: LCALL GET_TEMPER;调用读温度子程序

MOV A,29H

MOV C,40H;将28H中的最低位移入C

RRC A

MOV C,41H

RRC A

MOV C,42H

RRC A

MOV C,43H

RRC A

MOV 29H,A

LCALL DISPLAY;调用数码管显示子程序

JNB FLAG1,MM1

CLR P1.0

SJMP MAIN

MM1: SETB P1.0

SJMP MAIN

INIT_1820: SETB P2.2 ; 这是DS18B20复位初始化子程序

NOP

CLR P2.2

MOV R1,#3 ;主机发出延时537微秒的复位低脉冲

TSR1: MOV R0,#107

DJNZ R0,$

DJNZ R1,TSR1

SETB P2.2 ;然后拉高数据线

NOP

NOP

NOP

MOV R0,#25H

TSR2: JNB P2.2,TSR3 ;等待DS18B20回应

DJNZ R0,TSR2

LJMP TSR4 ; 延时

TSR3: SETB FLAG1 ; 置标志位,表示DS1820存在

LJMP TSR5

TSR4: CLR FLAG1 ; 清标志位,表示DS1820不存在

LJMP TSR7

TSR5: MOV R0,#70

TSR6: DJNZ R0,TSR6 ; 时序要求延时一段时间

TSR7: SETB P2.2

RET

GET_TEMPER: SETB P2.2 ; 读出转换后的温度值

LCALL INIT_1820;先复位DS18B20

JB FLAG1,TSS2

RET ; 判断DS1820是否存在?若DS18B20不存在则返回

TSS2: 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_18200; 将读出的温度数据保存到35H/36H

RET

WRITE_1820: MOV R2,#8;写DS18B20的子程序(有具体的时序要求),一共8位数据

CLR C

WR1: CLR P2.2

MOV R3,#5

DJNZ R3,$

RRC A

MOV P2.2,C

MOV R3,#21

DJNZ R3,$

SETB P2.2

NOP

DJNZ R2,WR1

SETB P2.2

RET

READ_18200: MOV R4,#2 ; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据,将温度高位和低位从DS18B20中读出

MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)

RE00: MOV R2,#8;数据一共有8位

RE01: CLR C

SETB P2.2

NOP

NOP

CLR P2.2

NOP

NOP

NOP

SETB P2.2

MOV R3,#8

RE10: DJNZ R3,RE10

MOV C,P2.2

MOV R3,#21

RE20: DJNZ R3,RE20

RRC A

DJNZ R2,RE01

MOV @R1,A

DEC R1

DJNZ R4,RE00

RET

display: mov a,29H;显示子程序将29H中的十六进制数转换成10进制

mov b,#10 ;10进制/10=10进制

div ab

mov b_bit,a ;十位在a

mov a_bit,b ;个位在b

mov dptr,#numtab ;指定查表启始地址

mov r0,#4

dpl1: mov r1,#250 ;显示1000次

dplop: mov a,a_bit ;取个位数

MOVC A,@A+DPTR ;查个位数的7段代码

mov p0,a ;送出个位的7段代码

clr p2.6 ;开个位显示

acall d1ms ;显示1ms

setb p2.6

mov a,b_bit ;取十位数

MOVC A,@A+DPTR ;查十位数的7段代码

mov p0,a ;送出十位的7段代码

clr p2.7 ;开十位显示

acall d1ms ;显示1ms

setb p2.7

djnz r1,dplop ;100次没完循环

djnz r0,dpl1 ;4个100次没完循环

ret

D1MS: MOV R7,#80 ;1MS延时

DJNZ R7,$

RET

numtab: DB 0C0H,0F9H,0A4H,0B0H, 099H, 092H, 082H,0F8H 080H, 090H ;实验板上的7段数码管0~9数字的共阴显示代码

end

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

Copyright © 2019- sceh.cn 版权所有 湘ICP备2023017654号-4

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

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