本設計為一種溫控風扇系統,具有靈敏的溫度感測和顯示功能,系統AT89C5 單片機作為控制平臺對風扇轉速進行控制?捎捎脩粼O置高、低溫度值,測得溫度值在高低溫度之間時打開風扇弱風檔,當溫度升高超過所設定的溫度時自動切換到大風檔,當溫度小于所設定的溫度時自動關閉風扇,控制狀態隨外界溫度而定。所設高低溫值保存在溫度傳感器DS18B20內部E2ROM中,掉電后仍然能保存上次設定值,性能穩定,控制準確。
目 錄摘 要 目 錄 1引言 2 方案論證 2.1 溫度傳感器的選用 2.2 控制核心的選擇 2.3顯示電路 2.4調速方式 2.5控制執行部件 3 系統簡述 4 硬件設計 4.1、本系統各器件簡介 4.1.1 DS18B20 單線數字溫度傳感器簡介 4.1.2 AT89C52 單片機簡介 4.1.3 八段LED 數碼管 4.2 各部分電路設計 4.2.1 電源電路 4.2.2 數碼管顯示電路 4.2.3 聲響、溫度采集、溫度設定以及復位電路 4.2.4 溫控自動電路 4.2.5無級調速電路 5 軟件設計 6 安裝調試 參考文獻 附錄1 程序流程圖 附錄2 源程序
1引言生活中,我們經常會使用一些與溫度有關的設備。比如,現在雖然不少城市家庭用上了空調,但在占中國大部分人口的農村地區依舊使用電風扇作為降溫防暑設備,春夏(夏秋)交替時節,白天溫度依舊很高,電風扇應高轉速、大風量,使人感到清涼;到了晚上,氣溫降低,當人入睡后,應該逐步減小轉速,以免使人感冒。雖然電風扇都有調節不同檔位的功能,但必須要人手動換檔,睡著了就無能為力了,而普遍采用的定時器關閉的做法,一方面是定時時間長短有限制,一般是一兩個小時;另一方面可能在一兩個小時后氣溫依舊沒有降低很多,而風扇就關閉了,使人在睡夢中熱醒而不得不起床重新打開風扇,增加定時器時間,非常麻煩,而且可能多次定時后最后一次定時時間太長,在溫度降低以后風扇依舊繼續吹風,使人感冒;第三方面是只有簡單的到了定時時間就關閉風扇電源的單一功能,不能滿足氣溫變化對風扇風速大小的不同要求。又比如在較大功率的電子產品散熱方面,現在絕大多數都采用了風冷系統,利用風扇引起空氣流動,帶走熱量,使電子產品不至于發熱燒壞。要使電子產品保持較低的溫度,必須用大功率、高轉速、大風量的風扇,而風扇的噪音與其功率成正比。如果要低噪音,則要減小風扇轉速,又會引起電子設備溫度上升,不能兩全其美。為解決上述問題,我們設計了這套溫控自動風扇系統。本系統采用高精度集成溫度傳感器,用單片機控制,能顯示實時溫度,并根據使用者設定的溫度自動在相應溫度時作出小風、大風、停機動作,精確度高,動作準確。
2 方案論證本系統實現風扇的溫度控制,需要有較高的溫度變化分辨率和穩定可靠的換檔停機控制部件。 2.1 溫度傳感器的選用溫度傳感器可由以下幾種方案可供選擇: 方案一:選用熱敏電阻作為感測溫度的核心元件,通過運算放大器放大由于溫度變化引起熱敏電阻電阻的變化、進而導至的輸出電壓變化的微弱電壓變化信號,再用AD轉換芯片ADC0809將模擬信號轉化為數字信號輸入單片機處理。 方案二:采用熱電偶作為感測溫度的核心元件,配合橋式電路,運算放大電路和AD轉換電路,將溫度變化信號送入單片機處理。 方案三:采用數字式集成溫度傳感器DS18B20作為感測溫度的核心元件,直接輸出數字溫度信號供單片機處理。 對于方案一,采用熱敏電阻有價格便宜、元件易購的優點,但熱敏電阻對溫度的細微變化不敏感,在信號采集、放大、轉換過程中還會產生失真和誤差,并且由于熱敏電阻的R-T關系的非線性,其本身電阻對溫度的變化存在較大誤差,雖然可以通過一定電路予以糾正,但不僅將使電路復雜穩定性降低,而且在人體所處溫度環境溫度變化中難以檢測到小的溫度變化。故該方案不適合本系統。 對于方案二,采用熱電偶和橋式測量電路相對于熱敏電阻其對溫度的敏感性和器件的非線性誤差都有較大提高,其測溫范圍也非常寬,從-50攝氏度到1600攝氏度均可測量。但是依然存在電路復雜,對溫度敏感性達不到本系統要求的標準,故不采用該方案。 對于方案三,由于數字式集成溫度傳感器DS18B20的高度集成化,大大降低了外接放大轉換等電路的誤差因素,溫度誤差很小,并且由于其感測溫度的原理與上述兩種方案的原理有著本質的不同,使得其溫度分辨力極高。溫度值在器件內部轉換成數字量直接輸出,簡化了系統程序設計,又由于該傳感器采用先進的單總線技術(1-WRIE),與單片機的接口變的非常簡潔,抗干擾能力強。關于DS18B20的詳細參數參看下面“硬件設計”中的器件介紹。 2.2 控制核心的選擇方案一:采用電壓比較電路作為控制部件。溫度傳感器采用熱敏電阻或熱電偶等,溫度信號轉為電信號并放大,由集成運放組成的比較電路判決控制風扇轉速,當高于或低于某值時將風扇切換到相應檔位。 方案二:采用單片機作為控制核心。以軟件編程的方法進行溫度判斷,并在端口輸出控制信號。 對于方案一,采用電壓比較電路具有電路簡單、易于實現,以及無需編寫軟件程序的特點,但控制方式過于單一,不能自由設置上下限動作溫度,無法滿足不同用戶以及不同環境下的多種動作溫度要求,故不在本系統中采用。 對于方案二,以單片機作為控制器,通過編寫程序不但能將傳感器感測到的溫度通過顯示電路顯示出來,而且用戶能通過鍵盤接口,自由設置上下限動作溫度值,滿足全方位的需求。并且通過程序判斷溫度具有極高的精準度,能精確把握環境溫度的微小變化。故本系統采用方案二。 2.3顯示電路方案一:采用五位共陽數碼管顯示溫度,動態掃描顯示方式。 方案二:采用液晶顯示屏LCD顯示溫度 對于方案一,該方案成本低廉,顯示溫度明確醒目,在夜間也能看見,功耗極低,顯示驅動程序的編寫也相對簡單,這種顯示方式得到廣泛應用。不足的地方是掃描顯示方式是使五個LED逐個點亮,因此會有閃爍,但是人眼的視覺暫留時間為20MS,當數碼管掃描周期小于這個時間時人眼將感覺不到閃爍,因此可以通過增大掃描頻率來消除閃爍感。 對于方案二,液晶體顯示屏具有顯示字符優美,不但能顯示數字還能顯示字符甚至圖形的優點,這是LED數碼管無法比擬的。但是液晶顯示模塊價格昂貴,驅動程序復雜,從簡單實用的原則考慮,本系統采用方案一。 2.4調速方式方案一:采用變壓器調節方式,運用電磁感應原理將220V電壓通過線圈降壓到不同的電壓,控制風扇電機接到不同電壓值的線圈上可控制電機的轉速,從而控制風扇風力大小。 方案二:采用晶閘管構成無級調速電路。 對于方案一,由于采用變壓器改變電壓調節,有風速級別限制,不能適應人性化要求。且在變壓過程中會有損耗發熱,效率不高,發熱有不安全因素。 對于方案二,以電位器控制晶閘管的導通角大小,可實現由最大風速到關閉的無級別調速,可將風力調節在關閉無風到最大風之間的任意風力,實現“自由風”。且在調速環節中基本無電力損耗。故本系統采用方案二。 2.5控制執行部件方案一:采用數模轉換芯片AD0832控制,由單片機根據當前溫度值送出相應數字量到AD0832,由AD0832產生模擬信號控制晶閘管的導通角,從而配合無級調速電路實現溫控時的自動無級風力調節。 方案二:采用繼電器,繼電器的接有控制晶閘管導通角的電阻的接入電路與否由單片機控制,根據當前溫度值在相應管腳送出高/低電平,決定某個繼電器的導通角控制電阻是否接入電路。(詳見4.2.4) 對于方案一,該方案能夠實現在風扇處于溫控狀態時也能無級調速,但是D/A轉換芯片價格較高,與其溫控狀態下無級調速功能相比性價比不高。 對于方案二,雖然在溫控狀態下只能實現弱/大風兩級調速,但采用繼電器價格便宜,控制可靠,且出于在溫控狀態時無級調速并不是特別需要的功能,綜合考慮采用方案二。
3 系統簡述本系統由集成溫度傳感器、單片機、LED數碼管、繼電器、雙向晶閘管、蜂鳴器及一些其他外圍器件組成。使用具有價廉易購的AT89S52單片機編程控制,通過修改程序可方便實現系統升級。系統的框圖結構如下:
圖1 系統框圖
4 硬件設計系統主要部件包括DS18B20溫度傳感器、AT89S52單片機、雙向晶閘管、五位LED數碼管和風扇。輔助元件包括繼電器、蜂鳴器、電阻、晶振、電源、按鍵和撥碼開關等。 4.1、本系統各器件簡介
4.1.1 DS18B20 單線數字溫度傳感器簡介DS18B20 單線數字溫度傳感器是Dallas 半導體公司開發的世界上第一片支持“一線總線”接口的溫度傳感器。它具有3 引腳TO-92 小體積封裝形式。溫度測量范圍為-55℃——+125℃,可編程為9 位——12 位A/D 轉換精度,測溫分辨率可達0.0625℃。被測溫度用符號擴展的16位數字量方式串行輸出。工作電壓支持3V——5.5V 的電壓范圍,既可在遠端引入,也可采用寄生電源方式產生。DS18B20 還支持“一線總線”接口,多個DS18B20可以并聯到3 根或2 根線上,CPU 只需一根端口線就能與諸多DS18B20 通信,占用微處理器的端口較少,可節省大量的引線和邏輯電路。它還有存儲用戶定義報警溫度等功能。 DS18B20 內部結構及管腳 DS18B20 內部結構如圖3所示,主要由4 部分組成:64 位ROM、溫度傳感器、非揮發的溫度報警觸發器TH 和TL、配置寄存器。其管腳排列如圖4所示,DQ 為數字信號端,GND 為電源地,VDD 為電源輸入端。
圖1 DS18B20 內部結構
圖2 DS18B20外形及管腳 4.1.2 AT89C52 單片機簡介AT89C52 是一種帶4K字節閃存可編程可擦除只讀存儲器(FPEROM)256B片內RAM的低電壓,高性能CMOS8 位微處理器。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業標準的MCS-51 指令集和輸出管腳相兼容。由于將多功能8 位CPU 和閃爍存儲器組合在單個芯片中,ATMEL 的AT89C52 是一種高效微控制器,為很多嵌入式控制系統提供了一種靈活性高且價廉的方案。 AT89C52單片機管腳 AT89C52單片機管腳如圖3所示。
圖3 AT89C52單片機管腳 各管腳功能: VCC:供電電壓。 GND:接地。 P0 口:P0 口為一個8 位漏級開路雙向I/O 口,每腳可吸收8TTL 門電流。當P1 口的管腳第一次寫1 時,被定義為高阻輸入。P0 能夠用于外部程序數據存儲器,它可以被定義為數據/地址的第八位。在FIASH 編程時,P0 口作為原碼輸入口,當FIASH 進行校驗時,P0輸出原碼,此時P0 外部必須被拉高。 P1 口:P1 口是一個內部提供上拉電阻的8 位雙向I/O 口,P1 口緩沖器能接收輸出4TTL門電流。P1 口管腳寫入1 后,被內部上拉為高,可用作輸入,P1 口被外部下拉為低電平時,將輸出電流,這是由于內部上拉的緣故。在FLASH 編程和校驗時,P1 口作為第八位地接 收。 P2 口:P2 口為一個內部上拉電阻的8 位雙向I/O 口,P2 口緩沖器可接收,輸出4 個TTL 門電流,當P2 口被寫“1”時,其管腳被內部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2 口的管腳被外部拉低,將輸出電流。這是由于內部上拉的緣故。P2 口當用于外部程序存儲器或16 位地址外部數據存儲器進行存取時,P2 口輸出地址的高八位。在給出地址“1”時,它利用內部上拉優勢,當對外部八位地址數據存儲器進行讀寫時,P2 口輸出其特殊功能寄存器的內容。P2 口在FLASH 編程和校驗時接收高八位地址信號和控制信號。 P3 口:P3 口管腳是8 個帶內部上拉電阻的雙向I/O 口,可接收輸出4 個TTL 門電流。當P3 口寫入“1”后,它們被內部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3 口將輸出電流(ILL)這是由于上拉的緣故。P3 口也可作為AT89C51 的一些特殊功能口。P3.0:RXD(串行輸入口);P3.1:TXD(串行輸出口);P3.2:/INT0(外部中斷0);P3.3:/INT1(外部中斷1);P3.4:T0(記時器0外部輸入);P3.5:T1(記時器1外部輸入);P3.6:/WR(外部數據存儲器寫選通);P3.7:/RD(外部數據存儲器讀選通)。 P3 口同時為閃爍編程和編程校驗接收一些控制信號。 RST:復位輸入。當振蕩器復位器件時,要保持RST 腳兩個機器周期的高電平時間。ALE/PROG:當訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節。在FLASH 編程期間,此引腳用于輸入編程脈沖。在平時,ALE 端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當用作外部數據存儲器時,將跳過一個ALE 脈沖。如想禁止ALE 的輸出可在SFR8EH 地址上置0。此時,ALE 只有在執行MOVX,MOVC 指令是ALE 才起作用。另外,該引腳被略微拉高。如果微處理器在外部執行狀態ALE 禁止,置位無效。/PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數據存儲器時,這兩次有效的/PSEN 信號將不出現。/EA/VPP:當/EA 保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內部程序存儲器。注意加密方式1 時,/EA 將內部鎖定為RESET;當/EA 端保持高電平時,此間內部程序存儲器。在FLASH 編程期間,此引腳也用于施加12V 編程電源(VPP)。 XTAL1:反向振蕩放大器的輸入及內部時鐘工作電路的輸入。 XTAL2:來自反向振蕩器的輸出。 4.1.3 八段LED 數碼管本系統使用五個七段LED數碼管作為溫度顯示,公共陽極。 4.2 各部分電路設計4.2.1 電源電路電源電路采用LM7805集成穩壓器作為穩壓器件,用典型接法,220V電源整流濾波后送入LM7805穩壓,在輸出端接一個470U和0.1U電容進一步濾除紋波,得到5V穩壓電源。電路如圖4所示。
圖4 電源 4.2.2 數碼管顯示電路顯示部分包括如下圖5: 5個八段(共陽)數碼管、PNP型三極管、電阻等。其連接方式如下:應用單片機P0口連接八段數碼管,用P2口的P2.3—P2.7五個端口作為數碼管的片選信號輸出端口,其中要用8550(PNP型)三極管做驅動。又因為P0口做I/O口時要加上拉電阻,所以我們給P0各位各加一個10K的電阻到電源。為了防止燒壞數碼管,所以給數碼管各段各加一個300歐姆的限流電阻。要顯示的數據通過P0口送給數碼管顯示,通過P2口的P2.7—P2.3五個端口分別對數碼管進行位選,事實上數碼管是間斷被點亮的,只是其間斷時間十分短,掃描周期在20ms以下,利用人眼視覺暫留,我們基本看不出它們的閃爍。
圖5 顯示電路 4.2.3 聲響、溫度采集、溫度設定以及復位電路電路如圖6所示,這一部分主要是由DS18B20,四個按鍵、一個電容一個三極管和一個蜂鳴器等構成。 聲響電路在每按下按鍵時會響一聲,當沒有把DS18B20接入到電路中時,單片機就會通過蜂鳴器發出報警聲音。 溫度采集電路主要是由DS18B20構成,它可以把采集的溫度數據轉化成二進制數,經過單片機處理后輸出送數碼管顯示。 溫度設定主要是通過按鍵S1、S2|、S3來設定的。按鍵S1、S2、S3分別接入單片機的 P1.4、P1.5、P1.6腳。 S3是設定鍵。用于對風速調節的上限和下限值TH、TL的設置。當按下S1時,可以加1, 長按可以快速加1,當按下S2 時,可以減1, 長按可以快速減1。
圖6 聲響、溫度采集、溫度設置及復位電路 4.2.4 溫控自動電路該電路為控制風速的人工控制與溫控兩種方式之溫控模式時的控制電路,當選擇為溫控時,單片機默認為弱風,當當前溫度低于所設的溫度下限TL時繼電器1吸合,關閉風扇,當當前溫度高于所設的溫度上限時繼電器2吸合,切換到強風檔。電路如圖7。
圖7 溫控自動電路 4.2.5無級調速電路此電路如圖8所示,包括:雙向可控硅,雙觸發二極管、滑動變阻器、電容。 該電路為無級調速電路,通過調節滑動變阻器的阻值來改變通過雙向二極管的電流,控制雙向晶閘管的導通角,從而控制電機的轉速?蓪崿F由最大風速到關閉的無級別調速,可將風力調節在關閉無風到最大風之間的任意風力,實現“自由風”。
圖8 無級調速電路 本系統的總電原理圖為:
圖9 總電原理圖 5 軟件設計程序實現的功能是上電復位時檢測溫度傳感器DS18B20是否存在或它工作是否正常,當不存在或工作不正常時從蜂鳴器發出報警聲,提示用戶檢查DS18B20,安裝或者更換。這部分功能由DS18B20復位與檢測子程序RESET完成。當檢測到傳感器工作正常后,發出溫度轉換命令及讀取溫度值命令,將從DS18B20讀取的二進制溫度值轉換為七段碼在LED上顯示出來。顯示功能由溫度顯示子程序DISP1子程序實現。 在溫控自動狀態,本系統可由用戶根據需要自由設置大小風檔的切換溫度值TH,TL,硬件設計上為通過3個按鍵,由按鍵掃描子程序KEYSCAN子程序提供軟件支持。按下一次設置鍵K3,進入低溫關風扇溫度值TL設置狀態,此時按下“加”鍵K1,TL值加一,長按K1不放可實現快速加1,按下“減”鍵K2,TL值減1,長按K2不放可實現快速減1。再按一次設置鍵K3,進入高溫切換大風檔溫度值TH設置狀態,此時按下“加”鍵K1,TH值加一,長按K1不放可實現快速加1,按下“減”鍵K2,TH值減1,長按K2不放可實現快速減1。下限動作溫度值TL和上限動作溫度值的設置范圍為0-120攝氏度,滿足一般使用要求。再按一次設置鍵K3退出上下限溫度設置狀態,恢復到當前溫度顯示狀態。在當前溫度顯示狀態,按下“加”鍵K1一次顯示當前TL設定值,再按一下顯示當前TH設定值,如此循環,按設置鍵K3退回到當前溫度顯示狀態。每次設定的TL、TH值均拷備到DS18B20的EEROM內,在單片機掉電后設定值不會丟失,在再次上電時從DS18B20的EEROM中讀回上次設定的上下限動作溫度值TH、TL,用戶 要實現根據當前溫度實時的控制風扇的狀態,需要在程序中不時的判斷當前溫度值是否超過設定的動作溫度值范圍,此部分功能由比較控制子程序TEMP_COMP來完成。由于單片機的工作頻率高達12MHz,在執行程序時不斷將當前溫度和設定動作溫度進行比較判斷,當超過設定溫度值范圍時及時的轉去執行超溫處理和欠溫處理子程序,控制繼電器的吸合、斷開狀態,從而控制風扇實時的切換到關閉、弱風、大風三個狀態。在沒有超過設定的TL、TH值時默認將風扇置為弱風檔。該比較控制程序又由溫度比較程序、超溫處理子程序和欠溫處理子程序構成。 顯示驅動程序以查七段碼取得各數碼管應顯數字,逐位掃描顯示。 主程序和個主要子程序的流程圖如附錄1所示。
6 安裝調試將本電路用硬件做出來,用編程器將KEIL軟件對源程序編譯生成的.HEX文件燒入AT89C52單片機,將單片機插入到目標板中,連好線。 將“控制模式”開關選擇在“溫控”,打開電源,風扇工作在弱風檔,數碼管正常顯示當前的溫度21.6攝氏度,第五位數碼管閃爍顯示“O”,表示當前溫度在TL和TH值之間,沒有欠溫或超溫。按“設置”鍵及“加”“減”鍵將下限動作溫度值TL設為20攝氏度,將上限動作溫度值TH設為23攝氏度,用書對著DS18B20扇動,顯示溫度逐漸降低,當達到19.9攝氏度時繼電器1動作,將風扇關閉,第五位數碼管閃爍顯示“L”,表示當前溫度低于TL值。然后用手握著DS18B20,顯示溫度逐步上升,當達到23.1攝氏度時繼電器2動作,將風扇切換到大風檔,第五位數碼管閃爍顯示“H”,表示當前溫度高于TH值。 將“控制模式”開關選擇在“人控”,這時數碼管依然按照上述規律顯示,但是不能對風扇進行控制。用手旋動無級調速旋鈕,可以將風扇從關閉一直連續調到最大風速,具有無級調節風扇風力的功能。 測試結果表明,本系統實現了預期功能。
參考文獻[1] 胡漢才.單片機原理及其接口技術.北京:清華大學出版社,2004 [2] 吳金戍,沈慶陽,郭庭吉.8051單片機實踐與應用.北京: 清華大學出版社,2002 [3] 求是科技.單片機典型模塊設計實例導航.北京:人民郵電出版社,2004 [4] 王化詳,張淑英.傳感器原理.天津:天津大學出版社,2002 [5] 榮俊昌.新型電風扇原理與維修.北京:高等教育出版社,2004 [6] 王港元.電工電子實踐指導.江西:江西科學技術出版社,2005
附錄1 程序流程圖主程序流程圖
圖11 主程序流程圖 按鍵掃描子程序流程圖
圖12 按鍵掃描子程序流程圖 設置上下限動作溫度值TH,TL子程序流程圖
圖13 設置上下限動作溫度值TH,TL子程序流程圖 實時溫度值與設定TH,TL值比較及超、欠溫處理子程序流程圖
圖14 實時溫度值與設定TH,TL值比較及超、欠溫處理子程序流程圖 溫度顯示子程序流程圖
圖15 溫度顯示子程序流程圖 DS18B20復位與檢測子程序
圖16 DS18B20復位與檢測子程序 附錄2 源程序
單片機源程序如下:
- ********************************************************************
- ;精準溫度顯示溫控自動風扇系統 *
- ;*說明:
- ;* 1、K3 → 進入設定低溫動作溫度值 TL 狀態:
- ;* 2、K3 → 進入設定高溫動作溫度值 TH 狀態:
- ;* 3、K3 → 返回
- ;* 4、設定過程: K1 →加鍵 (UP), K2 →減鍵 (DOWN),可快速調
- ; 5、實際溫度在TL和TH之間時,開啟弱風檔,低于TL時,關閉風扇;
- ;高于TH時,開啟大風檔。每次設置的TH和TL均被保存在DS18B20的ROM
- ;內,掉不需重新設置. *
- ;********************************************************************
- TIMER_L DATA 23H
- TIMER_H DATA 24H
- TIMER_COUN DATA 25H
-
- TEMPL DATA 26H
- TEMPH DATA 27H
- TEMP_TH DATA 28H
- TEMP_TL DATA 29H
-
- TEMPHC DATA 2AH
- TEMPLC DATA 2BH
- TEMP_ZH DATA 2CH
-
- BEEP EQU P3.7
- DATA_LINE EQU P3.3
- C1 EQU P3.4 ;C1控制口,接繼電器1
- C2 EQU P3.5 ;C2控制口,接繼電器2
-
- FLAG1 EQU 20H.0
- FLAG2 EQU 20H.1
-
- ;-------------------------------------------------
- K1 EQU P1.4
- K2 EQU P1.5
- K3 EQU P1.6
- ;=================================================
- ORG 0000H
- JMP MAIN
-
- ORG 000BH
- AJMP INT_T0
- ;--------------------------------------------------
- MAIN: MOV SP,#30H
- MOV TMOD,#01H ;T0,方式1
- MOV TIMER_L,#00H ;50ms定時值
- MOV TIMER_H,#4CH
- MOV TIMER_COUN,#00H ;中斷計數
- MOV IE,#82H ;EA=1,ET0=1
- LCALL READ_E2
- MOV 20H,#00H
- SETB BEEP
- SETB C1
- setb C2
- MOV 7FH,#0AH ;熄滅符
-
- CALL RESET ;復位與檢測DS18B20
- JNB FLAG1,MAIN1 ;FLAG1=0,DS18B20不存在
- JMP START
-
- MAIN1: CALL RESET
- JB FLAG1,START
- LCALL BEEP_BL ;DS18B20錯誤,報警
- JMP MAIN1
- START:
- MOV A,#0CCH ; 跳過ROM匹配
- CALL WRITE
- MOV A,#044H ; 發出溫度轉換命令
- CALL WRITE
-
- CALL RESET
- MOV A,#0CCH ; 跳過ROM匹配
- CALL WRITE
- MOV A,#0BEH ; 發出讀溫度命令
- CALL WRITE
-
- CALL READ ;讀溫度數據
- CALL CONVTEMP
- CALL DISPBCD
- CALL DISP1
- CALL SCANKEY
- LCALL TEMP_COMP
- JMP MAIN1
-
- ;=====================================================
- ;DS18B20 復位與檢測子程序
- ;FLAG1=1 OK, FLAG1=0 ERROR
- ;======================================================
- RESET:
- SETB DATA_LINE
- NOP
- CLR DATA_LINE
- MOV R0,#64H ;主機發出延時600微秒的復位低脈沖
- MOV R1,#03H
- RESET1: DJNZ R0,$
- MOV R0,#64H
- DJNZ R1,RESET1
- SETB DATA_LINE ;然后拉高數據線
- NOP
- MOV R0,#25H
- RESET2: JNB DATA_LINE,RESET3 ;等待DS18B20回應
- DJNZ R0,RESET2
- JMP RESET4 ; 延時
- RESET3: SETB FLAG1 ; 置標志位,表示DS1820存在
- JMP RESET5
- RESET4: CLR FLAG1 ; 清標志位,表示DS1820不存在
- JMP RESET6
- RESET5: MOV R0,#064H
- DJNZ R0,[ DISCUZ_CODE_2 ]nbsp; ; 時序要求延時一段時間
- RESET6: SETB DATA_LINE
- RET
- ;===========================================================
- ;
- ;===========================================================
- WRITE: MOV R2,#8 ;一共8位數據
- CLR CY
- WR1:
- CLR DATA_LINE ;開始寫入DS18B20總線要處于復位(低)狀態
- MOV R3,#09
- DJNZ R3,[ DISCUZ_CODE_2 ]nbsp; ;總線復位保持18微妙以上
- RRC A ;把一個字節DATA 分成8個BIT環移給C
- MOV DATA_LINE,C ;寫入一個BIT
- MOV R3,#23
- DJNZ R3,[ DISCUZ_CODE_2 ]nbsp; ;等待46微妙
- SETB DATA_LINE ;重新釋放總線
- NOP
- DJNZ R2,WR1 ;寫入下一個BIT
- SETB DATA_LINE
- RET
- ;============================================================
- ;從DS18B20中讀出溫度低位、高位和動作溫度設定值TH、TL
- ;存入26H、27H、28H、29H
- ;============================================================
- READ: MOV R4,#4 ; 將溫度高位和低位從DS18B20中讀出
- MOV R1,#26H ; 存入26H、27H、28H、29H
- RE00: MOV R2,#8
- RE01: CLR C
- SETB DATA_LINE
- NOP
- NOP
- CLR DATA_LINE ;讀前總線保持為低
- NOP
- NOP
- NOP
- SETB DATA_LINE ;開始讀總線釋放
- MOV R3,#09 ;延時18微妙
- DJNZ R3,$
- MOV C,DATA_LINE ;從DS18B20總線讀得一個BIT
- MOV R3,#23
- DJNZ R3,[ DISCUZ_CODE_2 ]nbsp; ;等待46微妙
- RRC A ;把讀得的位值環移給A
- DJNZ R2,RE01 ;讀下一個BIT
- MOV @R1,A
- INC R1
- DJNZ R4,RE00
- RET
- ;--------------------------------------------
- ;200ms對閃動標記取反一次
- ;--------------------------------------------
- INT_T0:
- PUSH ACC
- PUSH PSW
- MOV TL0,TIMER_L
- MOV TH0,TIMER_H
- INC TIMER_COUN
- MOV A,TIMER_COUN
- CJNE A,#04H,INT_END
- MOV TIMER_COUN,#00H
- CPL FLAG2
- INT_END:
- POP PSW
- POP ACC
- RETI
- ;==========================================================
- ;重新對 DS18B20 初始化
- ;將設定的動作溫度設定值寫入 DS18B20
- ;==========================================================
- RE_18B20:
- JB FLAG1,RE_18B20A
- RET
- RE_18B20A:
- CALL RESET
- MOV A,#0CCH ;跳過ROM匹配
- LCALL WRITE
- MOV A,#4EH ;寫暫存寄存器
- LCALL WRITE
- MOV A,TEMP_TH ;TH(動作上限溫度)
- LCALL WRITE
- MOV A,TEMP_TL ;TL(動作下限溫度)
- LCALL WRITE
- MOV A,#7FH ;12位精確度
- LCALL WRITE
- RET
-
- ;====================================================
- ;功能鍵掃描子程序
- ;====================================================
- SCANKEY:
- MOV P1,#0F0H
- JB K1,SCAN_K2
- CALL BEEP_BL
- SCAN_K1: CALL ALERT_TL
- CALL ALERT_PLAY
- JB K1,SCAN_K1
- CALL BEEP_BL
- SCAN_K11: CALL ALERT_TH
- CALL ALERT_PLAY
- JB K1,SCAN_K11
- CALL BEEP_BL
- SCAN_K2: JB K2,SCAN_K3
- CALL BEEP_BL
- SCAN_K3: JB K3,SCAN_END
- CALL BEEP_BL
- LCALL RESET_ALERT
- LCALL RE_18B20
- LCALL WRITE_E2
- SCAN_END: RET
-
- ;================================================
- ;設置動作溫度值TL,TH
- ;================================================
- RESET_ALERT:
- CALL ALERT_TL
- CALL ALERT_PLAY
- JNB K3,[ DISCUZ_CODE_2 ]nbsp; ;K3為位移鍵
- SETB TR0
- RESET_TL:
- CALL ALERT_PLAY
- JNB FLAG2,R_TL01
- mov 75H,7fh ;送入熄滅符
- mov 76H,7fh
- CALL ALERT_PLAY
- JMP R_TL02
- R_TL01: CALL ALERT_TL
- mov 75h,7Eh ;送設定值
- mov 76h,7Dh
- CALL ALERT_PLAY ;顯示設定值
- R_TL02: JNB K1,K011A
- JNB K2,K011B
- JNB K3,RESET_TH
- JMP RESET_TL
- K011A:
- INC TEMP_TL
- MOV A,TEMP_TL
- CJNE A,#120,K012A ;沒有到設定上限值,轉
- MOV TEMP_TL,#0
- K012A: CALL TL_DEL
- JMP RESET_TL
- K011B:
-
- MOV A,TEMP_TL
- CJNE A,#00H,K ;沒有到設定下限值,轉
-
- MOV TEMP_TL,#120
- K: DEC TEMP_TL
- K012B: CALL TL_DEL
- JMP RESET_TL
- ;-------------------------------------------------------
- RESET_TH:
- CALL BEEP_BL
- JNB K3,$
- RESET_TH1:
- CALL ALERT_PLAY
- JNB FLAG2,R_TH01
- mov 75H,7fh ;送入熄滅符
- mov 76H,7fh
- CALL ALERT_PLAY
- JMP R_TH02
- R_TH01: CALL ALERT_TH
- mov 75h,7Eh ;
- mov 76h,7Dh
- CALL ALERT_PLAY
- R_TH02: JNB K1,K021A
- JNB K2,K021B
- JNB K3,K002
- JMP RESET_TH1
- K021A:
- INC TEMP_TH
- MOV A,TEMP_TH
- CJNE A,#120,K022A ;沒有到設定上限值,轉
- MOV TEMP_TH,#0
- K022A: CALL TH_DEL
- JMP RESET_TH1
-
- K021B:
-
- MOV A,TEMP_TH
- CJNE A,#00H,K023B ;沒有到設定下限值,轉
-
- MOV TEMP_TH,#120
- K023B: DEC TEMP_TH
- K022B: CALL TH_DEL
- JMP RESET_TH1
-
- K002: CALL BEEP_BL
- CLR TR0 ;關閉中斷
- RET
- ;-----------------------------------------------------
- ;鍵延時子程序
- ;多次調用動作溫度設定值顯示程序來延時
- ;-----------------------------------------------------
- TL_DEL: ;動作溫度低值TL延時
- MOV R2,#0AH
- TL_DEL1: CALL ALERT_TL
- CALL ALERT_PLAY
- DJNZ R2,TL_DEL1
- RET
- TH_DEL: ;動作溫度高值TH延時
- MOV R2,#0AH
- TH_DEL1: CALL ALERT_TH
- CALL ALERT_PLAY
- DJNZ R2,TH_DEL1
- RET
- ;====================================================
- ;實時溫度值與動作溫度設定值 TH、TL 比較子程序
- ;當實際溫度大于 TH 的設定值時,顯示"H",繼電器1吸合,繼電器2吸合
- ;當實際溫度小于 TH 的設定值時,顯示“O”,繼電器1、2斷開,
- ;當實際溫度小于 TL 的設定值時,顯示“L”。繼電器1吸合,繼電器2斷開
- ;閃動顯示標記符 H、L、O
- ;====================================================
- TEMP_COMP:
- SETB TR0 ;啟動中斷
- MOV A,TEMP_TH
- SUBB A,#01H
- SUBB A,TEMP_ZH ;減數>被減數,則
- JC CHULI1 ;借位標志位C=1,轉
- MOV A,TEMP_ZH
- SUBB A,TEMP_TL ;減數>被減數,則
- JC CHULI2 ;借位標志位C=1,轉
- JNB FLAG2,T_COMP1 ;FLAG2=0,顯示標記字符
- MOV 74H,#0AH ;熄滅符
- LCALL DISP1
- JMP T_COMP2
- T_COMP1: MOV 74H,#00H
- LCALL DISP1 ;顯示"O"
- T_COMP2:
- SETB C1 ;繼電器1斷開
- SETB C2 ;繼電器2斷開
- CLR TR0 ;關閉中斷
- RET
- ;---------------------------------------------
- ;超溫處理
- ;---------------------------------------------
- CHULI1:
- CLR C1 ;繼電器1吸合
- CLR C2 ;繼電器2吸合
- JNB FLAG2,CHULI10
- MOV 74H,#0AH ;熄滅符
- LCALL DISP1
- JMP CHULI11
- CHULI10: MOV 74H,#0DH
- LCALL DISP1 ;顯示"H"
- CHULI11:
- CLR TR0 ;關閉中斷
- RET
- ;---------------------------------------------
- ;欠溫處理
- ;---------------------------------------------
- CHULI2: CLR C1 ;繼電器1吸合
- SETB C2 ;繼電器2斷開
- JNB FLAG2,CHULI20
- MOV 74H,#0AH ;熄滅符
- LCALL DISP1
- JMP CHULI21
- CHULI20: MOV 74H,#0CH
- LCALL DISP1 ;顯示"L"
- CHULI21: CLR TR0 ;關閉中斷
- RET
- ;------------------------------------------------------------
- ;把 DS18B20 暫存器里的動作溫度設定值拷貝到EEROM
- ;------------------------------------------------------------
- WRITE_E2:
- CALL RESET
- MOV A,#0CCH ;跳過ROM匹配
- LCALL WRITE
- MOV A,#48H ;動作溫度設定值拷貝到EEROM
- LCALL WRITE
- RET
- ;--------------------------------------------------------------
- ;把 DS18B20 EEROM 里的動作溫度設定值拷貝回暫存器
- ;-------------------------------------------------------------
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
完整文檔下載(word格式 可編輯):
文檔.doc
(433.5 KB, 下載次數: 40)
2021-3-24 02:21 上傳
點擊文件名下載附件
|