导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→江湖救急[mouseju]

 *第12096篇: 江湖救急

  
楼 主:mouseju 2003年5月16日11:01
 江湖救急
小弟近日正为用AT89C51配合DS18B20来监控井下每个矿点的温度。温度超标后声光报警,而后用PC机连接每一个矿点。最后利TC-35来实现短信发送报警信息的课题。不知那位高人可有这方面经验。愿意指点一二!江湖救急!!!!!!!!
  
2楼:szqingliu 2003年5月16日11:11
 我来回答你
89c51和数字传感器1820做主机,检测每一个点温度,例程上有,用485和PC通讯,通讯,在用pc机发端信息
  
3楼:xuyunsong 2003年5月16日15:47
 刚才去你的网站看了看,还不错。
  
4楼:mouseju 2003年5月16日11:40
 请帮个忙
szqingliu:
     谢谢,我去了你给的网站。只找到了DS1820的汇编程序。这段程序我已经找到。但是我现在有一端关于DS18B20的程序不懂,不知可否请您指点一下!!


  
5楼:szqingliu 2003年5月21日09:52
 1820与18B20应该差不多!
  
6楼:szqingliu 2003年5月21日17:25
 源程序
   ;***************
   ;Ds18b20_program  2003-1-3
   ;***************
   TemperL       EQU    8H
   TemperH       EQU    TemperL+1
   TemperDotL    EQU    TemperH+1
   TemperDotH    equ    TemperDotL+1
   TemperZer     equ    TemperDotH+1
   Led1       equ    TemperZer+1
   led2       equ    led1+1
   led3       equ    led2+1
   DogL       equ    Led3+1
   DogH       equ    DogL+1
   SpData       equ    22h
   
   DogX       equ    0 ;4Min
   
   Ds18b20F      BIT    00H

   DQ            BIT    P3.7
          led_1         bit p3.0
          led_2         bit p3.1
          led_3         bit p3.4
          
          key_f      bit p3.3
          pnp1       bit p3.4
          pnp2       bit p3.5
  
   
   oRG  0000H;            ;
        sJMP start            
   ORG  0003H;            ;
        reti;
   ORG  000BH             ;
        reti           ;
   ORG  0013H    
        reti              ;
   ORG  001BH             ;
        reti;aJMP T1        ;
   ORG  0023H             ;
       RETI; AJMP RS_485             ;
;**************************************                      
start:   
        MOV R7,#7fh       ;
  MOV R0,#1       ;
CR:             INC R0            ;
  MOV @R0,#0         ;
               djnz r7,cr        ;CLR RAM
                MOV SP,#SpData       ;
;*****************
;   MINI_Pragram
;*****************
;  mov Dogl,#DogX
  mov led1,#0fh
  mov led2,#ff_led
  mov led3,#ff_led
STAR_BI:
  CALL GetTemper
         CALL TemperDo
  call led
  djnz DogL ,Star_bi
;  djnz DogH,Star_bi
  mov p1,#0ffh
  mov p3,#0ffh
  mov Pcon,#02
  sjmp Star_bi
;*******************
LED:            
  mov dptr,#led_asc
 ;***************************led1
  mov a,led1
  movc a,@a+dptr
  call TurnAsc1
  mov p1,a
  clr led_1
  call timer_1ms
  setb led_1
 ;*************************led2  
 led_led2:
  mov a,led2
  movc a,@a+dptr
  call TurnAsc
  mov p1,a
  clr  led_2
  call timer_1ms
  setb led_2
 ;*************************led3  
 led_led3:
  mov a,led3
  movc a,@a+dptr
  call TurnAsc
  mov p1,a
  clr led_3
  call timer_1ms
  setb led_3
led_end:
  ret
