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

📄 at89c5218b2012232f.txt.txt

📁 温度传感器采用DALLAS公司继DS1820之后推出的一种改进型智能温度传感器DS18B20
💻 TXT
📖 第 1 页 / 共 2 页
字号:
;****************************************************************;
;              温度计程序/18B20\12232F显示)                        ;
;                                                                ;
;              AT89C52/12M晶振/编写者LRM/2005.07.10               ;
;                                                                ;
;****************************************************************;
;
; 温度显示缓冲单元:60H-67H: :\空\百\十\个\小数点\小数位\空\℃
; 显示式样第二行为:    温度: 100.5 ℃
;*****************定义*********************;
                            PLAYFLG  EQU P3.4     ; 主程序运行指示灯用
                              SPEAK  BIT P0.2     ;
                               KEY2  BIT P3.2
                             KEYSW0  EQU  P2.6     ;
                             KEYSW1  EQU  P2.7     ;  

                         CON1S       DATA 3BH      ;  1秒计时用,温度1-2秒测量一次
                         CON1S_DATA  DATA 0FH      ;  测温间隔定时值65*15ms
                         FLG1S       EQU  07H      ;  1秒到标志
;************LCD定义***********************;
                            LAMPBLAK EQU        P1.4          ;背光灯控制,=0时开,=1时关.
                            CS      EQU P1.5          ;液晶使能,=1操作,=0禁止.
                            SID      EQU   P1.6          ;液晶串行数据输入口
                            CLK        EQU P1.7          ;液晶串行操作时钟口
;温度部分定义
                        TEMPHEAD        EQU   30H      ;
                    TEMPL      DATA  26H
                    TEMPH      DATA  27H
                    TEMPHC     DATA  28H
                    TEMPLC     DATA  29H
                        TEMPDIN         BIT     P1.3
;
        VSDA            BIT P3.6 ; EEPROM数据传送口,24C16的5脚
        VSCL            BIT P3.5 ; EEPROM时钟传送口 ,24C16的6脚
        BDATA           DATA 2AH  ;百十个小数位比较用
        SDATA           DATA 2BH
        GDATA           DATA 2CH
        XSDATA          DATA 2DH
;
;*********************程序入口*********************;
;
                                  ORG 0000H
                                  LJMP  START
                                  ORG 0003H
                                  RETI
                                  ORG 000BH
                                  LJMP INTT0
                                  ORG 0013H
                                  RETI
                                  ORG 001BH
                                  RETI
                                  ORG 0023H
                                  RETI
                                  ORG 002BH
                                  RETI
;
;*****************;主程序;*********************;
;
                START:
                          CLR  CS                ;液晶操作禁止
                      mov   SP, #80H         ;堆栈在80H上
                          LCALL   READTEMP  ;上电时先温度转换一次
                          MOV TMOD,#11H  ;计数器1,方式1
                           MOV TL0,#00H    ;1秒定时用
                          MOV TH0,#00H
                          CLR A                           ;
                          MOV R0, A                       ;从24C16中 0000H开始读出4个字节放在40H始单元
                          MOV R1, #BDATA                  ;
                          MOV R7, #04H                    ;
                          LCALL C16SERD                   ;
                          SETB EA
;
                            LCALL SETUP            ;LCD初始化
                          LCALL LOGON            ;开机显示画面
                          LCALL TEMPP            ;下行显示“温度:
                          SETB  ET0
                          SETB  TR0
                          CLR   FLG1S
                          MOV   CON1S,#CON1S_DATA
                          AJMP  MAIN11
;以下主程序
              MAIN1:      
                          JNB    KEY2,BAOJSET ;设置温度报警
                          JBC    FLG1S,MAIN11
                          AJMP   MAIN1
MAIN11:
                          LCALL   READTEMP1      ;读出温度值子程序
                          LCALL   CONVTEMP    ;温度BCD 码计算处理子程序
                          LCALL DISPTEMP                ;温度值显示涮新子程序
                          LCALL BAOJ                    ; 报警处理
                          LCALL   READTEMP                ;再发一次转换温度命令
                          SETB  TR0
                          SETB  ET0
                          CPL   PLAYFLG                 ;程序运行指示灯
                          LJMP MAIN1
