找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 1714|回復(fù): 2
收起左側(cè)

AT/STC51單片機(jī)DS18B20水溫控制系統(tǒng)設(shè)計(jì)

[復(fù)制鏈接]
ID:1039126 發(fā)表于 2024-5-13 08:24 | 顯示全部樓層 |閱讀模式
在一些溫控系統(tǒng)電路中,廣泛采用的是通過(guò)熱電偶、熱電阻或PN結(jié)測(cè)溫電路經(jīng)過(guò)相應(yīng)的信號(hào)調(diào)理電路,轉(zhuǎn)換成A/D轉(zhuǎn)換器能接收的模擬量,再經(jīng)過(guò)采樣/保持電路進(jìn)行A/D轉(zhuǎn)換,最終送入單片機(jī)及其相應(yīng)的外圍電路,完成監(jiān)控。但是由于傳統(tǒng)的信號(hào)調(diào)理電路實(shí)現(xiàn)復(fù)雜、易受干擾、不易控制且精度不高。本文介紹單片機(jī)結(jié)合DS18B20水溫控制系統(tǒng)設(shè)計(jì),因此,本系統(tǒng)用一種新型的可編程溫度傳感器(DS18B20),不需復(fù)雜的信號(hào)調(diào)理電路和A/D轉(zhuǎn)換電路能直接與單片機(jī)完成數(shù)據(jù)采集和處理,實(shí)現(xiàn)方便、精度高,可根據(jù)不同需要用于各種場(chǎng)合。
目錄
一.引言...
二.設(shè)計(jì)目的...
三.系統(tǒng)功能...
四.系統(tǒng)設(shè)備...
五.溫度控制總體方案與原理...
1.系統(tǒng)模塊圖...
2.系統(tǒng)模塊總關(guān)系圖...
六.溫度轉(zhuǎn)換核心及其算法...
1.溫度傳感器DS18B20原理與特性...
DSl8B20的管腳及特點(diǎn)...
DS18B20的內(nèi)部結(jié)構(gòu)...
DS18B20的內(nèi)存結(jié)構(gòu)...
DS18B20的測(cè)溫功能...
DSl820工作過(guò)程中的協(xié)議...
溫度傳感器與單片機(jī)通訊時(shí)序...
2.溫度轉(zhuǎn)換算法及分析...
七.硬件設(shè)計(jì)說(shuō)明...
1.系統(tǒng)總體電路圖...
2.各個(gè)模塊電路圖...
輸入系統(tǒng)...
輸出系統(tǒng)...
芯片系統(tǒng)...
八.軟件設(shè)計(jì)說(shuō)明...
1.總模塊的流程圖...
2.各個(gè)模塊的流程圖...
讀取溫度DS18B20模塊的流程...
鍵盤(pán)掃描處理流程...
九.操作指引...
按鍵功能...
顯示溫度...
設(shè)定溫度...
十.參考文獻(xiàn)...
程序源代碼...


二.設(shè)計(jì)目的
設(shè)計(jì)并制作一個(gè)水溫自動(dòng)控制系統(tǒng),控制對(duì)象為1升凈水,容器為搪瓷器皿。水溫可以在一定范圍內(nèi)由人工設(shè)定,并能在環(huán)境溫度降低時(shí)實(shí)現(xiàn)自動(dòng)控制,以保持設(shè)定的溫度基本不變。
利用單片機(jī)AT89S52實(shí)現(xiàn)水溫的智能控制,使水溫能夠在40-90 度之間實(shí)現(xiàn)控制溫度調(diào)節(jié)。利用儀器讀出水溫,并在此基礎(chǔ)上將水溫調(diào)節(jié)到我們通過(guò)鍵盤(pán)輸入的溫度(其方式是加熱或降溫),而且能夠?qū)囟蕊@示在我們的七段發(fā)光二極管板上。

