基于52單片機(jī)溫濕度傳感器課程設(shè)計(jì)報(bào)告含代碼_第1頁
基于52單片機(jī)溫濕度傳感器課程設(shè)計(jì)報(bào)告含代碼_第2頁
基于52單片機(jī)溫濕度傳感器課程設(shè)計(jì)報(bào)告含代碼_第3頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、.基于52單片機(jī)的溫濕度檢測儀的設(shè)計(jì)摘要利用Atmel52系列單片機(jī)和數(shù)字溫濕度傳感器AM2301設(shè)計(jì)并制作一個(gè)簡單的溫濕度檢測儀。以單片機(jī)為核心,外圍電路包括電源、時(shí)鐘芯片、12864LCD、Max232芯片、AM2301傳感器以及蜂鳴器報(bào)警電路等。其中AM2301傳感器是含有已校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度復(fù)合傳感器,它包括一個(gè)電阻式感濕元件和一個(gè)NTC測溫元件。LCD顯示包括萬年歷、溫濕度以及報(bào)警設(shè)置,同時(shí)通過內(nèi)部中斷方式把溫濕度的實(shí)時(shí)值通過VB編寫的上位機(jī)程序接收并顯示。一、 設(shè)計(jì)功能(1) LCD分兩個(gè)界面顯示:主界面和設(shè)置報(bào)警界面;(2) 主界面顯示萬年歷和溫濕度實(shí)時(shí)值;(3) 設(shè)置報(bào)警

2、界面顯示溫濕度上下限及開/關(guān)報(bào)警;(4) 當(dāng)溫濕度低于設(shè)置的下限或高于設(shè)置的上限并且開報(bào)警后,蜂鳴器和led燈配合報(bào)警;(5) 有按鍵設(shè)置功能,以及關(guān)報(bào)警和回到主界面顯示功能;(6) 能通過Max芯片和計(jì)算機(jī)通信,把溫濕度數(shù)據(jù)顯示在上位機(jī)界面上,實(shí)現(xiàn)遠(yuǎn)程監(jiān)控。二、 設(shè)計(jì)所需元件清單(1)9V電源(2)杜邦線若干(3)12864LCD1塊(4)80X52單片機(jī)1片(5)排阻1排,電阻若干(6)AM2301傳感器1個(gè)(7)32768Hz晶振1個(gè),12MHz晶振1個(gè)(8)蜂鳴器1個(gè)(9)LM2940穩(wěn)壓元件1個(gè)(10)DS1302時(shí)鐘芯片1片(11)船型開關(guān)1個(gè),觸點(diǎn)開關(guān)若干(12)30pF電容若干

3、,22uF電容若干(13)LED燈2個(gè),三極管,紐扣電池三、具體設(shè)計(jì)根據(jù)所要實(shí)現(xiàn)的功能,將系統(tǒng)模塊化設(shè)計(jì),總體模塊結(jié)構(gòu)圖如下圖所示:以下就分別就各模塊功能實(shí)現(xiàn)進(jìn)行設(shè)計(jì)。1. 復(fù)位電路這部分是單片機(jī)一般都需要的,當(dāng)運(yùn)行出錯(cuò)或者死機(jī)時(shí),利用復(fù)位按鍵能重新啟動(dòng)系統(tǒng)。RST2. 時(shí)鐘電路如上圖所示。其中時(shí)鐘芯片DS1302的各引腳功能如下:Vcc1:主電源;Vcc2:備份電源。當(dāng)Vcc2>Vcc1+0.2V時(shí),由Vcc2向DS1302供電,當(dāng)Vcc2< Vcc1時(shí),由Vcc1向DS1302供電。SCLK:串行時(shí)鐘,輸入,控制數(shù)據(jù)的輸入與輸出;I/O:三線接口時(shí)的雙向數(shù)據(jù)線;RST為復(fù)位引腳

