基于單片機(jī)的5層電梯控制系統(tǒng)設(shè)計(jì)資料_第1頁
基于單片機(jī)的5層電梯控制系統(tǒng)設(shè)計(jì)資料_第2頁
基于單片機(jī)的5層電梯控制系統(tǒng)設(shè)計(jì)資料_第3頁
基于單片機(jī)的5層電梯控制系統(tǒng)設(shè)計(jì)資料_第4頁
基于單片機(jī)的5層電梯控制系統(tǒng)設(shè)計(jì)資料_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

《微機(jī)原理及接口技術(shù)》課程設(shè)計(jì)說明書設(shè)計(jì)題目:基于單片機(jī)的5層電梯控制系統(tǒng)設(shè)計(jì)設(shè)計(jì)人:指導(dǎo)教師:專業(yè)班級(jí):電子信息工程2013-3所在學(xué)院:電子通信與物理學(xué)院2006年7月課程設(shè)計(jì)任務(wù)書專業(yè)電子信息工程班級(jí)2013-3學(xué)生1.設(shè)計(jì)題目:基于單片機(jī)的5層電梯控制系統(tǒng)設(shè)計(jì)2.設(shè)計(jì)專題:3.設(shè)計(jì)原始資料:[1]譚浩強(qiáng)C程序設(shè)計(jì)(第三版)清華大學(xué)出社;[2]何賓STC單片機(jī)原理及應(yīng)用清華大學(xué)出版社;[3]王選民智能儀器原理及設(shè)計(jì)清華大學(xué)出版社.4.設(shè)計(jì)應(yīng)解決的主要問題:1>選擇單片機(jī)及必備外設(shè),設(shè)計(jì)5層電梯控制系統(tǒng)。2>系統(tǒng)實(shí)現(xiàn)5層電梯的上下、開關(guān)門、異常報(bào)警等。3>系統(tǒng)日歷、溫濕度檢測(cè)等功能。5.附件:protues,keil,程序6.命題發(fā)出日期:2006.7.3設(shè)計(jì)完成日期:2006.7.14指導(dǎo)教師(簽章):系主任(簽章):指導(dǎo)教師對(duì)課程設(shè)計(jì)的評(píng)語指導(dǎo)教師(簽章):日期:摘要摘要隨著社會(huì)的不斷發(fā)展,樓房越來越高,而電梯則成了高層樓房的必須設(shè)備。電梯從手柄開關(guān)操縱電梯、按鈕控制電梯發(fā)展到了現(xiàn)在的群控電梯,為高層運(yùn)輸做出了不可磨滅的貢獻(xiàn)。

單片機(jī)在電梯升降控制上的應(yīng)用主要體現(xiàn)在它的邏輯開關(guān)控制功能。由于單片機(jī)具有邏輯運(yùn)算,計(jì)數(shù)和定時(shí)以及數(shù)據(jù)輸入輸出的功能,在電梯升降過程中,各種邏輯開關(guān)控制與單片機(jī)很好的結(jié)合,很好的實(shí)現(xiàn)了對(duì)升降的控制。同時(shí),電梯中可以顯示溫濕度以及實(shí)時(shí)時(shí)間,為人們的出行乘坐電梯提供了方便。因此設(shè)計(jì)出一款基于單片機(jī)的電梯控制系統(tǒng),并顯示精度高、穩(wěn)定性好、能報(bào)警的溫濕度顯示系統(tǒng)及電子萬年歷具有重要實(shí)際意義。關(guān)鍵字AT89C51;AT89C52;ULN2003A,CD4511,SHT10,DS1302目錄溫濕度顯示報(bào)警系統(tǒng)及電子萬年歷的設(shè)計(jì)確定設(shè)計(jì)方案.............................................31.1溫濕度顯示報(bào)警系統(tǒng)的設(shè)計(jì)方案.............................31.2電子萬年歷的設(shè)計(jì)方案.....................................3邏輯總框圖...............................................4系統(tǒng)硬件電路的設(shè)計(jì).......................................53.1主控制電路..............................................53.2振蕩電路................................................53.3復(fù)位電路................................................63.4溫濕度測(cè)量及傳感器介紹..................................63.5電子萬年歷時(shí)鐘芯片介紹..................................83.6顯示電路................................................93.7報(bào)警電路...............................................10仿真與調(diào)試.............................................114.1溫濕度仿真原理圖.......................................114.2電子萬年歷仿真原理圖...................................11電梯控制系統(tǒng)的設(shè)計(jì)方案論證.............................................12電梯控制器原理圖.....................................13電梯硬件電路的設(shè)計(jì)...................................133.1單片機(jī)最小系統(tǒng).......................................133.2電梯外部電路.........................................143.3電機(jī)驅(qū)動(dòng)電路.........................................153.4樓層顯示電路.........................................15調(diào)試..................................................16總結(jié)體會(huì).............................................17參考文獻(xiàn).............................................18五、附錄(程序)摘要摘要:隨著社會(huì)的不斷發(fā)展,樓房越來越高,而電梯則成了高層樓房的必須設(shè)備。電梯從手柄開關(guān)操縱電梯、按鈕控制電梯發(fā)展到了現(xiàn)在的群控電梯,為高層運(yùn)輸做出了不可磨滅的貢獻(xiàn)。

