一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
楼主: ckvlhf
收起左侧

发个小玩意——温度计

[复制链接]
发表于 2009-5-16 22:40 | 显示全部楼层
18B20
 楼主| 发表于 2009-5-18 09:12 | 显示全部楼层
我来了,用的是18B20,精度应该足够了吧。电路挺简单的,我也没有画原理图,本来什么都没有的,为了让大家看的明白些就用个简易的PCB软件画了一下实际布线。第一张图是正面元件图,第二张是背面走线,不过数码管的限流电阻和12B20上拉电阻还有2051的复位电阻我都用贴片的放在了背面。晶振电容放在单片机下面。本来我的这个18B20是紧贴着单片机右边的,后来发现温度总是比室温高2度(和另一个单片机学习板上的比较),现在改成活动式的就好了,没想到这么灵敏。

[ 本帖最后由 ckvlhf 于 2009-5-18 09:31 编辑 ]
 楼主| 发表于 2009-5-18 09:14 | 显示全部楼层
附上程序,还有点问题,但我找不出来
就是温度上了100后,十分位要大于5才显示,0-5直接灭了,不解,哪位GG给我找找到底什么原因。
————————————————————————————
D1820   BIT   P3.7
  COOV    BIT   20H.2
  COM     EQU   39H
                  ORG   0000H
                  JMP   MAIN
                  ORG   0050H
MAIN:     MOV   SP,#60H
          SETB  COOV                          ;必须在循环外置位温度转换标志位,
LOOP:     LCALL DS18B20                          ;否则循环中不会进行温度转换!
          LCALL CTEM
          LCALL DISPLAY
                  LJMP  LOOP


;DS18B20温度转换子程序
DS18B20:
          JNB   COOV,CHCO                  ;检查温度转换完成标志位,未完成的话跳转到温度转换完成度检查
          LCALL RES1820
                  MOV   COM,#0CCH              ;跳过命令
                  LCALL WCOM
                  MOV   COM,#0BEH                  ;读取温度命令
                  LCALL WCOM
                  LCALL RDATA
          LCALL RES1820
                  MOV   COM,#0CCH                  ;跳过命令
                  LCALL WCOM
                  MOV   COM,#44H                  ;启动温度转换命令,
                  LCALL WCOM                          ;紧接着CHCO来检测转换是否完成
CHCO:     CLR   COOV              ;清除转换完成标志位
          CLR   D1820                          ;
          NOP                                          ;开始读时隙
                  SETB  D1820                          ;
                  JB    D1820,SETCOOV          ;温度转换完成的话置位COOV位
                  JMP   OUT                                  ;
SETCOOV:  SETB  COOV                          ;
OUT:      RET


;温度数据处理子程序
CTEM:          MOV   R6,#7
                  MOV   R0,38H
C0:                  MOV   A,@R0                      ;
                  CLR   A                              ;显示缓存
                  MOV   @R0,A                      ;清零
                  DEC   R0                              ;
                  DJNZ  R6,C0                      ;
                  CLR   20H.0
          MOV   A,22H                      ;
                  ANL   A,#0F0H                      ;判断温度是否小于0
                  CJNE  A,#0F0H,COUNT     ;是的话在20.0H位标记
                  SETB  20H.0                      ;
                  MOV   A,21H                      ;补码形式
                  CPL   A                              ;的负温度
                  ADD   A,#1                      ;值转换成
                  MOV   21H,A                      ;源码形式
                  MOV   A,22H                      ;
                  CPL   A                              ;
                  ADDC  A,#0                      ;
                  MOV   22H,A                      ;
COUNT:                                                  ;开始数据处理
          MOV   A,21H                 
          SWAP  A
                  ANL   A,#0FH                      ;屏蔽小数部分
                  MOV   R1,A
                  MOV   A,22H
                  SWAP  A
                  ANL   A,#0F0H                      ;屏蔽符号部分
                  ADD   A,R1                      ;得温度整数部分
                  MOV   B,#100
                  CLR   C
                  DIV   AB
                  MOV   38H,A                      ;百位值存38H单元
                  MOV   A,B
                  MOV   B,#10
                  CLR   C
                  DIV   AB
                  MOV   37H,A                      ;十位值存37H单元
                  MOV   A,B
                  MOV   36H,A                      ;个位值存36H单元
                  JNB   21H.3,COUN1                  ;开始小数部分处理,处理1/2位,即0.5
                  MOV   35H,#5
COUN1:          JNB   21H.2,COUN2                  ;处理1/4位,即0.25
          MOV   A,35H
                  ADD   A,#2
                  MOV   35H,A
                  MOV   34H,#5
COUN2:    JNB   21H.1,COUN3                  ;处理1/8位,即0.125
          MOV   A,35H
                  ADD   A,#1
                  MOV   35H,A
                  MOV   A,34H
                  ADD   A,#2
                  MOV   34H,A
COUN3:    JNB   21H.0,CC                  ;处理1/16位,即0.0625
          MOV   A,34H
                  ADD   A,#6
                  MOV   34H,A
CC:       MOV   A,34H                      ;
          CJNE  A,#4,CC1                  ;百分位向十分位四舍五入
                  JMP   BACK                          ;
CC1:      JC    BACK                          ;
          INC   35H
BACK:     RET


