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

* 31395: 江湖救急

   szqingliu 
szqingliu发表的帖子 

 源程序
   ;***************
   ;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



发表时间:2003年5月21日17:25:18

  
回复该帖

本主题共有 6 帖,分页:>>>>>该主题的所有内容[6]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

[上一篇帖子]:USB?Can't use USB for USB&
[下一篇帖子]:大家不要光看不说呀,小弟急用!