4、,在讀、寫數(shù)據(jù)期間,必須為高,X1 X2為32867Hz晶振管腳,為芯片提供時(shí)鐘脈沖。3. 報(bào)警電路各I/O口在上電時(shí)為高電平,LED燈和蜂鳴器處于熄滅和不響狀態(tài)。其中LED燈通過一個(gè)1K的電阻限流,防止點(diǎn)亮?xí)r電流過大被燒壞。蜂鳴器要用NPN型三極管驅(qū)動(dòng),當(dāng)P2.5口輸出高電平時(shí),Q1飽和導(dǎo)通,蜂鳴器獲得工作電流發(fā)出響聲。4. 鍵盤掃描電路這里用了5個(gè)按鍵。其中按鍵1是調(diào)時(shí)按鍵,根據(jù)按的次數(shù)依次進(jìn)入年、月、日、時(shí)、分、秒、星期調(diào)整,再按一次則退出。按鍵2和3分別是加操作和減操作。按鍵4是設(shè)置溫濕度上下限值及報(bào)警開關(guān);按鍵5是關(guān)報(bào)警。5. 12864LCD顯示電路ST7920系列12864是帶中

5、文字庫的液晶顯示器,它可以顯示4行,每行16個(gè)字節(jié),各行的地址依次為0x800x87、0x900x97、0x880x8F0x980x9F。注:RB0RB7(為數(shù)據(jù)口)依次接P1各口,變阻器R2下端接地。5.1接口說明:VSS為電源地;VDD為電源正端;V0為LCD驅(qū)動(dòng)電壓輸入端;RS:并行的指令/數(shù)據(jù)選擇信號(hào),串行的片選信號(hào);RW:并行的讀寫選擇信號(hào),串行的數(shù)據(jù)口;E:并行的使能信號(hào),串行的同步時(shí)鐘;PSB:并/串行接口選擇,高電平時(shí)為并行;NC:空腳;RST:復(fù)位信號(hào),低電平有效;BLA:背光源正極;BLK:背光源負(fù)極。5.2、12864讀寫時(shí)序圖如下:讀寫操作時(shí)序數(shù)據(jù)與命令時(shí)序5.3、基本

6、操作時(shí)序(1)讀狀態(tài):輸入:RS=L,RW=H,E=H 輸出:D0D7=狀態(tài)字(2)寫指令:輸入:RS=L,RW=L, D0D7=指令碼,E=高脈沖輸出:無(3)讀數(shù)據(jù):輸入:RS=H,RW=H,E=H 輸出:D0D7=數(shù)據(jù)(4)寫數(shù)據(jù):輸入:RS=H,RW=L, D0D7=數(shù)據(jù),E=高脈沖輸出:無5.4、初始化過程(復(fù)位過程)指令:(1)延時(shí)15毫秒(2)寫指令38H;顯示模式設(shè)置(3)寫指令08H;顯示關(guān)閉(4)寫指令01H;顯示清屏(5)寫指令06H;顯示光標(biāo)移動(dòng)設(shè)置(6)寫指令0CH;顯示開及光標(biāo)設(shè)置6. 與PC機(jī)通信模塊從上述電路可知,單片機(jī)要與計(jì)算機(jī)通信,必須通過MAX232(或其

7、他)芯片。這是因?yàn)橛?jì)算機(jī)串口上的電平執(zhí)行的是RS-232標(biāo)準(zhǔn),它定義的高低電平和單片機(jī)的TTL邏輯電平不兼容。而MAX232芯片加上幾個(gè)電解電容,能完成電壓的加倍和反相,實(shí)現(xiàn)TTL電平和RS-232電平的轉(zhuǎn)換。單片機(jī)的串行口TXD與MAX232的一組電平轉(zhuǎn)換器的TTL輸入端(管腳12)相連,經(jīng)過MAX232轉(zhuǎn)換后,RS-232標(biāo)準(zhǔn)輸出端(管腳14)輸出的信號(hào)進(jìn)入計(jì)算機(jī)串口的RXD。同樣計(jì)算機(jī)串口的TXD與MAX232的RS-232標(biāo)準(zhǔn)輸入端(管腳13)相連,經(jīng)過電平轉(zhuǎn)換后,由TTL輸出端(管腳11)輸出到單片機(jī)的RXD上。7. AM2301溫濕度檢測電路上圖中DHT11和AM2301是一個(gè)系列

8、的,他們的引腳和功能一樣。7.1 AM2301溫濕度傳感器簡介 DHT11的供電電壓為35.5V。傳感器上電后,要等待1s 以越過不穩(wěn)定狀態(tài)在此期間無需發(fā)送任何指令。電源引腳(VDD,GND)之間可增加一個(gè)100nF 的電容,用以去耦濾波。DATA 用于微處理器與DHT11之間的通訊和同步,采用單總線數(shù)據(jù)格式,一次通訊時(shí)間4ms左右,數(shù)據(jù)分小數(shù)部分和整數(shù)部分,具體格式在下面說明,當(dāng)前小數(shù)部分用于以后擴(kuò)展,現(xiàn)讀出為零.操作流程如下:一次完整的數(shù)據(jù)傳輸40bit,高位先出。數(shù)據(jù)格式:8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)+8bit校驗(yàn)和用戶MCU發(fā)送一

