返回列表 回复 发帖

发个我给大4学生做的18B20温度测温仪0~125度

本帖最后由 13013963877 于 2011-5-22 12:00 编辑

;********************************************
;本程序测量温度范围:0~125度,      *
;4位数码管显示                               *
;不得用于商业目的                           *
;********************************************
;各单元定义----------------------------------------
DAT    BIT P3.5    ;数据通信口
WDLSB DATA 34H   ;读出的温度低节
WDMSB DATA 35H   ;读出的温度高节
DTEMP1  EQU  30H
DTEMP2  EQU  31H
DTEMP3  EQU  32H
DTEMP4  EQU  33H        ;显示数据单元
KEYST  BIT  P3.2        ;设定键
KEYUP  BIT  P3.3        ;加键
KEYDN  BIT  P3.4        ;减键
WD1    DATA  50H        ;设定温度低字节
WD2    DATA  51H        ;设定温度高字节
CON    BIT   P3.7       ;控制线
A138   BIT   P3.0
B138   BIT   P3.1
COUNT  DATA  40H
XS    DATA   52H
ZS    DATA   53H
       ORG  0000H
       LJMP  MAIN
       ORG  000BH
       LJMP  T0SEV
;***************************************************************
        ORG 0030H
;主程序:
MAIN:   MOV SP,#60H
        MOV  COUNT,#00H
        MOV  TMOD,#01H
        MOV  TH0,#3CH
        MOV  TL0,#0B0H
        SETB EA
        MOV 50H,#00H
        MOV 51H,#00H
        MOV 24H,#0
        MOV 25H,#0
        MOV 26H,#0
        MOV 27H,#0         ;设定温度初始化
        MOV R7,#50H
        SETB   CON
LOOP :  
        LCALL RST
        JNB  F0,ERROR     ;如果没有应答调显示1820
        MOV  R0,#0CCH
        LCALL SEND_BYTE         ;发出读温度命令
        MOV  R0,#44H
        LCALL SEND_BYTE         ;发出读温度命令
DLOOP:  LCALL  KEY           ;调用键盘
        LCALL DISP0           ;显示温度
        JNB  DAT,DLOOP
        LCALL RST
        JNB  F0,ERROR
        MOV R0,#0CCH         ;跳过ROM匹配
        LCALL SEND_BYTE
        MOV R0,#0BEH         ;发出读温度命令
        LCALL SEND_BYTE
        LCALL READ_BYTE
        MOV WDLSB,R0           ;读得二进制温度34H
        LCALL READ_BYTE
        MOV WDMSB,R0           ;35H
        LCALL TRANS            ;转换为十进制温度
        LCALL  CHK              ;调用比较检测
        MOV   R7,#20H
XXX1:   LCALL  DISP0
        LCALL  KEY
        DJNZ  R7,XXX1
        AJMP  LOOP
ERROR : MOV R7,#30H
        SETB  TR0
       SETB  ET0
DDD:    MOV 57H, #0DH
        MOV 56H, #0AH
        MOV 55H, #0CH
        MOV 54H, #0CH
        LCALL DISP1
        DJNZ R7,DDD
        MOV R7,#30H
;1820故障报警----------------------------------------------------------
EEE:    MOV 54H, #0      ;送0
        MOV 55H, #2      ;送2
        MOV 56H, #8      ;送8
        MOV 57H, #1      ;送1
        LCALL DISP1
        DJNZ R7,EEE
      
        AJMP ERROR     ;反复显示1820
T1MS:   MOV R5,#00H  ;延时子程序
TT:     MOV R6,#9
        DJNZ R6,$
DJNZ R5,TT
RET

;*****************************************************************
;温度转换程序:精确到:0.06
TRANS : MOV A,WDLSB
ANL A,#0F0H
        MOV B,A
MOV A,WDMSB
ANL A,#0FH
ORL A,B
SWAP A
MOV B,#10
DIV AB
MOV DTEMP4,A
MOV DTEMP3,B
MOV DPTR,#TABB
MOV A,WDLSB
ANL A,#0FH
MOV B,#2
MUL AB
MOVC A,@A+DPTR
MOV DTEMP2,A
MOV A,WDLSB
ANL A,#0FH
MOV B,#2
MUL AB
INC A
MOVC A,@A+DPTR
MOV DTEMP1,A
RET
TABB:   DB 0,0,0,6,1,2,1,8,2,5,3,1,3,7,4,3,5,0
DB 5,6,6,2,6,8,7,5,8,1,8,7,9,3
;BCD转换设定温度用:
TRANS1: MOV A,WD1
ANL A,#0F0H
        MOV B,A
