DS18B20仿真问题


;----------------------------------------------------
          TEMP_TH   DATA  22H     ;高温报警值存放单元
          TEMP_TL   DATA  23H     ;低温报警值存放单元
          TEMP_ZH   DATA  24H     ;实时温度值存放单元
          TEMPL     DATA  25H
          TEMPH     DATA  26H
          TEMPHC    DATA  29H
          TEMPLC    DATA  2AH
   TL_A     DATA  80H
   TL_B     DATA  81H
   TH_A      DATA  82H
   TH_B     DATA  83H
          DATE_LINE EQU P2.2
          BUZZER EQU P2.0
          RELAY  EQU  P2.1  ;继电器控制端口
;--------------------------------
           ORG  0000H
           JMP  MAIN
           org 000bh  ;timer0中断起始地址
    jmp tim0  ;跳至timer0中断子程序
MAIN:     MOV  SP,#60H
          MOV  A,#00H
          MOV  R0,#20H       ;将 20H-2FH 单元清零
          MOV  R1,#80H
          MOV  R2,#10H
CLEAR:    MOV  @R0,A
          MOV  @R1,A
          INC  R0
          INC  R1
          DJNZ  R2,CLEAR
          mov  temp_th,#1EH
          mov  temp_TL,#1CH
          clr relay
START2:
          CALL  RESET
          MOV   A,#0CCH        ; 跳过ROM匹配
          CALL  WRITE
          MOV   A,#44H         ; 发出温度转换命令
          CALL  WRITE
          CALL  RESET
          MOV   A,#0CCH        ; 跳过ROM匹配
          CALL  WRITE
          MOV   A,#0BEH        ; 发出读温度命令
          CALL  WRITE
          CALL  READ
          CALL CONVTEMP
          Call DISPBCD
   CALL SMG
   CALL main0
          CALL TEMP_COMP
   JNB P2.3,L1
   SJMP START2
L1:   CALL SET_DELAY
   CALL SETTEMP
   SJMP START2
;-----------------------------------------------------
reset:  setb date_line
        nop
        clr date_line
        mov r0,#6bh         ;主机发出延时复位低脉冲
        mov r1,#04h
tsr1:   djnz r0,$
        mov r0,#6bh
        djnz r1,tsr1
        setb date_line        ;然后拉高数据线
        nop
        nop
        nop
        mov r0,#32h
tsr5:   mov r0,#06bh
tsr6:   djnz r0,$            ; 时序要求延时一段时间
tsr7:   setb date_line
        ret
;-------------------------------------------------------
write:  mov r2,#8            ;一共8位数据
        CLR  C
wr1:
        clr date_line        ;开始写入DS18B20总线要处于复位(低)状态
        mov r3,#07
        djnz r3,$            ;总线复位保持16微妙以上
        rrc a                ;把一个字节DATA 分成8个BIT环移给C
        mov date_line,c      ;写入一个BIT
        mov r3,#3CH
        djnz r3,$            ;等待100微妙
        setb date_line       ;重新释放总线
        nop
        djnz r2,wr1          ;写入下一个BIT
        setb date_line
        ret
;--------------------------------------------------------------------
read:    mov r4,#4          ; 将温度低位、高位、TH、TL从DS18B20中读出
         mov r1,#TEMPL        ; 存入25H、26H、27H、28H
re00:    mov r2,#8
re01:    clr cy
         setb date_line
         nop
         nop
         clr date_line        ;读前总线保持为低
         nop
         nop
         nop
         setb date_line       ;开始读总线释放
         mov r3,#09           ;延时18微妙
         djnz r3,$
         mov c,date_line      ;从DS18B20总线读得一个BIT
         mov r3,#3CH
         djnz r3,$            ;等待100微妙
         rrc a                ;把读得的位值环移给A
         djnz r2,re01         ;读下一个BIT
         mov @r1,a
         inc r1
         djnz r4,re00
         ret

