久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

單片機DS18B20水溫控制系統(tǒng)設計

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2007年08月25日   【字體:

 

單片機DS18B20水溫控制系統(tǒng)設計程序源碼
 


        TEMPERATURE_L DATA 31H ;DS18B20低8位Buffer
        TEMPERATURE_H DATA 30H ;DS18B20高8位Buffer
           
        TEMPERATURE_HC DATA 32H   ;計算后的百位和十位的BCD碼存放BUFFER
        TEMPERATURE_LC DATA 33H   ;計算后的個位和小數(shù)位的BCD碼存放BUFFER
        TEMPERATURE_ZH DATA 34H   ;計算后十位和個位HEX碼的存放BUFFER
   
        DIS_BUF_X DATA 35H ;數(shù)碼管小數(shù)位Buffer
        DIS_BUF_G DATA 36H  ;數(shù)碼管個位Buffer
        DIS_BUF_S DATA 37H  ;數(shù)碼管十位Buffer
        DIS_BUF_B DATA 38H  ;數(shù)碼管百位Buffer
       
        KEY_BUF_G DATA 39H ;鍵盤輸入后,的個位值
        KEY_BUF_S DATA 49H ;鍵盤輸入后,的十位值
        KEY_BUF_B DATA 41H ;鍵盤輸入后,的百位值
       
        K_UP EQU P1.5     ;上調按鈕
        K_DOWN EQU P1.6   ;下調按鈕
        K_ENTER EQU P1.7  ;輸入數(shù)據(jù)確認按鈕
 
        P_DS18B20 EQU P3.3  ;讀取DS18B20的輸入端口
        P_SWITCH EQU P1.3   ;繼電器控制端口,1-風扇,0-電爐
       
        FLAG EQU 20H.0        ;標志位,確定是否存在DS18B20
        ENTER_FLAG EQU 20H.1  ;鍵盤輸入的標志位,為0說明鍵盤正在輸入,為1說明鍵盤輸入退出

;程序開始執(zhí)行
        ORG 0000H
        LJMP MAIN
        ORG 0100H
MAIN:  MOV SP,#60H           ;初始化
        MOV KEY_BUF_G,#00H   ;由于KEY_BUF是由用戶輸入的,所以先賦值初始化
        MOV KEY_BUF_S,#00H
        MOV KEY_BUF_B,#00H
   
NEXT:
        LCALL   READ_TEMP ;調用讀溫度子程序
        JB FLAG,NORMAL    ;判斷是否有DS18B20的存在
        CALL ERR              ;不存在時顯示錯誤信息
AJMP    NEXT
NORMAL: LCALL DATA_DEA      ;處理從DS18B20得到的數(shù)據(jù)
        LCALL SET_DIS_BUF       ;賦值給DIS_BUF_X,G,S,B
        LCALL DISPLAY       ;調用數(shù)碼管顯示子程序
        LCALL SCAN_KEY      ;掃描鍵盤
        LCALL SWITCH            ;處理繼電器
        AJMP    NEXT

;程序名稱:ERR
;功能:程序出錯處理,顯示四個8,即8888
;入口參數(shù):無
;出口參數(shù):DIS_BUF_X,DIS_BUF_G, DIS_BUF_S, DIS_BUF_B
ERR:    MOV DIS_BUF_X,#08H ;如果沒有找到DS18B20,那么就顯示錯誤,錯誤顯示為888
        MOV DIS_BUF_G,#08H     
        MOV DIS_BUF_S,#08H
        MOV DIS_BUF_B,#08H
        LCALL DISPLAY
        RET

;程序名稱:DATA_DEAL
;功能:處理采集后的的數(shù)據(jù)
;入口參數(shù):TEMPERATURE_L
;出口參數(shù):DIS_BUF_G, DIS_BUF_S, DIS_BUF_B
DATA_DEAL:
        MOV  A,TEMPERATURE_H    ;判溫度是否零下
        ANL  A,#80H
        JZ  TEMPC1          ;A為0,說明是正數(shù),跳往TEMPC1,如果是負數(shù),則對低8為進行補碼處理
        CLR  C
        MOV  A,TEMPERATURE_L    ;二進制數(shù)求補(雙字節(jié))
        CPL  A              ;取反加1
        ADD  A,#01H
        MOV  TEMPERATURE_L,A    ;取補碼后存回TEMPERATURE_L,此時TEMPERATURE_L里面的值就能表示溫