;
        BAOJSET:     LCALL   DELAY1
                     JNB     KEY2,BAOJSET
                     CLR    ET0
                     CLR    EA
                     CLR    TR0
                     MOV  A,#90H         ;第二行左第一个字开始
                 LCALL WRITE_COM
                 MOV  DPTR,#CHINESE4       ;16*16点阵“报警-----”
                 LCALL WRITE_HZ
                     MOV    66H,XSDATA
                     MOV    64H,GDATA
                     MOV    63H,SDATA
                     MOV    62H,BDATA
                     MOV     60H,#0AH                ;  :
                     MOV     61H,#0FH                ;  空
                     MOV     65H,#11H                ;  小数点.
                     MOV     67H,#0FH                ;  空
                     LCALL   TEMPUP                 ;显示报警温度
                     MOV     R0,#62H
           SET10:
                    JNB     KEY2,SET2
                    JNB     KEYSW0,SAFEADD1
                    JNB     KEYSW1,SAFESUBB1
                    LCALL   TEMPUP                 ;显示报警温度
                    LJMP    SET10
           SET2:    LCALL   DELAY1
                    JNB     KEY2,SET2
                    INC     R0
                    MOV     A,R0
                    CLR     C
                    CJNE    A,#65H,SET101
        SET101:     JC      SET10
                    AJMP    SETOUT
;
       SAFEADD1:    LCALL   DELAY1
                    JNB     KEYSW0,SAFEADD1
                    MOV     A,@R0
                    LCALL   ADD11
                    MOV     @R0,A
                    LJMP    SET10
       SAFESUBB1:   LCALL   DELAY1
                    JNB     KEYSW1,SAFESUBB1
                    MOV     A,@R0
                    LCALL   SUBB11
                    MOV     @R0,A
                    LJMP    SET10
;
       SETOUT:      MOV    BDATA,62H
                    MOV    SDATA,63H
                    MOV    GDATA,64H
                    MOV    XSDATA,66H
                    CLR A            ; 把4 字节写入24C16的0000H开始地址中
                    MOV R0, A        ;
                    MOV R1, #BDATA   ;
                    MOV R7, #4       ;R7中的最大数据在1-16
                    LCALL C16PAWR    ;
                LCALL TEMPP
                    SETB    ET0
                    SETB     EA
                    SETB    TR0
MAIN111:            LJMP    MAIN1
;
ADD11:
                    ADD    A,#01H
                    CJNE   A,#0AH,OLOOP
       OLOOP:       JC    OUTT
                    MOV   A,#00H
       OUTT:        RET
;
       SUBB11:
                    JZ     PPP1
                    DEC    A
       OUTP:        RET
       PPP1:        MOV    A,#09H
                    AJMP   OUTP
;以下中断程序用于1秒定时用
INTT0:
                          DJNZ  CON1S,INTOUT
                          CLR   TR0
                          CLR   ET0
                          MOV   CON1S,#CON1S_DATA
                          SETB  FLG1S
INTOUT:                   RETI
;
BAOJ:               SETB   SPEAK
                    MOV    A,62H
                    CJNE   A,#0FH,BB3
                    MOV    A,#00H
                    CLR    C
BB3:                CJNE   A,BDATA,BAO1
                    MOV    A,63H
                    CJNE   A,#0FH,BB2
                    MOV    A,#00H
                    CLR    C
BB2:                CJNE   A,SDATA,BAO1
                    MOV    A,64H
                    CLR    C
                    CJNE   A,GDATA,BAO1
                    MOV    A,66H
                    CLR    C
                    CJNE   A,XSDATA,BAO1
        BAOJING:    CLR    SPEAK
            BBAO:   RET
;
         BAO1:      JC     BBAO
                    LJMP   BAOJING