;----------------------------------------------------
;  处理温度 BCD 码子程序
;----------------------------------------------------
CONVTEMP:      MOV  A,TEMPH       ;判温度是否零下
               ANL  A,#80H
               JZ  TEMPC1         ;温度零上转
               CLR  C
               MOV  A,TEMPL       ;二进制数求补(双字节)
               CPL  A             ;取反加1
               ADD  A,#01H
               MOV  TEMPL,A
               MOV  A,TEMPH
               CPL  A
               ADDC  A,#00H
               MOV  TEMPH,A
               SJMP  TEMPC11
TEMPC1:        MOV  TEMPHC,#0AH     ;+
TEMPC11:       MOV  A,TEMPHC
               SWAP  A
               MOV  TEMPHC,A
               MOV  A,TEMPL
               ANL  A,#0FH              ;乘0.0625
               MOV  DPTR,#TEMPDOTTAB
               MOVC  A,@A+DPTR
               MOV  TEMPLC,A            ;TEMPLC LOW=小数部分 BCD
               MOV  A,TEMPL             ;整数部分
               ANL  A,#0F0H             ;取出高四位
               SWAP  A
               MOV  TEMPL,A
               MOV  A,TEMPH             ;取出低四位
               ANL  A,#0FH
               SWAP  A
               ORL  A,TEMPL             ;重新组合
               MOV  TEMP_ZH,A
               LCALL  HEX2BCD1
               MOV  TEMPL,A
               ANL  A,#0F0H
               SWAP  A
               ORL  A,TEMPHC            ;TEMPHC LOW = 十位数 BCD
               MOV  TEMPHC,A
               MOV  A,TEMPL
               ANL  A,#0FH
               SWAP  A                  ;TEMPLC HI = 个位数 BCD
               ORL  A,TEMPLC
               MOV  TEMPLC,A
               MOV  A,R4
               JZ  TEMPC12
               ANL  A,#0FH
               SWAP  A
               MOV  R4,A
               MOV  A,TEMPHC            ;TEMPHC HI = 百位数 BCD
               ANL  A,#0FH
               ORL  A,R4
               MOV  TEMPHC,A
TEMPC12:       RET
;---------------------------------------------------------------
HEX2BCD1:
              MOV  B,#064H          ;十六进制-> BCD
              DIV  AB               ;B= A % 100
              MOV  R4,A             ;R7 = 百位数
              MOV  A,#0AH
              XCH  A,B
              DIV  AB               ;B = A % B
              SWAP  A
              ORL  A,B
              RET
;-------------------------------
;  小数部分码表
;-------------------------------
TEMPDOTTAB:
         DB   00H,00H,01H,01H,02H,03H,03H,04H
         DB   05H,05H,06H,06H,07H,08H,08H,09H
;--------------------------------
;显示区 BCD 码温度值刷新子程序
;--------------------------------
DISPBCD:
          MOV  A,TEMPLC
              ANL  A,#0FH
              MOV  70H,A                 ;小数位
      MOV  A,TEMPLC
              SWAP  A
              ANL  A,#0FH
              MOV  71H,A                 ;个位
      MOV  A,TEMPHC
              ANL  A,#0FH
              MOV  72H,A                 ;十位
      MOV  A,TEMPHC
              SWAP  A
              ANL  A,#0FH
              MOV  73H,A                 ;百位
              MOV  A,TEMPHC
              ANL  A,#0F0H
              CJNE  A,#010H,DISPBCD0
              SJMP  DISPBCD2
DISPBCD0:     MOV  A,TEMPHC
              ANL  A,#0FH
              JNZ  DISPBCD2               ;十位数是0
              MOV  A,TEMPHC
              SWAP  A
              ANL  A,#0FH
              MOV  73H,#0AH               ;符号位不显示
              MOV  72H,A                  ;十位数显示符号
