⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 数字温度计完整源代码.txt

📁 数字温度计完整源代码本科毕业论文专用代码!!!!!!!绝无仅有
💻 TXT
字号:
源程序

TemperL       EQU    30H
TemperH       EQU    TemperL+1
TemperDotL    EQU    TemperH+1
TemperDotH    equ    TemperDotL+1
TemperZer     equ    TemperDotH+1
show          equ    40h
s1            bit    p0.1
s2            bit    p0.2
s3            bit    p0.3
bell          bit    p0.0
DQ            BIT    P3.2
Ds18b20F      BIT    00H
SkipDs18b20   equ    0cch
StartDs18b20  equ    44h
ReadDs        equ    0beh    
KEY1          BIT    P3.3  ;设置上限温度键
KEY2          BIT    P3.2  ;设置下限温度键
KEY3          BIT    P3.5  ;加一键
KEY4          BIT    P3.4  ;减一键
ST            EQU   25H   ;状态
TEMPB1        EQU   26H
TEMPB2        EQU   27H
SXH           EQU   28H   ;上限温度
SXL           EQU   29H
XXH           EQU   2AH   ;下限温度
XXL           EQU   2BH
SJH           EQU   2CH   ;实际温度
SJL           EQU   2DH


        ORG 0000H
        JMP MAIN

        ORG 0100H
MAIN:
        NOP
        NOP
        NOP
        MOV SP,#58H
        MOV ST,#00H
MAIN_2:
        CALL GETKEY             ;判键
        CJNE A,#00H,MAIN_1
        SJMP MAIN_2
MAIN_1: MOV B,A
        MOV R6,#20H             ;键盘去抖动
        CALL DELAY
        CALL GETKEY
        CJNE A,B,MAIN_13
        CJNE A,#01H,MAIN_4      ;设置上限温度键
        MOV A,ST
        CJNE A,#00H,MAIN_20
        MOV R6,SXH              ;显示上限温度
        MOV R7,SXL
        CALL TOSHOW
        MOV ST,#01H
        JMP MAIN_3
MAIN_20:CJNE A,#01H,MAIN_13
        MOV R6,SJH              ;显示实际温度
        MOV R7,SJL
        CALL TOSHOW
        MOV ST,#00H
MAIN_13:JMP MAIN_3

MAIN_4: CJNE A,#02H,MAIN_5      ;设置下限温度键
        MOV A,ST
        CJNE A,#00H,MAIN_22
        MOV R6,XXH              ;显示下限温度
        MOV R7,XXL
        CALL TOSHOW
        MOV ST,#02H
        JMP MAIN_3
MAIN_22:CJNE A,#02H,MAIN_13
        MOV R6,SJH              ;显示实际温度
        MOV R7,SJL
        CALL TOSHOW
        MOV ST,#00H
        JMP MAIN_3

MAIN_5: CJNE A,#03H,MAIN_6
        MOV A,ST
        CJNE A,#01H,MAIN_23

        MOV A,SXL               ;上限增加一度
        ADD A,#01H
        MOV SXL,A
        MOV A,SXH
        ADDC A,#00H
        MOV SXH,A
        MOV R6,SXH
        MOV R7,SXL
        CALL TOSHOW

        JMP MAIN_3
MAIN_23:CJNE A,#02H,MAIN_13

        MOV A,XXL               ;下限增加一度
        ADD A,#01H
        MOV XXL,A
        MOV A,XXH
        ADDC A,#00H
        MOV XXH,A
        MOV R6,XXH
        MOV R7,XXL
        CALL TOSHOW
        MOV R6,XXH
        MOV R7,XXL
        CALL TOSHOW

        JMP MAIN_3

MAIN_6: CJNE A,#04H,MAIN_3

        MOV A,ST
        CJNE A,#01H,MAIN_24

        CLR C
        MOV A,SXL               ;上限减少一度
        SUBB A,#01H
        MOV SXL,A
        MOV A,SXH
        SUBB A,#00H
        MOV SXH,A
        MOV R6,SXH
        MOV R7,SXL
        CALL TOSHOW

        JMP MAIN_3