9、次開始信號(hào)后,DHT11從低功耗模式轉(zhuǎn)換到高速模式,等待主機(jī)開始信號(hào)結(jié)束后,DHT11發(fā)送響應(yīng)信號(hào),送出40bit的數(shù)據(jù),并觸發(fā)一次信號(hào)采集,用戶可選擇讀取部分?jǐn)?shù)據(jù).從模式下,DHT11接收到開始信號(hào)觸發(fā)一次溫濕度采集,如果沒有接收到主機(jī)發(fā)送開始信號(hào),DHT11不會(huì)主動(dòng)進(jìn)行溫濕度采集.采集數(shù)據(jù)后轉(zhuǎn)換到低速模式。1、總線空閑狀態(tài)為高電平,主機(jī)把總線拉低等待DHT11響應(yīng),主機(jī)把總線拉低必須大于18毫秒,保證DHT11能檢測到起始信號(hào)。DHT11接收到主機(jī)的開始信號(hào)后,等待主機(jī)開始信號(hào)結(jié)束,然后發(fā)送80us低電平響應(yīng)信號(hào).主機(jī)發(fā)送開始信號(hào)結(jié)束后,延時(shí)等待20-40us后, 讀取DHT11的響應(yīng)信號(hào)

10、,主機(jī)發(fā)送開始信號(hào)后,可以切換到輸入模式,或者輸出高電平均可, 總線由上拉電阻拉高。2、總線為低電平,說明DHT11發(fā)送響應(yīng)信號(hào),DHT11發(fā)送響應(yīng)信號(hào)后,再把總線拉高80us,準(zhǔn)備發(fā)送數(shù)據(jù),每一bit數(shù)據(jù)都以50us低電平時(shí)隙開始,高電平的長短定了數(shù)據(jù)位是0還是1.格式見下面圖示.如果讀取響應(yīng)信號(hào)為高電平,則DHT11沒有響應(yīng),請檢查線路是否連接正常.當(dāng)最后一bit數(shù)據(jù)傳送完畢后,DHT11拉低總線50us,隨后總線由上拉電阻拉高進(jìn)入空閑狀態(tài)。四、 各模塊流程圖1、 溫度模塊控制流程圖:2、 濕度模塊控制流程圖3、 顯示模塊控制流程圖4、 報(bào)警模塊流程圖5、 溫濕度報(bào)警設(shè)置流程圖6、萬年歷設(shè)

11、置流程圖7、 與PC通信模塊流程圖五、 設(shè)計(jì)過程問題解決本次設(shè)計(jì)過程很費(fèi)周折,由于proteus里面缺少一些必要的元件如20引腳12864液晶顯示模塊和AM2301溫濕傳感器,故實(shí)驗(yàn)過程中是先設(shè)計(jì)好硬件電路,焊好電路以后才進(jìn)行調(diào)試的,其間的艱難可想而知。也因?yàn)檫@樣,硬件電路的錯(cuò)誤比較多,中間一直在修改硬件電路,造成電路板修修補(bǔ)補(bǔ)不美觀。實(shí)驗(yàn)過程中遇到的困難很多,尤其是實(shí)現(xiàn)界面切換和返回主界面的過程,要保持時(shí)鐘仍在運(yùn)行,同時(shí)光標(biāo)也要隨著界面一起移動(dòng)。否則就會(huì)顯示出錯(cuò)。此外開關(guān)報(bào)警的設(shè)置如何能夠保持,這就要做到返回主界面以后要保存設(shè)置量,當(dāng)報(bào)警時(shí)按下了關(guān)報(bào)警,要刷新設(shè)置界面。而在本次設(shè)計(jì)過程中,我

