


版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、.基于52單片機的溫濕度檢測儀的設計摘要利用Atmel52系列單片機和數字溫濕度傳感器AM2301設計并制作一個簡單的溫濕度檢測儀。以單片機為核心,外圍電路包括電源、時鐘芯片、12864LCD、Max232芯片、AM2301傳感器以及蜂鳴器報警電路等。其中AM2301傳感器是含有已校準數字信號輸出的溫濕度復合傳感器,它包括一個電阻式感濕元件和一個NTC測溫元件。LCD顯示包括萬年歷、溫濕度以及報警設置,同時通過內部中斷方式把溫濕度的實時值通過VB編寫的上位機程序接收并顯示。一、 設計功能(1) LCD分兩個界面顯示:主界面和設置報警界面;(2) 主界面顯示萬年歷和溫濕度實時值;(3) 設置報警
2、界面顯示溫濕度上下限及開/關報警;(4) 當溫濕度低于設置的下限或高于設置的上限并且開報警后,蜂鳴器和led燈配合報警;(5) 有按鍵設置功能,以及關報警和回到主界面顯示功能;(6) 能通過Max芯片和計算機通信,把溫濕度數據顯示在上位機界面上,實現遠程監(jiān)控。二、 設計所需元件清單(1)9V電源(2)杜邦線若干(3)12864LCD1塊(4)80X52單片機1片(5)排阻1排,電阻若干(6)AM2301傳感器1個(7)32768Hz晶振1個,12MHz晶振1個(8)蜂鳴器1個(9)LM2940穩(wěn)壓元件1個(10)DS1302時鐘芯片1片(11)船型開關1個,觸點開關若干(12)30pF電容若干
3、,22uF電容若干(13)LED燈2個,三極管,紐扣電池三、具體設計根據所要實現的功能,將系統(tǒng)模塊化設計,總體模塊結構圖如下圖所示:以下就分別就各模塊功能實現進行設計。1. 復位電路這部分是單片機一般都需要的,當運行出錯或者死機時,利用復位按鍵能重新啟動系統(tǒng)。RST2. 時鐘電路如上圖所示。其中時鐘芯片DS1302的各引腳功能如下:Vcc1:主電源;Vcc2:備份電源。當Vcc2>Vcc1+0.2V時,由Vcc2向DS1302供電,當Vcc2< Vcc1時,由Vcc1向DS1302供電。SCLK:串行時鐘,輸入,控制數據的輸入與輸出;I/O:三線接口時的雙向數據線;RST為復位引腳
4、,在讀、寫數據期間,必須為高,X1 X2為32867Hz晶振管腳,為芯片提供時鐘脈沖。3. 報警電路各I/O口在上電時為高電平,LED燈和蜂鳴器處于熄滅和不響狀態(tài)。其中LED燈通過一個1K的電阻限流,防止點亮時電流過大被燒壞。蜂鳴器要用NPN型三極管驅動,當P2.5口輸出高電平時,Q1飽和導通,蜂鳴器獲得工作電流發(fā)出響聲。4. 鍵盤掃描電路這里用了5個按鍵。其中按鍵1是調時按鍵,根據按的次數依次進入年、月、日、時、分、秒、星期調整,再按一次則退出。按鍵2和3分別是加操作和減操作。按鍵4是設置溫濕度上下限值及報警開關;按鍵5是關報警。5. 12864LCD顯示電路ST7920系列12864是帶中
5、文字庫的液晶顯示器,它可以顯示4行,每行16個字節(jié),各行的地址依次為0x800x87、0x900x97、0x880x8F0x980x9F。注:RB0RB7(為數據口)依次接P1各口,變阻器R2下端接地。5.1接口說明:VSS為電源地;VDD為電源正端;V0為LCD驅動電壓輸入端;RS:并行的指令/數據選擇信號,串行的片選信號;RW:并行的讀寫選擇信號,串行的數據口;E:并行的使能信號,串行的同步時鐘;PSB:并/串行接口選擇,高電平時為并行;NC:空腳;RST:復位信號,低電平有效;BLA:背光源正極;BLK:背光源負極。5.2、12864讀寫時序圖如下:讀寫操作時序數據與命令時序5.3、基本
6、操作時序(1)讀狀態(tài):輸入:RS=L,RW=H,E=H 輸出:D0D7=狀態(tài)字(2)寫指令:輸入:RS=L,RW=L, D0D7=指令碼,E=高脈沖輸出:無(3)讀數據:輸入:RS=H,RW=H,E=H 輸出:D0D7=數據(4)寫數據:輸入:RS=H,RW=L, D0D7=數據,E=高脈沖輸出:無5.4、初始化過程(復位過程)指令:(1)延時15毫秒(2)寫指令38H;顯示模式設置(3)寫指令08H;顯示關閉(4)寫指令01H;顯示清屏(5)寫指令06H;顯示光標移動設置(6)寫指令0CH;顯示開及光標設置6. 與PC機通信模塊從上述電路可知,單片機要與計算機通信,必須通過MAX232(或其
7、他)芯片。這是因為計算機串口上的電平執(zhí)行的是RS-232標準,它定義的高低電平和單片機的TTL邏輯電平不兼容。而MAX232芯片加上幾個電解電容,能完成電壓的加倍和反相,實現TTL電平和RS-232電平的轉換。單片機的串行口TXD與MAX232的一組電平轉換器的TTL輸入端(管腳12)相連,經過MAX232轉換后,RS-232標準輸出端(管腳14)輸出的信號進入計算機串口的RXD。同樣計算機串口的TXD與MAX232的RS-232標準輸入端(管腳13)相連,經過電平轉換后,由TTL輸出端(管腳11)輸出到單片機的RXD上。7. AM2301溫濕度檢測電路上圖中DHT11和AM2301是一個系列
8、的,他們的引腳和功能一樣。7.1 AM2301溫濕度傳感器簡介 DHT11的供電電壓為35.5V。傳感器上電后,要等待1s 以越過不穩(wěn)定狀態(tài)在此期間無需發(fā)送任何指令。電源引腳(VDD,GND)之間可增加一個100nF 的電容,用以去耦濾波。DATA 用于微處理器與DHT11之間的通訊和同步,采用單總線數據格式,一次通訊時間4ms左右,數據分小數部分和整數部分,具體格式在下面說明,當前小數部分用于以后擴展,現讀出為零.操作流程如下:一次完整的數據傳輸40bit,高位先出。數據格式:8bit濕度整數數據+8bit濕度小數數據+8bi溫度整數數據+8bit溫度小數數據+8bit校驗和用戶MCU發(fā)送一
9、次開始信號后,DHT11從低功耗模式轉換到高速模式,等待主機開始信號結束后,DHT11發(fā)送響應信號,送出40bit的數據,并觸發(fā)一次信號采集,用戶可選擇讀取部分數據.從模式下,DHT11接收到開始信號觸發(fā)一次溫濕度采集,如果沒有接收到主機發(fā)送開始信號,DHT11不會主動進行溫濕度采集.采集數據后轉換到低速模式。1、總線空閑狀態(tài)為高電平,主機把總線拉低等待DHT11響應,主機把總線拉低必須大于18毫秒,保證DHT11能檢測到起始信號。DHT11接收到主機的開始信號后,等待主機開始信號結束,然后發(fā)送80us低電平響應信號.主機發(fā)送開始信號結束后,延時等待20-40us后, 讀取DHT11的響應信號
10、,主機發(fā)送開始信號后,可以切換到輸入模式,或者輸出高電平均可, 總線由上拉電阻拉高。2、總線為低電平,說明DHT11發(fā)送響應信號,DHT11發(fā)送響應信號后,再把總線拉高80us,準備發(fā)送數據,每一bit數據都以50us低電平時隙開始,高電平的長短定了數據位是0還是1.格式見下面圖示.如果讀取響應信號為高電平,則DHT11沒有響應,請檢查線路是否連接正常.當最后一bit數據傳送完畢后,DHT11拉低總線50us,隨后總線由上拉電阻拉高進入空閑狀態(tài)。四、 各模塊流程圖1、 溫度模塊控制流程圖:2、 濕度模塊控制流程圖3、 顯示模塊控制流程圖4、 報警模塊流程圖5、 溫濕度報警設置流程圖6、萬年歷設
11、置流程圖7、 與PC通信模塊流程圖五、 設計過程問題解決本次設計過程很費周折,由于proteus里面缺少一些必要的元件如20引腳12864液晶顯示模塊和AM2301溫濕傳感器,故實驗過程中是先設計好硬件電路,焊好電路以后才進行調試的,其間的艱難可想而知。也因為這樣,硬件電路的錯誤比較多,中間一直在修改硬件電路,造成電路板修修補補不美觀。實驗過程中遇到的困難很多,尤其是實現界面切換和返回主界面的過程,要保持時鐘仍在運行,同時光標也要隨著界面一起移動。否則就會顯示出錯。此外開關報警的設置如何能夠保持,這就要做到返回主界面以后要保存設置量,當報警時按下了關報警,要刷新設置界面。而在本次設計過程中,我
12、們調用了兩次顯示,一次寫顯示格式,一次刷新,只要有更改就刷新,對于那些不變的漢字我們不刷新,這樣也使得顯示得到簡化。此外,由于使用到單片機與計算機通信知識,通過查閱相關書籍,用VB編寫了一個上位機顯示界面,將12864上顯示的溫濕度數值通過串口控件顯示。下面將分步驟將實現過程中的問題和解決方案作說明:1. 剛開始燒了程序以后,發(fā)現LCD什么都不顯示,后來發(fā)現是因為沒有開背光,因為沒開背光顯示不明顯,如果角度不對會發(fā)現什么都沒顯示。而背光要通過可調電阻來調,在12864的BLA背光正極接一個可調電阻,電阻的兩端是接地和電源(之間還有一個撥碼開關)。當打開開關時,背光關掉,可以省電;合上開關,調節(jié)
13、電阻可以使12864顯示亮度變化。2. 能夠顯示以后,發(fā)現顯示界面一直在刷新,顯示不穩(wěn)定。原因是每秒隨著秒刷新初始化界面一次,解決的方案是不重新調用顯示,而是只給顯示秒的位置刷新,其他時間隨秒變化。溫濕度值則是有了變化就刷新。3. 由于編寫程序時,沒有考慮到串口通信中傳回PC的數據的十六進制與顯示字符之間的數據處理關系,導致在串口助手軟件中只顯示了傳回的最后一個十六進制數所對應的ASC的字符,找到問題的解決關鍵所在后,經過數的分位與字符顯示后,成功的顯示了傳回的溫度、濕度的數據,讓我們距離成功只差一小步了。接下來的任務就是顯示在12864液晶上,根據之前單獨在其上顯示過液晶萬年歷的基礎,知道只
14、要將dht11檢測的數據進行相應處理后并且與液晶萬年歷的顯示集成一起送顯示就行了。理論雖簡單,但實際在下載到芯片中檢測現象時,我們發(fā)現分別單獨顯示兩者的數據沒有問題,但集成在一塊顯示不久就會花屏的現象,問題出在刷新漢字時,指針光標的位置修改錯誤所導致的。之后經過重新寫回指針后就達到了較為滿意的效果。在報警程序的設置上,主要解決蜂鳴器報警間隔和LED燈閃爍的時間匹配問題,讓兩者現象統(tǒng)一。4. 單片機與計算機通信。上位機界面設計,利用VB編程,用MSComm控件能夠實現單片機傳送數據到計算機并顯示。Private Sub MSComm1_OnComm() Dim rec As String ;定義
15、接收字符串 Select Case MSComm1.CommEvent ;串口事件選擇 Case comeEvReceive ;串口事件為接收 rec = MSComm1.Input ;從接收緩沖區(qū)中讀取數據 Text1.Text = rec ;將接收到的字符串寫入文本框 MSComm1.InBufferCount = 0 ;設置接收緩沖區(qū)中等待計算機接受的字符數為0 End Select End SubPrivate Sub form_load() MSComm1.Settings = "9600,N,8,1" ;波特率,奇偶校驗,發(fā)送位數,停止位 MSComm1.Com
16、mPort = 5 ;串口號 If MSComm1.PortOpen = True Then MSComm1.PortOpen = False MSComm1.RThreshold = 8 ;接收緩沖區(qū)字符為8時,串口控件設置串口事件為接收,并產生OnComm事件 MSComm1.SThreshold = 2 ;發(fā)送緩沖區(qū)中字符小于2時,串口控件設置串口事件為發(fā)送,并產生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() ;窗體背景圖片設置Image1.Top = 0Image1.Left = 0Image1.Stretch = TrueImage1.Height = Me.ScaleHeightImage1.Width = Me.ScaleWidthEnd SubPrivate Sub mnuQuit_Click() EndEnd Sub六、 設計總結本次設計
18、是小組三人共同努力的成果,大家齊心協(xié)力克服了上述種種困難,才把實物做出來。通過這次設計,我們學習到了如何把傳感器聯(lián)系單片機知識做成一個簡單的檢測系統(tǒng),如何完成簡單的通信任務,如何編寫高效率的C代碼。當然我們的不足也有很多,比如硬件設計電路考慮不全面,造成后來不得不修改一些連線和元件使得電路板不夠美觀;還有程序不夠模塊化,有不少冗余,移植性和兼容性也不好,今后要更加注重這些方面的改進。附錄代碼:/*基于單片機的溫濕度檢測系統(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; /關報警sbit s4=P04; /設置溫濕度報警值及開關報警sbit s3=P05;/調時開/關sbit s2=P06;/加操作sbit s1=P07;/減操作sbit led1=P20;/溫度報警sbit led2=P21;/濕度報警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時00分00秒"uchar code dis3="溫度: 25.0 日"uchar code dis4="濕度: 40.0"uchar
21、 code dis5="溫度上限:"/溫濕度設置界面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;,"六"(兩個字節(jié)為一個漢字)/-定義區(qū)-/U8 Temp,RH1;U8 U8FLAG;U8 U8count,U8temp;U8 data tab8=0x00,0x00,0x2e,0x00,0x00,0x00,0x2e,0x00;/存儲溫濕度數據U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;/溫濕度的高低位及校驗位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é)數U8 str8=“”; U8 count;U16 U16temp1,U16temp2;/*延時1ms子函數*/void delay(uint z)uint x,y;for(x=z;x>0;x-)for(y=110;y>0;y-);/*延時子函數*/void Delay2(U16 j) U8 i; for(;j>0;j-)for(i=0;i<27;i+);/*延時10us子函數*/void Delay_10us(void)U8 i;i
24、-;i-;i-;i-;i-;i-;/*發(fā)送字符串子函數*/void SendData(U8*a) outdata0=a0; outdata1=a1; outdata2=a2; outdata3=a3; outdata4=a4; outdata5=a5; outdata6=a6; outdata7=a7; count=0; SBUF=outdata0;/*寫指令子函數*/*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、寫數據子函數*/*RS=1,RW=0,E=0,D0-D7=數據*/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;/*設定顯示位置*/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初始化設定*/void init()LCD_P
26、SB=1; /并口方式write_(0x30); /基本指令操作delay(5);write_(0x0c); /顯示開,關光標delay(5);write_(0x01); /清除LCD的顯示內容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);/*寫年月日子函數*/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);/*寫時分秒子函數*/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);/*溫濕度上下限設置更新*/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); /*溫度顯示子函數*/void write_tem(uchar add)write_(0x88+add);write_dat(tab4);write_dat(tab5);write_dat(tab6);write_dat(tab7);/*濕度顯示子函數*/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+);/超時則跳出for循環(huán)if(U8FLAG=1)break;/判斷數據位是0還是1/ 如果高電
31、平高過預定0高電平值則數據位為 1 U8comdata<<=1;U8comdata|=U8temp; /*溫濕度讀取子函數*/void RH(void)/主機拉低18ms AM2301=0;Delay2(180);AM2301=1;/總線由上拉電阻拉高主機延時40usDelay_10us();Delay_10us();Delay_10us();Delay_10us();/主機設為輸入判斷從機響應信號AM2301=1;/判斷從機是否有低電平響應信號如不響應則跳出,響應則向下運行if(!AM2301) /T !U8FLAG=2;/判斷從機是否發(fā)出 80us 的低電平響應信號是否結束wh
32、ile(!AM2301)&&U8FLAG+);U8FLAG=2;/判斷從機是否發(fā)出 80us 的高電平,如發(fā)出則進入數據接收狀態(tài)while(AM2301)&&U8FLAG+);/數據接收狀態(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;/數據校驗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; /濕度個位 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;/溫度個位 U8checkdata=U8checkdata_temp;/校驗位/*主界面顯示
35、*/void display1() uchar i; init();/*從第一行第一個字符的位置開始顯示*/lcd_pos(0,0);i=0;while(dis1i!='0')write_dat(dis1i);i+;/*從第二行第一個字符的位置開始顯示*/lcd_pos(1,0);i=0;while(dis2i!='0')write_dat(dis2i);i+;/*從第三行第一個字符的位置開始顯示*/lcd_pos(2,0);i=0;while(dis3i!='0')write_dat(dis3i);i+;/*從第四行第一個字符的位置開始顯示*/
36、lcd_pos(3,0);i=0;while(dis4i!='0')write_dat(dis4i);i+;/*溫濕度上下限及報警開關設置界面*/void display2() uchar i; init();/*從第一行第一個字符的位置開始顯示*/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);/*從第二行第一個字符的位置開始顯示*/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);/*從第三行第一個字符的位置開始顯示*/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);/*從第四行第一個字符的位置開始顯示*/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);/*調時按鍵掃描*/void keyscan1()if(s1=0)delay(5);/延時5ms去抖動!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; 上一次已經停了。write_(0x80+5);/write_(0x0f);if(s1num=4)/TR0=0; 上一次已經停了。write_(0x90+0);/write_(0x0f);if(s1num=5)/TR0=0; 上一次已經停了。write_(0x90+2);/write_(0x0f);上一次光標已閃爍if(s1num=6)/TR0=0; 上一次已經停了。write_(0x90+4);/write_(0x0f);上一次光標已閃爍if(s1num=7
41、)write_(0x88+7);if(s1num=8)s1num=0;TR0=1;write_(0x0c);if(s1num!=0)/*按鍵計數加*/if(s2=0)delay(5);if(s2=0)while(!s2);/消抖,否則就會一下加很多/*調節(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;/刷新時!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);/*按鍵計數減*/if(s3=0)delay(5);if(s3=0)while(!s3);/消抖,否則就會一下加很多/*調節(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);/*溫濕度上下限設置按鍵掃描*/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次數 if(s4num!=0) /*按鍵計數加*/if(s2=0)delay(10);if(s2=0)while(!s2);/消抖,否則就會一下加很多/*調節(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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年動物醫(yī)學專業(yè)實操能力考試卷及答案
- 2025年電商運營與管理崗位考試題及答案
- 2025年財務分析師考試試題及答案
- 2025年財務風險管理與控制基礎知識試題及答案
- 童裝品牌陳列培訓
- 月亮詩詞書法培訓
- 冬季維修安全培訓
- 中職語文二冊課件
- 整形美容醫(yī)院培訓
- 2025年懷化客運駕駛員從業(yè)資格考試
- 胖東來投訴管理制度
- 傳染病知識培訓課件
- 2024-2025新入職員工安全培訓考試試題及完整答案【一套】
- 人教版二年級數學下冊期末測試卷(5篇)
- 2025年湖南融通資源循環(huán)產業(yè)有限公司技能崗位招聘題庫帶答案分析
- 新能源汽車全生命周期碳足跡測算模型及減排策略
- 糧食加工消防安全管理規(guī)定
- 骨科器械的處理流程與清洗難點
- 小浣熊的課件
- 2024北京西城區(qū)五年級(下)期末語文試題及答案
- 屋頂樹脂瓦安裝合同協(xié)議
評論
0/150
提交評論