MOV A,WD2
ANL A,#0FH
ORL A,B
SWAP A
MOV B,#10
DIV AB
MOV 27H,A             ;26H
MOV 26H,B             ;27H
MOV DPTR,#TABB
MOV A,WD1
ANL A,#0FH
MOV B,#2
MUL AB
MOVC A,@A+DPTR
MOV 25H,A             ;25H
MOV A,WD1
ANL A,#0FH
MOV B,#2
MUL AB
INC A
MOVC A,@A+DPTR
MOV 24H,A             ;24H
RET
;******************************************************************
;发送一个字节程序
SEND_BYTE:
MOV A,R0
MOV R5,#8
SEN3:  CLR C
RRC A
JC SEN1
LCALL WRITE_0
SJMP SEN2
SEN1:   LCALL WRITE_1
SEN2:  DJNZ R5,SEN3         ; 循环8次,写一个字节
RET
;*******************************************************************
;读一个字节程序
READ_BYTE:
MOV R5,#8
READ1:  LCALL READ
RRC A
DJNZ R5,READ1      ; 循环8次,读一个字节
MOV R0,A
RET
;*******************************************************************
;复位程序,如果复位置位F0,没有就清F0
RST: CLR DAT
MOV R6,#250  ;主机发复位脉冲持续250*2US=500US
DJNZ R6,$
        SETB DAT        ;主机释放总线,口线改为输入
MOV R6,#40
DJNZ R6,$       ;等待80US
  MOV C,DAT
JC RST0
SETB F0          ;检测到信号,置位F0
SJMP  CHCK
RST0:  CLR F0           ;未准备好F0复位
CHCK:   MOV R6,#50
        DJNZ R6,$        ;等待应答结束
        RET
;*********************************************************************
;写一位数据
WRITE_0:           ;写0
        CLR DAT
MOV R6,#30
DJNZ R6,$
SETB DAT
RET
WRITE_1:CLR DAT           ;写1
NOP
NOP
NOP
NOP
        NOP
SETB DAT
MOV R6,#30
DJNZ R6,$
RET
;*********************************************************************
;读一位数据程序
READ:
CLR DAT
NOP
NOP
SETB DAT       ;置位DAT准备接收数据
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV C,DAT
MOV R6,#23
DJNZ R6,$
RET
;*************************************************************
;键盘子程序
KEY:      JB    KEYST,KEYRET     ;是设定键?是1无键返回
          JMP   KEYSF
KEYRET:   RET                    ;返回
KEYSF:
          LCALL DISP2            ;是设定键调显示去抖
          JNB   KEYST,KEYSF      ;为0等键释放是设定?
          CLR  EA
          SETB CON
          MOV   A,WD1
          ANL   A,#0FH
          MOV   XS,A             ;小数组装
KEYLOOP:
          LCALL DISP2             ;调显示去抖
          JB    KEYDN,KEY1       ;为0是减1有键顺序,为1转查加1
          DEC   XS
          MOV   A,XS
          ANL   A,#0FH
          ANL   WD1,#0F0H         ;保留WD1的整数部分
          ORL   WD1,A             ;送小数
          LCALL TRANS1           ;调BCD转换
KEY3:     LCALL DISP2             ;调显示去抖
          JNB   KEYDN,KEY3       ;为0等减1键释放
KEY1:     JB    KEYUP,KEY2       ;是加1顺序不是查设定
          INC   XS
          MOV   A,XS
          ANL   A,#0FH
          ANL   WD1,#0F0H
          ORL   WD1,A
          LCALL TRANS1           ;调BCD转换
KEY4:     LCALL DISP2             ;调显示去抖
          JNB   KEYUP,KEY4       ;为0等加1键释放