;
;***************开机显示画面***********************
LOGON: MOV  A,#80H        ;第一行左第一个字开始
    LCALL WRITE_COM
    MOV  DPTR,#CHINESE     ;WORD 16*16点阵TEST
    LCALL WRITE_HZ
        MOV  A,#90H          ;第二行左第一个字开始
    LCALL WRITE_COM
    MOV  DPTR,#CHINESE1    ;WORD 16*16点阵TEST
    LCALL WRITE_HZ
        CLR   LAMPBLAK         ;开背光灯
        LCALL DELAY5S          ;显示5秒
        SETB  LAMPBLAK         ;关背光灯
        RET
;**********初始化程序*************
SETUP:  LCALL DELAY
        LCALL DELAY
        LCALL DELAY
        LCALL DELAY
    MOV  A,#01H    ;CLEAR DISPLAY
    LCALL WRITE_COM
    MOV  A,#00110000B ;FUNCTION SETTING
    LCALL WRITE_COM
    MOV  A,#00000010B ;DDRAM SET TO '00H'
    LCALL WRITE_COM
    MOV  A,#00000100B ;
    LCALL WRITE_COM
    MOV  A,#00001100B ;DISPLAY ON
    LCALL WRITE_COM
    MOV  A,#00000001B ;CLEARING SCREEN
    LCALL WRITE_COM
    MOV  A,#10000000B ;SET DDRAM ADDRESS
    LCALL WRITE_COM
        LCALL DELAY
    LCALL DELAY
    LCALL DELAY
        LCALL DELAY
    RET
;************串行命令写入子程序****************
;写入命令字在A中
WRITE_COM:
            LCALL DELAY1    ;
                SETB  CS
       PUSH  ACC
       MOV  R0,#8
       MOV  A,#11111000B
COMM1:
                CLR  C
       RLC  A
       MOV  SID,C
       CLR  CLK
                SETB CLK
       DJNZ R0,COMM1
       POP  ACC
       MOV  R5,A
       ANL  A,#0F0H
       MOV  R0,#8
COMM2:         CLR  C
       RLC  A
       MOV  SID,C
       CLR  CLK
       SETB CLK
       DJNZ R0,COMM2
       MOV  A,R5
       SWAP A
       ANL  A,#0F0H
       MOV  R0,#8
COMM3:         CLR  C
       RLC  A
       MOV  SID,C
       CLR  CLK
       SETB CLK
       DJNZ R0,COMM3
       CLR  CS
            RET
;
;***********串行数据写入子程序****************
;写入数据字在A中
WRITE_DAT:
       LCALL DELAY1
                SETB CS
       PUSH  ACC
       MOV  R0,#8
       MOV  A,#11111010B
DATA1:         CLR  C
       RLC  A
       MOV  SID,C
       CLR  CLK
       SETB CLK
       DJNZ R0,DATA1
       POP  ACC
       MOV  R5,A
       ANL  A,#0F0H
       MOV  R0,#8
DATA2:         CLR  C
       RLC  A
       MOV  SID,C
       CLR  CLK
       SETB CLK
       DJNZ R0,DATA2
       MOV  A,R5
       SWAP A
       ANL  A,#0F0H
       MOV  R0,#8
DATA3:         CLR  C
       RLC  A
       MOV  SID,C
       CLR  CLK
       SETB CLK
       DJNZ R0,DATA3
       CLR  CS
            RET
;
;**************延时子程序**********************
;0.544ms
DELAY1:
    MOV  R7,#010H
D11:   MOV  R6,#010H
    DJNZ R6,$
    DJNZ R7,D11
    RET
;0.13s
DELAY:
    MOV  R1,#00H
D2: MOV  R2,#00H
    DJNZ R2,$
    DJNZ R1,D2
    RET
;5.2s
DELAY5S:MOV  R3,#28H
DE5S:   LCALL DELAY
        DJNZ R3,DE5S
        RET
;
;************16*16点阵汉字写入子程序共7个***********
WRITE_HZ:    ;WRITE 7 CHINESE TO LCD
       MOV  R4,#7
DD:         CLR  A
       MOVC A,@A+DPTR
       INC  DPTR
       LCALL WRITE_DAT
       CLR  A
       MOVC A,@A+DPTR
       INC DPTR
       LCALL WRITE_DAT
       DJNZ R4,DD
       RET
