freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

自動溫濕度控制系統(tǒng)設(shè)計畢業(yè)論文-資料下載頁

2025-06-19 13:39本頁面
  

【正文】 。//拉高電平,準(zhǔn)備讀取。 _nop_()。 _nop_()。 dq=0。//拉低電平,開始讀時間隙。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 dq=1。 //將端口置1,以便把數(shù)據(jù)輸入至單片機(jī)。 _nop_()。 _nop_()。 _nop_()。 _nop_()。 v=dq。//讀取值。 18b20_delay (12)。 return v。}void ds18b20_write(bit v){ dq=1。//拉高電平,準(zhǔn)備寫ds18b20_delay(1)。dq=0。//開始寫時間隙dq=v。//發(fā)送數(shù)據(jù) ds18b20_delay(12)。 dq=1。 //拉高引腳,以便于下次的寫數(shù)據(jù)。 ds18b20_delay(1)。}上面兩個程序僅是讀寫一位數(shù)據(jù)的,但是在實際應(yīng)用當(dāng)中,需要讀取一個字節(jié)或?qū)懸粋€字節(jié)數(shù)據(jù)(8為數(shù)據(jù)),以上程序顯然不能滿足要求。因此編寫了讀/寫一字節(jié)的函數(shù),具體可見源程序中的ds18b20_rd()和ds18b20_wr()函數(shù)。(4)讀取溫度讀取溫度值的程序如下:readtemp(){ unsigned char templ,temph,temp,temperature。 ds18b20_init(); //初始化。 ds18b20_wr(0xcc);//跳過序列號。ds18b20_wr(0x44);//啟動溫度轉(zhuǎn)換。ds18b20_delay(150);//溫度的轉(zhuǎn)換需要時間。ds18b20_init(); ds18b20_wr(0xcc);ds18b20_wr(0xbe); //讀溫度寄存器,關(guān)鍵是讀寄存器中的頭兩個字節(jié),分別存儲著溫度的低位和高位。 templ =ds18b20rd()。 //讀溫度的低字節(jié)。 temph =ds18b20rd()。 //讀溫度的高字節(jié)。temp= temph*+templ;//將高低部分的溫度數(shù)值相加。 temperature= temp*;//轉(zhuǎn)化為實際的溫度。return temperature。} 測濕程序 SHT11的工作原理及流程圖(1) SHT11的工作原理串行時鐘輸入 (SCK)SCK 用于微處理器與 SHT11 之間的通訊同步。由于接口包含了完全靜態(tài)邏輯,因而不存在最小 SCK 頻率。串行數(shù)據(jù) (DATA)DATA三態(tài)門用于數(shù)據(jù)的讀取。DATA在SCK時鐘下降沿之后改變狀態(tài),并僅在 SCK 時鐘上升沿有效。數(shù)據(jù)傳輸期間,在SCK時鐘高電平時,DATA必須保持穩(wěn)定。為避免信號沖突,微處理器應(yīng)驅(qū)動 DATA 在低電平。需要一個外部的上拉電阻(例如:10kΩ)將10k信號提拉至高電平。上拉電阻通常已包含在微處理器的 I/O 電路中。發(fā)送命令 用一組“啟動傳輸”時序,來表示數(shù)據(jù)傳輸?shù)某跏蓟Kǎ寒?dāng)SCK時鐘高電平時DATA翻轉(zhuǎn)為低電平,緊接著 SCK 變?yōu)榈碗娖?,隨后是在 SCK 時鐘高電平時 DATA 翻轉(zhuǎn)為高電平。后續(xù)命令包含三個地址位(目前只支持“000”),和五個命令位。SHT11 會以下述方式表示已正確地接收到指令:在第 8 個 SCK 時鐘的下降沿之后,將 DATA下拉為低電平(ACK 位)。在第 9個 SCK 時鐘的下降沿之后,釋放 DATA(恢復(fù)高電平)。表3—1便是SHT11的命令集。表3—1 SHT11命令集命令代碼預(yù)留0000x溫度測濕00011濕度測濕00101讀狀態(tài)寄存器00111寫狀態(tài)寄存器00110預(yù)留0101x~1110x軟復(fù)位,復(fù)位接口、清空狀態(tài)寄存器為默認(rèn)值,下一次命令前等待至少11ms11110測量時序(RH 和T) 發(fā)布一組測量命令(‘00000101’表示相對濕度 RH,‘00000011’表示溫度 T)后,控制器要等待測量結(jié)束。這個過程需要大約 20/80/320ms,分別對應(yīng)8/12/14bit測量。確切的時間隨內(nèi)部晶振速度,最多可能有30%的變化。SHT11通過下拉DATA至低電平并進(jìn)入空閑模式,表示測量的結(jié)束??刂破髟谠俅斡|發(fā)SCK 時鐘前,必須等待這個“數(shù)據(jù)備妥”信號來讀出數(shù)據(jù)。檢測數(shù)據(jù)可以先被存儲,這樣控制器可以繼續(xù)執(zhí)行其它任務(wù)在需要時再讀出數(shù)據(jù)。接著傳輸2個字節(jié)的測量數(shù)據(jù)和1個字節(jié)的CRC奇偶校驗。單片機(jī)需要通過下拉DATA為低電平,以確認(rèn)每個字節(jié)。所有的數(shù)據(jù)從 MSB 開始,右值有效(例如:對于 12bit 數(shù)據(jù),從第 5個SCK 時鐘起算作 MSB;而對于 8bit 數(shù)據(jù),首字節(jié)則無意義)。用 CRC 數(shù)據(jù)的確認(rèn)位,表明通訊結(jié)束。如果不使用CRC8校驗,控制器可以在測量值LSB后,通過保持確認(rèn)位ACK高電平來中止通訊。在測量和通訊結(jié)束后,SHT11自動轉(zhuǎn)入休眠模式。通訊復(fù)位時序 如果與 SHT11通訊中斷,下列信號時序可以復(fù)位串口: 當(dāng)DATA保持高電平時,觸發(fā)SCK時鐘9次或更多;在下一次指令前,發(fā)送一個“傳輸啟動”時序,這些時序只復(fù)位串口,狀態(tài)寄存器內(nèi)容仍然保留。(2) SHT11的軟件流程圖SHT11的軟件流程圖如圖3—7所示。圖3—7 SHT11的軟件流程圖 源程序(1)啟動傳輸void transstart(){ SCK=1。_nop_()。 DATA=0。 //當(dāng)SCK時鐘高電平時DATA翻轉(zhuǎn)為低電平_nop_()。 SCK=0。 //緊接著 SCK 變?yōu)榈碗娖絖nop_()。_nop_()。_nop_()。 SCK=1。_nop_()。 DATA=1。 //隨后是在 SCK 時鐘高電平時 DATA 翻轉(zhuǎn)為高電平_nop_()。 SCK=0。 //拉低,置回到原先的狀態(tài),為下次的使用做好準(zhǔn)備}(2)寫入命令子函數(shù)uchar write_byte(uchar value) { uchar i。 for(i=0x80。i0。i=i/2) //對i的賦值連續(xù)的變化,從1000 0000~0000 0001 { if(iamp。value) //對value的每一位進(jìn)行測試,看是1還是0,最后賦值 DATA=1。 else DATA=0。 SCK=1。 //SCK從低電平跳變?yōu)楦唠娖綍r,單片機(jī)向SHT11寫數(shù)據(jù) _nop_()。_nop_()。_nop_()。 SCK=0。 } //單片機(jī)完成向SHT11寫命令的過程 DATA=1。 SCK=1。 error=DATA。 SCK=0。 return error。}對程序最后幾句語句這里做一下解釋。前面已經(jīng)說明了,SHT11會以下述方式表示已正確地接收到指令:在第 8個 SCK 時鐘的下降沿之后,將 DATA下拉為低電平(ACK 位),并且在第 9個 SCK 時鐘的下降沿之后,釋放 DATA(恢復(fù)高電平)。因此在第8個時鐘的下降沿到第9個時鐘的下降沿之間SHT11應(yīng)該是將DATA拉低為低電平。這時首先故意將DATA拉高,如果在8與9兩個時鐘之間DATA不變?yōu)榈?,那么表示SHT11未正確接收到信號,也就是說如果error =1,就表示傳輸出錯了。(3)讀取數(shù)據(jù)子函數(shù)uchar read_byte(bit ACK){ uchar i,val=0。 DATA=1。 for(i=0x80。i0。i=i/2) //對i的賦值連續(xù)的變化,從1000 0000~0000 0001 { SCK=1。 if(DATA) val=val|i。 SCK=0。 } //當(dāng)DATA為1時,表示該位為1,那么只需要將val的對應(yīng)位與i相或,便得到1;否則就將保持對應(yīng)位上的0不變 DATA=! ACK。 SCK=1。 _nop_()。_nop_()。_nop_()。 SCK=0。 DATA=1。 return val。}對程序的最后幾句語句在這做一下解釋。前文已經(jīng)敘述過了,如果不使用CRC8校驗,控制器可以在測量值LSB后,通過保持確認(rèn)位ACK高電平來中止通訊。本設(shè)計采用的是默認(rèn)的濕度測量分辨率(12位),并且采用ACK的高低電平來停止或繼續(xù)通訊。這也就是說對與12位的數(shù)據(jù),高位對應(yīng)的應(yīng)該是ACK=1,! ACK=0可繼續(xù)進(jìn)行通訊;低位對應(yīng)的是ACK=0,! ACK=1停止通訊。(4) 測量子函數(shù)uint measure(){ uchar value_1,value_2。 uint tempvalue。 transstart()。 error+=write_byte(MEASURE_HUMI)。 //MEASURE_HUMI定義為濕度測試命令 if(error!=0) connectionreset()。//如果傳輸出錯,那么就復(fù)位 else { while(DATA==1) _nop_()。//數(shù)據(jù)傳輸期間,在SCK時鐘高電平時,DATA必須保持穩(wěn)定。為避免信號沖突,微處理器應(yīng)驅(qū)動 DATA 在低電平 if(DATA==0) { value_1=read_byte(ACK)。 value_2=read_byte(noACK)。 tempvalue=value_2+value_1*256。 //轉(zhuǎn)換成16位的int型 } else error=1。 } return tempvalue。} (5) 計算濕度值子函數(shù)該程序段最主要的功能是將檢測到的數(shù)據(jù)轉(zhuǎn)化為相應(yīng)的濕度數(shù)據(jù)。float calc_humi(float humivalue){ const float c1=,c2=,c3=,t1=,t2=。 float rh=humivalue。 float rhlin。 float rhtrue。 uchar i。 rhlin=c1+c2*rh+c3*rh*rh。 rhtrue=()*(t1+t2*rh)+rhlin。 if(rhtrue100) rhtrue=100。 if(rhtrue) rhtrue=。 humivalue=rhtrue。 for(i=100。i0。i) display(humivalue)。 return humivalue。} 鍵盤程序矩陣鍵盤的軟件流程圖如圖3—8所示。圖3—8 矩陣鍵盤的軟件流程圖常用的矩陣鍵盤鍵識別方法有掃描法和線反轉(zhuǎn)法兩種。這兩種方法的原理可以簡述如下:掃描法先是首先確定是否有鍵按下,然后再進(jìn)行判斷是哪個鍵;行列反轉(zhuǎn)法就是將行線和列線分別做為輸入和輸出,從而得知按鍵所在行線和列線。本設(shè)計采用的是掃描法。掃描法又分為程序掃描、定時掃描和中斷掃描。本文選擇的是程序掃描法對鍵盤進(jìn)行識別,讀取鍵狀態(tài)。程序掃描實際上是指在特定的程序位置段上安排鍵盤掃描程序讀取鍵盤狀態(tài),主要完成判斷鍵是否被按下、按鍵消抖處理、按鍵定位等操作。矩陣鍵盤按鍵的兩端都與單片機(jī)的I/O口連接,掃描過程可以描述為:先使行線輸出為低電平,看列線的變化。如果列線輸出為高電平,說明沒有按鍵按下;如果輸出有低電平,說明有按鍵按下。判斷完有鍵按下后,可以具體的找出是哪個鍵按下了??墒鼓骋恍校ㄔO(shè)為第N行)的輸出為低電平,其余行為高電平,接著就看列線的輸出。如果列線的輸出為高電平,說明沒有鍵按下;如果某一行(設(shè)為第M列)輸出為低電平,說明第N行第M列的鍵被按下了。舉一個具體的例子,比如說圖中的S5鍵按下了,那么檢測的具體步驟可以描述如下:首先使第一行的輸出為低電平,其余行為高電平,查看列線的狀態(tài)發(fā)現(xiàn)輸出全為高電平;然后使第二行的輸出為低電平,其余行的輸出為高電平,查看列線的輸出發(fā)現(xiàn)第一列輸出為低電平,其余列為高電平。這樣就可以唯一的確定按鍵S5被按下了。 源程序 (1)掃描第一行的源程序 由圖可以知道,~,~。Float keydata(void){unsigned char n。P0=0xfe。// 對P0口輸入1111 1110,就是使得第一條行線輸入為低電平,而其余行線輸入為高電平。如果有按鍵按下的話,~。n=P0。//將當(dāng)前P0口輸出的狀態(tài)讀進(jìn)來。namp。=P0。 //~。if(n!=oxf0)//~,那么就不執(zhí)行下面的程序段;如果發(fā)生變化,說明有鍵按下,則開始執(zhí)行下面的程序段來確認(rèn)鍵值。 { delay()。 P0=0xfe。 n=P0。 namp。=0xf0。 //相與的目的是為了找出到底是哪條列線的狀態(tài)發(fā)生了改變。if(n!=0xf0){switch(){case(0xe0):return(0)。 //如果n為1110 0000(e0),即第一行第一列,那么就可以確定是S1,用顯示程序display輸出。case(0xd0): return (1)。case(0xb0): return (2)。case(0x70): return (3)。}}}} (2)在判斷完按鍵序號后,還需要等待按鍵被釋放,檢測釋放語句如下:while(temp!=0xf0){temp=P1。 temp=tempamp。0xf0。}不斷讀取P1口的數(shù)據(jù),然后和0xf0“與”運算,只要結(jié)果不等于0xf0,則說明按鍵沒有被釋放,直到釋放按鍵,程序才退出while語句。 顯示程序 12864軟件相關(guān)
點擊復(fù)制文檔內(nèi)容
職業(yè)教育相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1