登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

[分享]数字温度计程序

作者:jaky 栏目:单片机
S1OK  EQU  5FH
TEMPUTER  EQU  39H
    TEMPH   EQU  5EH
     TEMPL EQU  5DH
     MS50   EQU  5CH
SIGN  EQU  5BH
           S1   BIT  P1.0
           S2   BIT  P1.1
           S3   BIT  P1.2
             S4   BIT  P1.3
               ORG   0000H
            LJMP  MAIN
            ORG   000BH
            LJMP  TOIT
         ORG   0030H
MAIN:   MOV   SP,  #60H
         MOV   TMOD, #01H
         MOV   TH0, #3CH
         MOV   TL0, #0B0H
         SETB  ET0
         SETB  TR0
         SETB  EA
         MOV  TEMPH, #30
         MOV  TEMPL, #9
         MOV  TEMPUTER, #15   ;温度最始值
         MOV  S1OK,  #00H
         MOV  SIGN,  #00H
         MOV  38H,  #0BH
         MOV  37H,  #0CH
         MOV  36H,  #0BH
         ACALL DISP
         ACALL T1S
; *****************************************
;  主程序
START:  JB  S1,  NET1
        ACALL T12MS
        JB  S1,  NET1
        JNB S1,  $
        INC SIGN
        MOV A, SIGN
        CJNE A, #1, TIAO
        ACALL TIAOTL
   TIAO:CJNE A, #2, NET1
        MOV SIGN, #0
        ACALL TIAOTH
; *****************************************
        NET1: MOV   A, S1OK
        CJNE  A, #1, START
        MOV   A, TEMPUTER
        SUBB  A,  TEMPH
        JNB   ACC.7, ALEM
        MOV   A, TEMPUTER
        SUBB  A,  TEMPL
        JB    ACC.7, ALEM
        SETB  P2.1
        ACALL WENDU
        ACALL DISP
        MOV   S1OK,  #00H
        AJMP  START
  ALEM: MOV   36H, #0CH
        MOV   37H, #0CH
        MOV   38H, #0CH
        CLR   P2.1
        ACALL DISP
        ACALL T1S
        LCALL WENDU
        LCALL DISP
        MOV   S1OK,  #00H
        SJMP  START
;*****************************************
TIAOTL:MOV  50H,    TEMPUTER
       MOV  37H,  TEMPL
       ACALL BIN_BCD
       ACALL DISP
       ACALL T12MS
       ACALL T12MS
       ACALL T12MS
       ACALL T12MS
       MOV   36H, #0AH
       MOV   37H, #0AH
       MOV   38H, #0AH
       ACALL DISP
       ACALL T12MS
       ACALL T12MS
       ACALL T12MS
       ACALL T12MS
       JB  S2,  ADD1
       ACALL T12MS
       JB  S2,  ADD1
       JNB S2,  $
       INC TEMPL
       MOV  A, TEMPL
       CJNE A, #100, ADD1
       MOV  TEMPL, #0
ADD1: JB  S3,  ADD2
       ACALL T12MS
       JB  S3,  ADD2
       JNB S3,   $
       DEC TEMPL
       MOV A, TEMPL
       CJNE A, #00 , ADD2
       MOV  TEMPL,#100
ADD2: JB  S4, TIAOTL
       ACALL T12MS
       JB  S4, TIAOTL
       JNB S4, $
       MOV TEMPUTER, 50H
       LJMP START
2楼: >>参与讨论
jaky

bsp;   ACALL T12MS

        JB  S4, TIAOTH
        JNB S4, $
        MOV TEMPUTER, 50H
        LJMP START
;  一秒定时中段
; *****************************************
TOIT:   PUSH   PSW
        PUSH   ACC
        MOV   TH0,  #3CH
        MOV   TL0,  #0B0H
        INC   MS50
        MOV   A,  MS50
        CJNE  A, #14H, RETURN
        MOV   S1OK, #1
        MOV   MS50, #00H
RETURN:POP   ACC
        POP   PSW
        RETI
; *****************************************
;温度总子程序
; *****************************************
wendu:  ACALL   INIT_1820
        ACALL   RE_CONFIG
        ACALL   GET_TEMPER
        ACALL   TEMPER_COV
        RET
; *****************************************
;DS18B20初始化程序
; *****************************************
      INIT_1820:
      SETB P2.0
      NOP
      CLR P2.0
      MOV R0,#06BH
      MOV R1,#03H
TSR1:
      DJNZ R0,TSR1 ; 延时
      MOV R0,#6BH
      DJNZ R1,TSR1
      SETB P2.0
      NOP
      NOP
      NOP
      MOV R0,#25H
TSR2:
     JNB P2.0,TSR3
     DJNZ R0,TSR2
     LJMP TSR4 ; 延时
TSR3:
     SETB 20H.1 ; 置标志位,表示DS1820存在
     LJMP TSR5
TSR4:
     CLR  20H.1 ; 清标志位,表示DS1820不存在
     LJMP TSR7
TSR5:
     MOV R0,#06BH
     MOV R1,#03H