;度了,不過還要繼續(xù)處理一下。
        MOV  A,TEMPERATURE_H
        CPL  A
        ADDC  A,#00H               ;高位TEMPERATURE_H取反,加上從低位TEMPERATURE_L進來的位
        MOV  TEMPERATURE_H,A       ;寫回TEMPERATURE_H
        MOV  TEMPERATURE_HC,#0BH
        SJMP  TEMPC11

TEMPC1: MOV  TEMPERATURE_HC,#0AH    
TEMPC11:MOV  A,TEMPERATURE_HC
        SWAP  A
        MOV  TEMPERATURE_HC,A
        MOV  A,TEMPERATURE_L
        ANL  A,#0FH              ;取A低4位(小數(shù)位,單位是0.0625),得出來的數(shù)要乘以0.0625,通過查表來算出值
        MOV  DPTR,#TEMPDOTTAB
        MOVC  A,@A+DPTR          ;查表
        MOV  TEMPERATURE_LC,A    ;TEMPERATURE_LC  LOW=小數(shù)部分 BCD
        MOV  DIS_BUF_X,A         ;小數(shù)位的BCD碼送入顯示buffer中

        MOV  A,TEMPERATURE_L     ;整數(shù)部分
        ANL  A,#0F0H             ;得到個位‘單個數(shù)值
        SWAP  A                  ;SWAP后就得到個位真正的個位
        MOV  TEMPERATURE_L,A
        MOV  A,TEMPERATURE_H
        ANL  A,#0FH
        SWAP  A
        ORL  A,TEMPERATURE_L
        MOV  TEMPERATURE_ZH,A     ;組合后的值存入TEMPERATURE_ZH
        LCALL  HtoB               ;轉換HEx值成為BCD碼
        MOV  TEMPERATURE_L,A      ;TEMPERATURE_L目前存入的是十位和個位的BCD編碼
        ANL  A,#0F0H
        SWAP  A
        ORL  A,TEMPERATURE_HC     ;TEMPERATURE_HC LOW位 = 十位數(shù) BCD
        MOV  TEMPERATURE_HC,A
        MOV  A,TEMPERATURE_L
        ANL  A,#0FH
        SWAP  A                   ;TEMPERATURE_LC HI位 = 個位數(shù) BCD
        ORL  A,TEMPERATURE_LC
        MOV  TEMPERATURE_LC,A
        MOV  A,R7
        JZ  TEMPC12
        ANL  A,#0FH
        SWAP  A
        MOV  R7,A
        MOV  A,TEMPERATURE_HC      ;TEMPERATURE_HC HI = 百位數(shù) BCD
        ANL  A,#0FH
 
        ORL  A,R7
        MOV  TEMPERATURE_HC,A
TEMPC12:RET
;  小數(shù)部分碼表
TEMPDOTTAB:  DB   00H,01H,01H,02H,03H,03H,04H,04H,05H,06H,06H,07H,08H,08H,09H,09H
;0.0625->00H
;0.0625*2 = 0.125->01H
;0.0625*3 = 0.1875->01H
;0.0625*4 = 0.25->02H
;0.0625*5 = 0.3125->03H
;以此類推..........

;程序名稱:HtoB
;功能:十六進制轉 BCD
;入口參數(shù):A
;出口參數(shù):R7
HtoB:   MOV  B,#064H  ;100       
        DIV  AB       ;a/100       
        MOV  R7,A     ;       
        MOV  A,#0AH
        XCH  A,B
        DIV  AB              
        SWAP  A
        ORL  A,B
        RET

;程序名稱:INIT_TEMP
;功能:初始化DS18B20,確定DS18B20是否是存在的
;入口參數(shù):無
;出口參數(shù):FLAG
INIT_TEMP:                 
        SETB    P_DS18B20
        NOP
        CLR P_DS18B20                ;主機發(fā)出延時537微秒的復位低脈沖
        MOV R0,#6BH
        MOV R1,#04H