單片機(jī)在電梯升降控制上的應(yīng)用主要體現(xiàn)在它的邏輯開關(guān)控制功能。由于單片機(jī)具有邏輯運(yùn)算,計(jì)數(shù)和定時(shí)以及數(shù)據(jù)輸入輸出的功能,在電梯升降過程中,各種邏輯開關(guān)控制與單片機(jī)很好的結(jié)合,很好的實(shí)現(xiàn)了對(duì)升降的控制。同時(shí),電梯中可以顯示溫濕度以及實(shí)時(shí)時(shí)間,為人們的出行乘坐電梯提供了方便。因此設(shè)計(jì)出一款基于單片機(jī)的電梯控制系統(tǒng),并顯示精度高、穩(wěn)定性好、能報(bào)警的溫濕度顯示系統(tǒng)及電子萬年歷具有重要實(shí)際意義。關(guān)鍵字AT89C51;AT89C52;ULN2003A,CD4511,SHT10,DS1302溫濕度顯示報(bào)警系統(tǒng)及電子萬年歷的設(shè)計(jì)確定設(shè)計(jì)方案1.1溫濕度顯示報(bào)警系統(tǒng)的設(shè)計(jì)方案溫濕度報(bào)警系統(tǒng)的設(shè)計(jì)以單片機(jī)AT89C51為核心,利用溫濕度傳感器SHT10,通過控制單片機(jī)的P1口的一些端口來調(diào)節(jié)當(dāng)前溫濕度的顯示,完成了溫濕度的顯示報(bào)警功能,在程序中設(shè)置溫濕度范圍后,達(dá)到指定范圍后讓LED燈的閃亮來實(shí)現(xiàn)溫濕度控制的效果,讓LED1602液晶屏接到單片機(jī)的串口上,賦值來控制1602的顯示。整個(gè)方案設(shè)計(jì)包含四個(gè)部分,即:?jiǎn)纹瑱C(jī)最小系統(tǒng)部分、顯示部分、溫濕度數(shù)據(jù)采集部分、報(bào)警部分。1.2電子萬年歷的設(shè)計(jì)方案電子萬年歷,系統(tǒng)分為主控模塊、時(shí)鐘電路模塊、按鍵掃描模塊,LCD顯示模塊,電源電路、復(fù)位電路、晶振電路等模塊。主控模塊采用AT89C52單片機(jī),按鍵模塊用四個(gè)按鍵,用于調(diào)整時(shí)間,顯示模塊采用LCD1602,顯示功能強(qiáng)大,利于控制。時(shí)鐘電路模塊采用DS1302時(shí)鐘芯片實(shí)現(xiàn)對(duì)時(shí)間、日期的操作。2、邏輯總框圖:溫濕度報(bào)警系統(tǒng)的總體設(shè)計(jì)框圖如下圖所示萬年歷的總體設(shè)計(jì)框圖如下圖所示。3系統(tǒng)硬件電路的設(shè)計(jì)3.1主控制系統(tǒng)溫濕度報(bào)警系統(tǒng)選用AT89C51單片機(jī)作為中央處理器。電子萬年歷選用AT89C52單片機(jī)作為中央處理器。3.2振蕩電路振蕩電路圖(3)所示,時(shí)鐘振蕩電路用于產(chǎn)生單片機(jī)正常工作時(shí)所需要的時(shí)鐘信號(hào),電路由兩個(gè)30pF的瓷片電容和一個(gè)12MHz的晶振組成,并接入到單片機(jī)的XTAL1和XTAL2引腳處,使單片機(jī)工作于內(nèi)部振蕩模式。此電路在加電后延遲大約10ms振蕩器起振,在XTAL2引腳產(chǎn)生幅度為3V左右的正弦波時(shí)鐘信號(hào),其振蕩頻率主要由石英晶振的頻率決定。電路中兩個(gè)電容C1、C2的作用使電路快速起振,提高電路的運(yùn)行速度。圖(3)時(shí)鐘振蕩電路圖圖(4)復(fù)位電路3.3復(fù)位電路復(fù)位RST

9