三.系統(tǒng)功能
1. 可以對(duì)溫度進(jìn)行自由設(shè)定,到那時(shí)必須在0-100攝氏度單位內(nèi),設(shè)定時(shí)可以適時(shí)的顯示說(shuō)設(shè)定的溫度值,溫度是可以自由設(shè)置的,傳感器的檢測(cè)值與設(shè)定的溫度比較,可以顯示在七段發(fā)光二極管上。
2. 溫度由1臺(tái)1000w電爐來(lái)實(shí)現(xiàn),如果溫度不在40-90度之間,則在LED上顯示“8888”,表示錯(cuò)誤。
3. 能夠保持不間斷顯示水溫,顯示位數(shù)4位,分別為百位,個(gè)位,十位,和小數(shù)位。(但由于規(guī)定不超過(guò)90度,所以百位也就沒(méi)有實(shí)現(xiàn),默認(rèn)的百位是不顯示的)

四.系統(tǒng)設(shè)備
ME300B 最小系統(tǒng)板
DS18B20 數(shù)字溫度傳感器(集成了A/D轉(zhuǎn)換功能)
1000W 電爐
溫度計(jì)
繼電器
風(fēng)扇
盛水器皿

六.溫度轉(zhuǎn)換核心及其算法 1.溫度傳感器DS18B20原理與特性本系統(tǒng)采用了DS18B20單總線可編程溫度傳感器,來(lái)實(shí)現(xiàn)對(duì)溫度的采集和轉(zhuǎn)換,極大簡(jiǎn)化了電路的復(fù)雜度,以及算法的要求。首先先來(lái)介紹一下DS18B20這塊傳感器的特性及其功能: DSl8B20的管腳及特點(diǎn) DS18B20可編程溫度傳感器有3個(gè)管腳。(如圖:1) GND為接地線,DQ為數(shù)據(jù)輸入輸出接口,通過(guò)一個(gè)較弱的上拉電阻與單片機(jī)相連。VDD為電源接口,既可由數(shù)據(jù)線提供電源,又可由外部提供電源,范圍3.O~5.5 V。本文使用外部電源供電。主要特點(diǎn)有: 1. 用戶可自設(shè)定報(bào)警上下限溫度值。 2. 不需要外部組件,能測(cè)量-55~+125℃ 范圍內(nèi)的溫度。 3. -10℃ ~ +85℃ 范圍內(nèi)的測(cè)溫準(zhǔn)確度為±0.5℃ 。 4. 通過(guò)編程可實(shí)現(xiàn)9~l2位的數(shù)字讀數(shù)方式,可在至多750 ms內(nèi)將溫度轉(zhuǎn)換成12 位的數(shù)字,測(cè)溫分辨率可達(dá)0.0625℃ 。 5. 獨(dú)特的單總線接口方式,與微處理器連接時(shí)僅需要一條線即可實(shí)現(xiàn)與微處理器雙向通訊。 DS18B20的內(nèi)部結(jié)構(gòu) DS18B20內(nèi)部功能模塊如圖2所示,主要由4部分組成:64位光刻R0M(圖3)、溫度傳感器、非易失性的溫度報(bào)警觸發(fā)器TH和TL、配置寄存器。R0M 中的64位序列號(hào)是出廠前被光刻好的,他可以看作是該DSISB20的地址序列碼,每個(gè)DSI8B20的64位序列號(hào)均不相同。高低溫報(bào)警觸發(fā)器TH 和TL,配置寄存器均由一個(gè)字節(jié)的E2PROM組成,使用一個(gè)存儲(chǔ)器功能命令可對(duì) TH,TL或配置寄存器寫(xiě)入。配置寄存器中R1,R0決定溫度轉(zhuǎn)換的精度位數(shù):R1R0=’00’,9位精度,最大轉(zhuǎn)換時(shí)間為93.75 ms;R1R0 = ‘01’,10位精度,最大轉(zhuǎn)換時(shí)間為187.5 ms;R1R0 = ‘10’,11位精度,最大轉(zhuǎn)換時(shí)間為375 ms;R1R0 =’11’,12位精度,最大轉(zhuǎn)換時(shí)間為750 ms;未編程時(shí)默認(rèn)為12位精度。本系統(tǒng)采用的也是12位的精度。 DS18B20的內(nèi)存結(jié)構(gòu) DSI8B20溫度傳感器的內(nèi)部存儲(chǔ)器包括一個(gè)高速暫存RAM (便箋式的內(nèi)部存儲(chǔ)器)和一個(gè)非易失性的可電擦除的EEPROM,后者存放高溫和低溫觸發(fā)器TH,TL和結(jié)構(gòu)寄存器。便箋存儲(chǔ)器包含了9個(gè)連續(xù)字節(jié)(0~8),前兩個(gè)字節(jié)是測(cè)得的溫度信息(圖4),字節(jié)0的內(nèi)容是溫度的低8位,字節(jié)1是溫度的高8位,字節(jié)2是TH(溫度上限報(bào)警),字節(jié)3是TL(溫度下限報(bào)警),字節(jié)4是配置寄存器(圖5),用于確定輸出分辨率9到12位。第5、6、7個(gè)字節(jié)是預(yù)留寄存器,用于內(nèi)部計(jì)算。字節(jié)8是冗余檢驗(yàn)字節(jié),校驗(yàn)前面所有8個(gè)字節(jié)的CRC碼,可用來(lái)保證通信正確。 DS18B20的測(cè)溫功能當(dāng)DSI8B20接收到溫度轉(zhuǎn)換命令后,開(kāi)始啟動(dòng)轉(zhuǎn)換。轉(zhuǎn)換完成后的溫度值就以16位帶符號(hào)擴(kuò)展的二進(jìn)制補(bǔ)碼形式存儲(chǔ)在高速暫存存儲(chǔ)器的0,1字節(jié)。單片機(jī)可通過(guò)單線接口讀到該數(shù)據(jù),讀取時(shí)低位在前,高位在后,數(shù)據(jù)格式以0.062 5℃/LSB形式表示。溫度值格式如圖4所示,其中“S”為標(biāo)志位,對(duì)應(yīng)的溫度計(jì)算:當(dāng)符號(hào)位S=0時(shí),直接將二進(jìn)制位轉(zhuǎn)換為十進(jìn)制;當(dāng)S=1時(shí),先將補(bǔ)碼變換為原碼,再計(jì)算十進(jìn)制值。圖4下面的表是對(duì)應(yīng)的一部分溫度值。DSI8B20完成溫度轉(zhuǎn)換后,就把測(cè)得的溫度值與 TH做比較,若T>TH或T RoM操作命令 -> 存儲(chǔ)器操作命令-> 處理數(shù)據(jù) 1 初始化 單總線上的所有處理均從初始化開(kāi)始 2 ROM操作品令 總線主機(jī)檢測(cè)到DSl820的存在便可以發(fā)出ROM操作命令之一這些命令如 指令 代碼 Read ROM(讀ROM) [33H] Match ROM(匹配ROM) [55H] Skip ROM(跳過(guò)ROM] [CCH] Search ROM(搜索ROM) [F0H] Alarm search(告警搜索) [ECH] 3 存儲(chǔ)器操作命令 指令 代碼 Write Scratchpad(寫(xiě)暫存存儲(chǔ)器) [4EH] Read Scratchpad(讀暫存存儲(chǔ)器) [BEH] Copy Scratchpad(復(fù)制暫存存儲(chǔ)器) [48H] Convert Temperature(溫度變換) [44H] Recall EPROM(重新調(diào)出) [B8H] Read Power supply(讀電源) [B4H] 溫度傳感器與單片機(jī)通訊時(shí)序 2.溫度轉(zhuǎn)換算法及分析由于DS18B20轉(zhuǎn)換后的代碼并不是實(shí)際的溫度值,所以要進(jìn)行計(jì)算轉(zhuǎn)換。溫度高字節(jié)(MS Byte)高5位是用來(lái)保存溫度的正負(fù)(標(biāo)志為S的bit11~bit15),高字節(jié)(MS Byte)低3位和低字節(jié)來(lái)保存溫度值(bit0 ~ bit10)。其中低字節(jié)(LS Byte)的低4位來(lái)保存溫度的小數(shù)位(bit0 ~ bit 3)。由于本程序采用的是0.0625的精度,小數(shù)部分的值,可以用后四位代表的實(shí)際數(shù)值乘以0.0625,得到真正的數(shù)值,數(shù)值可能帶幾個(gè)小數(shù)位,所以采取小數(shù)舍入,保留一位小數(shù)即可。也就說(shuō),本系統(tǒng)的溫度精確到了0.1度。 算法核心:首先程序判斷溫度是否是零下,如果是,則DS18B20保存的是溫度的補(bǔ)碼值,需要對(duì)其低8位(LS Byte)取反加一變成原碼。處理過(guò)后把DS18B20的溫度Copy到單片機(jī)的RAM中,里面已經(jīng)是溫度值的Hex碼了,然后轉(zhuǎn)換Hex碼到BCD碼,分別把小數(shù)位,個(gè)位,十位,百位的BCD碼存入RAM中。由于百位沒(méi)有用,默認(rèn)情況是置為0A,在顯示屏上沒(méi)有任何顯示。溫度算法核心代碼 DATA_DEAL: MOV A,TEMPERATURE_H ;TEMPERATURE_H存放的是DS18B20轉(zhuǎn)換后的高8位的值(上圖的MS Byte)ANL A,#80H ;判溫度是否零下 JZ TEMPC1 ;A為0,說(shuō)明是正數(shù),跳往TEMPC1,如果是負(fù)數(shù),則對(duì)低8為進(jìn)行補(bǔ)碼處理 CLR C MOV A,TEMPERATURE_L ;為負(fù)數(shù),對(duì)低8 位(上圖的LS Byte)求補(bǔ) CPL A ;取反加1 ADD A,#01H MOV TEMPERATURE_L,A ;取補(bǔ)碼后存回TEMPERATURE_L,此時(shí)TEMPERATURE_L里面的值就可以表示溫度了 MOV A,TEMPERATURE_H CPL A ADDC A,#00H ;高位TEMPERATURE_H取反,加上從低位TEMPERATURE_L進(jìn)來(lái)的位 MOV TEMPERATURE_H,A ;寫(xiě)回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),得出來(lái)的數(shù)要乘以0.0625,通過(guò)查表來(lái)算出值 MOV DPTR,#TEMPDOTTAB MOVC A,@A+DPTR ;查表 MOV TEMPERATURE_LC,A ;TEMPERATURE_LC的低四位保存 小數(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 低4位 存放 十位數(shù) BCD MOV TEMPERATURE_HC,A MOV A,TEMPERATURE_L ANL A,#0FH SWAP A ;TEMPERATURE_LC高4位 存放 個(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高4位 存放 百位數(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 結(jié)果溫度值的BCD碼存放到TEMPERATURE_HC(百位和十位),TEMPERATURE_LC(個(gè)位和小數(shù)位)中七.硬件設(shè)計(jì)說(shuō)明 1.系統(tǒng)總體電路圖 2.各個(gè)模塊電路圖輸入系統(tǒng) 1. 鍵盤(pán)模塊我們用的下面四個(gè)獨(dú)立鍵盤(pán)中的三個(gè),分別是:K2,K3,K4。 1. 溫度測(cè)量模塊 DS18B20通過(guò)P3.3口和AT89S52進(jìn)行通訊。


