PIC单片机利用温度传感器18B20测温度程序_单片机_电子信息网



?PIC单片机利用温度传感器18B20测温度程序????

时间:2007-09-02 00:05:20?来源:钟闰田的BLOG


......
CALL???? RESET_18B20????? ;调用复位18B20子程序
???MOVLW??? 0CCH
???MOVWF??? TEMP
???CALL???? WRITE_18B20????? ;SKIP ROM命令
???MOVLW??? 44H
???MOVWF??? TEMP
???CALL???? WRITE_18B20????? ;温度转换命令
???BTFSS??? FLAG,FLAG_750MS
???GOTO???? DISPLAY
???BCF????? FLAG,FLAG_750MS
???MOVLW??? DQ_DELAY_VALUE1
???MOVWF??? DQ_DELAY1
???MOVLW??? DQ_DELAY_VALUE2
???MOVWF??? DQ_DELAY2
???CALL???? RESET_18B20
???MOVLW??? 0CCH
???MOVWF??? TEMP
???CALL???? WRITE_18B20????? ;SKIP ROM命令
???MOVLW??? 0BEH
???MOVWF??? TEMP
???CALL???? WRITE_18B20????? ;读温度命令
???CALL???? READ_18B20?????? ;调用读温度低字节
???MOVFW??? TEMP
???MOVWF??? TEMP1
???CALL???? READ_18B20?????? ;调用读温度高字节
???MOVFW??? TEMP
???MOVWF??? TEMP2
?CALL???? RESET_18B20
???CALL???? TEMP_CHANGE????? ;调用温度转换程序
?
RESET_18B20
;复位DS18B20子程序
;根据DATASHEET介绍,写数据时应遵照如下规定:
;主控制器把总线拉低至少480us,
;18B20等待15-60us后,把总线拉低做为返回给控制器的应答信号??
???BANKSEL? TRISB
???BCF????? TRISB,1
???BCF????? STATUS,RP0
???BCF????? DQ
???MOVLW??? 0A0H
???MOVWF??? COUNT?????????? ;160US
???DECFSZ?? COUNT,1
???GOTO???? $-1???????????? ;拉低480us
???BSF????? DQ????????????? ;释放总线
???MOVLW??? 14H
???MOVWF??? COUNT
???DECFSZ?? COUNT,1
???GOTO???? $-1???????????? ;等待60us
???BANKSEL? TRISB
???BSF????? TRISB,1
???BCF????? STATUS,RP0
???BTFSC??? DQ
???GOTO???? RESET_18B20
???MOVLW??? 4H
???MOVWF??? COUNT
???DECFSZ?? COUNT,1
???GOTO???? $-1
???BTFSC??? DQ
???GOTO???? RESET_18B20
???MOVLW??? 4BH
???MOVWF??? COUNT
???DECFSZ?? COUNT,1
???GOTO???? $-1
???BANKSEL? TRISB
???BCF????? TRISB,1
???BCF????? STATUS,RP0
???RETURN
WRITE_18B20
;写DS18B20子程序
;根据DATASHEET介绍,写数据时应遵照如下规定:
;写数据0时,主控制器把总线拉低至少60us
;写数据1时,主控制器把总线拉低,但必须在15us内释放??
???MOVLW??? 8H
???MOVWF??? COUNT
???BANKSEL? TRISB
???BCF????? TRISB,1
???BCF????? STATUS,RP0
???BCF????? STATUS,C
WRITE_18B20_1
???BSF????? DQ
???MOVLW??? 5H
???MOVWF??? COUNT1
???BCF????? DQ
???DECFSZ?? COUNT1
???GOTO???? $-1
???RRF????? TEMP,1
???BTFSS??? STATUS,C
???GOTO???? WRITE_0
???BSF????? DQ
???GOTO???? WRITE_END
WRITE_0
???BCF????? DQ
WRITE_END
???MOVLW??? 0FH
???MOVWF??? COUNT1
???DECFSZ?? COUNT1,1
???GOTO???? $-1
???BSF????? DQ??????????????? ;释放总线
???DECFSZ?? COUNT,1
???GOTO???? WRITE_18B20_1
???RETURN
READ_18B20
;读DS18B20子程序
;根据DATASHEET介绍,读数据时应遵照如下规定:
;读数据0时,主控制器把总线拉低后,18B20再把总线拉低60us
;读数据1时,主控制器把总线拉低后,保持总线状态不变
;主控制器在数据线拉低后15us内读区数据线上的状态。???????
????MOVLW??? 8H
????MOVWF??? COUNT
READ_18B20_1
????BANKSEL? TRISB
????BCF????? TRISB,1
????BCF????? STATUS,RP0
????BCF????? DQ
????MOVLW??? 1H
????MOVWF??? COUNT1
????DECFSZ?? COUNT1,1???????? ;拉低总线3us
????GOTO???? $-1
????BSF????? DQ?????????????? ;释放总线
????BANKSEL? TRISB
????BSF????? TRISB,1
????BCF????? STATUS,RP0
????MOVLW??? 2H
????MOVWF??? COUNT1
????DECFSZ?? COUNT1,1
????GOTO???? $-1
????BSF????? STATUS,C
????BTFSS??? DQ
????BCF????? STATUS,C
????RRF????? TEMP,1
????MOVLW??? 12H
????MOVWF??? COUNT1
????DECFSZ?? COUNT1,1
????GOTO???? $-1??????????????? ;读一位数据至少需要60us
????DECFSZ?? COUNT,1
????GOTO???? READ_18B20_1
????RETURN
TEMP_CHANGE??
;温度表示形式转换程序
;因为从18B20中读出的温度值是二进制形式,必须把它转换成对象ASCII才能在LCD上显示
;18B20中温度的表示为:S S S S S 2的6次方 2的5次方 2的4次方??? 2的3次方 2的2次方 。。。。2的负4次方
;结果整数放在38H开始的存储器里,小数部分放在3B开始的单元里
;38H(百位) 39H(十位) 3AH(个位) 3BH(小数点)
;3CH(十分位) 3DH(百分位) 3EH(千分位) 3FH(万分位)
?
;整数部分
;处理方法是依次判别每一位上是否为1,若是则加上该位的权。因为温度测量范围{zd0}值
;整数部分为127,可以用减法的方法,算出百、十、个位上的数字。