TSR1:   DJNZ    R0,$
        MOV     40,#6BH
        DJNZ    R1,TSR1
        SETB    P_DS18B20               ;然后拉高數(shù)據(jù)線,釋放總線進入接受狀態(tài)
        NOP
        NOP
        NOP
        MOV R0,#32H
TSR2:   JNB     P_DS18B20,TSR3       ;等待DS18B20回應
        DJNZ    R0,TSR2
        LJMP    TSR4                ;延時
TSR3:   SETB    FLAG                ;置標志位,表示DS1820存在
        LJMP    TSR5
TSR4:   CLR FLAG                ;清標志位,表示DS1820不存在
        LJMP    TSR7
TSR5:   MOV R0,#06BH
TSR6:   DJNZ    R0,TSR6         ;時序要求延時一段時間
TSR7:   SETB    P_DS18B20
        RET

;程序名稱:READ_TEMP
;功能:讀取DS18B20的數(shù)據(jù)
;入口參數(shù):TEMPERATURE_L,TEMPERATURE_H
;出口參數(shù):無
READ_TEMP:
        SETB    P_DS18B20
        LCALL   INIT_TEMP     ;先復位DS18B20
        JB  FLAG,TSS2
        RET                   ;判斷DS1820是否存在?若DS18B20不存在則返回
TSS2:   MOV A,#0CCH           ;跳過ROM匹配
        LCALL   WRITE_18B20
        MOV A,#44H            ;發(fā)出溫度轉換命令
        LCALL   WRITE_18B20
        ;LCALL  DISPLAY       ;等待AD轉換結束,12位的話750微秒
        LCALL   INIT_TEMP     ;準備讀溫度前先復位
        MOV A,#0CCH           ;跳過ROM匹配
        LCALL   WRITE_18B20
        MOV A,#0BEH           ;發(fā)出讀溫度命令
        LCALL   WRITE_18B20
        LCALL   READ_18B20    ;將讀出的溫度數(shù)據(jù)保存到35H/36H
        RET

;具體的步驟:初始化完后當拉低電平開始產生寫時隙-》15微妙之內送入一位數(shù)據(jù)-》15~60微妙1820來
;采樣讀取它  

;程序名稱:WRITE_18B20
;功能:將A保存的數(shù)值寫入DS1820中,有具體的時序要求,詳細參考附圖的說明
;入口參數(shù):A 寄存器
;出口參數(shù):無
WRITE_18B20:   
        MOV R2,#8           ;一共8位數(shù)據(jù),串行通信
        CLR C
WR1:    CLR P_DS18B20
        MOV R3,#07
        DJNZ    R3,$
        RRC A               ;循環(huán)右移
        MOV P_DS18B20,C
        MOV R3,#3CH
        DJNZ    R3,$                ;23*2 = 46微妙
        SETB    P_DS18B20
        NOP
        DJNZ    R2,WR1          ;A里面一共是8位,所以要送8次
        SETB    P_DS18B20       ;釋放總線
        RET

;程序名稱:READ_18B20
;功能:讀取18B20中的數(shù)據(jù),由于是串行通信,每次讀取一個,循環(huán)8次讀取
;入口參數(shù):TEMPRATURE_L
;出口參數(shù):無
READ_18B20:
        MOV R4,#4               ;將溫度高位和低位從DS18B20中讀出
        MOV R1,#TEMPERATURE_L  
RE00:   MOV R2,#8               ;數(shù)據(jù)一共有8位
RE01:   CLR C
        SETB    P_DS18B20
        NOP
        NOP
        CLR P_DS18B20
        NOP
        NOP
        NOP
        SETB    P_DS18B20
        MOV R3,#09
RE10:   DJNZ R3,RE10
        MOV C,P_DS18B20
        MOV R3,#3CH
RE20:   DJNZ R3,RE20
        RRC A
        DJNZ R2,RE01
        MOV @R1,A
        DEC R1
        DJNZ R4,RE00
        RET