12、們調(diào)用了兩次顯示,一次寫顯示格式,一次刷新,只要有更改就刷新,對于那些不變的漢字我們不刷新,這樣也使得顯示得到簡化。此外,由于使用到單片機(jī)與計(jì)算機(jī)通信知識(shí),通過查閱相關(guān)書籍,用VB編寫了一個(gè)上位機(jī)顯示界面,將12864上顯示的溫濕度數(shù)值通過串口控件顯示。下面將分步驟將實(shí)現(xiàn)過程中的問題和解決方案作說明:1. 剛開始燒了程序以后,發(fā)現(xiàn)LCD什么都不顯示,后來發(fā)現(xiàn)是因?yàn)闆]有開背光,因?yàn)闆]開背光顯示不明顯,如果角度不對會(huì)發(fā)現(xiàn)什么都沒顯示。而背光要通過可調(diào)電阻來調(diào),在12864的BLA背光正極接一個(gè)可調(diào)電阻,電阻的兩端是接地和電源(之間還有一個(gè)撥碼開關(guān))。當(dāng)打開開關(guān)時(shí),背光關(guān)掉,可以省電;合上開關(guān),調(diào)節(jié)

13、電阻可以使12864顯示亮度變化。2. 能夠顯示以后,發(fā)現(xiàn)顯示界面一直在刷新,顯示不穩(wěn)定。原因是每秒隨著秒刷新初始化界面一次,解決的方案是不重新調(diào)用顯示,而是只給顯示秒的位置刷新,其他時(shí)間隨秒變化。溫濕度值則是有了變化就刷新。3. 由于編寫程序時(shí),沒有考慮到串口通信中傳回PC的數(shù)據(jù)的十六進(jìn)制與顯示字符之間的數(shù)據(jù)處理關(guān)系,導(dǎo)致在串口助手軟件中只顯示了傳回的最后一個(gè)十六進(jìn)制數(shù)所對應(yīng)的ASC的字符,找到問題的解決關(guān)鍵所在后,經(jīng)過數(shù)的分位與字符顯示后,成功的顯示了傳回的溫度、濕度的數(shù)據(jù),讓我們距離成功只差一小步了。接下來的任務(wù)就是顯示在12864液晶上,根據(jù)之前單獨(dú)在其上顯示過液晶萬年歷的基礎(chǔ),知道只

14、要將dht11檢測的數(shù)據(jù)進(jìn)行相應(yīng)處理后并且與液晶萬年歷的顯示集成一起送顯示就行了。理論雖簡單,但實(shí)際在下載到芯片中檢測現(xiàn)象時(shí),我們發(fā)現(xiàn)分別單獨(dú)顯示兩者的數(shù)據(jù)沒有問題,但集成在一塊顯示不久就會(huì)花屏的現(xiàn)象,問題出在刷新漢字時(shí),指針光標(biāo)的位置修改錯(cuò)誤所導(dǎo)致的。之后經(jīng)過重新寫回指針后就達(dá)到了較為滿意的效果。在報(bào)警程序的設(shè)置上,主要解決蜂鳴器報(bào)警間隔和LED燈閃爍的時(shí)間匹配問題,讓兩者現(xiàn)象統(tǒng)一。4. 單片機(jī)與計(jì)算機(jī)通信。上位機(jī)界面設(shè)計(jì),利用VB編程,用MSComm控件能夠?qū)崿F(xiàn)單片機(jī)傳送數(shù)據(jù)到計(jì)算機(jī)并顯示。Private Sub MSComm1_OnComm() Dim rec As String ;定義

15、接收字符串 Select Case MSComm1.CommEvent ;串口事件選擇 Case comeEvReceive ;串口事件為接收 rec = MSComm1.Input ;從接收緩沖區(qū)中讀取數(shù)據(jù) Text1.Text = rec ;將接收到的字符串寫入文本框 MSComm1.InBufferCount = 0 ;設(shè)置接收緩沖區(qū)中等待計(jì)算機(jī)接受的字符數(shù)為0 End Select End SubPrivate Sub form_load() MSComm1.Settings = "9600,N,8,1" ;波特率,奇偶校驗(yàn),發(fā)送位數(shù),停止位 MSComm1.Com

16、mPort = 5 ;串口號(hào) If MSComm1.PortOpen = True Then MSComm1.PortOpen = False MSComm1.RThreshold = 8 ;接收緩沖區(qū)字符為8時(shí),串口控件設(shè)置串口事件為接收,并產(chǎn)生OnComm事件 MSComm1.SThreshold = 2 ;發(fā)送緩沖區(qū)中字符小于2時(shí),串口控件設(shè)置串口事件為發(fā)送,并產(chǎn)生OnComm事件 MSComm1.InputLen = 0 ;返回一次從接收緩沖區(qū)讀取所有字節(jié) MSComm1.InputMode = comInputModeText ;接收模式為文本 If MSComm1.PortOpen

