<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)DS18B20水溫控制系統(tǒng)設(shè)計(jì)程序源碼

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

          作者: 時(shí)間:2016-11-22 來源:網(wǎng)絡(luò) 收藏
          TEMPERATURE_L DATA 31H ;DS18B20低8位Buffer
          TEMPERATURE_H DATA 30H ;DS18B20高8位Buffer

          TEMPERATURE_HC DATA 32H ;計(jì)算后的百位和十位的BCD碼存放BUFFER
          TEMPERATURE_LC DATA 33H ;計(jì)算后的個(gè)位和小數(shù)位的BCD碼存放BUFFER
          TEMPERATURE_ZH DATA 34H ;計(jì)算后十位和個(gè)位HEX碼的存放BUFFER

          DIS_BUF_X DATA 35H ;數(shù)碼管小數(shù)位Buffer
          DIS_BUF_G DATA 36H ;數(shù)碼管個(gè)位Buffer
          DIS_BUF_S DATA 37H ;數(shù)碼管十位Buffer
          DIS_BUF_B DATA 38H ;數(shù)碼管百位Buffer

          KEY_BUF_G DATA 39H ;鍵盤輸入后,的個(gè)位值
          KEY_BUF_S DATA 49H ;鍵盤輸入后,的十位值
          KEY_BUF_B DATA 41H ;鍵盤輸入后,的百位值

          K_UP EQU P1.5 ;上調(diào)按鈕
          K_DOWN EQU P1.6 ;下調(diào)按鈕
          K_ENTER EQU P1.7 ;輸入數(shù)據(jù)確認(rèn)按鈕

          P_DS18B20 EQU P3.3 ;讀取DS18B20的輸入端口
          P_SWITCH EQU P1.3 ;繼電器控制端口,1-風(fēng)扇,0-電爐

          FLAG EQU 20H.0 ;標(biāo)志位,確定是否存在DS18B20
          ENTER_FLAG EQU 20H.1 ;鍵盤輸入的標(biāo)志位,為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 ;調(diào)用讀溫度子程序
          JB FLAG,NORMAL ;判斷是否有DS18B20的存在
          CALL ERR ;不存在時(shí)顯示錯(cuò)誤信息
          AJMP NEXT
          NORMAL: LCALL DATA_DEA ;處理從DS18B20得到的數(shù)據(jù)
          LCALL SET_DIS_BUF ;賦值給DIS_BUF_X,G,S,B
          LCALL DISPLAY ;調(diào)用數(shù)碼管顯示子程序
          LCALL SCAN_KEY ;掃描鍵盤
          LCALL SWITCH ;處理繼電器
          AJMP NEXT

          ;程序名稱:ERR
          ;功能:程序出錯(cuò)處理,顯示四個(gè)8,即8888
          ;入口參數(shù):無
          ;出口參數(shù):DIS_BUF_X,DIS_BUF_G, DIS_BUF_S, DIS_BUF_B
          ERR: MOV DIS_BUF_X,#08H ;如果沒有找到DS18B20,那么就顯示錯(cuò)誤,錯(cuò)誤顯示為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,如果是負(fù)數(shù),則對(duì)低8為進(jìn)行補(bǔ)碼處理
          CLR C
          MOV A,TEMPERATURE_L ;二進(jìn)制數(shù)求補(bǔ)(雙字節(jié))
          CPL A ;取反加1
          ADD A,#01H
          MOV TEMPERATURE_L,A ;取補(bǔ)碼后存回TEMPERATURE_L,此時(shí)TEMPERATURE_L里面的值就能表示溫
          ;度了,不過還要繼續(xù)處理一下。
          MOV A,TEMPERATURE_H
          CPL A
          ADDC A,#00H ;高位TEMPERATURE_H取反,加上從低位TEMPERATURE_L進(jìn)來的位
          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 ;得到個(gè)位‘單個(gè)數(shù)值
          SWAP A ;SWAP后就得到個(gè)位真正的個(gè)位
          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 ;轉(zhuǎn)換HEx值成為BCD碼
          MOV TEMPERATURE_L,A ;TEMPERATURE_L目前存入的是十位和個(gè)位的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位 = 個(gè)位數(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
          ;功能:十六進(jìn)制轉(zhuǎn) 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 ;主機(jī)發(fā)出延時(shí)537微秒的復(fù)位低脈沖
          MOV R0,#6BH
          MOV R1,#04H
          TSR1: DJNZ R0,$
          MOV 40,#6BH
          DJNZ R1,TSR1
          SETB P_DS18B20 ;然后拉高數(shù)據(jù)線,釋放總線進(jìn)入接受狀態(tài)
          NOP
          NOP
          NOP
          MOV R0,#32H
          TSR2: JNB P_DS18B20,TSR3 ;等待DS18B20回應(yīng)
          DJNZ R0,TSR2
          LJMP TSR4 ;延時(shí)
          TSR3: SETB FLAG ;置標(biāo)志位,表示DS1820存在
          LJMP TSR5
          TSR4: CLR FLAG ;清標(biāo)志位,表示DS1820不存在
          LJMP TSR7
          TSR5: MOV R0,#06BH
          TSR6: DJNZ R0,TSR6 ;時(shí)序要求延時(shí)一段時(shí)間
          TSR7: SETB P_DS18B20
          RET

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

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

          ;程序名稱:WRITE_18B20
          ;功能:將A保存的數(shù)值寫入DS1820中,有具體的時(shí)序要求,詳細(xì)參考附圖的說明
          ;入口參數(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ù),由于是串行通信,每次讀取一個(gè),循環(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 ;每次進(jìn)來都賦值輸入標(biāo)志,設(shè)置為0
          MOV KEY_BUF_G,DIS_BUF_G ;將當(dāng)前的溫度賦值給KEY_BUF,也就是說是以當(dāng)前溫度為基準(zhǔn),進(jìn)行加減的
          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
          ;功能:確認(rèn)鍵盤輸入和退出鍵盤輸入
          ;入口參數(shù):ENTER_FLAG
          ;出口參數(shù):ENTER_FLAG
          PRO_ENTER:
          CALL K_DELAY
          JB K_ENTER,K_LOOP ;按鈕抖動(dòng)處理
          SETB ENTER_FLAG
          CALL K_DELAY
          RET

          ;程序名稱:PRO_UP
          ;功能:數(shù)值上調(diào)處理
          ;入口參數(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 ;按鈕抖動(dòng)處理
          INC KEY_BUF_G ;個(gè)位增一
          MOV A,KEY_BUF_G
          CJNE A,#0AH,UPNEXT;個(gè)位增加到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 ;出錯(cuò),顯示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ù)值下調(diào)處理
          ;入口參數(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 ;按鈕抖動(dòng)處理
          DEC KEY_BUF_G ;個(gè)位減一
          MOV A,KEY_BUF_G
          CJNE A,#0FFH,DOWNNEXT;個(gè)位減到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 ;出錯(cuò),顯示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: ;鍵盤抖動(dòng)延時(shí)子程序
          MOV R6,#250
          DL20MS_1:
          MOV R7,#200
          DJNZ R7,$
          DJNZ R6, DL20MS_1
          RET

          ;繼電器控制
          SWITCH:
          MOV A,KEY_BUF_G ;三個(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ù)比較個(gè)位
          MOV A,KEY_BUF_G
          SUBB A,DIS_BUF_G
          JC COOL
          HOT: CLR P_SWITCH ;P_SWITCH 為0說明當(dāng)前溫度小于設(shè)定溫度,要升溫,所以接電爐
          SJMP SQUIT
          COOL: SETB P_SWITCH ;P_SWITCH 為1說明當(dāng)前溫度大于設(shè)定溫度,要降溫,所以接風(fēng)扇
          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 ;個(gè)位
          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 ;符號(hào)位不顯示
          MOV 72H,A ;十位數(shù)顯示符號(hào)
          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 ;一次顯示結(jié)束,P0口復(fù)位
          MOV P2,#0FFH ;P2口復(fù)位
          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


          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();