KEY2:     JB    KEYST,KEYLOOP    ;是设定键?不是转查加1减1键
KEYSF1:   LCALL DISP2            ;调显示去抖
          JNB   KEYST,KEYSF1     ;等设定释放
          MOV    A,WD1
          ANL    A,#0F0H
          SWAP   A
          MOV    B,A
          MOV    A,WD2
          ANL    A,#0FH
          SWAP   A
          ORL    A,B
          MOV    ZS,A            ;整数组装
KEYLOOP1:
          LCALL DISP2             ;调显示去抖
          JB    KEYDN,KEY11      ;为0是减1顺序不是转查加1键
          DEC  ZS                ;51H减1
          MOV  A,ZS
          CJNE A,#0FFH,KEYX2
          MOV  ZS,#63H
KEYX2:    MOV  A,ZS
          ANL  A,#0F0H           ;高四位
          SWAP  A
          MOV  WD2,A
          MOV  A,ZS
          ANL  A,#0FH            ;低四位
          SWAP A
          ANL  WD1,#0FH
          ORL  WD1,A
          LCALL TRANS1           ;调BCD转换
KEY31:    LCALL DISP2             ;调显示去抖
          JNB   KEYDN,KEY31      ;等减1键释放
KEY11:    JB    KEYUP,KEY21      ;为0是加1顺序不是转查设定键
          INC   ZS               ;51H加1
          MOV  A,ZS
          CJNE  A,#64H,KEYX1
          MOV   ZS,#00H
KEYX1:    MOV  A,ZS
          ANL  A,#0F0H           ;高四位
          SWAP  A
          MOV  WD2,A
          MOV  A,ZS
          ANL  A,#0FH            ;低四位
          SWAP A
          ANL  WD1,#0FH
          ORL  WD1,A
          LCALL TRANS1           ;调BCD转换
KEY41:    LCALL DISP2             ;调显示去抖
          JNB   KEYUP,KEY41      ;为0等加1键释放
KEY21:    JB    KEYST,KEYLOOP1   ;是设定键?不是转查加1减1键
          JNB   KEYST,$          ;等设定释放
          SETB  EA
          RET
;显示子程序----------------------------------------------------------------------
DISP0:
    MOV P1,#0FFH
    MOV  DPTR,#DISPTAB
    MOV  A,DTEMP1
    MOVC A,@A+DPTR
    MOV  P1,A
    CLR  P3.0
    CLR  P3.1   ;个位
    LCALL  T1MS
    MOV P1,#0FFH
    MOV  A,DTEMP2
    MOVC A,@A+DPTR
    MOV  P1,A
    SETB P3.0
    CLR  P3.1  ; 十位
    LCALL  T1MS
    MOV P1,#0FFH
    MOV  A,DTEMP3
    MOVC A,@A+DPTR
    MOV  P1,A
    CLR  P3.0
    SETB P3.1  ; 百位
    CLR  P1.7
    LCALL  T1MS
    MOV P1,#0FFH
    MOV  A,DTEMP4
    MOVC A,@A+DPTR
    MOV  P1,A
    SETB  P3.0  ;千位
    SETB  P3.1
    LCALL   T1MS
    MOV P1,#0FFH
    RET
DISP1:
        MOV P1,#0FFH
        MOV A,54H
        MOV DPTR,#DISPTAB1
        MOVC A,@A+DPTR
        MOV P1,A
        CLR  P3.0
        CLR  P3.1   ;个位
        CALL T1MS
        MOV P1,#0FFH
        MOV A,55H
        MOV DPTR,#DISPTAB1
        MOVC A,@A+DPTR
        MOV P1,A
        SETB P3.0
        CLR  P3.1   ; 十位
        CALL T1MS
        MOV P1,#0FFH
        MOV A,56H
        MOV DPTR,#DISPTAB1
        MOVC A,@A+DPTR
        MOV P1,A
        CLR  P3.0
        SETB P3.1   ; 百位
        CALL T1MS
        MOV P1,#0FFH
        MOV A,57H
        MOV DPTR,#DISPTAB1
        MOVC A,@A+DPTR
        MOV P1,A
        SETB  P3.1  ;千位
        SETB  P3.0
        CALL T1MS
        MOV P1,#0FFH
        RET