;程序名稱:SCAN_KEY
;功能:掃描鍵盤
;入口參數(shù):DIS_BUF_G,DIS_BUF_S,DIS_BUF_B
;出口參數(shù):KEY_BUF_G,KEY_BUF_S,kEY_BUF_B
SCAN_KEY:
      JB K_ENTER,QUIT           ;如果又Enter鍵入,則開始鍵盤輸入
      LCALL K_DELAY
      JB K_ENTER,QUIT
      CLR ENTER_FLAG                ;每次進來都賦值輸入標志,設置為0
      MOV KEY_BUF_G,DIS_BUF_G ;將當前的溫度賦值給KEY_BUF,也就是說是以當前溫度為基準,進行加減的
      MOV KEY_BUF_S,DIS_BUF_S
      MOV KEY_BUF_B,DIS_BUF_B
K_LOOP:
      JB ENTER_FLAG,QUIT            ;如果輸入完成,ENTER_FLAG則為1,退出鍵盤程序
      JB K_ENTER,KUP
      CALL PRO_ENTER
KUP:  JB K_UP,KDOWN
      CALL PRO_UP
KDOWN:JB K_DOWN,LOOPA
      CALL PRO_DOWN
LOOPA:LCALL DISPLAY
      SJMP K_LOOP
QUIT: RET

;程序名稱:PRO_ENTER
;功能:確認鍵盤輸入和退出鍵盤輸入
;入口參數(shù):ENTER_FLAG
;出口參數(shù):ENTER_FLAG
PRO_ENTER:
      CALL K_DELAY
      JB K_ENTER,K_LOOP ;按鈕抖動處理
      SETB ENTER_FLAG
      CALL K_DELAY
      RET

;程序名稱:PRO_UP
;功能:數(shù)值上調處理
;入口參數(shù):KEY_BUF_G,KEY_BUF_S,KEY_BUF_B
;出口參數(shù):DIS_BUF_G,DIS_BUF_S,DIS_BUF_B
PRO_UP:
      CALL K_DELAY
      JB K_UP,K_LOOP    ;按鈕抖動處理
      INC KEY_BUF_G     ;個位增一
      MOV A,KEY_BUF_G
      CJNE A,#0AH,UPNEXT;個位增加到10,回0
      MOV KEY_BUF_G,#00H
      INC KEY_BUF_S     ;十位加一
      MOV A,KEY_BUF_S
      CJNE A,#0AH,UPNEXT;十位超過99,溢出了
      MOV R0,#200
ERROR1:LCALL ERR        ;出錯,顯示8888
      DJNZ R0,ERROR1
      DEC KEY_BUF_S     ;退回99
      MOV KEY_BUF_G,#09H
UPNEXT:
      MOV DIS_BUF_G,KEY_BUF_G
      MOV DIS_BUF_S,KEY_BUF_S
      MOV DIS_BUF_B,KEY_BUF_B
      CALL K_DELAY
      RET

;程序名稱:PRO_DOWN
;功能:數(shù)值下調處理
;入口參數(shù):KEY_BUF_G,KEY_BUF_S,KEY_BUF_B
;出口參數(shù):DIS_BUF_G,DIS_BUF_S,DIS_BUF_B
PRO_DOWN:
      CALL K_DELAY
      JB K_DOWN,K_LOOP    ;按鈕抖動處理
      DEC KEY_BUF_G       ;個位減一
      MOV A,KEY_BUF_G
      CJNE A,#0FFH,DOWNNEXT;個位減到0,回到9
      MOV KEY_BUF_G,#09H
      DEC KEY_BUF_S        ;十位減一
      MOV A,KEY_BUF_S
      CJNE A,#0FFH,DOWNNEXT;十位低于0,溢出了
      MOV R0,#200
ERROR2:LCALL ERR           ;出錯,顯示8888
      DJNZ R0,ERROR2
      INC KEY_BUF_S        ;退回00
      MOV KEY_BUF_G,#00H
DOWNNEXT:
      MOV DIS_BUF_G,KEY_BUF_G ;增加完成后,賦值退出,然后DISPLAY顯示出來
      MOV DIS_BUF_S,KEY_BUF_S
      MOV DIS_BUF_B,KEY_BUF_B
      CALL K_DELAY
      RET
 