;*************************
black     equ  1Ch
l_led     equ  11h
o_led     equ  15h
u_led     equ  1Bh
r_led     equ  18h
QQ_led    equ  1dh
p_led     equ  16h
a_led     equ  0ah
UU_led    equ  1ah
s_led     equ  19h
e_led     equ  0eh      
tt_led    equ  1fh
ff_led    equ  1eh
c_led     equ  0ch
h_led     equ  10h
b_led     equ  0bh
d_led     equ  0dh
f_led     equ  0fh                                                                                                                      
nn_led    equ  12h
n_led     equ  13h
cc_led    equ  2ah
oo_led    equ  15h   
rr_led    equ  16h
dot_led   equ  2bh 
;"bafgecdh"
;*********************************************
;       led=>    /   abcdefgh
led_asc:
  db 11111100B;0
  db 01100000B;1
  db 11011010B;2
  db 11110010B;3
  db 01100110B;4
  db 10110110B;5
  db 10111110B;6
  db 11100000B;7
  db 11111110B;8
  db 11110110B;9
  DB   11101110B;a=>  A
  DB   00111110B;B=>  B      
  DB   10011100B;C=>  C      
  DB   01111010B;D=>  D      
  DB   10011110B;E=>  E      
  DB   10001110B;F=>  F      
  DB   01101110B;H=>  10H      
  DB   00011100B;L=>  11H      
  DB   11101100B;N=>  12H      
  db   00101010b;n=>  13h
  db   11111100b;O=>  14h
  dB   00111010B;o=>  15H
  DB   11001110B;P=>  16H
  DB   11100110B;Q=>  17H
  DB   00001010B;r=>  18H
  DB   10110110B;S=>  19H      
  DB   01111100B;U=>  1AH      
  DB   00111000B;u=>  1BH      
  DB   00000000B;BLACK=>  1CH
  DB   11111111B;8.=>  1DH
  db   00000010b;-=>  1Eh
  db   00011110b;t=>  1Fh
  db 11111101B;0.=>  20h
  db 01100001B;1.
  db 11011011B;2.
  db 11110011B;3.
  db 01100111B;4.
  db 10110111B;5.
  db 10111111B;6.
  db 11100001B;7.
  db 11111111B;8.
  db 11110111B;9.=>  29h
;************* add 2002.12.10 
  DB   11101111B;a.=>  A
  DB   00111111B;B.=>  B      
  DB   10011101B;C.=>  C      
  DB   01111011B;D.=>  D      
  DB   10011111B;E.=>  E      
  DB   10001111B;F.=>  F      
  DB   01101111B;H.=>  10H      
  DB   00011101B;L.=>  11H      
  DB   11101101B;N.=>  12H      
  db   00101011b;n.=>  13h
  db   11111101b;O.=>  14h
  dB   00111011B;o.=>  15H
  DB   11001111B;P.=>  16H
  DB   11100111B;Q.=>  17H
  DB   00001011B;r.=>  18H
  DB   10110111B;S.=>  19H      
  DB   01111101B;U.=>  1AH      
  DB   00111001B;u.=>  1BH      
  DB   00000001B;BLACK.=>  1CH
  DB   11111111B;8.=>  1DH
  db   00000011b;-=>  1Eh
  db   00011111b;t=>  1Fh
  db 'li jie by 2002.12.24' 
;*************************************
timer_1ms:
  djnz b,$
  djnz b,$
  ret
;"bafgecdh"
;*********************************************
;       led=>    /   abcdefgh ,bafgecdh
TurnAsc:
  mov c,acc.0
  mov b.0,c
  mov c,acc.1
  mov b.4,c
  mov c,acc.2
  mov b.5,c
  mov c,acc.3
  mov b.3,c
  mov c,acc.4
  mov b.1,c
  mov c,acc.5
  mov b.2,c
  mov c,acc.6
  mov b.7,c
  mov c,acc.7
  mov b.6,c
  mov a,b
  ret  
;***************************
;abcdefgh=>  bafhecdg
TurnAsc1:
  mov c,acc.0
  mov b.4,c
  mov c,acc.1
  mov b.0,c
  mov c,acc.2
  mov b.5,c
  mov c,acc.3
  mov b.3,c
  mov c,acc.4
  mov b.1,c
  mov c,acc.5
  mov b.2,c
  mov c,acc.6
  mov b.7,c
  mov c,acc.7
  mov b.6,c
  mov a,b
  ret  
