




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 基于單片機的水泥養護箱溫度檢測儀的設計 第 40 頁 共 40 頁單片機原理及應用 課程設計說明書設計題目:水泥養護箱溫度檢測儀的設計學 院:工學院專 業:電氣工程及其自動化設 計 者:馬曉晴學 號:14102038指導老師:吳敏 設計時間:2016年12月5日2016年12月25日單片機原理及應用課程設計任務書一、目的意義單片機原理及應用是高校工程專業的一門專業基礎課,該門課程具有很強的實踐性。通過課程的學習,使學生掌握基本概念、基本理論和基本技能,為今后從事相應的生產設計和科研工作打下一定的基礎。因此,除課程的理論教學和實驗教學外,單片機課程設計也是一個必要和重要的實踐教學環節。通過課程
2、設計,進一步培養學生理論聯系實際的能力,學會正確地分析工程實際問題,善于查閱參考文獻,準確地選擇相應的數據、參數,具備全面地解決實際問題的素質,同時課程設計也為今后的畢業設計打下基礎。二、設計時間、地點、班級時間:第16、17周(二周)地點: 三教433 、426 班級: 14電氣工程及其自動化第三組 三、設計內容(2)水泥養護箱溫度檢測儀的設計1、功能描述水泥養護箱是水泥企業必備的試驗設備,其性能的優劣直接影響水泥檢驗結果的準確性設計,單片機控制的水泥養護箱溫度檢測儀,溫度范圍2035。控制要求:(1)系統每隔2秒鐘采集一次溫度值,正常情況下,由LCD顯示器顯示;(2)當溫度達到35以上時,
3、紅色指示燈常亮,并伴有聲音報警,低于20時,黃色指示燈亮,也伴有聲音報警;溫度在2035之間時,綠色指示燈長亮;(可用三路LED燈代替)(3)可以通過串口將采集的溫度實時數據送PC機顯示;(4)設計溫度加熱電路;當溫度低于20時,加熱電路即開發板上繼電器可以打開開始工作。2、設計要求:(1)、分析系統功能,選擇單片機、溫度傳感器(熱電偶)和功能模塊;(2)、設計系統的硬件電路圖;(3)、編寫相應的軟件,完成控制系統的控制要求;(4)、上機調試、完善程序;3、軟件設計要求:可以用按鍵設置溫度目標值,150ms掃描按鍵一次,用定時器0;200ms啟動一次AD轉換,用定時器1;且AD轉換結果在AD中
4、斷服務程序中讀出,讀10次取平均值并在LCD12864上顯示,同時結果通過串口0發送到PC機。 目 錄摘要21 總體設計方案21.1設計原理及相關說明21.2總體設計框圖32 各芯片的設計及其調用42.1 STC90C516RD+單片機主控模塊42.2 溫度傳感器(熱電偶)52.2.1 熱電偶的結構及工作原理62.3 AD轉換模塊72.3.1 PCF8591的基本特性72.3.2 引腳及接口說明72.3.3 24C02的基本特性82.3.4 24C02的引腳及接口說明82.4 LCD 12864B 液晶顯示模塊(帶中文字庫)92.4.1 帶字庫的12864的基本特性92.4.2 引腳及接口說明
5、102.4.3 LCD12864液晶顯示模塊使用注意事項102.5 復位和晶振電路112.6 鍵盤接口與工作顯示模塊113 系統軟件設計123.1 按鍵掃描程序123.2 LCD12864顯示程序133.3 AD轉換程序143.4 串口發送程序153.5 報警及溫度調節程序164 調試174.1 調試步驟174.2 性能分析18附錄1 系統電路原理圖19附錄2 實物調試圖21附錄3 程序清單23附錄4 實物清單-38基于單片機的水泥養護箱溫度檢測儀設計作者:馬曉晴 指導老師:吳敏(安徽農業大學工學院 14級電氣工程及其自動化 )摘要:該設計是基于單片機的水泥養護箱溫度檢測系統,采用STC90C
6、516RD+單片機作為主控制器,具有溫度采集、AD轉換、按鍵設置、數據顯示及傳送和報警模塊。不僅能實現將溫度傳感器采集到的模擬電壓信號轉換為數字信號,在LCD12864彩屏上顯示,并將數據實時傳送到PC機的功能,而且還能設置溫度上限和溫度下限,當實際溫度超過溫度上限時,啟動報警裝置,當實際溫度低于溫度下限時自動啟動加熱裝置。具有實時、自動、智能等特點。 1 總體設計方案1.1設計原理及相關說明 單片機控制水泥養護箱的溫度保持在20-35之間,因此采用PCF8591AD轉換器將從溫度傳感器熱電偶上采集的模擬電壓信號轉換成數字信號,通過反復實驗找到電壓與溫度之間對應的函數關系,建立正確的數學模型,
7、然后通過LCD12864將實際測量溫度顯示出來,此時再通過程序設置溫度上限和溫度下限,當實際溫度超過溫度上限35時,實驗箱亮紅燈且發出警報聲,當實際溫度在正常溫度范圍內時,實驗箱亮綠燈,當實際溫度低于溫度下限20時,實驗箱亮黃燈,且發出警報聲,此時連接加熱電路的繼電器開始工作。另外該系統還可通過串口將實時溫度發送到PC機上,便于監控實驗箱溫度。圖1為該系統的主流程圖。 開始初始化按鍵掃描AD轉換 LCD12864顯示報警及溫度調節串口發送結束 圖1 程序主流程圖 由于實驗室熱電偶試驗臺溫度調試時溫度很難降到20以下,因此在程序編寫時將溫度下限調整為35,溫度上限調整為45;另外由于實驗室開發板
8、上沒有黃色和綠色的LED燈,因此在程序編寫時,將其改為三個不同位置的紅色LED燈,當實際溫度超過45時,第一個紅燈亮,當實際溫度在允許溫度范圍內時,第二個紅燈亮,當實際溫度低于35時,第三個紅燈亮;由于系統每隔2秒鐘采集一次溫度,并取10次平均值顯示在LCD12864上,因此顯示溫度值波動較大,但總的實際溫度變化趨勢與理想變化趨勢相符合。1.2總體設計框圖水泥養護箱溫度檢測系統設計框圖如圖2所示:圖2 水泥養護箱溫度檢測系統設計框圖2 各芯片的設計及其調用2.1 STC90C516RD+單片機主控模塊單片機的主控模塊如圖2,它以單片機STC90C516RD+為核心,STC90C516RD+系列
9、單片機是宏晶科技推出的新一代超強抗干擾/高速/低功耗單片機,指令代碼完全兼容傳統8051單片機,12時鐘/機器周期和6時鐘/機器周期可任意選擇,內部集成MAX810專用復位電路,時鐘頻率在12MHZ以下時,復位腳可直接接地。其主要性能特點如下:增強型6時鐘/機器周期,12時鐘/機器周期8051CPU;工作電壓:5.5V-3.8V(5V單片機)/3.8V-2.4V(3單片機);工作頻率范圍:0-40MHZ,相當于普通8051的0-80MHZ;用戶應用程序空間4K/6K/7K/8K/10K/12K/13K/16K/32K/40K/48K/56K/61K/字節;片上集成 1280字節/512/256
10、字節 RAM;通用I/O口(35/39 個),復位后為: P1/P2/P3/P4 是準雙向口/ 弱上拉(普通8051 傳統I/O 口)P0口是開漏輸出,作為總線擴展用時,不用加上拉電阻,作為I/O 口用時,需加上拉電阻;ISP(在系統可編程)/IAP(在應用可編程),無需專用編程器 / 仿真器可通過串口(P3.0/P3.1)直接下載用戶程序,8K 程序3 - 5 秒即可完成一片;EEPROM 功能;看門狗;內部集成MAX810專用復位電路,外部晶體12M以下時,可省外部復位電路,復位腳可直接接地;共3個16位定時器/計數器,其中定時器0還可以當成2個8位定時器使用;外部中斷4路,下降沿中斷或低
11、電平觸發中斷,Power Down模式可由外部中斷低電平觸發中斷方式喚醒;通用異步串行口(UART),還可用定時器軟件實現多個UART;工作溫度范圍:0-75/-40-+85;封裝:LQFP-44,PDIP-40,PLCC-44。由圖3可知,單片機的18和19管腳接時鐘電路,19管腳接外部晶振和微調電容的一端,在片內它是振蕩器倒相放大器的輸入,18管腳接外部晶振和微調電容的另一端,在片內它是振蕩器倒相放大器的輸出,9引腳是復位輸入端,接上電容、電阻及開關后構成上電復位電路。圖3 主控制器 STC90C516RD+模塊2.2 溫度傳感器(熱電偶)溫度傳感器是指能感受溫度并轉換成可用輸出信號的傳感
12、器。按測量方式可分為接觸式和非接觸式,按照傳感器材料及電子元件特性可分為熱電阻和熱電偶兩大類。本文介紹是熱電偶傳感器,它能直接測量溫度,并把溫度信號轉換成熱電動勢信號,通過電氣儀表(二次儀表)轉換成被測介質的溫度。 圖3 熱電偶實物圖2.2.1 熱電偶的結構及工作原理熱電偶工作原理是基于賽貝克效應,即兩種不同成分的導體兩端連接成回路,如兩連接端溫度不同,則在回路內產生熱電流的物理現象。該系統采用的是K/E復合型熱電偶,該熱電偶的特點是:適宜在氧化性及惰性氣體中連續使用,其熱電勢與溫度的關系近似線性,價格便宜;1000以下耐氧化性良好;構造簡單,使用方便,測量范圍廣,測量精度高。 圖4 熱電偶傳
13、感器的結構圖 當熱電偶采集到熱電勢后,這個熱電勢的電壓值通常都會比較小,為了方便測量,需將熱電偶連接上放大電路。實驗室的溫度傳感器實驗模塊內置了放大電路,將兩個溫度傳感器實驗模塊連接在一起,構成兩級電壓放大電路,這樣方便測出電壓信號。圖5所示為傳感器與實驗電路連接。 圖5 傳感器與實驗電路連接圖2.3 AD轉換模塊 圖5 PCF8591 AD轉換模塊如圖5所示,本設計采用PCF8951 AD轉換與24C02 EEPROM模塊實現溫度的采集與轉換,PCF8951是一個單片集成、單獨供電、低功耗、8-bit CMOS數據獲取器件。它具有4個模擬輸入、1個模擬輸出和1個串行I2C總線接口。24C02
14、是一個1K/2K/4K/8K/16K位串行COMS EEPROM,內部含有128/256/512/1024/2048 個8 位字節,CATALYST 公司的先進CMOS 技術實質上減少了器件的功耗。24C02有一個16 字節頁寫緩沖器,該器件通過I2C 總線接口進行操作有一個專門的寫保護功能。2.3.1 PCF8591的基本特性: (1)PCF8591的操作電壓范圍2.5V-6V; (2)低待機電流; (3)通過I2C總線串行輸入/輸出; (4)PCF8591的采樣率由I2C總線速率決定; (5)8-bit逐次逼近A/D轉換器; (6)PCF8591內置跟蹤保持電路; (7)PCF8591模擬
15、電壓范圍從Vss到VDD; (8)4個模擬輸入可編程為單端型或差分輸入。2.3.2 引腳及接口說明: PCF8591P的引腳圖如圖6所示。 圖6 PCF8591P引腳圖 接口說明:AIN0-AIN3:模擬信號輸入端; A0-A3:引腳地址端; VDD,VSS:電源端,(2.5V-6V); SDA,SCL:I2C總線的數據線、時鐘線; OSC:外部時鐘輸入端,內部時鐘輸出端; EXT:內部、外部時鐘選擇線,使用內部時鐘時EXT接地; AGND:模擬信號地。2.3.3 24C02的基本特性: (1)與400KHz I2C總線兼容 ; (2)1.8V-6.0V工作電壓范圍; (3)低功耗COMS技術
16、; (4)寫保護功能:當WP為高電平時進入寫保護狀態; (5)頁寫緩沖器; (6)自定時擦寫周期; (7)溫度范圍:商業級,工業級和汽車級;2.3.4 24C02的引腳及接口說明: 24C02的引腳圖及接口說明如圖7所示。 圖7 24C02引腳及接口說明圖2.4 LCD 12864B 液晶顯示模塊(帶中文字庫)如圖7所示,本設計采用LCD 12864B 液晶顯示模塊,它屬于點陣型液晶,可直接調用CGRAM中的字庫,即DB定義即可,而不帶中文字庫的LCD12864則需要采用取模軟件取模,相比較之下前者更加方便使用。2.4.1 帶字庫的12864的基本特性: (1)內置漢字字庫,提供8192個16
17、×16點陣漢字(12864內部有一個CGROM,內容掉電可以存儲,所以漢字字庫會存放在里面。滿屏最多顯示4*8=32個漢字)。(2)內置 128個16×8點陣ASCII字符(12864一次最多可以顯示4*16=64個ASCII字符)。(3)通訊方式:串行、并口可選 (數據寫入和讀出可以是以串行的方式,也可以是以并行的方式。) 圖8 LCD12864液晶顯示模塊2.4.2 引腳及接口說明 圖9 12864接口說明圖10 12864引腳說明2.4.3 LCD12864液晶顯示模塊使用注意事項: (1)欲在某一個位置顯示中文字符時,應先設定顯示字符位置,即先設定顯示地址,再寫入中
18、文字符編碼;(2)顯示ASCII字符過程與顯示中文字符過程相同。不過在顯示連續字符時,只須設定一次顯示地址,由模塊自動對地址加1指向下一個字符位置,否則,顯示的字符中將會有一個空ASCII字符位置;(3)當字符編碼為2字節時,應先寫入高位字節,再寫入低位字節;(4)當寫入為數字時,應在數字后面加上0x30,將其轉換成為基本指令;(5)模塊在接收指令前,向處理器必須先確認模塊內部處于非忙狀態,即讀取BF標志時BF需為“0”,方可接受新的指令。如果在送出一個指令前不檢查BF標志,則在前一個指令和這個指令中間必須延遲一段較長的時間,即等待前一個指令確定執行完成。指令執行的時間請參考指令表中的指令執行
19、時間說明;(6)“RE”為基本指令集與擴充指令集的選擇控制位。當變更“RE”后,以后的指令集將維持在最后的狀態,除非再次變更“RE”位,否則使用相同指令集時,無需每次均重設“RE”位;2.5 復位和晶振電路 單片機的晶振電路通由一個晶振和兩個電容組成,晶振頻率的大小決定了單片機系統運行速度的快慢。每條指令都由一個或幾個機器周期組成,1個機器周期等于12個晶振周期。復位是單片機的初始化操作,單片機在啟動時都需要復位,以使CPU及系統各部件處于確定的初始狀態,并從初態開始工作。51系列單片機的復位要求是RST上加高電平時間大于2個機器周期。 圖11 晶振電路與復位電路模塊2.6 鍵盤接口與工作顯示
20、模塊鍵盤接口電路如圖12,本次設計中,按鍵有3個,升溫鍵,降溫鍵和確定鍵,每個按鍵各占用一根I/O線,各按鍵相互獨立,彼此的工作狀態互不影響,STC單片機自帶上拉電阻因此無需外接上拉電阻。當進行目標溫度設定時,由升溫鍵和降溫鍵控制目標溫度數值的加減,當按下確定鍵時,LCD顯示測量電壓和測量溫度,同時啟動串口向PC機發送數據。當測量溫度大于溫度上限45攝氏度時,LED0亮,當溫度小于溫度下限35攝氏度時,LED2亮,當溫度處于允許溫度范圍內時,LED1亮。其工作顯示電路如圖13所示。 圖12 鍵盤接口電路 圖13 工作狀態顯示電路圖3 系統軟件設計3.1 按鍵掃描程序 本系統對目標溫度的設定采用
21、三個按鍵設定,分別定義為加按鍵,減按鍵和確定按鍵,采用定時器0,150ms掃描按鍵一次。在設定目標溫度的過程中,溫度值設定為浮點型,加按鍵按下則溫度值個位加一,滿十進位,減按鍵按下則溫度值個位減一,滿十借位,十分位和百分位始終保持0,即設定目標溫度值始終為整數,溫度設定完成后,按下確定鍵,此時開始顯示實際測量溫度值和測量電壓值,同時啟動串口將實際測量的溫度值發送到PC機。按鍵掃描程序流程圖如下圖14所示:是是否否開始判斷升溫鍵 是否按下判斷降溫鍵 是否按下判斷確定鍵 是否按下等待按鍵個位溫度加1個位溫度減1啟動溫度和 電壓測量啟動串口發送是 圖14 按鍵掃描程序流程圖 3.2 LCD12864
22、顯示程序LCD12864為帶中文字庫的彩屏,因此要想在LCD上顯示中文字符,則首先要定義一個code數組,將要顯示的內容存放到數組里,在顯示中文字符時要先用LCD12864_SetWindow()函數設定顯示字符的位置坐標,本系統中程序設定中文字符為第一行顯示“設定溫度:”,第三行顯示“測量溫度:”,第四行顯示“測量電壓:”,而數字變量皆為四位數字,并設定在兩位數字之間添加小數點以此來顯示浮點型小數,因此本設計在LCD顯示之前先定義了片外可讀寫數組xdata,以便于將測量數據和按鍵調節數據存放其中,并在數組顯示完成一次后清零,以避免出現亂碼顯示的現象。 NY開始LCD12864初始化置顯示行初
23、值,顯示指針指向第一行待顯示數據送入緩沖區預設數據顯示在指定區域中調整指針,指向LCD下一行顯示結束否?結束 圖16 LCD12864 顯示程序流程圖3.3 AD轉換程序 將熱電偶采集到的電壓信號接到PCF8591P的AIN1口,啟動I2C總線,這時程序中的接收函數開始接受數據,并設置一個變量i,使其循環十次,每次測得的溫度值都與前一個相加得到sum,再將sum/10的值賦值給變量temp,即讀10次取平均值,保證數據的穩定性,減小誤差。為了使數據更加準確,通過反復實驗測量,得到熱電偶檢測到的電壓值與溫度顯示值存在的單值對應關系,轉換過后顯示在LCD12864上,其AD轉換流程圖如下所示。 開
24、始AD初始化啟動I2C總線發送字節數據AIN1口讀取數據啟動AD轉換,讀10次取平均值結束If(flagstart=1)是否 圖17 AD轉換程序流程圖3.4 串口發送程序 當設定完目標溫度按下確定鍵時,開始測量標志位flagstart置1,此時啟動串口發送,將接收到是數據放入到寄存器中,串口顯示按照從低位到高位顯示的順序,因此先發送低位,串口發送程序流程圖如下所示:開始if((flagstart=1)啟動串口發送將接收到的數據放入到寄存器等待發送完成串口初始化 圖18 串口發送程序流程圖3.5 報警及溫度調節程序 將繼電器連接到單片機P3.3口,將蜂鳴器連接到單片機P3.5口,將LED0,L
25、ED1和LED2分別接在單片機P3.0,P3.7和P3.6口,當測量溫度小于溫度下限35攝氏度時,P3.3口置0,繼電器開始工作,啟動加熱電路,P3.5口不斷取反,蜂鳴器發出蜂鳴聲,此時LED1常亮,當測量溫度大于溫度上限45攝氏度時,蜂鳴器發出蜂鳴聲,此時LED0常亮,當測量溫度在35攝氏度到45攝氏度之間時,LED2常亮。其程序流程圖如下圖所示: 開始判斷溫度是否正常Y指示燈2常亮N判斷溫度是否高于溫度范圍Y指示燈0常亮,且蜂鳴器報警N指示燈LED1常亮,蜂鳴器報警,繼電器打開結束 圖19 報警及溫度調節程序流程圖4 調試4.1 調試步驟(1)題目拿到手后,對 LCD12864 的用法及功
26、能并不怎么熟悉,因為在學習單片機課程的過程中,大部分都是采用數碼管或者LCD1602來做顯示模塊,很少涉及到LCD12864,只知道在顯示之前要先設定顯示的位置。(2)在學習了單片機例程中的“LCD12864顯示漢字”這個例程以及搜集了大量資料之后,開始自己在例程的基礎上改寫,但是由于例程采用的是不帶字庫的LCD,而實驗室提供的為帶中文字庫的LCD彩屏,兩種LCD的引腳分布以及功能不太一樣,不帶字庫的分為兩個片選區,CS1和CS2,要采用取模軟件將要顯示的字符先寫入數組中,而帶字庫的則只需調用即可,因此在初次調試的過程中,因為沒有弄清楚帶字庫與不帶字庫顯示的原理,所以經常黑屏或者亂碼。(3)在
27、后期彩屏調試的過程中,發現靜態的數組即“設定溫度”“測量溫度”等這些數組可以正常顯示,而動態的變量則總是出現亂碼,例如在按鍵設置目標溫度時,加按鍵或減按鍵按下之后屏幕開始出現亂碼,經過老師的指導,終于找到了問題的關鍵所在,我在設定用于存放數據的數組時,設定為code型,即只讀型,因此只能顯示靜態的數組,于是我將存放按鍵設定目標溫度以及測量溫度和測量電壓這些變量的數組設置為xdata型,并在顯示函數中,在其后加上0x30,將數字轉換成為基本指令,數組顯示完成一次后清零,避免了再次出現亂碼的現象。(4)在顯示測量溫度時,數據的小數位及個位變化速度太快,以至于出現數據顯示模糊的現象,因此我在AD讀取
28、數據的函數中加入了延時函數,delay(900),發現顯示數據明顯清晰和穩定,但是由于延時太久,再加上單片機開發板自身的硬件的問題,導致蜂鳴器不夠響,只能湊近才能聽到“嘟嘟”的響聲。(5)在編寫程序時,題目要求溫度范圍為20-35,低于20時亮黃燈,高于35時亮紅燈,正常溫度范圍內時亮綠燈,但是由于實驗室開著空調,試驗臺的熱電偶在溫度升上去之后再降到20以下的速度非常慢,因此為了便于測試我將允許溫度的范圍修改為35-45,另外由于實驗室提供的單片機開發板上沒有黃色和綠色的LED燈,因此我將不同顏色的燈改成不同位置的燈來表示實驗箱的工作狀態。(6)在矯正電壓與溫度的單值對應關系時,發現LCD顯示
29、的測量溫度總比試驗臺顯示的溫度稍微之后,在調節了試驗臺的放大增益后,發現總的溫度變化的趨勢是一致的,但是LCD顯示的溫度值上下波動較大,仔細思考過后發現,是由于按照題目要求顯示的溫度是AD讀取10次的平均值,因此LCD顯示的溫度較試驗臺顯示的溫度波動較大,于是我將10次平均值修改為直接讀取顯示,對比調試后發現不取平均值比取平均值波動要小,但是按照題目要求,我將程序依舊寫為10次取平均值。(7)在串口發送數據到PC機的過程中,起初調試時,串口助手中的文本格式總是出現亂碼,請教同學后發現,在發送文本到PC機上時,在程序中要寫成漢字相對應的ASCII代碼,并按照從低位到高位的順序傳送,在PC機上的文
30、本格式下才能顯示正確的漢字。(8)另外在編寫AD轉換模塊的程序時,題目要求采用定時器1每200ms啟動一次AD轉換,但是調試過程中發現如果對AD采用中斷溢出則屏幕就會出現亂碼,不能正常顯示,由于課程設計時間有限,于是放棄了這一環節的設置,并將定時器1應用到串口上。(9)在這次的單片機課程設計中,我學會了LCD12864,AD轉換以及串口的使用,并深刻意識到了理論與實踐相結合的重要性,也從中體會到了許多樂趣,日后我將在課余時間多學習單片機的相關知識,來提高自己的專業技能。 4.2 性能分析 將程序燒入單片機后,開機顯示“設定溫度:00.00”,“測量溫度:”和“測量電壓:”,按下K1(升溫鍵),
31、設定溫度個位加1,將其設定為“設定溫度:40.00”,按下K3(確定鍵),開始顯示測量溫度和測量電壓,即LCD12864界面變為“設定溫度:40.00”,“測量溫度:xx.xx”,“測量電壓:xx.xx”,此時打開PC機上的串口調試助手,將波特率設置為4800,打開文本格式,即可看到實時測量的溫度。當測量溫度小于35時,單片機開發板上右邊最下面的LED燈亮,繼電器開始工作加熱電路開啟,且蜂鳴器開始發出蜂鳴聲;當測量溫度大于35小于45時,開發板上右邊中間的LED燈亮,繼電器和蜂鳴器均停止工作;當測量溫度大于45時,開發板上右邊最上面的LED燈亮,蜂鳴器發出蜂鳴聲。LCD顯示10次平均值的結果,
32、因此顯示溫度上下波動較大,但是總體變化趨勢與實驗臺保持一致,蜂鳴器聲音較小,且PC機上顯示的漢字“攝氏度”偶爾會出現亂碼,所以本設計仍有許多需要改進的地方,請老師多多指教!附錄1 系統電路原理圖附錄2 實物調試圖 開機顯示:測量溫度高于45時:測量溫度在35到45之間時:測量溫度低于35時:附錄3 程序清單主程序:#include<reg51.h>#include"lcd12864.h"#include <I2C.H>#include"temp.h"unsigned char code CharCode="設定溫度: &
33、quot; /第一行顯示“設定溫度”unsigned char xdata setdata=0,0,0,0,0,0; /用于存放設定溫度值 按鍵可調unsigned char code tempmeasure="測量溫度: " /第三行顯示“測量溫度”第三行unsigned char xdata datas=0,0,0,0,0,0; /用于存放測量的溫度值unsigned char code voltemeasure="測量電壓: " /第四行顯示“測量電壓“第四行unsigned char xdata volt=0,0,0,0,0,0; /用于存放測量
34、的電壓值sbit key_up=P10; /升溫鍵 K1sbit key_dowm=P11; /降溫鍵 K2 sbit confir=P12; /確定鍵 K3 sbit beep=P35; /蜂鳴器 sbit led0=P30; /亮燈顯示 溫度過高時常亮sbit led1=P37; /溫度過低時常亮sbit led2=P36; /溫度正常時常亮sbit jidianqi=P33; /繼電器uchar count=0; /設置定時器變量uchar flagstart; /確定按鍵按下標志位int set; /用于設定溫度用 數組直接加減不行uchar CNCHAR6 = "攝氏度&q
35、uot;void LcdDisplay(int); / 函數申明void UsartConfiguration();void tx_init();*void main()unsigned char i,j,y; tx_init(); /定時器初始化 UsartConfiguration(); /初始化串口LCD12864_Init(); /12864初始化 while(1)LCD12864_SetWindow(0,0); /頂行顯示while(CharCodei!='0')LCD12864_WriteData(CharCodei); /顯示漢字i+;LCD12864_SetWi
36、ndow(2,0); /第三行顯示while(tempmeasurej!='0')LCD12864_WriteData(tempmeasurej); /顯示漢字j+;LCD12864_SetWindow(3,0); /第四行顯示while(voltemeasurey!='0')LCD12864_WriteData(voltemeasurey); /顯示漢字 電壓y+; while(1) LcdDisplay(ReadTemp(); /12864顯示溫度 *void keyset(void) /按鍵設定溫度值 key_up=1; if(!key_up) /如果溫度
37、加的按鍵按下 delay(100); /延時100MS用于消抖if(!key_up)set+; /個位溫度值加1 if(!key_dowm) /如果溫度加的按鍵按下 delay(100); /延時10MS用于消抖if(!key_dowm) /減法到0時,出現錯誤,需要逐級判斷才行 set-; /個位溫度值減1 if(!confir) /如果啟動測量按鍵按下 delay(100); /延時消抖 if(!confir) flagstart=1; /開始測量標志位 *void LcdDisplay(int temp) /lcd顯示 此處temp類型應該與ReaTemp返回值類型一致,否則可能會出錯i
38、nt voltes; unsigned char i,t,s,a; /這些變量都是用于循環顯示,用完后要清零 float tp,sets; /用于整型變量和浮點型變量轉換 keyset(); /按鍵先掃描一次 /顯示設定溫度sets=set;set=1.00*sets;setdata4 = 0+0x30; /百分位 直接顯示0setdata3 = 0+0x30; /十分位 直接顯示0setdata2=0x2e ; /加一個小數點setdata0 = (set % 100 / 10)+0x30; /十位setdata1 = (set % 10)+0x30; /個位 第一個動的LCD12864_S
39、etWindow(0,5); /第一行第六位顯示 設定溫度數據while(setdataa!='0') /直到顯示完數組內容LCD12864_WriteData(setdataa); /顯示數據a+;a=0; /a到3時候,清零,后面持續循環使用if(flagstart)if(temp>0.0) /當溫度值為負數 tp=temp; /將int型temp轉化為float型tp voltes=0.95*tp; /電壓,便于找電壓與溫度關系式 temp=tp*10.00; /將溫度對應的電壓放大10倍進行采集 ,可以提高靈敏度 temp=voltes*2.15+7.00; /
40、電壓與溫度關系 datas0 = (temp % 10000 / 1000)+0x30; /十位 測量溫度datas1 = (temp % 1000 / 100)+0x30; /個位datas2=0x2e ; /加一個小數點datas3 = (temp % 100 / 10)+0x30; /十分位datas4 = (temp % 10)+0x30; /百分位 *顯示測量溫度*LCD12864_SetWindow(2,5); /第三行第六位顯示while(datast!='0') /直到顯示完數組內容LCD12864_WriteData(datast); /顯示數據t+;t=0;
41、 /t到3時候,清零,后面持續循環使用*報警及調節溫度程序*if(temp>4500) /溫度高于45時,led0燈常亮,蜂鳴器響led0=0;beep=beep; else led0=1;if(temp<3500) /溫度低于35時,led1常亮,蜂鳴器響,繼電器開始工作led1=0;delay(50);beep=beep;jidianqi=0;else jidianqi=1,led1=1;if(temp>3500&&temp<4500) /溫度在35和45之間,led2常亮led2=0;delay(50);else led2=1;*顯示測量電壓*vo
42、lt0 = (voltes % 10000 / 1000)+0x30; /十位volt1 = (voltes % 1000 / 100)+0x30; /個位volt2=0x2e ; /加一個小數點volt3 = (voltes % 100 / 10)+0x30; /十分位volt4 = (voltes % 10)+0x30; /百分位LCD12864_SetWindow(3,5); /第四行第六位顯示 測量電壓顯示while(volts!='0') /直到顯示完數組內容LCD12864_WriteData(volts); /顯示數據s+;s=0; /s到3時候,清零,后面持續循
43、環使用 *串口顯示*SBUF = '0'+(temp % 10000 / 1000); /將接收到的數據放入到發送寄存器while (!TI); /等待發送數據完成TI = 0;SBUF = '0'+(temp % 1000 / 100); /將接收到的數據放入到發送寄存器while (!TI); /等待發送數據完成TI = 0;SBUF = '.' /將接收到的數據放入到發送寄存器while (!TI);/等待發送數據完成TI = 0;SBUF = '0'+(temp % 100 / 10); /將接收到的數據放入到發送寄存器w
44、hile (!TI); /等待發送數據完成TI = 0;SBUF = '0'+(temp % 10); /將接收到的數據放入到發送寄存器while (!TI); /等待發送數據完成TI = 0;for(i=0; i<6; i+) /在串口中顯示 攝氏度 漢字 SBUF = CNCHARi; /將接收到的數據放入到發送寄存器while (!TI); /等待發送數據完成 TI = 0; *void UsartConfiguration() /設置串口SCON=0X50;/設置為工作方式1 TMOD=0X22;/設置計數器工作方式2 PCON=0X80;/波特率加倍TH1=0XF3;/計數器初始值設置,注意波特率是4800的TL1=0XF3;TR1=1;/打開計數器*void tx_init() /定時器初始化TMOD=0x01; /采用定時器0方式1EA=1;ET0=1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論