DISPBCD2:     RET
;--------------------------------
; 数码管显示
;--------------------------------
SMG:
        mov dptr,#numtab
        MOV  A,TEMPLC
              ANL  A,#0FH
              MOV  70H,A                 ;小数位
              MOVC A,@A+DPTR
      MOV P0,A
      CLR P2.4
      CALL DELAY1
      SETB P2.4
      MOV  A,TEMPLC
              SWAP  A
              ANL  A,#0FH
              MOV  71H,A                 ;个位
              MOVC A,@A+DPTR
      MOV P0,A
      clr P0.0
                                  CLR P2.5
      CALL DELAY1
      SETB P2.5
      MOV  A,TEMPHC
              ANL  A,#0FH
              MOV  72H,A                 ;十位
              MOVC A,@A+DPTR
      MOV P0,A
                                  CLR P2.6
      CALL DELAY1
      SETB P2.6
      MOV  A,TEMPHC
              SWAP  A
              ANL  A,#0FH
              CJNE  A,#010H,SMG0
              SJMP  SMG2
SMG0:     MOV  A,TEMPHC
              ANL  A,#0FH
              JNZ  SMG2               ;十位数是0
              MOV  A,TEMPHC
              SWAP  A
              ANL  A,#0FH
              MOV  73H,#0AH               ;符号位不显示
              MOV  72H,A                  ;十位数显示符号
SMG2:         RET
numtab: db 03h,9fh,25h,0dh,99h,49h,41h,1fh,01h,09h
;--------------------------------
;发送给PC机
;--------------------------------
main0: MOV 20H,#00H
       MOV TMOD,#22H ;设定时器工作方式
       MOV SCON,#40H
   MOV TH1,#0FAH ;速度9600
   MOV PCON,#80H
   SETB TR1
   SETB REN ;允许接收
   ajmp kaishi
kaishi:
      MOV DPTR,#NUMTAB1
    MOV  A,TEMPLC
              ANL  A,#0FH
              MOV  70H,A                 ;小数位
   MOV  A,TEMPLC
              SWAP  A
              ANL  A,#0FH
              MOV  71H,A                 ;个位

  MOV  A,TEMPHC
              ANL  A,#0FH
              MOV  72H,A                 ;十位
  MOV  A,TEMPHC
              SWAP  A
              ANL  A,#0FH
              MOV  73H,A                ;百位
  MOV  A,TEMPHC
              ANL  A,#0F0H
SENDA:
     CLR A
     MOV A,70H
     MOV SBUF,A
     MOV SBUF,'$'
     AJMP DELAY1
     MOV A,71H
     mov sbuf,a
     mov sbuf,'$'
     AJMP DELAY1
     mov a,72H
     mov sbuf,a
     mov sbuf,'$'
     AJMP DELAY1
     mov a,73H
     mov sbuf,a
     mov sbuf,'$'
     AJMP DELAY1
     JNB TI,$
     CLR TI

              CJNE  A,#010H,PCFS0
              SJMP  PCFS2
PCFS0:     MOV  A,TEMPHC
              ANL  A,#0FH
              JNZ  PCFS2              ;十位数是0
              MOV  A,TEMPHC
              SWAP  A
              ANL  A,#0FH
              MOV  73H,#0AH               ;符号位不显示
              MOV  72H,A                  ;十位数显示符号
PCFS2:     RET
numtab1: db 02h,9fh,25h,0dh,99h,49h,41h,1fh,01h,09h
ok: db 70H,71H,72H,73H,'$'
;--------------------------------
;判断温度是过高还是过低
;--------------------------------
TEMP_COMP:
          MOV  A,TEMP_TH
          SUBB  A,TEMP_ZH       ;减数>被减数,则
          JC  Gaowen            ;借位标志位C=1,转
          MOV  A,TEMP_ZH
          SUBB  A,TEMP_TL       ;减数>被减数,则
          JC  DiWen            ;借位标志位C=1,转
          clr relay
          mov p1,#11110000B
          RET
GaoWen:   mov p1,#10101010B
          LJMP ALARM_SING
          RET
DiWen:    mov p1,#0
          setb relay
          RET
;--------------------------------
DE2:    NOP
         DJNZ  R7,DE2
         RET
DELAY:
         MOV  R6,#50
DL1:    MOV  R7,#100
         DJNZ  R7,$
         DJNZ  R6,DL1
         DJNZ  R5,DELAY
         RET