輸出系統(tǒng)
1. 繼電器模塊
下圖是一個(gè)蜂鳴器和一個(gè)繼電器的圖,我們只用到了繼電器的圖,繼電器和單片機(jī)的P1.3口進(jìn)行通訊。
圖片2.png



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

        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 ;鍵盤(pán)輸入后,的個(gè)位值
        KEY_BUF_S DATA 49H ;鍵盤(pán)輸入后,的十位值
        KEY_BUF_B DATA 41H ;鍵盤(pán)輸入后,的百位值
      
        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  ;鍵盤(pán)輸入的標(biāo)志位,為0說(shuō)明鍵盤(pán)正在輸入,為1說(shuō)明鍵盤(pán)輸入退出

;程序開(kāi)始執(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      ;掃描鍵盤(pán)
        LCALL SWITCH            ;處理繼電器
        AJMP    NEXT

;程序名稱:ERR
;功能:程序出錯(cuò)處理,顯示四個(gè)8,即8888
;入口參數(shù):無(wú)
;出口參數(shù):DIS_BUF_X,DIS_BUF_G, DIS_BUF_S, DIS_BUF_B
ERR:    MOV DIS_BUF_X,#08H ;如果沒(méi)有找到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,說(shuō)明是正數(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里面的值就能表示溫
;度了,不過(guò)還要繼續(xù)處理一下。
        MOV  A,TEMPERATURE_H
        CPL  A
        ADDC  A,#00H               ;高位TEMPERATURE_H取反,加上從低位TEMPERATURE_L進(jìn)來(lái)的位
        MOV  TEMPERATURE_H,A       ;寫(xiě)回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),得出來(lái)的數(shù)要乘以0.0625,通過(guò)查表來(lái)算出值
        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ù):無(wú)
