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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3289|回復: 0
打印 上一主題 下一主題
收起左側

DS18B20 51單片機溫控匯編程序 精度0.1°

[復制鏈接]
跳轉到指定樓層
樓主
ID:128229 發表于 2016-6-27 22:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;溫控匯編程序                 聶
;IC :DS18B20     AT89S52
;鍵盤 p1.0 p1.1 p1.2                                   ;
; DQ數據腳。p2.7                                                   
; 位選 P3
;  數據段 P0
;P2.0口是 繼電器控制口
;P2.1是蜂鳴器控制口
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TEMPERATURE_L DATA 31H ;DS18B20低8位Buffer
TEMPERATURE_H DATA 30H ;DS18B20高8位Buffer
TEMPERATURE_HC DATA 32H ;計算后的百位和十位的BCD碼存放BUFFER
TEMPERATURE_LC DATA 33H ;計算后的個位和小數位的BCD碼存放BUFFER
TEMPERATURE_ZH DATA 34H ;計算后十位和個位HEX碼的存放BUFFER
DIS_BUF_X DATA 35H ;數碼管小數位Buffer
DIS_BUF_G DATA 36H ;數碼管個位Buffer
DIS_BUF_S DATA 37H ;數碼管十位Buffer
DIS_BUF_B DATA 38H ;數碼管百位Buffer
KEY_BUF_X DATA 42H ;
KEY_BUF_G DATA 39H ;鍵盤輸入后,的個位值
KEY_BUF_S DATA 49H ;鍵盤輸入后,的十位值
KEY_BUF_B DATA 41H ;鍵盤輸入后,的百位值
K_UP EQU P1.2 ;上調按鈕
K_DOWN EQU P1.1 ;下調按鈕
K_ENTER EQU P1.0 ;輸入數據確認按鈕
P_DS18B20 EQU P2.7 ;讀取DS18B20的輸入端口
P_SWITCH EQU P2.1 ;繼電器控制端口,
FLAG EQU 20H.0 ;標志位,確定是否存在DS18B20
ENTER_FLAG EQU 20H.1 ;鍵盤輸入的標志位,為0說明鍵盤正在輸入,為1說明鍵盤輸入退出
;程序開始執行
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_DEAL ;處理從DS18B20得到的數據
LCALL SET_DIS_BUF ;賦值給DIS_BUF_X,G,S,B
LCALL DISPLAY ;調用數碼管顯示子程序
LCALL SCAN_KEY ;掃描鍵盤
LCALL SWITCH ;處理繼電器
AJMP NEXT
;程序名稱:ERR
;功能:程序出錯處理,顯示四個8,即8888
;入口參數:無
;出口參數: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
;功能:處理采集后的的數據
;入口參數:TEMPERATURE_L
;出口參數:DIS_BUF_G, DIS_BUF_S, DIS_BUF_B
DATA_DEAL:
MOV A,TEMPERATURE_H ;判溫度是否零下
ANL A,#80H
JZ TEMPC1 ;A為0,說明是正數,跳往TEMPC1,如果是負數,則對低8為進行補碼處理
CLR C
MOV A,TEMPERATURE_L ;二進制數求補(雙字節)
CPL A ;取反加1
ADD A,#01H
MOV TEMPERATURE_L,A ;取補碼后存回TEMPERATURE_L,此時TEMPERATURE_L里面的值就能表示溫
;度了,不過還要繼續處理一下。
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位(小數位,單位是0.0625),得出來的數要乘以0.0625,通過查表來算出值
MOV DPTR,#TEMPDOTTAB
MOVC A,@A+DPTR ;查表
MOV TEMPERATURE_LC,A ;TEMPERATURE_LC LOW=小數部分 BCD
MOV DIS_BUF_X,A ;小數位的BCD碼送入顯示buffer中
MOV A,TEMPERATURE_L ;整數部分
ANL A,#0F0H ;得到個位‘單個數值
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位 = 十位數 BCD
MOV TEMPERATURE_HC,A
MOV A,TEMPERATURE_L
ANL A,#0FH
SWAP A ;TEMPERATURE_LC HI位 = 個位數 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 = 百位數 BCD
ANL A,#0FH
ORL A,R7
MOV TEMPERATURE_HC,A
TEMPC12:RET
; 小數部分碼表
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
;入口參數:A
;出口參數: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是否是存在的
;入口參數:無
;出口參數:FLAG
INIT_TEMP:
SETB P_DS18B20
NOP
CLR P_DS18B20 ;主機發出延時537微秒的復位低脈沖
MOV R0,#6BH
MOV R1,#04H
TSR1: DJNZ R0,$
MOV 40,#6BH
DJNZ R1,TSR1
SETB P_DS18B20 ;然后拉高數據線,釋放總線進入接受狀態
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的數據
;入口參數:TEMPERATURE_L,TEMPERATURE_H
;出口參數:無
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 ;發出溫度轉換命令
LCALL WRITE_18B20
;LCALL DISPLAY ;等待AD轉換結束,12位的話750微秒
LCALL INIT_TEMP ;準備讀溫度前先復位
MOV A,#0CCH ;跳過ROM匹配
LCALL WRITE_18B20
MOV A,#0BEH ;發出讀溫度命令
LCALL WRITE_18B20
LCALL READ_18B20 ;將讀出的溫度數據保存到35H/36H
RET
;具體的步驟:初始化完后當拉低電平開始產生寫時隙-》15微妙之內送入一位數據-》15~60微妙1820來
;采樣讀取它
;程序名稱:WRITE_18B20
;功能:將A保存的數值寫入DS1820中,有具體的時序要求,詳細參考附圖的說明
;入口參數:A 寄存器
;出口參數:無
WRITE_18B20:
MOV R2,#8 ;一共8位數據,串行通信
CLR C
WR1: CLR P_DS18B20
MOV R3,#07
DJNZ R3,$
RRC A ;循環右移
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中的數據,由于是串行通信,每次讀取一個,循環8次讀取
;入口參數:TEMPRATURE_L
;出口參數:無
READ_18B20:
MOV R4,#4 ;將溫度高位和低位從DS18B20中讀出
MOV R1,#TEMPERATURE_L
RE00: MOV R2,#8 ;數據一共有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
;功能:掃描鍵盤
;入口參數:DIS_BUF_G,DIS_BUF_S,DIS_BUF_B
;出口參數: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_X,DIS_BUF_X
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
;功能:確認鍵盤輸入和退出鍵盤輸入
;入口參數:ENTER_FLAG
;出口參數:ENTER_FLAG
PRO_ENTER:
CALL K_DELAY
JB K_ENTER,K_LOOP ;按鈕抖動處理
SETB ENTER_FLAG
CALL K_DELAY
RET
;程序名稱:PRO_UP
;功能:數值上調處理
;入口參數:KEY_BUF_G,KEY_BUF_S,KEY_BUF_B
;出口參數:DIS_BUF_G,DIS_BUF_S,DIS_BUF_B
PRO_UP:
CALL K_DELAY
JB K_UP,K_LOOP ;按鈕抖動處理
INC KEY_BUF_X ;分位增一
MOV A,KEY_BUF_X
CJNE A,#0AH,UPNEXT;分位增加到10,回0
MOV KEY_BUF_X,#00H
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
/*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_X,KEY_BUF_X
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
;功能:數值下調處理
;入口參數:KEY_BUF_G,KEY_BUF_S,KEY_BUF_B
;出口參數:DIS_BUF_G,DIS_BUF_S,DIS_BUF_B
PRO_DOWN:
CALL K_DELAY
JB K_DOWN,K_LOOP ;按鈕抖動處理
DEC KEY_BUF_X ;分位減一
MOV A,KEY_BUF_X
CJNE A,#0FFH,DOWNNEXT;分位減到0,回到9
MOV KEY_BUF_X,#09H
DEC KEY_BUF_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 ;出錯,顯示8888
DJNZ R0,ERROR2
INC KEY_BUF_S ;退回00
MOV KEY_BUF_G,#00H
/*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_X,KEY_BUF_X
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
DL20MS_1:
MOV R7,#200
DJNZ R7,$
DJNZ R6, DL20MS_1
RET
;繼電器控制
SWITCH:
MOV A,KEY_BUF_X
JNZ SNEXT
MOV A,KEY_BUF_G ;三個Buffer都是0的話,說明還沒有輸入數值,直接退出
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 ;十位如果相等,那么繼續比較個位
MOV A,KEY_BUF_G
SUBB A,DIS_BUF_G
JC COOL
JNZ HOT ;個位如果相等,那么繼續比較分位
MOV A,KEY_BUF_X
SUBB A,DIS_BUF_X
JC COOL
HOT: SETB P_SWITCH ;P_SWITCH 為0說明當前溫度小于設定溫度
SETB P2.0;
SJMP SQUIT
COOL: CLR P_SWITCH ;P_SWITCH 為1說明當前溫度大于設定溫度
CLR P2.0;
SQUIT:RET
;程序名稱:SET_DIS_BUF
;功能:賦值給DIS_BUF_G, DIS_BUF_S, DIS_BUF_B
;入口參數:TEMPERATURE_LC,TEMPERATURE_HC
;出口參數:DIS_BUF_G, DIS_BUF_S, DIS_BUF_B
SET_DIS_BUF:
MOV A,TEMPERATURE_LC
ANL A,#0FH
MOV DIS_BUF_X,A ;小數位
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 ;十位數是0
MOV A,TEMPERATURE_HC
SWAP A
ANL A,#0FH
MOV 73H,#0AH ;符號位不顯示
MOV 72H,A ;十位數顯示符號
NEXT1: RET
;程序名稱:DISPLAY
;功能:顯示數據到數碼管中。
;入口參數:DIS_BUF_G, DIS_BUF_S, DIS_BUF_B
;出口參數:無
DISPLAY:
MOV DPTR,#DISTAB
MOV R3,#0FEH
MOV R1,#DIS_BUF_B
DPLOP: MOV A,@R1
MOVC A,@A+DPTR
MOV P3,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 P3,#0FFH ;P2口復位
RET
DS1M:
MOV R7,#0FFH
DJNZ R7,$
RET
;數碼管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


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精久久久久久久 | 国产国拍亚洲精品av | 先锋影音资源网站 | 一级毛片在线播放 | 美女131mm久久爽爽免费 | 天天综合久久 | 久久精品91 | 欧美一区二区三区在线观看视频 | 中文在线日韩 | 午夜在线小视频 | 香蕉久久久 | 在线免费观看色 | 伊人精品久久久久77777 | 亚洲福利一区二区 | 日韩精品一区二区三区中文在线 | 成人不卡| 夜夜骑av| 看片国产 | 精品国产一二三区 | 欧美视频在线播放 | 免费在线视频a | 九九久久国产精品 | 国产91av视频| 欧美久久一区二区三区 | 成年人视频在线免费观看 | 久久久精彩视频 | 久久黄色网 | 国产一级免费视频 | 99精品久久久久 | www.久草.com| h视频在线观看免费 | 一区二区三区视频在线观看 | 久久伊人一区二区 | 一区二区亚洲 | 久久国产精品一区二区三区 | 欧美日韩电影一区 | 亚洲网站在线观看 | 91精品国产91久久久久久吃药 | 国产日韩一区二区三区 | 欧美极品少妇xxxxⅹ免费视频 | 欧美一区二区 |