在一些溫控系統電路中,廣泛采用的是通過熱電偶、熱電阻或PN結測溫電路經過相應的信號調理電路,轉換成A/D轉換器能接收的模擬量,再經過采樣/保持電路進行A/D轉換,最終送入單片機及其相應的外圍電路,完成監控。但是由于傳統的信號調理電路實現復雜、易受干擾、不易控制且精度不高。本文介紹單片機結合DS18B20水溫控制系統設計,因此,本系統用一種新型的可編程溫度傳感器(DS18B20),不需復雜的信號調理電路和A/D轉換電路能直接與單片機完成數據采集和處理,實現方便、精度高,可根據不同需要用于各種場合。 目錄 一.引言... 二.設計目的... 三.系統功能... 四.系統設備... 五.溫度控制總體方案與原理... 1.系統模塊圖... 2.系統模塊總關系圖... 六.溫度轉換核心及其算法... 1.溫度傳感器DS18B20原理與特性... DSl8B20的管腳及特點... DS18B20的內部結構... DS18B20的內存結構... DS18B20的測溫功能... DSl820工作過程中的協議... 溫度傳感器與單片機通訊時序... 2.溫度轉換算法及分析... 七.硬件設計說明... 1.系統總體電路圖... 2.各個模塊電路圖... 輸入系統... 輸出系統... 芯片系統... 八.軟件設計說明... 1.總模塊的流程圖... 2.各個模塊的流程圖... 讀取溫度DS18B20模塊的流程... 鍵盤掃描處理流程... 九.操作指引... 按鍵功能... 顯示溫度... 設定溫度... 十.參考文獻... 程序源代碼...
二.設計目的 設計并制作一個水溫自動控制系統,控制對象為1升凈水,容器為搪瓷器皿。水溫可以在一定范圍內由人工設定,并能在環境溫度降低時實現自動控制,以保持設定的溫度基本不變。 利用單片機AT89S52實現水溫的智能控制,使水溫能夠在40-90 度之間實現控制溫度調節。利用儀器讀出水溫,并在此基礎上將水溫調節到我們通過鍵盤輸入的溫度(其方式是加熱或降溫),而且能夠將溫度顯示在我們的七段發光二極管板上。
三.系統功能 1. 可以對溫度進行自由設定,到那時必須在0-100攝氏度單位內,設定時可以適時的顯示說設定的溫度值,溫度是可以自由設置的,傳感器的檢測值與設定的溫度比較,可以顯示在七段發光二極管上。 2. 溫度由1臺1000w電爐來實現,如果溫度不在40-90度之間,則在LED上顯示“8888”,表示錯誤。 3. 能夠保持不間斷顯示水溫,顯示位數4位,分別為百位,個位,十位,和小數位。(但由于規定不超過90度,所以百位也就沒有實現,默認的百位是不顯示的)
四.系統設備 ME300B 最小系統板
DS18B20 數字溫度傳感器(集成了A/D轉換功能)
1000W 電爐
溫度計
繼電器
風扇
盛水器皿
六.溫度轉換核心及其算法 1.溫度傳感器DS18B20原理與特性本系統采用了DS18B20單總線可編程溫度傳感器,來實現對溫度的采集和轉換,極大簡化了電路的復雜度,以及算法的要求。首先先來介紹一下DS18B20這塊傳感器的特性及其功能: DSl8B20的管腳及特點 DS18B20可編程溫度傳感器有3個管腳。(如圖:1) GND為接地線,DQ為數據輸入輸出接口,通過一個較弱的上拉電阻與單片機相連。VDD為電源接口,既可由數據線提供電源,又可由外部提供電源,范圍3.O~5.5 V。本文使用外部電源供電。主要特點有: 1. 用戶可自設定報警上下限溫度值。 2. 不需要外部組件,能測量-55~+125℃ 范圍內的溫度。 3. -10℃ ~ +85℃ 范圍內的測溫準確度為±0.5℃ 。 4. 通過編程可實現9~l2位的數字讀數方式,可在至多750 ms內將溫度轉換成12 位的數字,測溫分辨率可達0.0625℃ 。 5. 獨特的單總線接口方式,與微處理器連接時僅需要一條線即可實現與微處理器雙向通訊。 DS18B20的內部結構 DS18B20內部功能模塊如圖2所示,主要由4部分組成:64位光刻R0M(圖3)、溫度傳感器、非易失性的溫度報警觸發器TH和TL、配置寄存器。R0M 中的64位序列號是出廠前被光刻好的,他可以看作是該DSISB20的地址序列碼,每個DSI8B20的64位序列號均不相同。高低溫報警觸發器TH 和TL,配置寄存器均由一個字節的E2PROM組成,使用一個存儲器功能命令可對 TH,TL或配置寄存器寫入。配置寄存器中R1,R0決定溫度轉換的精度位數:R1R0=’00’,9位精度,最大轉換時間為93.75 ms;R1R0 = ‘01’,10位精度,最大轉換時間為187.5 ms;R1R0 = ‘10’,11位精度,最大轉換時間為375 ms;R1R0 =’11’,12位精度,最大轉換時間為750 ms;未編程時默認為12位精度。本系統采用的也是12位的精度。 DS18B20的內存結構 DSI8B20溫度傳感器的內部存儲器包括一個高速暫存RAM (便箋式的內部存儲器)和一個非易失性的可電擦除的EEPROM,后者存放高溫和低溫觸發器TH,TL和結構寄存器。便箋存儲器包含了9個連續字節(0~8),前兩個字節是測得的溫度信息(圖4),字節0的內容是溫度的低8位,字節1是溫度的高8位,字節2是TH(溫度上限報警),字節3是TL(溫度下限報警),字節4是配置寄存器(圖5),用于確定輸出分辨率9到12位。第5、6、7個字節是預留寄存器,用于內部計算。字節8是冗余檢驗字節,校驗前面所有8個字節的CRC碼,可用來保證通信正確。 DS18B20的測溫功能當DSI8B20接收到溫度轉換命令后,開始啟動轉換。轉換完成后的溫度值就以16位帶符號擴展的二進制補碼形式存儲在高速暫存存儲器的0,1字節。單片機可通過單線接口讀到該數據,讀取時低位在前,高位在后,數據格式以0.062 5℃/LSB形式表示。溫度值格式如圖4所示,其中“S”為標志位,對應的溫度計算:當符號位S=0時,直接將二進制位轉換為十進制;當S=1時,先將補碼變換為原碼,再計算十進制值。圖4下面的表是對應的一部分溫度值。DSI8B20完成溫度轉換后,就把測得的溫度值與 TH做比較,若T>TH或T RoM操作命令 -> 存儲器操作命令-> 處理數據 1 初始化 單總線上的所有處理均從初始化開始 2 ROM操作品令 總線主機檢測到DSl820的存在便可以發出ROM操作命令之一這些命令如 指令 代碼 Read ROM(讀ROM) [33H] Match ROM(匹配ROM) [55H] Skip ROM(跳過ROM] [CCH] Search ROM(搜索ROM) [F0H] Alarm search(告警搜索) [ECH] 3 存儲器操作命令 指令 代碼 Write Scratchpad(寫暫存存儲器) [4EH] Read Scratchpad(讀暫存存儲器) [BEH] Copy Scratchpad(復制暫存存儲器) [48H] Convert Temperature(溫度變換) [44H] Recall EPROM(重新調出) [B8H] Read Power supply(讀電源) [B4H] 溫度傳感器與單片機通訊時序 2.溫度轉換算法及分析由于DS18B20轉換后的代碼并不是實際的溫度值,所以要進行計算轉換。溫度高字節(MS Byte)高5位是用來保存溫度的正負(標志為S的bit11~bit15),高字節(MS Byte)低3位和低字節來保存溫度值(bit0 ~ bit10)。其中低字節(LS Byte)的低4位來保存溫度的小數位(bit0 ~ bit 3)。由于本程序采用的是0.0625的精度,小數部分的值,可以用后四位代表的實際數值乘以0.0625,得到真正的數值,數值可能帶幾個小數位,所以采取小數舍入,保留一位小數即可。也就說,本系統的溫度精確到了0.1度。 算法核心:首先程序判斷溫度是否是零下,如果是,則DS18B20保存的是溫度的補碼值,需要對其低8位(LS Byte)取反加一變成原碼。處理過后把DS18B20的溫度Copy到單片機的RAM中,里面已經是溫度值的Hex碼了,然后轉換Hex碼到BCD碼,分別把小數位,個位,十位,百位的BCD碼存入RAM中。由于百位沒有用,默認情況是置為0A,在顯示屏上沒有任何顯示。溫度算法核心代碼 DATA_DEAL: MOV A,TEMPERATURE_H ;TEMPERATURE_H存放的是DS18B20轉換后的高8位的值(上圖的MS Byte)ANL A,#80H ;判溫度是否零下 JZ TEMPC1 ;A為0,說明是正數,跳往TEMPC1,如果是負數,則對低8為進行補碼處理 CLR C MOV A,TEMPERATURE_L ;為負數,對低8 位(上圖的LS Byte)求補 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的低四位保存 小數部分 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 低4位 存放 十位數 BCD MOV TEMPERATURE_HC,A MOV A,TEMPERATURE_L ANL A,#0FH SWAP A ;TEMPERATURE_LC高4位 存放 個位數 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高4位 存放 百位數 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 結果溫度值的BCD碼存放到TEMPERATURE_HC(百位和十位),TEMPERATURE_LC(個位和小數位)中七.硬件設計說明 1.系統總體電路圖 2.各個模塊電路圖輸入系統 1. 鍵盤模塊我們用的下面四個獨立鍵盤中的三個,分別是:K2,K3,K4。 1. 溫度測量模塊 DS18B20通過P3.3口和AT89S52進行通訊。
輸出系統 1. 繼電器模塊 下圖是一個蜂鳴器和一個繼電器的圖,我們只用到了繼電器的圖,繼電器和單片機的P1.3口進行通訊。
圖片2.png (27.88 KB, 下載次數: 30)
下載附件
2024-5-13 08:21 上傳
單片機DS18B20水溫控制系統設計程序源碼
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_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 ;輸入數據確認按鈕
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說明鍵盤輸入退出
;程序開始執行
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得到的數據
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_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_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
;功能:數值下調處理
;入口參數: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_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
DL20MS_1:
MOV R7,#200
DJNZ R7,$
DJNZ R6, DL20MS_1
RET
;繼電器控制
SWITCH:
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
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
;入口參數: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 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
;數碼管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. 顯示模塊 該顯示模塊的動態顯示數碼管,我們用到前面四個數碼管,P0口是送字符的,P2口是用來位選數碼管的。
圖片3.png (121.59 KB, 下載次數: 27)
下載附件
2024-5-13 08:22 上傳
芯片系統 本系統采用的是AT89S52芯片。下面是它的引腳圖。
圖片4.png (63.8 KB, 下載次數: 35)
下載附件
2024-5-13 08:22 上傳
八.軟件設計說明 本系統采用的是循環查詢方式,來顯示和控制溫度的。 1.總模塊的流程圖
圖片5.png (45.78 KB, 下載次數: 30)
下載附件
2024-5-13 08:22 上傳
2.各個模塊的流程圖 讀取溫度DS18B20模塊的流程
圖片6.png (32.42 KB, 下載次數: 30)
下載附件
2024-5-13 08:23 上傳
鍵盤掃描處理流程
圖片7.png (96.78 KB, 下載次數: 29)
下載附件
2024-5-13 08:23 上傳
九.操作指引 按鍵功能 1. Enter → P1.5(k2) 2. Up → P1.6(k3) 3. Down → P1.7(k4)
顯示溫度 1. 未插DS18B20時,數碼管顯示錯誤888.8. 2. 插入DS18B20是,數碼管顯示當前溫度XX.X
設定溫度 1.按下Enter,數碼管溫度顯示停止,顯示的數字變的比以前亮。 2.這時可以按Up和Down來調節當前溫度。 3.調節好后,按Enter退出。這時數字變的又暗了,數碼管繼續顯示當前溫度 繼電器隨著設定的溫度,依據情況跳變。 十.參考文獻 [1]. 單片機原理與應用技術 .江力 主編 .清華大學出版社 .2006 [2]. 微型計算機接口技術 . 王兆月等 編著. 機械工業出版社 .2006 [3]. 數字電子技術 . 江曉安等 編著. 西安電子科技大學出版社 .1993 [4]. ME300B說明書 .偉納電子 編著. 偉納電子出版 .2006 [5]. DS18B20官方英文文檔 . DS18B20官方英文站點下載 .
五.溫度控制總體方案與原理 1.系統模塊圖 系統模塊分為:DS18B20模塊,顯示模塊,繼電器模塊,鍵盤輸入模塊,DS18B20可以被編程,所以箭頭是雙向的,CPU(89S52)首先寫入命令給DS18B20,然后DS18B20開始轉換數據,轉換后通過89S52來處理數據。數據處理后的結果就顯示到數碼管上。
圖片8.png (31.21 KB, 下載次數: 46)
下載附件
2024-5-13 08:23 上傳
<單片機DS18B20水溫控制系統設計總體圖>
1.系統模塊總關系圖 本系統的執行方法是循環查詢執行的,鍵盤掃描也是用循環查詢的辦法,由于本系統對實時性要求不是很高,所以沒有用到中斷方式來處理。
圖片9.png (37.67 KB, 下載次數: 38)
下載附件
2024-5-13 08:23 上傳
|