17、 = False Then MSComm1.PortOpen = True MSComm1.InBufferCount = 0 Me.Caption = "溫濕度顯示"End SubPrivate Sub Form_Resize() ;窗體背景圖片設(shè)置Image1.Top = 0Image1.Left = 0Image1.Stretch = TrueImage1.Height = Me.ScaleHeightImage1.Width = Me.ScaleWidthEnd SubPrivate Sub mnuQuit_Click() EndEnd Sub六、 設(shè)計(jì)總結(jié)本次設(shè)計(jì)

18、是小組三人共同努力的成果,大家齊心協(xié)力克服了上述種種困難,才把實(shí)物做出來。通過這次設(shè)計(jì),我們學(xué)習(xí)到了如何把傳感器聯(lián)系單片機(jī)知識(shí)做成一個(gè)簡單的檢測系統(tǒng),如何完成簡單的通信任務(wù),如何編寫高效率的C代碼。當(dāng)然我們的不足也有很多,比如硬件設(shè)計(jì)電路考慮不全面,造成后來不得不修改一些連線和元件使得電路板不夠美觀;還有程序不夠模塊化,有不少冗余,移植性和兼容性也不好,今后要更加注重這些方面的改進(jìn)。附錄代碼:/*基于單片機(jī)的溫濕度檢測系統(tǒng)*/*include<reg52.h>*define uchar unsigned char*define uint unsigned int/*端口定義*/sb

19、it LCD_RS=P35; /寄存器選擇輸入sbit LCD_RW=P36;/液晶讀/寫控制sbit LCD_EN=P34;/液晶使能控制sbit LCD_PSB=P37;/串/并方式控制sbit s5=P03; /關(guān)報(bào)警sbit s4=P04; /設(shè)置溫濕度報(bào)警值及開關(guān)報(bào)警sbit s3=P05;/調(diào)時(shí)開/關(guān)sbit s2=P06;/加操作sbit s1=P07;/減操作sbit led1=P20;/溫度報(bào)警sbit led2=P21;/濕度報(bào)警sbit buzzer=P25;/蜂鳴器sbit AM2301=P26;/P2.6口為通訊口連接DHT11typedef unsigned cha

20、r U8;typedef unsigned int U16;char sec,min,hour,week,day=1,month=1,year;bit flag,flag2,flag3=0,flag4=0,flag5=0,flag6=0;uchar a;uchar s1num,s4num;uchar code dis1="2011年12月02日"uchar code dis2="00時(shí)00分00秒"uchar code dis3="溫度: 25.0 日"uchar code dis4="濕度: 40.0"uchar

21、 code dis5="溫度上限:"/溫濕度設(shè)置界面uchar code dis6="溫度下限:"uchar code dis7="濕度上限:"uchar code dis8="濕度下限:"uchar code disx=0xc8,0xd5,0xd2,0xbb,0xb6,0xfe,0xc8,0xfd,0xcb,0xc4,0xce,0xe5,0xc1,0xf9;/"日","一","二","三","四","五&

22、quot;,"六"(兩個(gè)字節(jié)為一個(gè)漢字)/-定義區(qū)-/U8 Temp,RH1;U8 U8FLAG;U8 U8count,U8temp;U8 data tab8=0x00,0x00,0x2e,0x00,0x00,0x00,0x2e,0x00;/存儲(chǔ)溫濕度數(shù)據(jù)U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;/溫濕度的高低位及校驗(yàn)位U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;U8

23、temp_H=30,temp_L=0,RH_H=50,RH_L=10;U8 U8comdata;U8 outdata8; /定義發(fā)送的字節(jié)數(shù)U8 str8=“”; U8 count;U16 U16temp1,U16temp2;/*延時(shí)1ms子函數(shù)*/void delay(uint z)uint x,y;for(x=z;x>0;x-)for(y=110;y>0;y-);/*延時(shí)子函數(shù)*/void Delay2(U16 j) U8 i; for(;j>0;j-)for(i=0;i<27;i+);/*延時(shí)10us子函數(shù)*/void Delay_10us(void)U8 i;i