;数码管显示子程序
DISPLAY:  
          MOV   A,37H
                  CJNE  A,#0,NEXT1                  ;判断十位是否为零
                  MOV   A,38H                          
                  CJNE  A,#0,NEXT2                  ;判断百位是否为零
                  MOV   37H,#11                          ;十位无显示
                  MOV   38H,#11                          ;百位无显示
                  JNB   20H.0,D1                  ;判断温度是否是负值
                  MOV   37H,#10                          ;十位显示负号
                  JMP   D1
NEXT1:    MOV   A,38H                          
          CJNE  A,#0,NEXT2                  ;判断百位是否为零
                  MOV   38H,#11                          ;为零的话无显示
NEXT2:          JNB   20H.0,D1                  ;判断温度是否位负值
                  MOV   38H,#10                          ;百位显示负号
D1:       MOV   P3,0FFH
                  MOV   P1,0FFH
          MOV   DPTR,#TAB
          MOV   A,38H
                  MOVC  A,@A+DPTR
                  MOV   P1,A
                  CLR   P3.2
                  LCALL DELAY5mS
                  SETB  P3.2
                  MOV   A,37H
          MOVC  A,@A+DPTR
                  MOV   P1,A
                  CLR   P3.3
                  LCALL DELAY5mS
                  SETB  P3.3
                  MOV   A,36H
                  MOVC  A,@A+DPTR
                  CLR   C
                  SUBB  A,#4                  ;显示小数点(为了避免飞线,数码管采用了非标准接法,
                  MOV   P1,A                          ;即DP接的不是PX.7,所以不是减180.
                  CLR   P3.4
                  LCALL DELAY5mS
                  SETB  P3.4
                  MOV   A,35H
                  MOVC  A,@A+DPTR
                  MOV   P1,A
                  CLR   P3.5
                  LCALL DELAY5mS
                  SETB  P3.5
                  RET

;复位18B20
RES1820:
          CLR   F0
                  CLR   D1820
                  LCALL DELAY480uS                          ;延时480uS拉低总线复位
                  SETB  D1820                                  ;复位结束
                  LCALL DELAY480uS                          ;由于只有一个单总线设备且是固定连接,
                  RET                                                  ;所以没有进行

;给18B20写指令
WCOM:   
          MOV   R5,#8                                  ;一字节即8位
          MOV   A,COM                                  ;命令吗传给A
W1:                  RRC   A                                          ;最低位移到C
                  CLR   D1820                                  ;拉低总线,准备传送数据
                  MOV   D1820,C                                  ;C值传给总线,开始传送
                  LCALL DELAY100uS                          ;延时100uS,给设备足够的接收时间
                  SETB  D1820                                  ;释放总线
                  DJNZ  R5,W1
                  RET

;读取18B20的温度值
RDATA:          MOV   R1,#21H                                  ;21H接收低8位温度值
          MOV   R6,#2
RE1:      MOV   R5,#8
RE2:      CLR   D1820                                  ;拉低总线,准备接收数据
                  NOP
                  NOP
                  SETB  D1820
                  MOV   C,D1820                                  ;接收数据
                  RRC   A                                          ;数据转移到A中
                  LCALL DELAY100uS                          ;延时100uS,
                  SETB  D1820                                  ;释放总线
                  DJNZ  R5,RE2
                  MOV   @R1,A
                  INC   R1                                          ;高8位温度值存放在22H单元
                  DJNZ  R6,RE1
                  RET

;延时程序
DELAY480uS:
          MOV   R7,#240
                  DJNZ  R7,$
                  RET

DELAY100uS:
          MOV   R7,#50
                  DJNZ  R7,$
                  RET

DELAY5mS:
          MOV   R6,#25
DE1:      MOV   R7,#40
                  DJNZ  R7,$
                  DJNZ  R6,DE1
                  RET


;数码管显示码表
TAB:  DB 005H,0DDH,046H,054H,09CH,034H,024H,05DH,004H,014H,0FEH,0FFH
                  END

评分

参与人数 1 +10 收起 理由
yleee + 10 感谢分享!

查看全部评分

 楼主| 发表于 2009-5-18 09:30 | 显示全部楼层

标注了的

温度计.JPG
发表于 2009-5-18 12:03 | 显示全部楼层
汇编不会看.. 也没把它放沸水里泡过. 发个我做的
也是2051

以前买了2个2051用不掉,(不好编程太难用) 写了个程序当温度计了.
IMG_6171.jpg

数码管 3毛钱一个.
发表于 2009-5-18 14:09 | 显示全部楼层
能不能用LM35做温度传感器?
发表于 2009-5-18 14:36 | 显示全部楼层
原帖由 fangjun 于 2009-5-18 14:09 发表 https://www.yleee.com.cn/images/common/back.gif
能不能用LM35做温度传感器?


老弹弓做过, 用LM35+带AD的单片机. 见<数字化饮水机>
发表于 2009-5-18 16:08 | 显示全部楼层
温度计这样的东东,一般是要长时间开着的,用51+LED太费电了,又得加个电源,占一个插座位,最好还是用PIC+0801,用电池就行。
发表于 2009-5-18 16:30 | 显示全部楼层
想办法用电话线的电

我就是用锂电,看温度的时候电源接通一下。
平时是关着的
发表于 2009-5-18 16:51 | 显示全部楼层
原帖由 yanjian 于 2009-5-18 16:30 发表 https://www.yleee.com.cn/images/common/back.gif
想办法用电话线的电

我就是用锂电,看温度的时候电源接通一下。
平时是关着的


恭喜你,兄弟,你被评为09年度“节能先锋”了

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-4 15:27 , Processed in 0.049948 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表