DS18B20实时温度检测实验 DS18B20.docx
- 文档编号:12856028
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:17
- 大小:127.52KB
DS18B20实时温度检测实验 DS18B20.docx
《DS18B20实时温度检测实验 DS18B20.docx》由会员分享,可在线阅读,更多相关《DS18B20实时温度检测实验 DS18B20.docx(17页珍藏版)》请在冰豆网上搜索。
DS18B20实时温度检测实验DS18B20
课题
DS18B20实时温度检测实验
教学目标
1、熟悉LCD1602的编程方法
2、熟悉PIC单片机I2C通信原理及工作方式
3、学习和掌握DS18B20温度传感器的工作原理及编程技巧
实验设备
PIC单片机实验箱一台
教学方法
演示法
教学时间
4课时
一、实验内容
本实验就是实时监测环境温度,将最终的温度测量结果通过LCD1602显示出来。
在实验中,如果用手去接触DS18B20传感器模块,会发现所测试的温度逐渐上升,这个实验在天气较冷的时候进行效果更为明显;而如果将一个小冰块去接触DS18B20传感器模块,显示的温度将迅速下降。
二、实验电路连接方式
如图35-1所示。
图35-1
三、实验及编程说明
本实验的编程内容主要包括系统初始化及单元变量定义,DS18B20初始化子程序、采集温度子程序、数据显示子程序等。
四、实验参考程序
LISTP=PIC16F877
TITLE="LCDDISPLAY"
ERRORLEVEl-302;去掉编译时的302号提示信息
;__CONFIGB'000010010101';代码保护开启;WRT_ENABLE;CPD_ENABLE;LVP_DISABLE;BODEN_ENABLE
;PWRTE_ENABLE;WDT_ENABLE;OSC_XT
;*****************以下是暂存器的定义*****************************
#INCLUDE
#DEFINERSPORTA,1;LCD控制信号
#DEFINERWPORTA,2;LCD控制信号
#DEFINEEPORTA,3;LCD控制信号
#DEFINEDATPORTC;LCD数据线
#DEFINEDQPORTA,2;18B20数据口
CBLOCK20H
DQ_DELAY1
DQ_DELAY2
TEMP
TEMP1
TEMP2;存放采样到的温度值
COUNT
COUNT1
ENDC
TMR0_VALUEEQU0AH;寄存器初值为6,预分频比1:
4,中断一次时间为4*(256-6)=1000us
DQ_DELAY_VALUE1EQU0FAH
DQ_DELAY_VALUE2EQU4H
;***********************以下是宏定义****************************
READ_STATEMACRO;读18B20的状态
BCFRS
BSFRW
BSFE
ENDM
WRITE_COMMANDMACRO;写命令
BCFRS
BCFRW
BCFE
ENDM
WRITE_DATAMACRO;写数据
BSFRS
BCFRW
BCFE
ENDM
;**********************以下是程序的开始************************
ORG00H
NOP
GOTOMAIN;入口地址
ORG04H
RETFIE;在中断入口出放置一条中断返回指令,防止干扰产生中断
;***************************主程序*******************************
MAIN
CLRFPORTC
CLRFPORTA
BANKSELTRISA
CLRFTRISA;A口所有先设置为输出
CLRFTRISC
MOVLW01H
MOVWFOPTION_REG;分频比1:
4,定时器,内部时钟源
MOVLW06H
MOVWFADCON1;关闭所有A/D口
BCFSTATUS,RP0
MOVLW00H
MOVWFINTCON;关闭所有中断,且同时清零T0IF
CLRFTEMP
CLRFTEMP1
CLRFTEMP2;清零临时寄存器
;****************************循环处理部分************************
;先启动18B20温度转换程序,在判断温度转换是否完成(需750us)
;未完成则调用显示子程序,直到完成温度转换
;完成后读取温度值
;送LCD显示
LOOP
CALLRESET_18B20;调用复位18B20子程序
MOVLW0CCH
MOVWFTEMP
CALLWRITE_18B20;SKIPROM命令
MOVLW44H
MOVWFTEMP
CALLWRITE_18B20;温度转换命令
CLRFSTATUS
BCFINTCON,T0IF
CALLDELAY_750MS;调用温度转换所需要的750MS延时
NOP
CALLRESET_18B20
MOVLW0CCH
MOVWFTEMP
CALLWRITE_18B20;SKIPROM命令
MOVLW0BEH
MOVWFTEMP
CALLWRITE_18B20;读温度命令
CALLREAD_18B20;调用读温度低字节
MOVFWTEMP
MOVWFTEMP1;保存到TEMP1
CALLREAD_18B20;调用读温度高字节
MOVFWTEMP
MOVWFTEMP2;保存到TMEP2
CALLRESET_18B20
CALLTEMP_CHANGE;调用温度转换程序
CALLDISPLAY;调用LCD显示程序
GOTOLOOP;循环工作
;***************************LCD显示子程序************************
DISPLAY
;LCD模块初始化,由厂家提供的资料显示,其初始化过程为:
;6----写指令38H,此条指令是将LCD显示模块设置为8位数据线,双行,5X7点阵显示
;7----检测Busy信号;
;8----写指令08H,关闭显示
;9----检测Busy信号;
;10---写指令01H,显示清屏
;以后写入光标等的控制指令.
BANKSELTRISA
CLRFTRISA;A口为LCD控制信号,全输出
BANKSELPORTA
NOP
MOVLW38H
CALLCOMMAND_WRITE;显示模式设置:
16*2显示,5*7点阵,8位数码接口
MOVLW08H
CALLCOMMAND_WRITE;显示关闭,不显示光标
MOVLW01H
CALLCOMMAND_WRITE;显示清屏
MOVLW06H
CALLCOMMAND_WRITE;显示光标移动设置(右移),整屏显示不移动
MOVLW0CH
CALLCOMMAND_WRITE;显示开及光标设置,不显示光标
DISPLAY0
MOVLW84H
CALLCOMMAND_WRITE;设置显示起始位置
CALLBUSY;判忙
MOVLW8H;共8个数据需要显示
MOVWFCOUNT
MOVLW37H;取数地址
MOVWFFSR
DISPLAY1
INCFFSR,1;取数地址加1
MOVFWINDF
CALLDATA_WRITE;调用写数据子程序
DECFSZCOUNT,1
GOTODISPLAY1
RETURN
;*****************************写命令子程序***********************
COMMAND_WRITE
WRITE_COMMAND;设置写命令所需要的控制信号
MOVWFDAT;把命令字送数据口
BSFE
NOP
BCFE
CALLBUSY;判忙
RETURN
;**************************判总线忙子程序************************
BUSY
BSFSTATUS,RP0
MOVLW80H
MOVWFTRISC;数据口最高位置为输入口
BCFSTATUS,RP0
READ_STATE
NOP
BCFE
BTFSCDAT,7;是否忙
GOTOBUSY;是,继续判断
BANKSELTRISC
CLRFTRISC;否,数据最高位恢复为输出状态
BCFSTATUS,RP0
RETURN
;*************************写数据子程序***************************
DATA_WRITE
WRITE_DATA
MOVWFDAT
BSFE
NOP
BCFE
CALLBUSY
RETURN
;*********************复位DS18B20子程序**************************
RESET_18B20
;根据DATASHEET介绍,写数据时应遵照如下规定:
;主控制器把总线拉低至少480us,
;18B20等待15-60us后,把总线拉低做为返回给控制器的应答信号
BANKSELTRISA
BCFTRISA,2
BCFSTATUS,RP0
BCFDQ
MOVLW0A0H
MOVWFCOUNT;160US
DECFSZCOUNT,1
GOTO$-1;拉低480us
BSFDQ;释放总线
MOVLW14H
MOVWFCOUNT
DECFSZCOUNT,1
GOTO$-1;等待60us
BANKSELTRISA
BSFTRISA,2;DQ设置为输入
BCFSTATUS,RP0
BTFSCDQ;数据线是否为低
GOTORESET_18B20;否则继续复位
MOVLW4H
MOVWFCOUNT
DECFSZCOUNT,1;延时一段时间后再次判断
GOTO$-1
BTFSCDQ
GOTORESET_18B20
MOVLW4BH
MOVWFCOUNT
DECFSZCOUNT,1
GOTO$-1
BANKSELTRISA
BCFTRISA,2;DQ设置为输出
BCFSTATUS,RP0
RETURN
;*********************写DS18B20子程序****************************
WRITE_18B20
;根据DATASHEET介绍,写数据时应遵照如下规定:
;写数据0时,主控制器把总线拉低至少60us
;写数据1时,主控制器把总线拉低,但必须在15us内释放
MOVLW8H
MOVWFCOUNT;8位数据
BANKSELTRISA
BCFTRISA,2
BCFSTATUS,RP0
BCFSTATUS,C
WRITE_18B20_1
BSFDQ;先保持DQ为高
MOVLW5H
MOVWFCOUNT1
BCFDQ;拉低DQ15us
DECFSZCOUNT1,1
GOTO$-1
RRFTEMP,1
BTFSSSTATUS,C;判断写的数据为0还是1
GOTOWRITE_0
BSFDQ;为1,立即拉高数据线
GOTOWRITE_END
WRITE_0
BCFDQ;继续保持数据线为低
WRITE_END
MOVLW0FH
MOVWFCOUNT1;保持45ms
DECFSZCOUNT1,1
GOTO$-1
BSFDQ;释放总线
DECFSZCOUNT,1;是否写完8位数据
GOTOWRITE_18B20_1
RETURN
;**********************读DS18B20子程序****************************
READ_18B20
;根据DATASHEET介绍,读数据时应遵照如下规定:
;读数据0时,主控制器把总线拉低后,18B20再把总线拉低60us
;读数据1时,主控制器把总线拉低后,保持总线状态不变
;主控制器在数据线拉低后15us内读区数据线上的状态。
MOVLW8H;一次读8位数据
MOVWFCOUNT
READ_18B20_1
BANKSELTRISA
BCFTRISA,2;数据线先设为输出
BCFSTATUS,RP0
BCFDQ;先拉低数据线
MOVLW1H
MOVWFCOUNT1
DECFSZCOUNT1,1;拉低总线3us
GOTO$-1
BSFDQ;释放总线
BANKSELTRISA
BSFTRISA,2;数据线设为输入
BCFSTATUS,RP0
MOVLW2H
MOVWFCOUNT1
DECFSZCOUNT1,1;延时6ms
GOTO$-1
BSFSTATUS,C
BTFSSDQ;判断数据线状态
BCFSTATUS,C
RRFTEMP,1;移位到TEMP中
MOVLW12H
MOVWFCOUNT1
DECFSZCOUNT1,1
GOTO$-1;读一位数据至少需要60us
DECFSZCOUNT,1;是否读完8位
GOTOREAD_18B20_1
RETURN
;*******************温度表示形式转换程序**************************
;因为从18B20中读出的温度值是二进制形式,必须把它转换成对象ASCII才能在LCD上显示
;18B20中温度的表示为:
SSSSS2的6次方2的5次方2的4次方2的3次方2的2次方。
。
。
。
2的负4次方
;结果整数放在38H开始的存储器里,小数部分放在3B开始的单元里
;38H(百位)39H(十位)3AH(个位)3BH(小数点)3CH(十分位)3DH(百分位)3EH(千分位)3FH(万分位)
TEMP_CHANGE
;整数部分
;因为转换后温度值位于两个单元内,所以必须先把它们组合到一个单元内。
;因为最大值为127.9375,所以只需判断结果是否大于100来决定百位上的结果
;用循环减0AH的方法得到十位的值,最后剩下的被减数即为个位的结果
MOVLW7H
ANDWFTEMP2,1;只保留低3位
SWAPFTEMP2,0
MOVWF3AH;转存3AH
MOVFWTEMP1
MOVWFTEMP2;转存TEMP2
MOVLW0F0H
ANDWFTEMP2,1;清除低4位
SWAPFTEMP2,0;高低半字节交换
IORWF3AH,1;组合得到结果的7位整数部分
MOVLW64H;计算整数部分百位的结果
SUBWF3AH,W;-100
BTFSSSTATUS,C
GOTONEXT0;温度小于100
MOVWF3AH;减后的结果覆盖原来的数据
MOVLW1H
MOVWF38H;整数部分最高位为1(不可能大于1)
GOTO$+2
NEXT0
CLRF38H;温度小于100,最高位为0
CLRF39H;计算整数部分十位的结果
MOVLW0AH;-10
SUBWF3AH,1
BTFSSSTATUS,C
GOTONEXT1
INCF39H,1;够减十位上加1
GOTO$-5
NEXT1
MOVLW0AH
ADDWF3AH,1;多减一次再加回来,剩下的值即为个位上的值
MOVLW'.'
MOVWF3BH;小数点
;小数部分
;取四位精度
;计算方法为从最低位开始依次判断是否为1,若为1则分别加上:
;0.0625、0.125、0.25、0.5,而且只有百分位相加时有可能结果大于0AH
CLRF3CH
CLRF3DH
CLRF3EH
CLRF3FH
BTFSSTEMP1,0
GOTONEXT2
MOVLW5H
MOVWF3FH
MOVLW2H
MOVWF3EH
MOVLW6H
MOVWF3DH;万分位
NEXT2
BTFSSTEMP1,1
GOTONEXT3
MOVLW5H
ADDWF3EH,1
MOVLW2H
ADDWF3DH,1
MOVLW1H
MOVWF3CH;千分位
NEXT3
BTFSSTEMP1,2
GOTONEXT5
MOVLW5H
ADDWF3DH,1
MOVLW0AH
SUBWF3DH,1
BTFSSSTATUS,C
GOTONEXT4
INCF3CH,1
GOTO$+3
NEXT4
MOVLW0AH
ADDWF3DH,1
MOVLW2H
ADDWF3CH,1;百分位
NEXT5
BTFSSTEMP1,3
GOTONEXT6
MOVLW5H
ADDWF3CH,1;十分位
NEXT6
MOVLW30H;各位加上30H,转换成对应的ASCII码,以便能在LCD上显示
ADDWF38H,1
ADDWF39H,1
ADDWF3AH,1
ADDWF3CH,1
ADDWF3DH,1
ADDWF3EH,1
ADDWF3FH,1
RETURN
;**************************延时750ms******************************
DELAY_750MS
MOVLWDQ_DELAY_VALUE2
MOVWFDQ_DELAY2
DELAY_750MS_2
MOVLWDQ_DELAY_VALUE1
MOVWFDQ_DELAY1
DELAY_750MS_1
MOVLWTMR0_VALUE
MOVWFTMR0;开启定时器
BTFSSINTCON,T0IF
GOTO$-1
BCFINTCON,T0IF
DECFSZDQ_DELAY1,1
GOTODELAY_750MS_1
DECFSZDQ_DELAY2,1
GOTODELAY_750MS_2
RETURN
;**************************程序结束******************************
END
作业
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS18B20实时温度检测实验 DS18B20 实时 温度 检测 实验