;************16*16点阵汉字写入子程序共2个***********
WRITE_HZ2:      ;WRITE 8 CHINESE TO LCD
       MOV  R4,#2
DD4:           CLR  A
       MOVC A,@A+DPTR
       INC  DPTR
       LCALL WRITE_DAT
       CLR  A
       MOVC A,@A+DPTR
       INC DPTR
       LCALL WRITE_DAT
       DJNZ R4,DD4
       RET
;
;*****************************16*8点阵的字符代码表**********************************
TABLE1: DB     30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,3AH,3BH,3CH,3DH,3EH,20H,2DH,2EH
;               0   1   2   3   4   5   6   7   8   9   :   ;   <   =   > "不显"'-''.'
;**********************************自造字符地址表***********************************
CGRAM1:   DB 000H,000H
CGRAM2:   DB 000H,002H
CGRAM3:   DB 000H,004H
CGRAM4:   DB 000H,006H
;******************"这里是16*16点阵的汉字代码表"************************************
CHINESE:  DW 0DBA0H,0D5E3H,0BDADH,0BAA3H,0D1F3H,0D1A7H,0D4BAH,0DBA0H;—浙江海洋学院—
CHINESE1: DW 0C2A5H,0C8BBH,0C3E7H,0B1CFH,0D2B5H,0C9E8H,0BCC6H,0DBA0H;楼然苗毕业设计—
CHINESE2: DW 0CAB1H,0BCE4H                                          ;时间
CHINESE3: DW 0CEC2H,0B6C8H,0DBA0H,0DBA0H,0DBA0H,0DBA0H,0A1E6H       ;温度----℃
CHINESE4: DW 0B1A8H,0BEAFH,0DBA0H,0DBA0H,0DBA0H,0DBA0H,0A1E6H       ;报警----℃                                          ;℃
;
;********************************************************************************
;
;
;**********************************************************
;以下温度测量子程序区
;
;**********************************************************
;       RESET DS18B20
;**********************************************************
INITDS1820:  SETB  TEMPDIN        ;
       NOP            ;
       NOP            ;
       CLR   TEMPDIN        ;
       MOV   R6, #0A0H      ; DELAY 480us
       DJNZ  R6, $
                MOV   R6, #0A0H
                DJNZ  R6, $       ;
       SETB  TEMPDIN        ;
       MOV   R6, #32H    ; DELAY 70us
       DJNZ  R6, $       ;
                MOV     R6,#3CH
LOOP1820:       MOV   C, TEMPDIN     ;
       JC INITDS1820OUT     ;
                DJNZ    R6,LOOP1820
                MOV   R6, #064H      ; DELAY 200us
       DJNZ  R6, $       ;
       SJMP  INITDS1820     ;
       RET            ;
;
INITDS1820OUT:  SETB  TEMPDIN        ;
       RET            ;
;
;
;**********************************************************
;       读DS18B20的程序, 从DS18B20中读出一个字节的数据
;**********************************************************
READDS1820:     MOV   R7, #08H    ;
       SETB  TEMPDIN        ;
       NOP            ;
       NOP            ;
READDS1820LOOP: CLR   TEMPDIN        ;
       NOP            ;
       NOP            ;
       NOP            ;
       SETB  TEMPDIN        ;
       MOV      R6, #07H    ; DELAY 15us
             DJNZ    R6, $        ;
            MOV     C, TEMPDIN    ;
       MOV   R6, #3CH    ; DELAY 120us
       DJNZ    R6, $        ;
       RRC   A        ;
                SETB  TEMPDIN        ;
       DJNZ    R7, READDS1820LOOP ;
       MOV   R6, #3CH    ; DELAY 120us
       DJNZ  R6, $       ;
       RET            ;
;
;
;**********************************************************
;       写DS18B20的程序, 从DS18B20中写一个字节的数据
;**********************************************************
WRITEDS1820:    MOV   R7, #08H    ;
       SETB  TEMPDIN        ;

⌨️ 快捷键说明

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