在振蕩器運(yùn)行時(shí),有兩個(gè)機(jī)器周期(24個(gè)振蕩周期)以上的高電平出現(xiàn)在此引腿時(shí),將使單片機(jī)復(fù)位,只要這個(gè)腳保持高電平,51芯片便循環(huán)復(fù)位。3.4溫濕度測(cè)量發(fā)布一組測(cè)量命令(?00000101‘表示相對(duì)濕度RH,?00000011‘表示溫度T)后,控制器要等待測(cè)量結(jié)束。這個(gè)過程需要大約20/80/320ms,分別對(duì)應(yīng)8/12/14bit

測(cè)量。確切的時(shí)間隨內(nèi)部晶振速度,最多可能有-30%的變化。SHT10通過下拉DATA

至低電平并進(jìn)入空閑模式,表示測(cè)量的結(jié)束。由于實(shí)際溫度與測(cè)試參考溫度25℃

(~77℉)的顯著不同,

濕度信號(hào)需要溫度補(bǔ)償。溫度校正粗略對(duì)應(yīng)于0.12%RH/℃@50%RH。

true

C

1

2

RH

linear

RH

=

T

?

25

?

t

+

t

?SO

+

RH

°SHT10引腳電源引腳VDD、GND

串行時(shí)鐘輸入SCK串行數(shù)據(jù)

DATA時(shí)鐘電路主要由時(shí)鐘芯片DS1302、備用電池、晶振等幾部分組成。圖(5)DS1302管腳圖圖(6)DS1302時(shí)鐘電路DS1302各引腳的功能為:8:Vcc1:備用電池端;1:Vcc2:5V電源。7:SCLK:串行時(shí)鐘,輸入;

6:I/O:數(shù)據(jù)輸入輸出口;5:CE/RST:復(fù)位腳;2、3:X1、X2是外接晶振腳(32.768KHZ的晶振);4:地(GND)。DS1302有關(guān)日歷、時(shí)間的寄存器:3.6顯示電路1602液晶也叫1602字符型液晶它是一種專門用來顯示字母、數(shù)字、符號(hào)等的點(diǎn)陣型液晶模塊它有若干個(gè)5X7或者5X11等點(diǎn)陣字符位組成,每個(gè)點(diǎn)陣字符位都可以顯示一個(gè)字符。7、報(bào)警電路圖

當(dāng)啟動(dòng)仿真程序時(shí),用手調(diào)節(jié)傳感器上的按鍵時(shí),可以調(diào)節(jié)溫度與濕度的數(shù)據(jù)轉(zhuǎn)換和相應(yīng)的溫濕度顯示數(shù)據(jù)的遞增或遞減。仿真與調(diào)試4.1溫濕度仿真原理圖4.2電子萬年歷仿真原理圖電梯控制系統(tǒng)的設(shè)計(jì)系統(tǒng)方案論證按照題目要求,電梯控制系統(tǒng)由中心控制模塊、用戶選擇樓層輸入模塊、電機(jī)控制與驅(qū)動(dòng)模塊和顯示等組成。

方案一

采用CPLD

器件作為控制中心,對(duì)整個(gè)系統(tǒng)的運(yùn)作進(jìn)行統(tǒng)一管理,但這種方案要求平時(shí)有很多的知識(shí)積累和較強(qiáng)的專業(yè)水平,實(shí)現(xiàn)起來比較困難且器件較貴,不符合經(jīng)濟(jì)要求,而且升降電機(jī)的控制,運(yùn)行時(shí)間的測(cè)量、顯示等還需要單片機(jī)的配合。

方案二