MAIN_24:CJNE A,#02H,MAIN_3

        CLR C
        MOV A,XXL               ;下限减少一度
        SUBB A,#01H
        MOV XXL,A
        MOV A,XXH
        SUBB A,#00H
        MOV XXH,A
        MOV R6,XXH
        MOV R7,XXL
        CALL TOSHOW

        JMP MAIN_3

MAIN_3: CALL SHOWBUFF
        CALL GetTemper
        CALL TemperDo
        MOV TemperDotL,SJL
        MOV TemperDotH,SJH        
        MOV A,SJH
        CJNE A,SXH,MAIN_30
        MOV A,SJL
        CJNE A,SXL,MAIN_30        ;超上限
MAIN_31:SETB BELL                 ;报警
        JMP MAIN_32
MAIN_30:JNC MAIN_31
        JMP MAIN_32
MAIN_32:
        MOV A,XXH
        CJNE A,SJH,MAIN_33
        MOV A,XXL
        CJNE A,SJL,MAIN_33        ;超下限
MAIN_34:SETB BELL                 ;报警
        JMP MAIN_2
MAIN_33:JNC MAIN_34
        JMP MAIN_2


SHOWBUFF:
       MOV A,SHOW             ;点亮百位
       MOV DPTR,#GYTAB
       MOVC A,@A+DPTR
       MOV P1,A
       SETB S1
       CLR S2
       CLR S3

       MOV A,SHOW+1           ;点亮十位
       MOV DPTR,#GYTAB
       MOVC A,@A+DPTR
       MOV P1,A
       SETB S2
       CLR S1
       CLR S3

       MOV A,SHOW+2           ;点亮个位
       MOV DPTR,#GYTAB
       MOVC A,@A+DPTR
       MOV P1,A
       SETB S3
       CLR S1
       CLR S2

       RET

TOSHOW:
       CALL HB2         ;十六进制变十进制并拆开放入显示缓冲区
       MOV A,R4
       CALL GETHALF
       MOV SHOW,TEMPB1
       MOV A,R5
       CALL GETHALF
       MOV SHOW+1,TEMPB2
       MOV SHOW+2,TEMPB1
       RET

GETHALF:                  ;拆开A 高位在temp2内,低位在temp1内
        MOV B,A
        ANL A,#0F0H
        SWAP A
        MOV TEMPB2,A
        MOV A,B
        ANL A,#0FH
        MOV TEMPB1,A
        RET


GETKEY:                ;判键程序
        JB KEY1,GET_1
        MOV A,#01H
        JMP GET_5
GET_1:  JB KEY2,GET_2
        MOV A,#02H
        JMP GET_5
GET_2:  JB KEY3,GET_3
        MOV A,#03H
        JMP GET_5
GET_3:  JB KEY4,GET_4
        MOV A,#04H
        JMP GET_5
GET_4:  MOV A,#00H
GET_5:  RET

HB2:
        CLR  A         ;BCD码初始化
        MOV  R3,A
        MOV  R4,A
        MOV  R5,A
        MOV  R2,#10H   ;转换双字节十六进制整数
HB3:    MOV  A,R7      ;从高端移出待转换数的一位到 CY 中
        RLC  A
        MOV  R7,A
        MOV  A,R6
        RLC  A
        MOV  R6,A
        MOV  A,R5      ;BCD码带进位自身相加,相当于乘2
        ADDC  A,R5
        DA  A          ;十进制调整
        MOV  R5,A
        MOV  A,R4
        ADDC  A,R4
        DA  A
        MOV  R4,A
        MOV  A,R3
        ADDC  A,R3
        MOV  R3,A      ;双字节十六进制数的万位数不超过6,不用调整
        DJNZ  R2,HB3   ;处理完16bit
        RET

GetTemper:
    ;***************************
       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:
        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
        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 

;***************
Delay1S:
        mov b,#130
Dela11:
        push b    
        pop b
        djnz b,Dela11
        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

;**********************    
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

GYTAB:  DB  0C0H, 0F9H, 0A4H, 0B0H  ;00-03H  0  1  2  3   共阳
        DB  99H, 92H, 82H, 0F8H     ;04-07H  4  5  6  7
        DB  80H, 90H, 0FFH          ;08-09H  8  9

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -