*
程序效果:通过DS18B20读取温度值,显示对应的温度值
程序重在理解时序,及延时时间
*/
DS18DQ EQU P1.3 //P1.3与DS18DQ等同,便于理解
SPEAKER EQU P2.0 //驱动蜂鸣器
TEMPH EQU 29H //保存读出温度的低8位
TEMPL EQU 28H //保存读出温度的高8位
DS18FLAG EQU 40H //设置标志
ORG 0000H
LJMP START
ORG 0030H
START: MOV 30H,#00 //设置初始值
MOV 31H,#00
MOV 32H,#00
START1: LCALL DS18_GF //设置DS18B20的工作方式
LCALL CONVERT_TEMPERATURE //输出转换温度命令
LCALL DELAY750MS //延时750ms
LCALL GET_TEMPERATURE //获?温度数据
LCALL CAL_TEMPERATURE //计算温度数值
LCALL DISPLAY //调用显示,防止掉显
LJMP START1 //无限循环
//初始化子程序
DS18_START:
PUSH 07H //保存R7的值,防止改变R7的数值
SETB DS18DQ //将数据线拉高
NOP //延时1us
CLR DS18DQ //将数据线拉低
MOV R7,#0 //延时大约512us
DJNZ R7,$
SETB DS18DQ //将数据线拉高
MOV R7,#40
DS18_START1: //延时大约160us
JNB DS18DQ,DS18_START2 //检查DS18B20是否工作正常
DJNZ R7,DS18_START1
SETB DS18FLAG //工作不正常
CLR SPEAKER //驱动蜂鸣器,报警
DS18_START2:
CLR DS18FLAG
MOV R7,#100 //延时月200us
DJNZ R7,$
POP 07H //恢复R7的值
RET
//设置DS18B20工作方式
DS18_GF:CLR DS18FLAG //清除标志
LCALL DS18_START //调用初始化子程序
MOV A,#0CCH //跳跃ROM指令
LCALL DS18_SEND //
MOV A,#4EH //向RAM写数据
LCALL DS18_SEND
MOV A,#75
LCALL DS18_SEND
MOV A,#0
LCALL DS18_SEND
MOV A,#7FH //设置工作方式
LCALL DS18_SEND
CLR DS18DQ //释放总线
LCALL DELAY500US //延时500us
LOOP: LCALL CONVERT_TEMPERATURE //调用转子程序
MOV R5,#80
LOOP1: LCALL DISPLAY //调用显示防止掉显,同时等待转换完成
DJNZ R5,LOOP1
LCALL GET_TEMPERATURE //获?转换值
LCALL CAL_TEMPERATURE //计算温度值
LJMP LOOP
RET[page]
//输出转换温度命令
CONVERT_TEMPERATURE:
LCALL DS18_START //调用初始化子程序
MOV A,#0CCH //跳跃ROM指令
LCALL DS18_SEND
MOV A,#44H //温度转换
LCALL DS18_SEND
RET
//读?温度数据
GET_TEMPERATURE:
LCALL DS18_START //调用初始化子程序
MOV A,#0CCH //跳跃ROM指令
LCALL DS18_SEND
MOV A,#0BEH //从RAM中的数据
LCALL DS18_SEND
LCALL DELAY60US
LCALL DS18_READ
MOV TEMPL,A //将获得数据的低八位存到TEMPL
LCALL DS18_READ
MOV TEMPH,A //将获得数据的高八位存到TEMPH
CLR DS18DQ //即复位。否则会一直读到
LCALL DELAY501US //暂存第九字节
RET
//计算获得温度值,便于现实
CAL_TEMPERATURE:
PUSH 07H //暂存,防止改变R7的数据
CLR C //进位标志清零
MOV R7,#04H //循环次数
EX2: MOV A,TEMPH // 这些语句的作用是:
RRC A // 整数位在:TEMPL中
MOV TEMPH,A //?数位在:TEMPH中的高半
MOV A,TEMPL
RRC A
MOV TEMPL,A
DJNZ R7,EX2 //
MOV A,TEMPH //
RLC A //这些语句的作用是:
RLC A //把TEMPH得高半移到低四位中
RLC A
RLC A //
ANL A,#0FH //屏蔽高四位,保留低四位
MOV DPTR,#TAB_TEMP //赋带?数点的数值表的表首地址
MOVC A,@A+DPTR
MOV 30H,A //暂存该值,用于显示
MOV A,TEMPL
CLR C
MOV B,#0AH
DIV AB //分离整数位的高低四位
MOV 32H,A //暂存十位
MOV A,B
ADD A,#10H
MOV 31H,A //暂存个位
POP 07H //恢复R7的值
RET
//写数据子程序
DS18_SEND:
PUSH 06H //保护Rn的值
PUSH 07H
//以下语句是"写 笔毙虻脑?
SETB DS18DQ //写时序是有DS18DQ的下降沿决定
NOP //延时1us
MOV R6,#08H //循环次数,一个字节
DS18_SEND1:
CLR DS18DQ //拉低,产生下降沿
MOV R7,#07 //延时大约15us
DJNZ R7,$
RRC A //把要写入得数据的高位移到C中
MOV DS18DQ,C //再把C的值赋给DS18DQ
MOV R7,#30 //延时时间约为60us,只要大约45us即可
DJNZ R7,$
SETB DS18DQ //拉高准备,下次产生下降沿
DJNZ R6,DS18_SEND1 //判断循环次数够了没
POP 07H //恢复Rn的数据
POP 06H
RET
篇幅太大完整程序请从这里下载:http://www.51hei.com/ziliao/file/ds182051hei.asm
本程序已经测试成功。
上一篇:时间可调的定时闹钟C51程序
下一篇:PWM控制LED台灯程序带红外遥控
推荐阅读最新更新时间:2024-03-16 13:11