;******************
;读出转换后的温度值
GetTemper:
 SkipDs18b20 equ 0cch
 StartDs18b20 equ 44h
 ReadDs  equ 0beh 
 ;***************************
 SETB  DQ            ; 定时入口
    call InitDs18b20
        JB   Ds18b20F,S22
 ret
   S22:call Delay64uS
 MOV A,#SkipDs18b20        ; 跳过ROM匹配------0CC
        call WriteByteDs1820
        MOV  A,#StartDs18b20        ; 发出温度转换命令
        call WriteByteDs1820
        call DELAY1s
 call InitDs18b20
        JB   Ds18b20F,ABC
 ret
   ABC:call Delay64uS
       MOV  A,#SkipDs18b20        ; 跳过ROM匹配
       call WriteByteDs1820
       MOV  A,#ReadDs        ; 发出读温度命令
       call WriteByteDs1820
       call ReadDs18b20   ;READ_1820
       RET
;------------------读DS18B20的程序,从DS18B20中读出一个字节的数据
ReadByteDs1820:
       MOV    R2,#8
RE1:
       CLR    C
       SETB    DQ
       NOP
       NOP
       CLR    DQ
       NOP
       NOP
       NOP
       SETB    DQ
       MOV    R3,#7
       DJNZ    R3,$
       MOV    C,DQ
       MOV    R3,#23
       DJNZ    R3,$
       RRC    A
       DJNZ    R2,RE1
       RET
;-------------------写DS18B20的程序
WriteByteDs1820:
       MOV    R2,#8
       CLR    C
WR1:
       CLR    DQ
       MOV    R3,#6
       DJNZ    R3,$
       RRC    A
       MOV    DQ,C
       MOV    R3,#23
       DJNZ    R3,$
       SETB    DQ
       NOP
       DJNZ    R2,WR1
       SETB    DQ
       RET
       ;-------------------读DS18B20的程序,从DS18B20中读出两个字节的温度数据
ReadDs18b20:
 Call ReadByteDs1820
        MOV  TemperL,A
 Call ReadByteDs1820
        MOV  TemperH,A
        RET
        ;------------------重新写DS18B20暂存存储器设定值
RE_CONFIG:
        JB    Ds18b20F,RE_CONFIG1    ; 若DS18B20存在,转RE_CONFIG1
        RET
RE_CONFIG1:
        MOV    A,#0CCH        ; 发SKIP ROM命令
        call    WriteByteDs1820
        MOV    A,#4EH        ; 发写暂存存储器命令
        call    WriteByteDs1820
        MOV    A,#00H        ; TH(报警上限)中写入00H
        ;call    WriteByteDs1820
        MOV    A,#00H        ; TL(报警下限)中写入00H
        ;call    WriteByteDs1820
        MOV    A,#7FH        ; 选择12位温度分辨率
        call    WriteByteDs1820
        RET
;------------------延时子程序
DELAY:
 MOV   R7,#00H
Dey1:
 call  led
 DJNZ  R7,Dey1
 RET
Delay500uS:
 MOV   R6,#00H
        DJNZ  R6,$
        RET
Delay64uS:
 MOV   R6,#20H
        DJNZ  R6,$
        RET
;-------------------将从DS18B20中读出的温度数据进行转换
;2^3,2^2,2^1,2^0,2^-1,2^-2,2^-3,2^4 ;L
;SSSSSSS2^6,2^5,2^4;H
;************************
TemperDo:
     JB   Ds18b20F,Do1
        ret
do1:
 clr a
 mov TemperDotL,a
 mov TemperDotH,a
 mov TemperZer,a
 ;***************** 
 mov a,TemperH
 jnb acc.7,ZhenData ;>  0
 ;  <0
 mov a,TemperL
 cpl a
 add a,#01 ;cpl+1 
 mov TemperL,a
 mov a,TemperH
 cpl a
 addc a,#0
 mov TemperH,a
ZhenData:
 call FenLiDot 
 call FenLiZer
 call HexToLed
 call Led
 ret
;********************** 
FenLiZer:
 mov a,TemperL
 jnb acc.4,Fz1
 mov a,#01
 add a,TemperZer
 mov TemperZer,a