DELAY1:
         MOV  R6,#25
DL2:    MOV  R7,#50
         DJNZ  R7,$
         DJNZ  R6,DL2
         RET
;------------------------------------------------
SETTEMP:
TL_SET:  MOV R0,#TL_A
  MOV R1,#TL_B
  MOV R4,#0
  JNB P3.3,TEMP_INC
  JNB P3.2,TEMP_DEC
  JNB P2.3,TH_SET0
  CALL LOOK_ALARM
  SJMP TL_SET
TH_SET0: CALL SET_DELAY        
TH_SET:  MOV R0,#TH_A
  MOV R1,#TH_B
  MOV R4,#1
  JNB P3.3,TEMP_INC
  JNB P3.2,TEMP_DEC
  JNB P2.3,SET_OVER
  CALL LOOK_ALARM
  SJMP TH_SET
TEMP_INC:CALL SET_DELAY
  INC @R0
  MOV A,@R0
  CJNE A,#10,INC_OVER
  INC @R1
  MOV @R0,#0
  MOV A,@R1
  CJNE A,#10,INC_OVER
  MOV @R1,#0
INC_OVER:MOV A,R4
  JZ TL_SET
  AJMP TH_SET
TEMP_DEC:CALL SET_DELAY
  MOV A,@R0
  CJNE A,#0,DEC_A
  MOV @R0,#10
  MOV A,@R1
  CJNE A,#0,DEC_B
  MOV @R1,#10
  SJMP INC_OVER
DEC_A:  DEC @R0
  SJMP INC_OVER
DEC_B:  DEC @R1
  SJMP INC_OVER
SET_OVER:CALL SET_DELAY
         MOV A,TL_B
         MOV B,#10
         MUL AB
         ADD A,TL_A
         MOV TEMP_TL,A
         
         
         RET
SET_DELAY:
         mov r5,#5
SD1:     mov R6,#128
SD2:     mov r7,#255
         djnz r7,$
         djnz r6,SD2
         djnz r5,SD1
         ret
;------------------------------------------------
;显示子程序
LOOK_ALARM:
         mov dptr,#ALARMtab ;指定查表启始地址
         mov r6,#4
dpl1:    mov r5,#250     ;显示1000次
dplop:   mov a,@R0     ;取个位数
         MOVC A,@A+DPTR  ;查个位数的7段代码
         mov p0,a        ;送出个位的7段代码
         clr p2.4        ;开个位显示
         acall d1ms       ;显示1ms
         setb p2.4
         mov a,@R1 ;取十位数
         MOVC A,@A+DPTR ;查十位数的7段代码
         mov p0,a ;送出十位的7段代码
         clr p2.5 ;开十位显示
         acall d1ms ;显示1ms
         setb p2.5
         djnz r5,dplop ;100次没完循环
         djnz r6,dpl1 ;4个100次没完循环
         ret
D1MS: MOV R7,#2
      DJNZ R7,$
      RET
;7段数码管各划的数字排列表
ALARMtab: db 03h,9fh,25h,0dh,99h,49h,41h,1fh,01h,09h
;0 1 2 3 4 5 6 7 8 9
;--------------------------------------------
ALARM_SING:
        push a
        push psw
        mov tmod,#01h ;设timer0在MODE1
mov ie,#82h  ;中断使能
start0:
mov 30h,#00h ;取简谱码指针
next:   mov a,p1
        cpl a
        mov p1,a
        mov a,30h  ;简谱码指针载入A