K_DELAY:            ;鍵盤抖動延時子程序
    MOV R6,#250
D
L20MS_1:
    MOV R7,#200
    DJNZ R7,$
    DJNZ R6, DL20MS_1
    RET

;繼電器控制
SWITCH:
        MOV A,KEY_BUF_G     ;三個Buffer都是0的話,說明還沒有輸入數(shù)值,直接退出
        JNZ SNEXT
        MOV A,KEY_BUF_S
        JNZ SNEXT
        MOV A,KEY_BUF_B
        JZ  SQUIT
SNEXT:  CALL SET_DIS_BUF
    MOV A,KEY_BUF_S
    SUBB A,DIS_BUF_S
    JC COOL
    JNZ HOT                 ;十位如果相等,那么繼續(xù)比較個位
    MOV A,KEY_BUF_G
    SUBB A,DIS_BUF_G
    JC COOL
HOT:  CLR P_SWITCH              ;P_SWITCH 為0說明當前溫度小于設定溫度,要升溫,所以接電爐
      SJMP SQUIT
COOL: SETB P_SWITCH         ;P_SWITCH 為1說明當前溫度大于設定溫度,要降溫,所以接風扇
SQUIT:RET

;程序名稱:SET_DIS_BUF
;功能:賦值給DIS_BUF_G, DIS_BUF_S, DIS_BUF_B
;入口參數(shù):TEMPERATURE_LC,TEMPERATURE_HC
;出口參數(shù):DIS_BUF_G, DIS_BUF_S, DIS_BUF_B
SET_DIS_BUF:
     MOV  A,TEMPERATURE_LC
         ANL  A,#0FH
         MOV  DIS_BUF_X,A                 ;小數(shù)位
         MOV  A,TEMPERATURE_LC
         SWAP  A
         ANL  A,#0FH
         MOV  DIS_BUF_G,A                 ;個位
         MOV  A,TEMPERATURE_HC
         ANL  A,#0FH
         MOV  DIS_BUF_S,A                 ;十位
         MOV  A,TEMPERATURE_HC
         SWAP  A
         ANL  A,#0FH
         MOV  DIS_BUF_B,A                 ;百位
         MOV  A,TEMPERATURE_HC
         ANL  A,#0F0H
         CJNE  A,#010H,NEXT0
         SJMP  NEXT1

NEXT0:  MOV  A,TEMPERATURE_HC
         ANL  A,#0FH
         JNZ  NEXT1                 ;十位數(shù)是0
         MOV  A,TEMPERATURE_HC
         SWAP A
         ANL  A,#0FH
         MOV  73H,#0AH               ;符號位不顯示
         MOV  72H,A                  ;十位數(shù)顯示符號
NEXT1:  RET

;程序名稱:DISPLAY
;功能:顯示數(shù)據(jù)到數(shù)碼管中。
;入口參數(shù):DIS_BUF_G, DIS_BUF_S, DIS_BUF_B
;出口參數(shù):無
DISPLAY:
        MOV DPTR,#DISTAB
        MOV R3,#0FEH
        MOV R1,#DIS_BUF_B
DPLOP:  MOV A,@R1
        MOVC A,@A+DPTR
        MOV P2,R3
        MOV P0,A
        CJNE R3,#0FBH,DPNEXT
        CLR P0.7
DPNEXT: MOV A,R3
        RL A
        MOV R3,A
        DEC R1
    CALL DS1M
        CJNE R3,#0EFH,DPLOP
        MOV  P0,#0FFH            ;一次顯示結束,P0口復位
        MOV  P2,#0FFH            ;P2口復位
        RET
DS1M:
        MOV R7,#0FFH
        DJNZ R7,$
        RET

;數(shù)碼管TAB
DISTAB:
        DB  0C0H ;0
        DB  0F9H ;1
        DB  0A4H ;2
        DB  0B0H ;3
        DB  099H ;4
        DB  092H ;5
        DB  082H ;6
        DB  0F8H ;7
        DB  080H ;8
        DB  090H ;9
        DB  0FFH ;NONE
END

 

1. 顯示模塊