;出口參數(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ù):無(wú)
READ_TEMP:
        SETB    P_DS18B20
        LCALL   INIT_TEMP     ;先復(fù)位DS18B20
        JB  FLAG,TSS2
        RET                   ;判斷DS1820是否存在?若DS18B20不存在則返回
TSS2:   MOV A,#0CCH           ;跳過(guò)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           ;跳過(guò)ROM匹配
        LCALL   WRITE_18B20
        MOV A,#0BEH           ;發(fā)出讀溫度命令
        LCALL   WRITE_18B20
        LCALL   READ_18B20    ;將讀出的溫度數(shù)據(jù)保存到35H/36H
        RET

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

;程序名稱:WRITE_18B20
;功能:將A保存的數(shù)值寫(xiě)入DS1820中,有具體的時(shí)序要求,詳細(xì)參考附圖的說(shuō)明
;入口參數(shù):A 寄存器
;出口參數(shù):無(wú)
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ù):無(wú)
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
;功能:掃描鍵盤(pán)
;入口參數(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鍵入,則開(kāi)始鍵盤(pán)輸入
      LCALL K_DELAY
      JB K_ENTER,QUIT
      CLR ENTER_FLAG                ;每次進(jìn)來(lái)都賦值輸入標(biāo)志,設(shè)置為0
      MOV KEY_BUF_G,DIS_BUF_G ;將當(dāng)前的溫度賦值給KEY_BUF,也就是說(shuō)是以當(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,退出鍵盤(pán)程序
      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)鍵盤(pán)輸入和退出鍵盤(pá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;十位超過(guò)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顯示出來(lái)
      MOV DIS_BUF_S,KEY_BUF_S
      MOV DIS_BUF_B,KEY_BUF_B
      CALL K_DELAY
      RET

K_DELAY:            ;鍵盤(pán)抖動(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的話,說(shuō)明還沒(méi)有輸入數(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說(shuō)明當(dāng)前溫度小于設(shè)定溫度,要升溫,所以接電爐
      SJMP SQUIT
COOL: SETB P_SWITCH         ;P_SWITCH 為1說(shuō)明當(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ù):無(wú)
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

1. 顯示模塊
該顯示模塊的動(dòng)態(tài)顯示數(shù)碼管,我們用到前面四個(gè)數(shù)碼管,P0口是送字符的,P2口是用來(lái)位選數(shù)碼管的。
圖片3.png
芯片系統(tǒng)
本系統(tǒng)采用的是AT89S52芯片。下面是它的引腳圖。
圖片4.png
八.軟件設(shè)計(jì)說(shuō)明
本系統(tǒng)采用的是循環(huán)查詢方式,來(lái)顯示和控制溫度的。
1.總模塊的流程圖
圖片5.png
2.各個(gè)模塊的流程圖
讀取溫度DS18B20模塊的流程
圖片6.png
鍵盤(pán)掃描處理流程
圖片7.png
九.操作指引
按鍵功能
1.      Enter   → P1.5(k2)
2.      Up      → P1.6(k3)
3.      Down        → P1.7(k4)

顯示溫度
1.      未插DS18B20時(shí),數(shù)碼管顯示錯(cuò)誤888.8.
2.      插入DS18B20是,數(shù)碼管顯示當(dāng)前溫度XX.X

設(shè)定溫度
1.按下Enter,數(shù)碼管溫度顯示停止,顯示的數(shù)字變的比以前亮。
2.這時(shí)可以按Up和Down來(lái)調(diào)節(jié)當(dāng)前溫度。
3.調(diào)節(jié)好后,按Enter退出。這時(shí)數(shù)字變的又暗了,數(shù)碼管繼續(xù)顯示當(dāng)前溫度
繼電器隨著設(shè)定的溫度,依據(jù)情況跳變。
十.參考文獻(xiàn)
[1].              單片機(jī)原理與應(yīng)用技術(shù) .江力 主編 .清華大學(xué)出版社 .2006
[2].              微型計(jì)算機(jī)接口技術(shù) . 王兆月等 編著. 機(jī)械工業(yè)出版社 .2006
[3].              數(shù)字電子技術(shù) . 江曉安等 編著. 西安電子科技大學(xué)出版社 .1993
[4].              ME300B說(shuō)明書(shū) .偉納電子 編著. 偉納電子出版 .2006
[5].              DS18B20官方英文文檔 . DS18B20官方英文站點(diǎn)下載 .


五.溫度控制總體方案與原理
1.系統(tǒng)模塊圖
系統(tǒng)模塊分為:DS18B20模塊,顯示模塊,繼電器模塊,鍵盤(pán)輸入模塊,DS18B20可以被編程,所以箭頭是雙向的,CPU(89S52)首先寫(xiě)入命令給DS18B20,然后DS18B20開(kāi)始轉(zhuǎn)換數(shù)據(jù),轉(zhuǎn)換后通過(guò)89S52來(lái)處理數(shù)據(jù)。數(shù)據(jù)處理后的結(jié)果就顯示到數(shù)碼管上。
圖片8.png
<單片機(jī)DS18B20水溫控制系統(tǒng)設(shè)計(jì)總體圖>
1.系統(tǒng)模塊總關(guān)系圖
本系統(tǒng)的執(zhí)行方法是循環(huán)查詢執(zhí)行的,鍵盤(pán)掃描也是用循環(huán)查詢的辦法,由于本系統(tǒng)對(duì)實(shí)時(shí)性要求不是很高,所以沒(méi)有用到中斷方式來(lái)處理。
圖片9.png


回復(fù)

使用道具 舉報(bào)

ID:218360 發(fā)表于 2024-5-15 10:00 | 顯示全部樓層
厲害阿,還是用匯編寫(xiě)的,現(xiàn)在寫(xiě)匯編的人太少了
回復(fù)

使用道具 舉報(bào)

ID:1039126 發(fā)表于 2024-5-17 13:31 | 顯示全部樓層
打雜的 發(fā)表于 2024-5-15 10:00
厲害阿,還是用匯編寫(xiě)的,現(xiàn)在寫(xiě)匯編的人太少了

匯編還是很多人用的,不是計(jì)算機(jī)專業(yè)的學(xué)C語(yǔ)言很費(fèi)勁
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表