采用單片機(jī)為核心,擴(kuò)展相關(guān)的接口電路,實(shí)現(xiàn)全系統(tǒng)的控制,由于單片機(jī)技術(shù)目前較為成熟,自身資源豐富,硬件設(shè)計(jì)簡(jiǎn)單,并且我們?cè)谠O(shè)計(jì)中盡量用軟件代替硬件,可以節(jié)約成本,提高可靠性。另外單片機(jī)小系統(tǒng)價(jià)格便宜,符合經(jīng)濟(jì)性要求。同時(shí)電梯采用步進(jìn)電機(jī)進(jìn)行驅(qū)動(dòng),因?yàn)椴竭M(jìn)電機(jī)可經(jīng)直接接收數(shù)字信號(hào),用單片機(jī)控制非常方便,定位準(zhǔn)確,調(diào)速簡(jiǎn)單。比較適合此控制系統(tǒng)的要求。電梯控制器原理框圖電梯硬件電路的設(shè)計(jì)3.1單片機(jī)最小系統(tǒng)圖3.1單片機(jī)最小系統(tǒng)單片機(jī)最小系統(tǒng)電路如圖3-1所示,單片機(jī)采用ATMEL公司的AT89C51,晶體振蕩器選12MHz,C1、C2為30p瓷片電容,與晶體振蕩器構(gòu)成時(shí)鐘電路。電容C3按鍵RESET構(gòu)成上電復(fù)位和手動(dòng)復(fù)位電路。3.2電梯外部電路圖3.2矩陣鍵盤電路該矩陣鍵盤由14個(gè)按鍵組成,電源處接上拉電阻。第一排(F1、F2、F3、F4、F5)分別代表,進(jìn)入電梯內(nèi)部選擇目的樓層;第二排(U1、U2、U3、U4、START)分別代表電梯外部一樓至四樓選擇電梯上升以及電梯開動(dòng);第三排(D2、D3、D4、D5)代表二樓至五樓選擇電梯下降。程序編寫的時(shí)候采用列掃描法,若某一列有按鍵按下,通過延時(shí)消抖再次判斷,相應(yīng)的行線端口電平被拉低,若無鍵按下,則行線一直保持高電平。如圖3.2所示。3.3電機(jī)驅(qū)動(dòng)電路圖3.3電機(jī)驅(qū)動(dòng)電路此次采用了步進(jìn)電機(jī),步進(jìn)電機(jī)驅(qū)動(dòng)為ULN2003,工作時(shí)耐高壓、大電流,灌電流可達(dá)500mA,并且能夠在關(guān)態(tài)時(shí)承受50V的電壓,輸出還可以在高負(fù)載電流并行運(yùn)行。通過軟件部分控制電機(jī)正轉(zhuǎn)反轉(zhuǎn),實(shí)現(xiàn)電梯的升降。3.4樓層顯示電路圖3.4樓層顯示電路樓層顯示部分采用了七段共陰極數(shù)碼管,由顯示譯碼器CD4511驅(qū)動(dòng)。到達(dá)指定樓層將對(duì)應(yīng)樓層的代碼發(fā)送給CD4511,再轉(zhuǎn)譯給數(shù)碼管顯示。其中A、B、C、D為輸入端口,QA、QB、QC、QD、QE、QF、QG為輸出端口。BI是消隱輸入控制端,BI為0時(shí),數(shù)碼管處于熄滅狀態(tài),不顯示數(shù)字;BI為1時(shí),顯示數(shù)字。LT為測(cè)試輸入端,當(dāng)BI=1,LT=0時(shí),譯碼輸出全為1,不管ABCD的輸入狀態(tài),七段均發(fā)亮;BI=1,LT=1則正常譯碼顯示。LE為鎖定控制端,當(dāng)LE=0時(shí)允許譯碼輸出,LE=1時(shí)則保持之前狀態(tài)。調(diào)試首先按照最初電路設(shè)計(jì)進(jìn)行連接電路,然后寫入程序,再運(yùn)行測(cè)試。分別按下不同的鍵(不同樓層、上升或下降)測(cè)試顯示情況,出現(xiàn)錯(cuò)誤則查電路、找程序,直至修改運(yùn)行成功。三、總結(jié)與體會(huì)通過這次課程設(shè)計(jì),我們了解了基于51單片機(jī)的模擬電梯的相關(guān)設(shè)計(jì),也掌握了51單片機(jī)相關(guān)應(yīng)用,對(duì)以后的單片機(jī)深入學(xué)習(xí)及應(yīng)用打下基礎(chǔ)。此次設(shè)計(jì)要求軟硬件結(jié)合,使我們懂得了硬件設(shè)計(jì)與軟件編程同樣重要。硬件設(shè)計(jì)中的不足對(duì)軟件仿真結(jié)果有極大的影響,然而軟件設(shè)計(jì)運(yùn)行的不足同樣不能仿真成功,所以兩方面都要學(xué)好,都要弄懂,才能軟硬結(jié)合,實(shí)現(xiàn)更好地結(jié)果。此次課程設(shè)計(jì)我們?nèi)艘唤M分別不同的部分,其中靳湘楠負(fù)責(zé)電梯內(nèi)部溫濕度的檢測(cè)實(shí)現(xiàn),使電梯更人性化;常艷慧負(fù)責(zé)萬年歷時(shí)間的顯示部分,給乘客帶來方便;王光彩負(fù)責(zé)電梯控制部分,實(shí)現(xiàn)電梯的正常運(yùn)行。三人一組分工明確,相互幫助,實(shí)現(xiàn)了最終的結(jié)果。當(dāng)然,我們的設(shè)計(jì)也存在一些不足,電梯上下行的優(yōu)先順序沒能實(shí)現(xiàn),超重檢測(cè)部分、報(bào)警部分都可以加以實(shí)現(xiàn),由于時(shí)間緊迫,截止交課程設(shè)計(jì)報(bào)告只能進(jìn)行至此。不過還是要感謝老師的幫助,最終實(shí)現(xiàn)了電梯功能。參考文獻(xiàn)[1]譚浩強(qiáng)C程序設(shè)計(jì)(第三版)清華大學(xué)出版社[2]何賓STC單片機(jī)原理及應(yīng)用清華大學(xué)出版社[3]王選民智能儀器原理及設(shè)計(jì)清華大學(xué)出版社致謝頁面頁眉設(shè)置、字體、字號(hào)、打印格式同論文主體部分。2、溫濕度顯示#include<reg52.h>#include<intrins.h>#include<stdio.h>#include<string.h>#include<absacc.h>#include<math.h>#defineucharunsignedchar#defineuintunsignedint#defineTEMPUP28//溫度上限#defineTEMPDOWN0//溫度下限#defineHUMDOWN70//濕度上限#defineHUMUP10//濕度下限sbitLcdRs=P2^0;//1602液晶端口定義sbitLcdRw=P2^1;sbitLcdEn=P2^2;sbitled1=P3^0;//報(bào)警燈端口定義sbitled2=P3^4;sbitACC0=ACC^0;sbitACC7=ACC^7;bitstart;ucharstr[7];#defineLCD_COMMAND0//命令#defineLCD_DATA1//數(shù)據(jù)#defineLCD_CLEAR_SCREEN0x01//清屏#defineLCD_HOMING0x02//光標(biāo)返回原點(diǎn)//設(shè)置顯示模式************************************************************#defineLCD_SHOW0x04//顯示開#defineLCD_HIDE0x00//顯示關(guān)#defineLCD_CURSOR0x02//顯示光標(biāo)#defineLCD_NO_CURSOR0x00//無光標(biāo)#defineLCD_FLASH0x01//光標(biāo)閃動(dòng)#defineLCD_NO_FLASH0x00//光標(biāo)不閃動(dòng)//設(shè)置輸入模式************************************************************#defineLCD_AC_UP0x02#defineLCD_AC_DOWN0x00#defineLCD_MOVE0x01//畫面可平移#defineLCD_NO_MOVE0x00unsignedcharLCD_Wait(void);voidLCD_Write(bitstyle,unsignedcharinput);/***********1602液晶顯示部分子程序****************/voiddelay(uintz)//延時(shí)函數(shù){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}voidLCD_Write(bitstyle,unsignedcharinput){LcdRs=style;P0=input;delay(5);LcdEn=1;delay(5);LcdEn=0;}voidLCD_SetDisplay(unsignedcharDisplayMode)//設(shè)置輸出{LCD_Write(LCD_COMMAND,0x08|DisplayMode);}voidLCD_SetInput(unsignedcharInputMode)//設(shè)置輸入{LCD_Write(LCD_COMMAND,0x04|InputMode);}voidLCD_Initial()//初始化LCD函數(shù){LcdEn=0;LCD_Write(LCD_COMMAND,0x38);//8位數(shù)據(jù)端口,2行顯示,5*7點(diǎn)陣LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);//開啟顯示,無光標(biāo)LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);//AC遞增,畫面不動(dòng)}voidGotoXY(unsignedcharx,unsignedchary)//液晶字符輸入的位置{if(y==0)LCD_Write(LCD_COMMAND,0x80|x);if(y==1)LCD_Write(LCD_COMMAND,0x80|(x-0x40));}voidPrint(unsignedchar*str)//將字符輸出到液晶顯示{while(*str!='\0'){LCD_Write(LCD_DATA,*str);str++;}}voidzhuanhuan(floata)//浮點(diǎn)數(shù)轉(zhuǎn)換成字符串函數(shù){memset(str,0,sizeof(str));sprintf(str,"%f",a);}voidwelcome()//初始界面函數(shù){LCD_Initial();GotoXY(0,0);Print("Welcome!");GotoXY(0,1);Print("Codeofsht10");delay(200);}voiddelay_n10us(uintn)//延時(shí)n個(gè)10us@12M晶振{uinti;for(i=n;i>0;i--){nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}}/*********************第一部分LCD1602設(shè)置END****************************************//*********************第二部分SHT10設(shè)置START**************************************/sbitSCK=P1^0;//定義通訊時(shí)鐘端口sbitDATA=P1^1;//定義通訊數(shù)據(jù)端口typedefunion{unsignedinti;//定義了兩個(gè)共用體floatf;}value;enum{TEMP,HUMI};//TEMP=0,HUMI=1#definenoACK0//用于判斷是否結(jié)束通訊#defineACK1//結(jié)束數(shù)據(jù)傳輸#defineSTATUS_REG_W0x06//00000110#defineSTATUS_REG_R0x07//00000111#defineMEASURE_TEMP0x03//00000011#defineMEASURE_HUMI0x05//00000101#defineRESET0x1e//00011110/****************定義函數(shù)****************/voids_transstart(void);//啟動(dòng)傳輸函數(shù)voids_connectionreset(void);//連接復(fù)位函數(shù)chars_write_byte(unsignedcharvalue);//SHT10寫函數(shù)chars_read_byte(unsignedcharack);//SHT10讀函數(shù)chars_measure(unsignedchar*p_value,unsignedchar*p_checksum,unsignedcharmode);//測(cè)量溫濕度函數(shù)voidcalc_dht90(float*p_humidity,float*p_temperature);//溫濕度補(bǔ)償voids_transstart(void){DATA=1;SCK=0;//Initialstate_nop_();SCK=1;_nop_();DATA=0;_nop_();SCK=0;_nop_();_nop_();_nop_();SCK=1;_nop_();DATA=1;_nop_();SCK=0;}voids_connectionreset(void)//連接復(fù)位函數(shù){unsignedchari;DATA=1;SCK=0;//Initialstatefor(i=0;i<9;i++)//9SCKcycles{SCK=1;SCK=0;}s_transstart();//transmissionstart}chars_write_byte(unsignedcharvalue)//SHT10寫字節(jié)函數(shù){unsignedchari,error=0;for(i=0x80;i>0;i/=2)//shiftbitformasking{if(i&value)DATA=1;//maskingvaluewithi,writetoSENSI-BUSelseDATA=0;SCK=1;//clkforSENSI-BUS_nop_();_nop_();_nop_();//pulswithapprox.3usSCK=0;}DATA=1;//releaseDATA-lineSCK=1;//clk#9forackerror=DATA;//checkack(DATAwillbepulleddownbyDHT90),DATA在第9個(gè)上升沿將被DHT90自動(dòng)下拉為低電平。_nop_();_nop_();_nop_();SCK=0;DATA=1;//releaseDATA-linereturnerror;//error=1incaseofnoacknowledge//返回:0成功,1失敗}/*****SHT10讀函數(shù)readsabyteformtheSensibusandgivesanacknowledgeincaseof"ack=1"****/chars_read_byte(unsignedcharack){unsignedchari,val=0;DATA=1;//releaseDATA-linefor(i=0x80;i>0;i/=2)//shiftbitformasking{SCK=1;//clkforSENSI-BUSif(DATA)val=(val|i);//readbit_nop_();_nop_();_nop_();//pulswithapprox.3usSCK=0;}if(ack==1)DATA=0;//incaseof"ack==1"pulldownDATA-LineelseDATA=1;//如果是校驗(yàn)(ack==0),讀取完后結(jié)束通訊_nop_();_nop_();_nop_();SCK=1;_nop_();_nop_();_nop_();//pulswithapprox.usSCK=0;_nop_();_nop_();_nop_();//pulswithapprox.3usDATA=1;//releaseDATA-linereturnval;}chars_measure(unsignedchar*p_value,unsignedchar*p_checksum,unsignedcharmode){unsignederror=0;unsignedinti;s_transstart();switch(mode){caseTEMP:error+=s_write_byte(MEASURE_TEMP);break;caseHUMI:error+=s_write_byte(MEASURE_HUMI);break;default:break;}for(i=0;i<65535;i++)if(DATA==0)break;if(DATA)error+=1;*(p_value)=s_read_byte(ACK);*(p_value+1)=s_read_byte(ACK);*p_checksum=s_read_byte(noACK);returnerror;}voidcalc_sht90(float*p_humidity,float*p_temperature)//溫濕度補(bǔ)償函數(shù){constfloatC1=-4.0;constfloatC2=+0.0405;constfloatC3=-0.0000028;constfloatT1=+0.01;constfloatT2=+0.00008;floatrh=*p_humidity;//rh:Humidity[Ticks]12Bitfloatt=*p_temperature;//t:Temperature[Ticks]14Bitfloatrh_lin;//rh_lin:Humiditylinearfloatrh_true;//rh_true:Temperaturecompensatedhumidityfloatt_C;//t_C:Temperature[C]t_C=t*0.01-40;//calc.temperaturefromticksto[C]rh_lin=C3*rh*rh+C2*rh+C1;//calc.humidityfromticksto[%RH]rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //calc.temperaturecompensatedhumidity[%RH]if(rh_true>100)rh_true=100;//cutifthevalueisoutsideofif(rh_true<0.1)rh_true=0.1; //thephysicalpossiblerange*p_temperature=t_C; //returntemperature[C]*p_humidity=rh_true;//returnhumidity[%RH]}/**************第二部分SHT10設(shè)置END*****************************//***************************主函************************************/voidmain(void){valuehumi_val,temp_val;unsignedcharerror,checksum,i;LcdRw=0;led1=0;led2=0;start=0;s_connectionreset();welcome();//顯示歡迎畫面delay(2000);LCD_Initial();while(1){error=0;error+=s_measure((unsignedchar*)&humi_val.i,&checksum,HUMI);error+=s_measure((unsignedchar*)&temp_val.i,&checksum,TEMP);if(error!=0)s_connectionreset();else{humi_val.f=(float)humi_val.i;temp_val.f=(float)temp_val.i;calc_sht90(&humi_val.f,&temp_val.f);//計(jì)算濕度與溫度GotoXY(0,0);Print("Tep:");GotoXY(0,1);Print("Hum:");zhuanhuan(temp_val.f);//轉(zhuǎn)換溫度為uchar方便液晶顯示GotoXY(5,0);str[5]=0xDF;//℃的符號(hào)str[6]=0x43;str[7]='\0';Print(str);if(temp_val.f>TEMPUP-1||temp_val.f<TEMPDOWN-1)led1=1;elseled1=0;zhuanhuan(humi_val.f);//轉(zhuǎn)換濕度為uchar方便液晶顯示GotoXY(5,1);str[5]='%';//%的符號(hào)str[6]='\0';//字符串結(jié)束標(biāo)志Print(str);if(humi_val.f>HUMUP-1||humi_val.f<HUMDOWN-1)led2=1;elseled2=0;}delay_n10us(80000);//延時(shí)約0.8s}}3、萬年歷#include<reg51.h>#include<intrins.h>#include<string.h>#defineuintunsignedint#defineucharunsignedcharsbitIO=P1^0; //DS1302數(shù)據(jù)線sbitSCLK=P1^1; //DS130時(shí)鐘線sbitRST=P1^2; //DS1302復(fù)位線sbitRS=P2^0; //LCD數(shù)據(jù)/命令選擇端sbitRW=P2^1; //LCD讀/寫控制sbitEN=P2^2; //LCD使能端sbitK1=P3^4; //選擇sbitK2=P3^5; //加sbitK3=P3^6; //減sbitK4=P3^7; //確定uchartCount=0;ucharMonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31};uchar*WEEK[]={"SUN","MON","TUS","WEN","THU","FRI","SAT"};ucharLCD_DSY_BUFFER1[]={"DATE00-00-00"};//顯示格式ucharLCD_DSY_BUFFER2[]={"TIME00:00:00"};ucharDateTime[7]; //所讀取的日期時(shí)間charAdjust_Index=-1;//當(dāng)前調(diào)節(jié)的時(shí)間對(duì)象:,,分,是,日,月,(1,2,3,4,6)ucharChange_Flag[]="-MHDM-Y"; //(分,時(shí),日,月,年)(不調(diào)節(jié)秒與周)/*---------延時(shí)程序------------------*/voidDelayMS(uintms){ uchari; while(ms--){for(i=0;i<120;i++);}}//-----------向DS1302寫入一字節(jié)------------------//voidWrite_A_Byte_TO_DS1302(ucharx){ uchari; for(i=0;i<8;i++){ IO=x&0x01; //每一位與1與存入IO中 SCLK=1;SCLK=0; //一個(gè)高脈沖將數(shù)據(jù)送入液晶控制器 x>>=1; //右移 }}//-----------從DS1302讀取一字節(jié)------------------//ucharGet_A_Byte_FROM_DS1302(){ uchari,b=0x00; for(i=0;i<8;i++){ b|=_crol_((uchar)IO,i); SCLK=1;SCLK=0; //每一個(gè)高脈沖讀取一位數(shù)據(jù) } returnb/16*10+b%16;//返回BCD碼}//-----------從DS1302指定位置讀數(shù)據(jù)------------------//ucharRead_Data(ucharaddr){ uchardat; RST=0;SCLK=0;RST=1; //RST高電平時(shí)讀/寫 Write_A_Byte_TO_DS1302(addr); //先寫入地址 dat=Get_A_Byte_FROM_DS1302();SCLK=1;RST=0; returndat;}//---------向DS1302某地址寫入數(shù)據(jù)--------------------//voidWrite_DS1302(ucharaddr,uchardat){ SCLK=0;RST=1; Write_A_Byte_TO_DS1302(addr); Write_A_Byte_TO_DS1302(dat); SCLK=0;RST=0; //高脈沖寫入數(shù)據(jù)}//--------------設(shè)置時(shí)間----------------//voidSET_DS1302(){ uchari;//寫控制字,取消寫保護(hù) Write_DS1302(0x8E,0x00);//分時(shí)日月年依次寫入 for(i=1;i<7;i++) {//分的起始地址10000010(0x82),后面依次是時(shí),日,月,周,年,寫入地址每次遞增2Write_DS1302(0x80+2*i,(DateTime[i]/10<<4)|(DateTime[i]%10)); } Write_DS1302(0x8E,0x80);//加保護(hù)}//----------讀取當(dāng)前日期時(shí)間------------//voidGetTime(){uchari; for(i=0;i<7;i++){ DateTime[i]=Read_Data(0X81+2*i);}}//-----------讀LCD狀態(tài)------------------//ucharRead_LCD_State(){ ucharstate; RS=0;RW=1;EN=1; //輸出:D0~D7=狀態(tài)字 DelayMS(1); state=P0; //從P0口讀LCD狀態(tài) EN=0;DelayMS(1); returnstate;}//-----------忙等待------------------//voidLCD_Busy_Wait(){ while((Read_LCD_State()&0x80)==0x80); DelayMS(5);} //-----------向LCD寫數(shù)據(jù)------------------//voidWrite_LCD_Data(uchardat){ LCD_Busy_Wait(); RS=1;EN=0;RW=0; //寫數(shù)據(jù),EN為高脈沖, P0=dat;EN=1;DelayMS(1);EN=0; }//-------------寫LCD指令-------------------//voidWrite_LCD_Command(ucharcmd){ LCD_Busy_Wait(); RS=0;EN=0; RW=0;//寫指令,EN高脈沖,輸出:D0~D7=數(shù)據(jù) P0=cmd;EN=1;DelayMS(1);EN=0; }//-------------LCD初始化-------------------//voidInit_LCD(){ Write_LCD_Command(0x38);//設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口 DelayMS(1); Write_LCD_Command(0x01);//顯示清零,數(shù)據(jù)指針清零 DelayMS(1); Write_LCD_Command(0x06);//寫一個(gè)字符后地址指針自動(dòng)加1 DelayMS(1); Write_LCD_Command(0x0c);//設(shè)置開顯示,不顯示光標(biāo) DelayMS(1); }//------------------------------------------//設(shè)置液晶顯示位置//------------------------------------------voidSet_LCD_POS(ucharp){ Write_LCD_Command(p|0x80);//相當(dāng)于在0x80基礎(chǔ)上加入位置量 }//----在LCD上顯示字符串---------//voidDisplay_LCD_String(ucharp,uchar*s){ uchari; Set_LCD_POS(p); for(i=0;i<16;i++) { Write_LCD_Data(s[i]);//在固定位置顯示時(shí)間日期 DelayMS(1); }}//---------日期與時(shí)間值轉(zhuǎn)換為數(shù)字字符----------------//voidFormat_DateTime(uchard,uchar*a){ a[0]=d/10+'0'; a[1]=d%10+'0';}//判斷是否為閏年ucharisLeapYear(uinty){ return(y%4==0&&y%100!=0)||(y%400==0);}//求自2000.1.1開始的任何一天是星期幾//函數(shù)沒有通過,求出總天數(shù)后再求星期幾//因?yàn)榍罂偺鞌?shù)可能會(huì)超出uint的范圍voidRefreshWeekDay(){ uinti,d,w=5; //已知1999.12.31是周五 for(i=2000;i<2000+DateTime[6];i++) { d=isLeapYear(i)?366:365; w=(w+d)%7; } d=0; for(i=1;i<DateTime[4];i++) { d+=MonthsDays[i]; } d+=DateTime[3]; //保存星期,0~6表示星期日,星期一,二,...,六,為了與DS1302的期格式匹配,返回值需要加 DateTime[5=(w+d)%7+1;//*****年月日時(shí)分++/--********//voidDateTime_Adjust(charx){ switch(Adjust_Index) { case6: //年00-99 if(x==1&&DateTime[6]<99)DateTime[6]++; if(x==-1&&DateTime[6]>0)DateTime[6]--; //獲取2月天數(shù) MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28; //如果年份變化后當(dāng)前月份的天數(shù)大于上限則設(shè)為上限 if(DateTime[3]>MonthsDays[DateTime[4]]) { DateTime[3]=MonthsDays[DateTime[4]];} RefreshWeekDay();//刷新星期 break; case4: //月01-12 if(x==1&&DateTime[4]<12)DateTime[4]++; if(x==-1&&DateTime[4]>1)DateTime[4]--; MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28; if(DateTime[3]>MonthsDays[DateTime[4]]) { DateTime[3]=MonthsDays[DateTime[4]];} RefreshWeekDay(); break; case3: //日00-28、29、30、31,調(diào)節(jié)之前首先根據(jù)年份得出該年中二月的天數(shù) MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28; //根據(jù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論