DISPTAB1B 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0C6H,0C7H, 0BFH, 0F1H
        ;     0,   1,  2,  3,  4,  5, 6,  7,  8,  9,A(C),B(L),D(-),E(J)
DISPTABB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DISP2:
        MOV P1,#0FFH
        MOV A,24H
        MOV DPTR,#DISPTAB2
        MOVC A,@A+DPTR
        MOV P1,A
        CLR  P3.0
        CLR  P3.1    ;个位
        CALL T1MS
        MOV P1,#0FFH
        MOV A,25H
        MOV DPTR,#DISPTAB2
        MOVC A,@A+DPTR
        MOV P1,A
        SETB P3.0
        CLR  P3.1   ; 十位
        CALL T1MS
        MOV P1,#0FFH
        MOV A,26H
        MOV DPTR,#DISPTAB2
        MOVC A,@A+DPTR
        MOV P1,A
        CLR  P3.0
        SETB P3.1  ; 百位
        CLR  P1.7
        CALL T1MS
        MOV P1,#0FFH
        MOV A,27H
        MOV DPTR,#DISPTAB2
        MOVC A,@A+DPTR
        MOV P1,A
        SETB  P3.0  ;千位
        SETB P3.1
        CALL T1MS
        MOV P1,#0FFH
        RET
DISPTAB2B  0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;*********************************************************************
;温度比较子程序
CHK:   MOV  A,WD2
       ANL  A,#0FH
       MOV  WD2,A
       MOV  A,WDMSB
       ANL  A,#0FH
       MOV  WDMSB,A
       CJNE A,WD2,CHK1           ;
       SETB C                    ;等于或小于C=1
CHK1:  JNC  KAI                  ;大于开报警
       CJNE A,WD2,CHK2           ;小于等于和51H再比较
CHK2:  JC   GUAN                 ;小于关报警
       MOV  A,WDLSB              ;高位等于,低位比较
       CJNE A,WD1,CHK3           ;和50H比较
CHK3:  JNC  KAI                  ;低位大于等于就开报警
GUAN:  SETB  CON                 ;否则关报警
       CLR  TR0
       CLR  ET0
       MOV  COUNT,#00H
       RET
KAI:   ;CLR  CON
       SETB  TR0
       SETB  ET0
       RET      
;********************************声音报警程序****************************
T0SEV:  PUSH  A
        INC  COUNT
        MOV  A,COUNT
        CJNE A,#10,T0RET
        MOV  COUNT,#00H
        CPL  CON
        MOV  TH0,#3CH
        MOV  TL0,#0B0H            
T0RET:  POP  A
        RETI        
END

;希望大家踊跃发帖把单片机板块火起来
2

评分次数

  • 中意维修:感谢分享,论坛有您更精彩!

  • 园东家电:原创内容,论坛有您更精彩!

敢问一下曹老师,你的精确到0.06度的参照标准是什么?

回复 2# 的帖子

本帖最后由 13013963877 于 2011-5-22 11:59 编辑

18B20的基本分辨率是0.0625,我现在编的精度还是低的,详细资料请你到网上查找DS18B20一看便知,有单片机问题可以发帖。
把线路图也发出来才读得懂程序啊
有线路图也无法看懂的!

错了,精度不是0.0625,而是0.5

错了,精度不是0.0625度,而是0.5度。
DS18B20转换结果有9位,10位,11位。其中那个0.0625是11位的分辨率。
精度和分辨率是不同的概念。比如我们常见的塑料尺子其分辨率是1MM,但是精度不是1MM。如果将尺子加热拉长,分辨率还是1MM,但是精度肯定不是1MM
1

评分次数

  • 13013963877:感谢分享,论坛有您更精彩!

果然是个单片机高手,以后可要麻烦您指点了,我现在正学习单片机,学了好长时间了,就是入不了门,只能编写一些简单的流水灯程序,想用18B20做一个热水泵自动控制电路,就是不知道程序如何写,也没有18B20的资料,还请曹老师帮忙给指点一下了

回复 7# 的帖子

这个程序很适合你做加热控制,IZF713指出概念错误在这里向他致谢!
都是大师呀!真好,俺也想学哟
bz你的c语言程序怎么没有呀 正在学习中 谢谢
返回列表