TSR6:DJNZ R0,TSR6 ; 延时
     MOV  R0,#6BH
     DJNZ R1,TSR6
TSR7:SETB P2.0
     RET
; *****************************************
; 重新写DS18B20暂存存储器设定值
; *****************************************
RE_CONFIG:JB 20H.1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
      RET
RE_CONFIG1:
      MOV A,#0CCH ; 发SKIP ROM命令
      LCALL WRITE_1820
      MOV A,#4EH ; 发写暂存存储器命令
      LCALL WRITE_1820
      MOV A,#00H ; TH(报警上限)中写入00H
      LCALL WRITE_1820
      MOV A,#00H ; TL(报警下限)中写入00H
      LCALL WRITE_1820
      MOV A,#1FH ; 选择9位温度分辨率
      LCALL WRITE_1820
      RET
; *****************************************
; 读出转换后的温度值
; *****************************************
GET_TEMPER:
      SETB P2.0 ; 定时入口
      LCALL INIT_1820
      JB 20H.1,TSS2
      RET ; 若DS18B20不存在则返回
TSS2:
      MOV A,#0CCH ; 跳过ROM匹配
      LCALL WRITE_1820
      MOV A,#44H ; 发出温度转换命令
      LCALL WRITE_1820
      LCALL INIT_1820
      MOV A,#0CCH ; 跳过ROM匹配
      LCALL WRITE_1820
      MOV A,#0BEH ; 发出读温度命令
      LCALL WRITE_1820
      LCALL READ_18200
      MOV   37H,A ; 将读出的温度数据保存
      RET
; *****************************************
; 写DS18B20的程序
; *****************************************
WRITE_1820:
      MOV R2,#8
      CLR C
WR1:CLR P2.0
     NOP
     NOP
     NOP
     NOP
     RRC A
     MOV P2.0,C
     MOV R3,#35
     DJNZ R3,$
     SETB P2.0
     NOP
     DJNZ R2,WR1
     SETB P2.0
     RET
; *****************************************
; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
; *****************************************
READ_18200:
     MOV R4,#2 ; 将温度高位和低位DS18B20中读  
RE00:MOV R2,#8
RE01:CLR C
     SETB P2.0
     NOP
     NOP
     CLR P2.0
     NOP
     NOP
     NOP
     SETB P2.0
     NOP
     NOP
     MOV C,P2.0
     MOV R3,#35
RE20:
     DJNZ R3,RE20
     RRC A
     DJNZ R2,RE01
     MOV @R1,A
     DEC R1
     DJNZ R4,RE00
     RET
; ******************************
3楼: >>参与讨论
jaky
; *****************************************
; 将16进制的温度数据转换成压缩BCD码
; 38H中放百位,37十位,36个位
; *****************************************
BIN_BCD:
MOV    39H,37H
     MOV    A,37H
     MOV    B,#100
     DIV    AB
     MOV    38H,A
     MOV    37H,B
     XCH    A,B
     MOV    B,#10
     DIV    AB
     MOV    37H,A
     MOV    36H,B
     RET
DISP: SETB RS0
       MOV   R0, #36H
       MOV   R7, #3
LOOPP:MOV   A,  @R0
       MOV DPTR, #TAB
       MOVC A,   @A+DPTR
MOV  SBUF, A
       JNB  TI, $
       CLR  TI
       INC  R0
       DJNZ R7,  LOOPP
       CLR  RS0
       RET
TAB:  DB 11H, 0D7H, 32H, 92H, 0D4H, 98H, 18H, 0D1H, 10H, 90H  ,0FFH, 070H, 0FEH
      ; 延时子程序
T12MS: SETB  RS1
       MOV      R7, #18H
   TM: MOV  R6,  #0FFH
   TM6: DJNZ  R6, TM6
        DJNZ  R7, TM
        CLR  RS1
        RET
   ; 开机延时程序
    T1S: SETB  RS1
        MOV   R6, #3
    LSP:ACALL T12MS
        DJNZ  R6, LSP
        CLR  RS1
        RET
        END
4楼: >>参与讨论
jaky
不知道有没有错
5楼: >>参与讨论
微蓝

怎么没有硬件图的啊..........

6楼: >>参与讨论
godsky
这个程序 我好像见到过 ^_^
7楼: >>参与讨论
zjh19831011

这么多,干吗不用C写啊

8楼: >>参与讨论
luo5610

楼住,能告诉我在这个程序中如何修改程序就可以把这个温度程序的测温范围扩大到1000度啊

9楼: >>参与讨论
zwt659
楼主怎么没有上传硬件部分啊,这样看起来有点不太清楚
10楼: >>参与讨论
wujing198
我刚才看见一个帖子在求温度控制,用这个程序改一下就可以实现温度控制,无非就是加一段控制程序,设计1、2个控制信号而已。其实资源多的是,就看自己会不会用。
11楼: >>参与讨论
wap

C麻烦,不好写

 

 

 

参与讨论
昵称:
讨论内容:
 
 
相关帖子
单片机的通讯协议如何编啊
请教:如何将在计算机上编译好的obj文件写入单片机?
求 keil
[原创]汇编1602时钟程序
求助大侠
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号