Fz1:
 mov a,TemperL
 jnb acc.5,Fz2
 mov a,#02
 add a,TemperZer
 mov TemperZer,a
Fz2:
 mov a,TemperL
 jnb acc.6,Fz3
 mov a,#04
 add a,TemperZer
 mov TemperZer,a
Fz3:
 mov a,TemperL
 jnb acc.7,Fz4
 mov a,#08
 add a,TemperZer
 mov TemperZer,a
Fz4:
 mov a,TemperH;!!!!
 jnb acc.0,Fz5
 mov a,#16
 add a,TemperZer
 mov TemperZer,a
Fz5:
 mov a,TemperH
 jnb acc.1,Fz6
 mov a,#32
 add a,TemperZer
 mov TemperZer,a
Fz6:
 mov a,TemperH
 jnb acc.2,Fz7
 mov a,#64
 add a,TemperZer
 mov TemperZer,a
Fz7:
 ret
;****************************
FenLiDot:
 mov a,TemperL
 jnb acc.3,Fen1 ;2^-1
 mov r5,#low(5000)
 mov r4,#High(5000)
 call Add2
Fen1:
 jnb acc.2,Fen2 ;2^-2
 mov r5,#low(2500)
 mov r4,#High(2500)
 call Add2
Fen2:
 jnb acc.1,Fen3 ;2^-3
 mov r5,#low(1250)
 mov r4,#High(1250)
 call Add2
Fen3:
 jnb acc.0,Fen4 ;2^-4
 mov r5,#low(625)
 mov r4,#High(625)
 call Add2
Fen4:
 ret
;****************
;TemperDorHL+r4r5=r2r3
;*****************
Add2:
 push a
 mov a,TemperDotL
 add a,r5
 mov TemperDotL,a
 mov a,TemperDotH
 addc a,r4
 mov TemperDotH,a
 pop a
 ret
;***********************
;  D=>  BCD_16
;***********************
bcd_16: clr a    ;in:r3r2[16 bdata]
      mov r4,a  ;R6,r5,r4[5 bcddata]
      mov r5,a
      mov R6,a
      mov R7,#10h
lp0:  clr c
      mov a,r2
      rlc a
      mov r2,a
      mov a,r3
      rlc a
      mov r3,a
      mov a,r4
      addc a,r4
      da a
      mov r4,a
      mov a,r5
      addc a,r5
      da a
      mov r5,a
      mov a,R6
      addc a,R6
      da a
      mov R6,a
      djnz R7,lp0
      ret 
;************************
HexToLed:
 mov r3,TemperDotH
 mov r2,TemperDotL
 call Bcd_16   ;r3r2(in)=>  r6r5r4(out)
 mov a,r5
 anl a,#0f0h
 swap a
 mov led3,a
 mov a,r5
 anl a,#0fh
 cjne a,#05,He1
 ;>  =0.5
He2: 
 inc led3
 sjmp He3 
He1:
 jnc He2
;******* Zer To Bcd
He3:
;***************************
 mov a,TemperZer
 mov b,#10
 div ab ;a.b
 mov led1,a
 jnz He4
 mov led1,#black
He4:
 mov a,b
 add a,#20h ;Add Dot
 mov led2,a
 ret
;***************
Delay1S:
 mov b,#130
Dela11:
 push b 
 call Led
 call Led
 pop b
 djnz b,Dela11
 ret
;-------------------DS18B20初始化程序
InitDs18b20:
        CLR    DQ
        MOV    R7,#80h
        DJNZ    R7,$        ; 延时
        SETB    DQ
        MOV    R7,#25h         ;
 DJNZ    R7,$
        SETB    Ds18b20F    ; 置标志位,表示DS1820存在
        JNB    DQ,TSR5
        CLR    Ds18b20F     ; 清标志位,表示DS1820不存在
        Jmp    TSR7
TSR5:
        MOV    R7,#06BH        ;200US
        DJNZ   R7,$        ; 延时
TSR7:
        SETB    DQ
        RET


>>>>>>对该主题发表你的看法

本主题贴数6,分页: [第1页]


[上一篇主题]:寻找芯片!!急急急!!!

[下一篇主题]:转让ICC AVR 编译器