24、-;i-;i-;i-;i-;i-;/*發(fā)送字符串子函數(shù)*/void SendData(U8*a) outdata0=a0; outdata1=a1; outdata2=a2; outdata3=a3; outdata4=a4; outdata5=a5; outdata6=a6; outdata7=a7; count=0; SBUF=outdata0;/*寫指令子函數(shù)*/*RS=0,RW=0,E=0,D0-D7=指令碼*/void write_(uchar )LCD_RS=0;LCD_RW=0;LCD_EN=0;P1=;delay(5);LCD_EN=1;delay(5);LCD_EN=0;/*

25、寫數(shù)據(jù)子函數(shù)*/*RS=1,RW=0,E=0,D0-D7=數(shù)據(jù)*/void write_dat(uchar dat)LCD_RS=1;LCD_RW=0;LCD_EN=0;P1=dat;delay(5);LCD_EN=1;delay(5);LCD_EN=0;/*設(shè)定顯示位置*/void lcd_pos(uchar X,uchar Y)uchar pos;if(X=0) X=0x80;else if(X=1) X=0x90;else if(X=2) X=0x88;else if(X=3) X=0x98;pos=X+Y;write_(pos);/*LCD初始化設(shè)定*/void init()LCD_P

26、SB=1; /并口方式write_(0x30); /基本指令操作delay(5);write_(0x0c); /顯示開,關(guān)光標(biāo)delay(5);write_(0x01); /清除LCD的顯示內(nèi)容delay(5);TMOD=0x21;TH0=0x4c;TL0=0x00;ET0=1;EA=1;TR0=1;TH1=253;/初始化串口TL1=253;TR1=1;SCON=0x50;ES=1;EA=1;TI=0;RI=0; SendData(str);Delay2(1);/*寫年月日子函數(shù)*/void write_ymd(uchar add,uchar dat)uchar shi,ge;shi=dat

27、/10;ge=dat%10;write_(0x80+add);write_dat(0x30+shi);write_dat(0x30+ge);/*寫時(shí)分秒子函數(shù)*/void write_hms(uchar add,uchar dat)uchar shi,ge;shi=dat/10;ge=dat%10;write_(0x90+add);write_dat(0x30+shi);write_dat(0x30+ge);/*溫濕度上下限設(shè)置更新*/void write_lim1(uchar add,uchar dat) uchar shi,ge;shi=dat/10;ge=dat%10;write_(0x

28、80+add);write_dat(0x30+shi);write_dat(0x30+ge); void write_lim2(uchar add,uchar dat) uchar shi,ge;shi=dat/10;ge=dat%10;write_(0x90+add);write_dat(0x30+shi);write_dat(0x30+ge); void write_lim3(uchar add,uchar dat) uchar shi,ge;shi=dat/10;ge=dat%10;write_(0x88+add);write_dat(0x30+shi);write_dat(0x30+g

29、e); void write_lim4(uchar add,uchar dat) uchar shi,ge;shi=dat/10;ge=dat%10;write_(0x98+add);write_dat(0x30+shi);write_dat(0x30+ge); /*溫度顯示子函數(shù)*/void write_tem(uchar add)write_(0x88+add);write_dat(tab4);write_dat(tab5);write_dat(tab6);write_dat(tab7);/*濕度顯示子函數(shù)*/void write_hum(uchar add)write_(0x98+add

30、);write_dat(tab0);write_dat(tab1);write_dat(tab2);write_dat(tab3); void COM(void)U8 i;for(i=0;i<8;i+)U8FLAG=2;while(!AM2301)&&U8FLAG+);Delay_10us();Delay_10us();Delay_10us();U8temp=0;if(AM2301)U8temp=1;U8FLAG=2;while(AM2301)&&U8FLAG+);/超時(shí)則跳出for循環(huán)if(U8FLAG=1)break;/判斷數(shù)據(jù)位是0還是1/ 如果高電

31、平高過預(yù)定0高電平值則數(shù)據(jù)位為 1 U8comdata<<=1;U8comdata|=U8temp; /*溫濕度讀取子函數(shù)*/void RH(void)/主機(jī)拉低18ms AM2301=0;Delay2(180);AM2301=1;/總線由上拉電阻拉高主機(jī)延時(shí)40usDelay_10us();Delay_10us();Delay_10us();Delay_10us();/主機(jī)設(shè)為輸入判斷從機(jī)響應(yīng)信號(hào)AM2301=1;/判斷從機(jī)是否有低電平響應(yīng)信號(hào)如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行if(!AM2301) /T !U8FLAG=2;/判斷從機(jī)是否發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束wh