該顯示模塊的動態(tài)顯示數(shù)碼管,我們用到前面四個數(shù)碼管,P0口是送字符的,P2口是用來位選數(shù)碼管的。

 

芯片系統(tǒng)

本系統(tǒng)采用的是AT89S52芯片。下面是它的引腳圖。

 

八.軟件設計說明

本系統(tǒng)采用的是循環(huán)查詢方式,來顯示和控制溫度的。

1.總模塊的流程圖

 

2.各個模塊的流程圖

讀取溫度DS18B20模塊的流程

 

鍵盤掃描處理流程

 

九.操作指引

按鍵功能

1.      Enter   → P1.5(k2)

2.      Up      → P1.6(k3)

3.      Down        → P1.7(k4)

 

顯示溫度

1.      未插DS18B20時,數(shù)碼管顯示錯誤888.8.

2.      插入DS18B20是,數(shù)碼管顯示當前溫度XX.X

 

設定溫度

1.按下Enter,數(shù)碼管溫度顯示停止,顯示的數(shù)字變的比以前亮。

2.這時可以按Up和Down來調節(jié)當前溫度。

3.調節(jié)好后,按Enter退出。這時數(shù)字變的又暗了,數(shù)碼管繼續(xù)顯示當前溫度

繼電器隨著設定的溫度,依據(jù)情況跳變。

十.參考文獻

[1].              單片機原理與應用技術 .江力 主編 .清華大學出版社 .2006

[2].              微型計算機接口技術 . 王兆月等 編著. 機械工業(yè)出版社 .2006

[3].              數(shù)字電子技術 . 江曉安等 編著. 西安電子科技大學出版社 .1993

[4].              ME300B說明書 .偉納電子 編著. 偉納電子出版 .2006

[5].              DS18B20官方英文文檔 . DS18B20官方英文站點下載 .

 

 

五.溫度控制總體方案與原理

1.系統(tǒng)模塊圖

系統(tǒng)模塊分為:DS18B20模塊,顯示模塊,繼電器模塊,鍵盤輸入模塊,DS18B20可以被編程,所以箭頭是雙向的,CPU(89S52)首先寫入命令給DS18B20,然后DS18B20開始轉換數(shù)據(jù),轉換后通過89S52來處理數(shù)據(jù)。數(shù)據(jù)處理后的結果就顯示到數(shù)碼管上。

<單片機DS18B20水溫控制系統(tǒng)設計總體圖>
 

1.系統(tǒng)模塊總關系圖

本系統(tǒng)的執(zhí)行方法是循環(huán)查詢執(zhí)行的,鍵盤掃描也是用循環(huán)查詢的辦法,由于本系統(tǒng)對實時性要求不是很高,所以沒有用到中斷方式來處理。


<單片機DS18B20水溫控制系統(tǒng)設計程序結構圖>

 

關閉窗口
主站蜘蛛池模板: av高清| 天天综合久久 | 视频一区二区国产 | 国产午夜在线 | 国产一区二区三区四区三区四 | 精品国产乱码久久久久久图片 | 少妇无套高潮一二三区 | 一级二级三级黄色 | 欧美极品在线 | 91精品国产91久久久久久最新 | 在线观看日本高清二区 | 亚洲区中文字幕 | 成人激情视频免费在线观看 | 神马福利| 国产乱码精品1区2区3区 | 欧美在线二区 | 国产免费自拍 | 99久久久久久99国产精品免 | 国产一区电影 | 狠狠综合久久av一区二区小说 | 亚洲精品99久久久久久 | 中文字幕一区在线观看视频 | 色网站在线 | 亚洲小视频 | av官网在线 | 亚洲成av片人久久久 | 中文字幕 在线观看 | 天天看片天天干 | 91香蕉视频在线观看 | 国产日韩欧美 | 欧美日韩成人一区二区 | 激情久久av一区av二区av三区 | 中文字幕 在线观看 | 国产伦精品一区二区三区精品视频 | 日本涩涩视频 | 中文字幕一区二区三区不卡在线 | 久久国产精品久久久久久 | 欧美一区二区三区精品 | 成人午夜视频在线观看 | 欧美视频在线播放 | 亚洲欧美日韩一区二区 |