???CLRF???? 3AH
???MOVLW??? 40H
???BTFSC??? TEMP2,2???????? ;2的6次方
???ADDWF??? 3AH,1
???MOVLW??? 20H
???BTFSC??? TEMP2,1???????? ;2的5次方
???ADDWF??? 3AH,1
???MOVLW??? 10H
???BTFSC??? TEMP2,0???????? ;2的4次方
???ADDWF??? 3AH,1
???MOVLW??? 8H
???BTFSC??? TEMP1,7???????? ;2的3次方
???ADDWF??? 3AH,1
???MOVLW??? 4H
???BTFSC??? TEMP1,6???????? ;2的2次方
???ADDWF??? 3AH,1
???MOVLW??? 2H
???BTFSC??? TEMP1,5???????? ;2的1次方
???ADDWF??? 3AH,1
???MOVLW??? 1H
???BTFSC??? TEMP1,4???????? ;2的0次方
???ADDWF??? 3AH,1
??
???MOVLW??? 64H???????????? ;结果大于100,30H存放1的ASCII码
???SUBWF??? 3AH,W
???BTFSS??? STATUS,C
???GOTO???? NEXT0
???MOVWF??? 3AH
???MOVLW??? 1H
???MOVWF??? 38H
???GOTO???? $+2
NEXT0
???CLRF???? 38H
???CLRF???? 39H
???MOVLW??? 0AH
???SUBWF??? 3AH,1
???BTFSS??? STATUS,C
???GOTO???? NEXT1
???INCF???? 39H,1
???GOTO???? $-5
NEXT1
???MOVLW??? 0AH
???ADDWF??? 3AH,1??????????? ;多减一次再加回来
??
???MOVLW??? '.'
???MOVWF??? 3BH?????????????? ;小数点
??
;小数部分
;结果保留了4位小数,处理方法是依次判别每一位上是否为1,若是则加上该位的权,而且
;只有小数后第二位可能存在进位,因此这种处理方法还算比较简单易懂。
???CLRF???? 3CH
???CLRF???? 3DH
???CLRF???? 3EH
???CLRF???? 3FH
???BTFSS??? TEMP1,0
???GOTO???? NEXT2
???MOVLW??? 5H
???MOVWF??? 3FH
???MOVLW??? 2H
???MOVWF??? 3EH
???MOVLW??? 6H
???MOVWF??? 3DH?????????????? ;万分位
NEXT2
???BTFSS??? TEMP1,1
???GOTO???? NEXT3
???MOVLW??? 5H
???ADDWF??? 3EH,1
???MOVLW??? 2H
???ADDWF??? 3DH,1
???MOVLW??? 1H
???MOVWF??? 3CH????????????? ;千分位
NEXT3
???BTFSS??? TEMP1,2
???GOTO???? NEXT5
???MOVLW??? 5H
???ADDWF??? 3DH,1
???MOVLW??? 0AH
???SUBWF??? 3DH,1
???BTFSS??? STATUS,C
???GOTO???? NEXT4
???INCF???? 3CH,1
???GOTO???? $+3
NEXT4
???MOVLW??? 0AH
???ADDWF??? 3DH,1
???MOVLW??? 2H
???ADDWF??? 3CH,1?????????? ;百分位
NEXT5
???BTFSS??? TEMP1,3
???GOTO???? NEXT6
???MOVLW??? 5H
???ADDWF??? 3CH,1????????? ;十分位
NEXT6
;因为结果送1602液晶屏显示(只需送ASCII码)故需把结果转换成对应的ASCII码
;(加30H)
???MOVLW??? 30H
???ADDWF??? 38H,1
???ADDWF??? 39H,1
???ADDWF??? 3AH,1
???ADDWF??? 3CH,1
???ADDWF??? 3DH,1
???ADDWF??? 3EH,1
???ADDWF??? 3FH,1
?
???RETURN
?
结论:
1、此程序没有考虑负温度的处理。
2、复位、读、写时序是操作18B20的关键跟难点。


本文引自:


我的qq:563614653
你只要在百度,新浪,搜狐,谷歌中搜索"永远的北邮人","志行合一",点永远的北邮人的博客就可以找到我了.



?

郑重声明:资讯 【PIC单片机利用温度传感器18B20测温度程序_单片机_电子信息网】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——