32、ile(!AM2301)&&U8FLAG+);U8FLAG=2;/判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)while(AM2301)&&U8FLAG+);/數(shù)據(jù)接收狀態(tài)COM();U8RH_data_H_temp=U8comdata;COM();U8RH_data_L_temp=U8comdata;COM();U8T_data_H_temp=U8comdata;COM();U8T_data_L_temp=U8comdata;COM();U8checkdata_temp=U8comdata;AM2301=1;/數(shù)據(jù)校驗(yàn)U8temp=(U8T_

33、data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);if(U8temp=U8checkdata_temp)if(1) U8RH_data_H = U8RH_data_H_temp;/濕度 U8RH_data_L = U8RH_data_L_temp; U16temp1 = U8RH_data_H; U16temp1 <<= 8; U16temp1 |= U8RH_data_L;/獲得完整的濕度 tab0=U16temp1/100+0x30; /濕度百位 tab1=U16temp1%100/10+0x30;/濕

34、度十位 tab3=U16temp1%10+0x30; /濕度個(gè)位 U8T_data_H = U8T_data_H_temp;/溫度 U8T_data_L = U8T_data_L_temp; U16temp2 = U8T_data_H; U16temp2<<=8; U16temp2 |= U8T_data_L;/獲得完整的溫度 tab4=U16temp2/100+0x30;/溫度百位 tab5=U16temp2%100/10+0x30;/溫度十位 tab7=U16temp2%10+0x30;/溫度個(gè)位 U8checkdata=U8checkdata_temp;/校驗(yàn)位/*主界面顯示

35、*/void display1() uchar i; init();/*從第一行第一個(gè)字符的位置開始顯示*/lcd_pos(0,0);i=0;while(dis1i!='0')write_dat(dis1i);i+;/*從第二行第一個(gè)字符的位置開始顯示*/lcd_pos(1,0);i=0;while(dis2i!='0')write_dat(dis2i);i+;/*從第三行第一個(gè)字符的位置開始顯示*/lcd_pos(2,0);i=0;while(dis3i!='0')write_dat(dis3i);i+;/*從第四行第一個(gè)字符的位置開始顯示*/

36、lcd_pos(3,0);i=0;while(dis4i!='0')write_dat(dis4i);i+;/*溫濕度上下限及報(bào)警開關(guān)設(shè)置界面*/void display2() uchar i; init();/*從第一行第一個(gè)字符的位置開始顯示*/lcd_pos(0,0);i=0;while(dis5i!='0')write_dat(dis5i);i+;write_lim1(5,temp_H);write_dat(0x2e);write_dat(0x30);if(flag3) write_(0x80+7); write_dat(0xbf); write_dat

37、(0xaa);else write_(0x80+7); write_dat(0xb9); write_dat(0xd8);/*從第二行第一個(gè)字符的位置開始顯示*/lcd_pos(1,0);i=0;while(dis6i!='0')write_dat(dis6i);i+;write_lim2(5,temp_L);write_dat(0x2e);write_dat(0x30);if(flag4) write_(0x90+7); write_dat(0xbf); write_dat(0xaa);else write_(0x90+7); write_dat(0xb9); write_d

38、at(0xd8);/*從第三行第一個(gè)字符的位置開始顯示*/lcd_pos(2,0);i=0;while(dis7i!='0')write_dat(dis7i);i+;write_lim3(5,RH_H);write_dat(0x2e);write_dat(0x30);if(flag5) write_(0x88+7); write_dat(0xbf); write_dat(0xaa);else write_(0x88+7); write_dat(0xb9); write_dat(0xd8);/*從第四行第一個(gè)字符的位置開始顯示*/lcd_pos(3,0);i=0;while(di

39、s8i!='0')write_dat(dis8i);i+;write_lim4(5,RH_L);write_dat(0x2e);write_dat(0x30);if(flag6) write_(0x98+7); write_dat(0xbf); write_dat(0xaa);else write_(0x98+7); write_dat(0xb9); write_dat(0xd8);/*調(diào)時(shí)按鍵掃描*/void keyscan1()if(s1=0)delay(5);/延時(shí)5ms去抖動(dòng)!if(s1=0)while(!s1);s1num+;if(s1num=1)TR0=0;writ