mov dptr,#table ;至table取简谱码
movc a,@a+dptr
mov r2,a  ;取到的简谱码暂存于R2
jz end0  ;是否取到00(结束码)?
anl a,#0fh  ;不是,则取低4位(节拍码)
mov r5,a  ;将节拍码存入R5
mov a,r2  ;将取到的简谱码再载入A
swap a  ;高低四位交换
anl a,#0fh  ;取低四位(音符码)
jnz sing  ;取到的音符码是否为零?
clr tr0  ;是,则不发音
jmp d1
sing: dec a  ;取到的音符码减1(不含0).
mov 22h,a  ;存入(22H).
rl a  ;乘2
mov dptr,#table1 ;至table1取相对的高位字节计数值
movc a,@a+dptr
mov th0,a  ;取到的高位字节存入TH0
mov 21h,a  ;取到的高位字节存入(21H)
mov a,22h  ;再载入取的的音符码
rl a  ;乘2
inc a  ;加1
movc a,@a+dptr ;至table1取相对的低位字节计数值
mov tl0,a  ;取到的高位字节存入TL0
mov 20h,a           ;取到的高位字节存入(20H)
setb tr0  ;启动timer0
d1: call Adelay  ;基本单位时间1/4拍187毫秒
inc 30h  ;取简谱码指针加1
jmp next  ;取下一个码
end0: clr tr0  ;停止timer0
;        jmp start0  ;重复循环
        pop a
        pop psw
        ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;time0中断服务子程序用来产生相应的音调脉冲频率。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
tim0:
push acc  ;将A的值暂存于堆栈
push psw  ;将psw的值暂存于堆栈
mov tl0,20h  ;重设计数值
mov th0,21h
cpl BUZZER  ;将蜂鸣器反相
pop psw  ;至堆栈取回psw的值
pop acc  ;至堆栈取回a的值
reti   ;返回主程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Adelay: mov r7,#02h  ;187毫秒
d2: mov r4,#187
d3: mov r3,#248
djnz r3,$
djnz r4,d3
djnz r7,d2
djnz r5,Adelay ;决定节拍
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
table1:
dw 64260,64400,64524,64580
dw 64684,64777,64820,64898
dw 64968,65030,65058,65110
dw 65157,65178,65217
table:
;1
db 82h,01h,81h,94h,84h,0b4h,0a4h,04h,82h,01h,81h,94h,84h,0c4h,0b4h,04h
;2
db 82h,01h,81h,0f4h,0d4h,0b4h,0a4h,94h,0e2h,01h,0e1h,0d4h,0b4h,0c4h,0b4h,04h
;3
db 82h,01h,81h,94h,84h,0b4h,0a4h,04h,82h,01h,81h,94h,84h,0c4h,0b4h,04h
;4
db 82h,01h,81h,0f4h,0d4h,0b4h,0a4h,94h,0e2h,01h,0e1h,0d4h,0b4h,0c4h,0b4h,04h,00
END



这个是程序,下面的是仿真图,我自己看程序做的,图改别人的哈,有点乱,PO口是接LED选段,P2.7,2.6,2.5,2.4是选位,P2.2是接DS18B20,P3.2,3.3,2.3都是开关。。。仿真不出来,乱码。。麻烦帮忙看看是怎么回事谢谢!


12213.jpg

DS18B20 LED CC.rar
(2008-09-21 15:20:56, Size: 80.9 KB, Downloads: 22)


我也来说两句 查看全部回复

最新回复

  • jdimove (2008-9-22 21:14:48)

    nengbu nengyong de a lou zhu
  • nestneptune (2008-9-23 00:18:46)

    能用我就开心了。。感觉好像程序有问题
  • penngao (2008-9-26 17:19:59)

    好用不好用是一会事,但是我下 来,就要留个脚印,
  • liqingjian007 (2008-9-26 17:32:55)

    谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,谢谢你,
  • 268明 (2008-10-23 10:40:28)

    随碟附送大方的师傅的师傅发生地方是大方是大方的师傅谁的
  • hllppyx (2008-11-02 14:57:04)

    不是C的,看的眼花,呵,
  • sunsetboy (2008-11-02 15:45:30)

    这个仿真不错,谢谢提供这个仿真不错,谢谢提供
  • nzlanny (2008-11-23 13:29:08)

    我要看看这个能不能行啊!楼主不要钱吧,谢谢楼主了
  • hcdxt (2008-12-02 14:20:39)

    我现在也在弄这个!遇到问题了!先来找点资料!希望有用!顶你下楼主