<li id="q1oxu"></li>

    <li id="q1oxu"><ol id="q1oxu"></ol></li>

    <li id="q1oxu"><th id="q1oxu"><pre id="q1oxu"></pre></th></li>

    <noscript id="q1oxu"><th id="q1oxu"></th></noscript>
    <rt id="q1oxu"><tbody id="q1oxu"><bdo id="q1oxu"></bdo></tbody></rt>
      專注電子技術(shù)學(xué)習(xí)與研究
      當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

      51單片機(jī)DS18B20溫度控制報(bào)警程序(可設(shè)置溫控范圍)

      作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2013年04月15日   【字體:

      DS18B20的管腳定義:
      1、GND
      2、DQ
      3、VCC

       DQ   →  P1.7
       
       K1   →  P3.2
       K2   →  P3.4
       K3   →  P3.6
       K4   →  P3.7

      溫度顯示用四位數(shù)碼管,當(dāng)溫度>=100度時(shí),第四位才顯示。
      第五位數(shù)碼管顯示狀態(tài)符號(hào)。

      開機(jī)檢測(cè) DS18B20 狀態(tài):

      DS18B20正常顯示:
       
         O  18.8  ← 顯示實(shí)時(shí)溫度和加熱標(biāo)記“O”

      DS18B20不正常顯示:
      黑屏、蜂鳴器一直響。

      這時(shí)你要檢查DS18B20是否連接好、接對(duì),否則要更換一個(gè)新的 DS18B20 芯片。

      程序在整個(gè)運(yùn)行過(guò)程中,始終對(duì) DS18B20 進(jìn)行檢測(cè)。
      你可以將 DS18B20 從 51hei-5 拔掉,檢測(cè)一下此功能。

      一、查看溫度報(bào)警值:

      K1 → 進(jìn)入查看溫度報(bào)警值 TL 狀態(tài):

        L--20
       TL: 20   低位報(bào)警值

      K1 → 進(jìn)入查看溫度報(bào)警值 TH 狀態(tài):
       
        H--28
       TH: 28  高位報(bào)警值

      K1 → 退出查看溫度報(bào)警值狀態(tài)。


      二、設(shè)定溫度報(bào)警值:

      1、K3 → 進(jìn)入設(shè)定溫度報(bào)警值 TL 狀態(tài):

         L--20

      2、K3 → 進(jìn)入設(shè)定溫度報(bào)警值 TH 狀態(tài):

         H--28

      3、K3 → 返回

      4、設(shè)定過(guò)程: K1 →加鍵 (UP), K2 →減鍵 (DOWN),可快速調(diào)。

      將設(shè)定的溫度報(bào)警值自動(dòng)存入 DS18B20 的 EEROM 中,可永久保存。
      每次開機(jī)時(shí)自動(dòng)從 DS18B20 的 EEROM 讀出溫度報(bào)警值。

      三、報(bào)警狀態(tài)的顯示:

      1、當(dāng)實(shí)際溫度大于 TH 的設(shè)定值時(shí),
       
         H  38.8       H → 閃動(dòng)

      關(guān)閉繼電器,表示超溫。

      2、當(dāng)實(shí)際溫度小于 TL 的設(shè)定值時(shí),
       
         L  18.8       L → 閃動(dòng)

      表示加熱部分出現(xiàn)故障。

      3、當(dāng)實(shí)際溫度小于 TH 的設(shè)定值時(shí),繼電器吸合,開始加熱。
       
      加熱標(biāo)記為“O”

      四、其它功能

      1、以閃動(dòng)方式顯示標(biāo)記符 “ H”、“ L”、“O”。

      2、實(shí)時(shí)溫度百位數(shù)為 “0”時(shí),不顯示。

      3、報(bào)警溫度值百位數(shù)為 “0”時(shí),顯示“-”。
       
      完整的程序代碼下載地址:http://www.torrancerestoration.com/f/DS18B20溫度控制LED顯示_asm.rar

      ;*****************************************************************
      ;*  標(biāo)題:  51Hei單片機(jī)開發(fā)系統(tǒng)演示程序 - DS18B20溫度控制數(shù)碼管顯示              *
      ;*  晶振:  12M                                                                  *
      ;*  跳線設(shè)置:J5的12腳用跳線帽短接,J5的第3腳用杜邦線連接到頂部P1.0擴(kuò)展,其他默認(rèn)                                                                  *                                                 *
      ;*  網(wǎng)站: http://www.torrancerestoration.com                                                  *
      ;******************************************************************
      ;*  描述:                                                                       *
      ;*          DS18B20溫度控制數(shù)碼管顯示                                           *
      ;*        1、K3 → 進(jìn)入設(shè)定溫度報(bào)警值 TL 狀態(tài):                                   *
      ;*           L--20                                                            *
      ;*        2、K3 → 進(jìn)入設(shè)定溫度報(bào)警值 TH 狀態(tài):                                   *
      ;*           H--28                                                            *
      ;*        3、K3 → 返回                                                          *
      ;*        4、設(shè)定過(guò)程: K1 →加鍵 (UP), K2 →減鍵 (DOWN),可快速調(diào)。         *
      ;*                                                                              *
      ;********************************************************************************
      
      
                TIMER_L     DATA  23H
                TIMER_H     DATA  24H
                TIMER_COUN  DATA  25H
      
                TEMPL       DATA  26H
                TEMPH       DATA  27H
                TEMP_TH     DATA  28H
                TEMP_TL     DATA  29H
      
                TEMPHC      DATA  2AH
                TEMPLC      DATA  2BH
                TEMP_ZH     DATA  2CH
      
                BEEP        EQU   P1.0
                DATA_LINE   EQU   P1.7
                RELAY       EQU   P2.2
      
                FLAG1       EQU   20H.0
                FLAG2       EQU   20H.1
      
      ;-------------------------------------------------
                K1   EQU  P3.2
                K2   EQU  P3.4
                K3   EQU  P3.6
                K4   EQU  P3.7
      ;=================================================
                ORG 0000H
                JMP  MAIN
      
                ORG  000BH
                AJMP  INT_T0
      ;--------------------------------------------------
      MAIN:     MOV SP,#30H
            ;以下5行的功能是關(guān)閉8*8點(diǎn)陣的輸出,也就是把所有的行置0,這樣不管列為任何電平點(diǎn)陣都不會(huì)亮了.
               MOV     R2,#8    ;輸出數(shù)據(jù)8位 
      hei:     CLR     P2.4     ;拉低SCL,以便下次拉高便可產(chǎn)生上升沿
               CLR     P2.5  ;數(shù)據(jù)先送入74hc164,等待clk上升沿的到來(lái)
               SETB    P2.4     ;低電平到高電平邊沿觸發(fā)到來(lái),并行數(shù)據(jù)輸出至164的Q0-Q7
               DJNZ    R2,hei   ;判斷輸出完畢了沒(méi)有
                MOV  TMOD,#01H        ;T0,方式1
                MOV  TIMER_L,#00H     ;50ms定時(shí)值
                MOV  TIMER_H,#4CH
                MOV  TIMER_COUN,#00H  ;中斷計(jì)數(shù)
                MOV  IE,#82H          ;EA=1,ET0=1
                LCALL  READ_E2
                ;LCALL  RE_18B20
                MOV  20H,#00H
                SETB   BEEP
                SETB   RELAY
                MOV  7FH,#0AH         ;熄滅符
      
                CALL RESET            ;復(fù)位與檢測(cè)DS18B20
                JNB FLAG1,MAIN1       ;FLAG1=0,DS18B20不存在
                JMP  START
      
      MAIN1:    CALL RESET
                JB FLAG1,START
                LCALL  BEEP_BL        ;DS18B20錯(cuò)誤,報(bào)警
                JMP  MAIN1
      START:
                MOV A,#0CCH         ; 跳過(guò)ROM匹配
                CALL WRITE
                MOV A,#044H         ; 發(fā)出溫度轉(zhuǎn)換命令
                CALL WRITE
      
                CALL RESET
                MOV A,#0CCH         ; 跳過(guò)ROM匹配
                CALL WRITE
                MOV A,#0BEH         ; 發(fā)出讀溫度命令
                CALL WRITE
      
                CALL  READ           ;讀溫度數(shù)據(jù)
                CALL  CONVTEMP
                CALL  DISPBCD
                CALL  DISP1
                CALL  SCANKEY
                LCALL  TEMP_COMP
                JMP   MAIN1
      
      ;=====================================================
      ;DS18B20 復(fù)位與檢測(cè)子程序
      ;FLAG1=1 OK, FLAG1=0 ERROR
      ;======================================================
      RESET:
                SETB DATA_LINE
                NOP
                CLR DATA_LINE
                MOV R0,#64H            ;主機(jī)發(fā)出延時(shí)600微秒的復(fù)位低脈沖
                MOV R1,#03H
      RESET1:   DJNZ R0,$
                MOV R0,#64H
                DJNZ R1,RESET1
                SETB DATA_LINE        ;然后拉高數(shù)據(jù)線
                NOP
                MOV R0,#25H
      RESET2:   JNB DATA_LINE,RESET3  ;等待DS18B20回應(yīng)
                DJNZ R0,RESET2
                JMP RESET4            ; 延時(shí)
      RESET3:   SETB FLAG1            ; 置標(biāo)志位,表示DS1820存在
                JMP RESET5
      RESET4:   CLR FLAG1             ; 清標(biāo)志位,表示DS1820不存在
                JMP RESET6
      RESET5:   MOV R0,#064H
                DJNZ R0,$             ; 時(shí)序要求延時(shí)一段時(shí)間
      RESET6:   SETB DATA_LINE
                RET
      ;===========================================================
      ;
      ;===========================================================
      WRITE:  MOV R2,#8            ;一共8位數(shù)據(jù)
              CLR CY
      WR1:
              CLR DATA_LINE        ;開始寫入DS18B20總線要處于復(fù)位(低)狀態(tài)
              MOV R3,#09
              DJNZ R3,$            ;總線復(fù)位保持18微妙以上
              RRC A                ;把一個(gè)字節(jié)DATA 分成8個(gè)BIT環(huán)移給C
              MOV DATA_LINE,C      ;寫入一個(gè)BIT
              MOV R3,#23
              DJNZ R3,$            ;等待46微妙
              SETB DATA_LINE       ;重新釋放總線
              NOP
              DJNZ R2,WR1          ;寫入下一個(gè)BIT
              SETB DATA_LINE
              RET
      ;============================================================
      ;從DS18B20中讀出溫度低位、高位和報(bào)警值TH、TL
      ;存入26H、27H、28H、29H
      ;============================================================
      READ:    MOV R4,#4            ; 將溫度高位和低位從DS18B20中讀出
               MOV R1,#26H          ; 存入26H、27H、28H、29H
      RE00:    MOV R2,#8
      RE01:    CLR C
               SETB DATA_LINE
               NOP
               NOP
               CLR DATA_LINE        ;讀前總線保持為低
               NOP
               NOP
               NOP
               SETB DATA_LINE       ;開始讀總線釋放
               MOV R3,#09           ;延時(shí)18微妙
               DJNZ R3,$
               MOV C,DATA_LINE      ;從DS18B20總線讀得一個(gè)BIT
               MOV R3,#23
               DJNZ R3,$            ;等待46微妙
               RRC A                ;把讀得的位值環(huán)移給A
               DJNZ R2,RE01         ;讀下一個(gè)BIT
               MOV @R1,A
               INC R1
               DJNZ R4,RE00
               RET        
      ;--------------------------------------------
      ;200ms對(duì)閃動(dòng)標(biāo)記取反一次
      ;--------------------------------------------
      INT_T0:
                PUSH  ACC
                PUSH  PSW
                MOV  TL0,TIMER_L
                MOV  TH0,TIMER_H
                INC  TIMER_COUN
                MOV  A,TIMER_COUN
                CJNE  A,#04H,INT_END
                MOV  TIMER_COUN,#00H
                CPL  FLAG2
      INT_END:
                POP  PSW
                POP  ACC
                RETI
      ;==========================================================
      ;重新對(duì) DS18B20 初始化
      ;將設(shè)定的溫度報(bào)警值寫入 DS18B20
      ;==========================================================
      RE_18B20:
              JB  FLAG1,RE_18B20A
              RET
      RE_18B20A:
              CALL  RESET
              MOV  A,#0CCH       ;跳過(guò)ROM匹配
              LCALL  WRITE
              MOV  A,#4EH        ;寫暫存寄存器
              LCALL  WRITE
              MOV  A,TEMP_TH     ;TH(報(bào)警上限)
              LCALL  WRITE
              MOV  A,TEMP_TL     ;TL(報(bào)警下限)
              LCALL  WRITE
              MOV  A,#7FH        ;12位精確度
              LCALL  WRITE
              RET
      
      ;====================================================
      ;功能鍵掃描子程序
      ;====================================================
      SCANKEY:
                    ;MOV  P1,#0F0H
                    JB  K1,SCAN_K2
                    CALL  BEEP_BL
      SCAN_K1:      CALL  ALERT_TL
                    CALL  ALERT_PLAY
                    JB   K1,SCAN_K1
                    CALL  BEEP_BL
      SCAN_K11:     CALL  ALERT_TH
                    CALL  ALERT_PLAY
                    JB    K1,SCAN_K11
                    CALL  BEEP_BL
      SCAN_K2:      JB  K2,SCAN_K3
                    CALL  BEEP_BL
      SCAN_K3:      JB  K3,SCAN_K4
                    CALL  BEEP_BL
                    LCALL  RESET_ALERT
                    LCALL  RE_18B20
                    LCALL  WRITE_E2
      SCAN_K4:      JB  K4,SCAN_END
                    CALL  BEEP_BL
      SCAN_END:     RET
      
      ;================================================
      ;設(shè)置溫度報(bào)警值
      ;================================================
      RESET_ALERT:
                CALL  ALERT_TL
                CALL  ALERT_PLAY
                JNB K3,$              ;K3為位移鍵
                SETB  TR0
      RESET_TL:
                CALL  ALERT_PLAY
                JNB  FLAG2,R_TL01
                mov  75H,7fh          ;送入熄滅符
                mov  76H,7fh
                CALL  ALERT_PLAY
                JMP   R_TL02
      R_TL01:   CALL  ALERT_TL
                mov  75h,7Eh          ;送設(shè)定值
                mov  76h,7Dh
                CALL  ALERT_PLAY      ;顯示設(shè)定值
      R_TL02:   JNB  K1,K011A
                JNB  K2,K011B
                JNB  K3,RESET_TH
                JMP  RESET_TL
      K011A:
                INC  TEMP_TL
                MOV  A,TEMP_TL
                CJNE  A,#120,K012A    ;沒(méi)有到設(shè)定上限值,轉(zhuǎn)
                MOV  TEMP_TL,#0
      K012A:    CALL  TL_DEL
                JMP   RESET_TL
      K011B:
                DEC  TEMP_TL
                MOV  A,TEMP_TL
                CJNE  A,#00H,K012B   ;沒(méi)有到設(shè)定下限值,轉(zhuǎn)
                MOV  TEMP_TL,#119
      K012B:    CALL  TL_DEL
                JMP   RESET_TL
      ;-------------------------------------------------------
      RESET_TH:
                 CALL  BEEP_BL
                 JNB  K3,$
      RESET_TH1:
                CALL  ALERT_PLAY
                JNB  FLAG2,R_TH01
                mov  75H,7fh          ;送入熄滅符
                mov  76H,7fh
                CALL  ALERT_PLAY
                JMP   R_TH02
      R_TH01:   CALL  ALERT_TH
                mov  75h,7Eh          ;
                mov  76h,7Dh
                CALL  ALERT_PLAY
      R_TH02:   JNB  K1,K021A
                JNB  K2,K021B
                JNB  K3,K002
                JMP  RESET_TH1
      K021A:
                INC  TEMP_TH
                MOV  A,TEMP_TH
                CJNE  A,#120,K022A   ;沒(méi)有到設(shè)定上限值,轉(zhuǎn)
                MOV  TEMP_TH,#0
      K022A:     CALL  TH_DEL
                JMP   RESET_TH1
      
      K021B:
                DEC  TEMP_TH         ;減1
                MOV  A,TEMP_TH
                CJNE  A,#00H,K022B   ;沒(méi)有到設(shè)定下限值,轉(zhuǎn)
                MOV  TEMP_TH,#119
      K022B:    CALL  TH_DEL
                JMP   RESET_TH1
      
      K002:     CALL  BEEP_BL
                CLR  TR0             ;關(guān)閉中斷
                RET
      ;-----------------------------------------------------
      ;鍵延時(shí)子程序
      ;多次調(diào)用報(bào)警值顯示程序來(lái)延時(shí)
      ;-----------------------------------------------------
      TL_DEL:                        ;報(bào)警低值延時(shí)
                MOV  R2,#0AH
      TL_DEL1:  CALL  ALERT_TL
                CALL  ALERT_PLAY
                DJNZ  R2,TL_DEL1
                RET
      TH_DEL:                        ;報(bào)警高值延時(shí)
                MOV  R2,#0AH
      TH_DEL1:  CALL  ALERT_TH
                CALL  ALERT_PLAY
                DJNZ  R2,TH_DEL1
                RET
      ;====================================================
      ;實(shí)時(shí)溫度值與設(shè)定報(bào)警溫度值 TH、TL 比較子程序
      ;當(dāng)實(shí)際溫度大于 TH 的設(shè)定值時(shí),顯示“H”,繼電器關(guān)閉。
      ;當(dāng)實(shí)際溫度小于 TH 的設(shè)定值時(shí),顯示“O”,繼電器吸合。
      ;當(dāng)實(shí)際溫度小于 TL 的設(shè)定值時(shí),顯示“L”。
      ;閃動(dòng)顯示標(biāo)記符 H、L、O
      ;====================================================
      TEMP_COMP:
                SETB  TR0             ;啟動(dòng)中斷
                MOV  A,TEMP_TH
                SUBB  A,TEMP_ZH       ;減數(shù)>被減數(shù),則
                JC  CHULI1            ;借位標(biāo)志位C=1,轉(zhuǎn)
                MOV  A,TEMP_ZH
                SUBB  A,TEMP_TL       ;減數(shù)>被減數(shù),則
                JC  CHULI2            ;借位標(biāo)志位C=1,轉(zhuǎn)
                JNB  FLAG2,T_COMP1    ;FLAG2=0,顯示標(biāo)記字符
                MOV  74H,#0AH         ;熄滅符
                LCALL  DISP1
                JMP  T_COMP2
      T_COMP1:  MOV  74H,#00H
                LCALL  DISP1          ;顯示"O"
      T_COMP2:  CLR   RELAY           ;繼電器吸合
                CLR  TR0              ;關(guān)閉中斷
                RET
      ;---------------------------------------------
      ;超溫處理
      ;---------------------------------------------
      CHULI1:
                SETB  RELAY           ;繼電器關(guān)閉
                JNB  FLAG2,CHULI10
                MOV  74H,#0AH         ;熄滅符
                LCALL  DISP1
                JMP  CHULI11
      CHULI10:  MOV  74H,#0DH         
                LCALL  DISP1          ;顯示"H"
                ;CALL  BEEP_BL        ;蜂鳴器響
      CHULI11:
                CLR  TR0              ;關(guān)閉中斷
                RET
      ;---------------------------------------------
      ;欠溫處理
      ;---------------------------------------------
      CHULI2:                         ;欠溫處理
                JNB  FLAG2,CHULI20
                MOV  74H,#0AH         ;熄滅符
                LCALL  DISP1
                JMP  CHULI21
      CHULI20:  MOV  74H,#0CH         
                LCALL  DISP1          ;顯示"L"
                ;CALL  BEEP_BL        ;蜂鳴器響
      CHULI21:  CLR  TR0              ;關(guān)閉中斷
                RET
      ;------------------------------------------------------------
      ;把 DS18B20 暫存器里的溫度報(bào)警值拷貝到EEROM
      ;------------------------------------------------------------
      WRITE_E2:
              CALL  RESET
              MOV  A,#0CCH        ;跳過(guò)ROM匹配
              LCALL  WRITE
              MOV  A,#48H         ;溫度報(bào)警值拷貝到EEROM
              LCALL  WRITE
              RET
      ;--------------------------------------------------------------
      ;把 DS18B20 EEROM 里的溫度報(bào)警值拷貝回暫存器
      ;-------------------------------------------------------------
      READ_E2:
              CALL  RESET
              MOV  A,#0CCH        ;跳過(guò)ROM匹配
              LCALL  WRITE
              MOV  A,#0B8H        ;溫度報(bào)警值拷貝回暫存器
              CALL  WRITE
              RET
      
      ;*****************************************************
      ;  處理溫度 BCD 碼子程序
      ;****************************************************
      CONVTEMP:      MOV  A,TEMPH       ;判溫度是否零下
                     ANL  A,#80H
                     JZ  TEMPC1         ;溫度零上轉(zhuǎn)
                     CLR  C
                     MOV  A,TEMPL       ;二進(jìn)制數(shù)求補(bǔ)(雙字節(jié))
                     CPL  A             ;取反加1
                     ADD  A,#01H
                     MOV  TEMPL,A
                     MOV  A,TEMPH       ;-
                     CPL  A
                     ADDC  A,#00H
                     MOV  TEMPH,A          ;TEMPHC HI =符號(hào)位
                     MOV  TEMPHC,#0BH
                     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=小數(shù)部分 BCD
      
                     MOV  A,TEMPL             ;整數(shù)部分
                     ANL  A,#0F0H
                     SWAP  A
                     MOV  TEMPL,A
                     MOV  A,TEMPH
                     ANL  A,#0FH
                     SWAP  A
                     ORL  A,TEMPL
                     MOV  TEMP_ZH,A           ;組合后的值存入TEMP_ZH
                     LCALL  HEX2BCD1
                     MOV  TEMPL,A
                     ANL  A,#0F0H
                     SWAP  A
                     ORL  A,TEMPHC            ;TEMPHC LOW = 十位數(shù) BCD
                     MOV  TEMPHC,A
                     MOV  A,TEMPL
                     ANL  A,#0FH
                     SWAP  A                  ;TEMPLC HI = 個(gè)位數(shù) BCD
                     ORL  A,TEMPLC
                     MOV  TEMPLC,A
                     MOV  A,R7
                     JZ  TEMPC12
                     ANL  A,#0FH
                     SWAP  A
                     MOV  R7,A
                     MOV  A,TEMPHC            ;TEMPHC HI = 百位數(shù) BCD
                     ANL  A,#0FH
                     ORL  A,R7
                     MOV  TEMPHC,A
      TEMPC12:       RET
      ;-----------------------------------------------------------
      ;  小數(shù)部分碼表
      ;-----------------------------------------------------------
      TEMPDOTTAB:  DB   00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
                   DB   06H,07H,08H,08H,09H,09H
      
      ;===========================================================
      
      ;顯示區(qū) BCD 碼溫度值刷新子程序
      
      ;===========================================================
      
      DISPBCD:      MOV  A,TEMPLC
                    ANL  A,#0FH
                    MOV  70H,A                 ;小數(shù)位
                    MOV  A,TEMPLC
                    SWAP  A
                    ANL  A,#0FH
                    MOV  71H,A                 ;個(gè)位
                    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               ;十位數(shù)是0
                    MOV  A,TEMPHC
                    SWAP  A
                    ANL  A,#0FH
                    MOV  73H,#0AH               ;符號(hào)位不顯示
                    MOV  72H,A                  ;十位數(shù)顯示符號(hào)
      DISPBCD2:     RET
      
      ;***************************************************************
      
      ;     溫度顯示子程序
      
      ;***************************************************************
      ;顯示數(shù)據(jù)在70H - 73H 單元內(nèi),用4位共陽(yáng)數(shù)碼管顯示,P0口輸出段碼數(shù)據(jù),
      ;P0 口作掃描控制,每個(gè) LED 數(shù)碼管亮 2MS 時(shí)間再逐位循環(huán)。
      
      DISP1:       MOV  R1,#70H             ;指向顯示數(shù)據(jù)首址
                   MOV  R5,#7FH            ;掃描控制字初值
      PLAY:     ;  MOV  P0,#0FFH
                   MOV  A,R5                ;掃描字放入A
                   MOV  P0,A
      	     SETB P2.7
      	     CLR  P2.7
                   MOV  A,@R1               ;取顯示數(shù)據(jù)到A
                   MOV  DPTR,#TAB           ;取段碼表地址
                   MOVC  A,@A+DPTR          ;查顯示數(shù)據(jù)對(duì)應(yīng)段碼
                   MOV  P0,A                ;段碼放入P0口
      	     SETB P2.6
      	     CLR  P2.6
                   MOV  A,R5
                   JB   ACC.6,LOOP5         ;小數(shù)點(diǎn)處理
                   SETB  P0.7
      	     SETB P2.6
      	     CLR  P2.6
      LOOP5:       LCALL  DL_MS              ;顯示2MS
                   INC  R1                   ;指向下一個(gè)地址
                   MOV  A,R5                 ;放回 R5 內(nèi)
                   JNB  ACC.3,ENDOUT        ;ACC.3=0時(shí)一次顯示結(jié)束
                   RR  A                    ;A 中數(shù)據(jù)循環(huán)左移
                   MOV  R5,A                ;放入 R5 中
                   AJMP  PLAY               ;跳回 PLAY 循環(huán)
      ENDOUT:     ; MOV  P0,#0FFH            ;一次顯示結(jié)束,P0口復(fù)位
                  ; MOV  P2,#0FFH            ;P2口復(fù)位
                   RET
       
      TAB:
      ;定義段碼對(duì)應(yīng)  0   1   2   3   4   5   6   7   8   9       -   L   H   
                 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H,40H,38H,76H
      
      
      DL_MS:      MOV  R6,#0AH         ;2MS延時(shí)程序,LED 顯示程序用
      DL1:        MOV  R7,#64H
      DL2:        DJNZ  R7,DL2
                  DJNZ  R6,DL1
                   MOV  P0,#00H         ;消隱
      	     SETB P2.6
      	     CLR  P2.6
                  RET
      
      ;******************************************************
      ;單字節(jié)十六進(jìn)制轉(zhuǎn) BCD
      ;******************************************************
      HEX2BCD1:   MOV  B,#064H          
                  DIV  AB               
                  MOV  R7,A             
                  MOV  A,#0AH
                  XCH  A,B
                  DIV  AB               
                  SWAP  A
                  ORL  A,B
                  RET
      ;===============================================
      ;報(bào)警值 TH、TL 數(shù)據(jù)轉(zhuǎn)換
      ;===============================================
      ALERT_TL:
                   MOV  79H,#0CH
                   MOV  78H,#0BH
                   MOV  A,TEMP_TL
                   MOV  R0,#77H
                   MOV  B,#064H
                   DIV  AB
                   CJNE  A,#01H,ALERT_TL1
                   MOV  @R0,A
                   JMP  ALERT_TL2
      ALERT_TL1:   MOV  A,#0BH           ;顯示“-”
                   MOV  @R0,A
      ALERT_TL2:   MOV  A,#0AH
                   XCH  A,B
                   DIV  AB
                   DEC  R0
                   MOV  @R0,A
                   MOV  7DH,A
                   DEC  R0
                   MOV  @R0,B
                   MOV  7EH,B
                   RET
      ;-----------------------------------------------
      ALERT_TH:
                   MOV  79H,#0DH
                   MOV  78H,#0BH
                   MOV  A,TEMP_TH
                   MOV  R0,#77H
                   MOV  B,#064H
                   DIV  AB
                   CJNE  A,#01H,ALERT_TH1
                   MOV  @R0,A
                   JMP  ALERT_TH2
      ALERT_TH1:   MOV  A,#0BH             ;顯示“-”
                   MOV  @R0,A
      ALERT_TH2:   MOV  A,#0AH
                   XCH  A,B
                   DIV  AB
                   DEC  R0
                   MOV  @R0,A
                   MOV  7DH,A
                   DEC  R0
                   MOV  @R0,B
                   MOV  7EH,B
                   RET
      ;===============================================
      ;報(bào)警值顯示子程序
      ;===============================================
      ALERT_PLAY:
                   MOV  R1,#75H             ;指向顯示數(shù)據(jù)首址
                   MOV  R5,#7FH            ;掃描控制字初值
      A_PLAY:    ; MOV  P0,#0FFH
                   MOV  A,R5                ;掃描字放入A
                   MOV  P0,A
      	     SETB P2.7
      	     CLR  P2.7
                   MOV  A,@R1               ;取顯示數(shù)據(jù)到A
                   MOV  DPTR,#ALERT_TAB     ;取段碼表地址
                   MOVC  A,@A+DPTR          ;查顯示數(shù)據(jù)對(duì)應(yīng)段碼
                   MOV  P0,A                ;段碼放入P0口
      	     SETB P2.6
      	     CLR  P2.6
                   LCALL  DL_MS1            ;顯示2MS
      	     
                   INC  R1                  ;指向下一個(gè)地址
                   MOV  A,R5
                   JNB  ACC.3,ENDOUT1
                   RR  A                    ;A 中數(shù)據(jù)循環(huán)左移
                   MOV  R5,A                ;放入 R5 中
                   AJMP  A_PLAY             ;跳回 PLAY 循環(huán)
      ENDOUT1:   ;  MOV  P0,#0FFH            ;一次顯示結(jié)束,P0口復(fù)位
                 ;  MOV  P2,#0FFH            ;P2口復(fù)位
                   RET
      
      ALERT_TAB:
      ;定義段碼對(duì)應(yīng)   0   1   2   3   4   5   6   7   8   9       -   L   H   
                DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H,40H,38H,76H
      
      DL_MS1:      MOV  R6,#0AH         ;2MS延時(shí)程序,LED 顯示程序用
      ADL1:        MOV  R7,#64H
      ADL2:        DJNZ  R7,ADL2
                   DJNZ  R6,ADL1
      	     MOV  P0,#00H         ;消隱
      	     SETB P2.6
      	     CLR  P2.6
                   RET
      ;===============================================
      ;蜂鳴器響一聲子程序
      ;P3.7=0,蜂鳴器響
      ;===============================================
      BEEP_BL:
               MOV  R6,#100
       BL2:    CALL  DEX1
               CPL  BEEP        ;對(duì) beep 取反
               DJNZ  R6,BL2
               MOV  R5,#10
               CALL  DELAY
               RET
       DEX1:   MOV  R7,#180
       DE2:    NOP
               DJNZ  R7,DE2
               RET
      DELAY:                    ;(R5)*延時(shí)10MS
               MOV  R6,#50
       DEL1:   MOV  R7,#100
               DJNZ  R7,$
               DJNZ  R6,DEL1
               DJNZ  R5,DELAY
               RET
      ;==================================================
               END
      
      
      
      關(guān)閉窗口

      相關(guān)文章