40、e_(0x80+1);write_(0x0f);if(s1num=2)write_(0x80+3);if(s1num=3)/TR0=0; 上一次已經(jīng)停了。write_(0x80+5);/write_(0x0f);if(s1num=4)/TR0=0; 上一次已經(jīng)停了。write_(0x90+0);/write_(0x0f);if(s1num=5)/TR0=0; 上一次已經(jīng)停了。write_(0x90+2);/write_(0x0f);上一次光標(biāo)已閃爍if(s1num=6)/TR0=0; 上一次已經(jīng)停了。write_(0x90+4);/write_(0x0f);上一次光標(biāo)已閃爍if(s1num=7

41、)write_(0x88+7);if(s1num=8)s1num=0;TR0=1;write_(0x0c);if(s1num!=0)/*按鍵計(jì)數(shù)加*/if(s2=0)delay(5);if(s2=0)while(!s2);/消抖,否則就會(huì)一下加很多/*調(diào)節(jié)修改顯示的位置*/if(s1num=1)year+;if(year=99)year=0;/刷新年!write_ymd(1,year);write_(0x80+1);if(s1num=2)month+;if(month=13)month=1;/刷新月!write_ymd(3,month);write_(0x80+3);if(s1num=3)da

42、y+;if(day=32)day=1;/刷新日!write_ymd(5,day);write_(0x80+5);if(s1num=4)hour+;if(hour=24)hour=0;/刷新時(shí)!write_hms(0,hour);write_(0x90+0);if(s1num=5)min+;if(min=60)min=0;/刷新分!write_hms(2,min);write_(0x90+2);if(s1num=6)sec+;if(sec=60)sec=0;/刷新秒!write_hms(4,sec);write_(0x90+4);if(s1num=7)uchar i;week+;if(week=

43、7)week=0;/刷新星期!i=2*week;while(i<2*week+2)write_dat(disxi);i+; write_(0x88+7);/*按鍵計(jì)數(shù)減*/if(s3=0)delay(5);if(s3=0)while(!s3);/消抖,否則就會(huì)一下加很多/*調(diào)節(jié)修改顯示的位置*/if(s1num=1)year-;if(year=-1)year=99;write_ymd(1,year);write_(0x80+1);if(s1num=2)month-;if(month=0)month=12;write_ymd(3,month);write_(0x80+3);if(s1num

44、=3)day-;if(day=0)day=31;write_ymd(5,day);write_(0x80+5);if(s1num=4)hour-;if(hour=-1)hour=23;write_hms(0,hour);write_(0x90+0);if(s1num=5)min-;if(min=-1)min=59;write_hms(2,min);write_(0x90+2);if(s1num=6)sec-;if(sec=-1)sec=59;write_hms(4,sec);write_(0x90+4);if(s1num=7)uchar i;week-;if(week=-1)week=6;i=

45、2*week;while(i<2*week+2)write_dat(disxi);i+;write_(0x88+7);/*溫濕度上下限設(shè)置按鍵掃描*/void keyscan2()if(s4=0) delay(5);if(s4=0) while(!s4); s4num+; if(s4num=1) TR0=0; display2(); write_(0x80+5); write_(0x0f); if(s4num=2) write_(0x80+7); if(s4num=3) write_(0x90+5); if(s4num=4) write_(0x90+7); if(s4num=5) wri

46、te_(0x88+5); if(s4num=6) write_(0x88+7); if(s4num=7) write_(0x98+5); if(s4num=8) write_(0x98+7); if(s4num=9) s4num=0; TR0=1; display1(); /write_(0x0c); /按鍵s4次數(shù) if(s4num!=0) /*按鍵計(jì)數(shù)加*/if(s2=0)delay(10);if(s2=0)while(!s2);/消抖,否則就會(huì)一下加很多/*調(diào)節(jié)修改顯示的位置*/if(s4num=1)temp_H+;if(temp_H=80)temp_H=30;/刷新溫度上限write_

47、lim1(5,temp_H);write_(0x80+5);if(s4num=2) flag3=flag3;if(flag3) write_(0x80+7); write_dat(0xbf); write_dat(0xaa); write_(0x80+7);else write_(0x80+7); write_dat(0xb9); write_dat(0xd8); write_(0x80+7); if(s4num=3)temp_L+;if(temp_L=29)temp_L=0;/刷新溫度下限write_lim2(5,temp_L);write_(0x90+5); if(s4num=4) flag4=flag4;if(flag4) write_(0x90+7); write_dat(0xbf); write_dat(0xaa); write_(0x90+7);else write_(0x90+7); write_dat(0xb9); write_dat(0xd8); write_(0x90+7); if(s4num=5)RH_H+;if(RH_H=99)RH_H=50;/刷新濕度上限write_lim3(5,RH_H);wri

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論