版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
目錄1.前言32.總體設(shè)計(jì)框架32.1實(shí)現(xiàn)的功能32.2總體程序流程圖43.水溫采集模塊程序設(shè)計(jì)53.1DS18B20簡介53.2DS18B20的初始化63.3DS18B20寫周期73.4DS18B20讀周期83.5溫度讀取程序94.顯示模塊程序設(shè)計(jì)114.1LCD1602初始化114.2LCD1602寫周期125.定時(shí)模塊程序設(shè)計(jì)135.1定時(shí)器設(shè)置145.2定時(shí)器中斷子程序156.中斷模塊程序設(shè)計(jì)166.1外部中斷設(shè)置166.2鍵盤掃描中斷子程序167.整體編程的實(shí)現(xiàn)178.設(shè)計(jì)過程中的問題及解決方案189.收獲與感悟191.前言隨著社會(huì)進(jìn)步與經(jīng)濟(jì)開展,人們對(duì)生活質(zhì)量的要求越來越高,每天的飲水量是衡量健康的重要指標(biāo)。但有多少人因?yàn)槊β档墓ぷ鞫焱浐人慨?dāng)你感到口渴想要喝水的時(shí)候,體內(nèi)的失水已經(jīng)到達(dá)2%,口渴本身其實(shí)是體內(nèi)已經(jīng)嚴(yán)重缺水的表現(xiàn),這是造成
“亞健康”狀態(tài)的致命習(xí)慣之一。同時(shí),越不注意喝水,喝水的欲望就會(huì)越低,人就會(huì)變得越來越缺水。研究說明,通常情況下,正常人每次喝水應(yīng)控制在300ml,間隔時(shí)間為30到60分鐘。本課程設(shè)計(jì)就此設(shè)計(jì)出一款智能水杯,用來智能顯示水溫和提醒喝水,既方便了生活,又保持了健康。本報(bào)告針對(duì)智能水杯的軟件系統(tǒng)進(jìn)行闡述,軟件編程在keil上操作。2.總體設(shè)計(jì)框架2.1實(shí)現(xiàn)的功能STC89C51控制器STC89C51控制器LCD溫度顯示溫度讀入溫度提示燈DS18B20外部中斷定時(shí)開啟按鍵定時(shí)器中斷蜂鳴器提醒設(shè)置圖1硬件結(jié)構(gòu)簡圖〔1〕水溫檢測(cè)使用DS18B20溫度傳感器,完成水溫的時(shí)時(shí)檢測(cè)功能?!?〕水溫及定時(shí)時(shí)間顯示使用LCD1602液晶顯示屏,完成水溫及定時(shí)時(shí)間的顯示功能。〔3〕智能提醒使用定時(shí)器0,開啟定時(shí)器中斷,蜂鳴器提醒。〔4〕定時(shí)時(shí)間設(shè)置使用外部中斷0擴(kuò)展電路,用三個(gè)按鍵觸發(fā)中斷,完成對(duì)應(yīng)定時(shí)開啟和定時(shí)時(shí)間加減的功能。2.2總體程序流程圖總體程序流程圖分為主程序和中斷程序兩局部,其中中斷程序分為外部中斷程序和定時(shí)器中斷程序。流程圖如下列圖所示。開始開始DS18B20檢測(cè)水溫LCD1602顯示水溫結(jié)束水溫>40℃?高溫提示燈紅燈亮適宜水溫黃燈亮低溫提示燈藍(lán)燈亮YN水溫<20℃?YN初始化外部0中斷?外部0中斷?執(zhí)行按鍵掃描程序關(guān)閉計(jì)時(shí)器定時(shí)時(shí)間減少,LCD顯示定時(shí)時(shí)間增加,LCD顯示按鍵1按下?按鍵2按下?按鍵3按下?TR0=0?開啟計(jì)時(shí)器,LCD顯示定時(shí)器符號(hào)YYYNNYN圖2主程序流程圖圖3外部按鍵中斷流程圖蜂鳴器提醒,計(jì)數(shù)清零蜂鳴器提醒,計(jì)數(shù)清零LCD顯示定時(shí)時(shí)間減1中斷計(jì)數(shù)加1定時(shí)器中斷?一分鐘時(shí)間到達(dá)?定時(shí)時(shí)間到達(dá)?YYY圖4定時(shí)器中斷程序設(shè)計(jì)流程圖3.水溫采集模塊程序設(shè)計(jì)3.1DS18B20簡介DS18B20單線數(shù)字溫度傳感器,即“一線器件”,其具有獨(dú)特的優(yōu)點(diǎn):〔1〕采用單總線的接口方式,與微處理器連接時(shí),僅需要一條口線即可實(shí)現(xiàn)微處理器與DS18B20的雙向通訊。單總線具有經(jīng)濟(jì)性好,抗干擾能力強(qiáng),適合于惡劣環(huán)境的現(xiàn)場(chǎng)溫度測(cè)量,使用方便等優(yōu)點(diǎn),使用戶可輕松地組建傳感器網(wǎng)絡(luò),為測(cè)量系統(tǒng)的構(gòu)建引入全新概念。〔2〕測(cè)量溫度范圍寬,測(cè)量精度高DS18B20的測(cè)量范圍為-55℃~+125℃;在-10~+85°C范圍內(nèi),精度為±0.5°C?!?〕持多點(diǎn)組網(wǎng)功能多個(gè)DS18B20可以并聯(lián)在惟一的單線上,實(shí)現(xiàn)多點(diǎn)測(cè)溫。〔5〕供電方式靈活DS18B20可以通過內(nèi)部寄生電路從數(shù)據(jù)線上獲取電源。因此,當(dāng)數(shù)據(jù)線上的時(shí)序滿足一定的要求時(shí),可以不接外部電源,從而使系統(tǒng)結(jié)構(gòu)更趨簡單,可靠性更高?!?〕測(cè)量參數(shù)可配置DS18B20的測(cè)量分辨率可通過程序設(shè)定9~12位。3.2DS18B20的初始化主機(jī)首先發(fā)出一個(gè)480-960微秒的低電平脈沖,然后釋放總線變?yōu)楦唠娖?,并在隨后的480微秒時(shí)間內(nèi)對(duì)總線進(jìn)行檢測(cè),如果有低電平出現(xiàn)說明總線上有器件已做出應(yīng)答。假設(shè)無低電平出現(xiàn)一直都是高電平說明總線上無器件應(yīng)答。作為從圖5DS18B20初始化時(shí)序圖器件的DS18B20在一上電后就一直在檢測(cè)總線上是否有480-960微秒的低電平出現(xiàn),如果有,在總線轉(zhuǎn)為高電平后等待15-60微秒后將總線電平拉低60-240微秒做出響應(yīng)存在脈沖,告訴主機(jī)本器件已做好準(zhǔn)備。假設(shè)沒有檢測(cè)到就一直在檢測(cè)等待。初始化時(shí)序圖如圖5所示。/*****************************************************************函數(shù)名:Ds18b20Init*函數(shù)功能:初始化*輸入:無*輸出 :初始化成功返回1,失敗返回0****************************************************************/unsignedcharDs18b20Init(){ unsignedinti; Desport=0; //將總線拉低480us~960us i=70; while(i--);//延時(shí)642usDsport=1;//然后拉高總線,假設(shè)DS18B20做出反響會(huì)將在15us~60us后將總線拉低 i=0; while(Desport) //等待DS18B20拉低總線 { i++; if(i>50000)//等待>50MS return0;//初始化失敗 } return1;//初始化成功}3.3DS18B20寫周期寫周期最少為60微秒,最長不超過120微秒。寫周期一開始做為主機(jī)先把總線拉低1微秒表示寫周期開始。隨后假設(shè)主機(jī)想寫0,那么將總線置為低電平,假設(shè)主機(jī)想寫1,那么將總線置為高電平,持續(xù)時(shí)間最少60微秒直至寫周期結(jié)束,然后釋放總線為高電平至少1微秒給總線恢復(fù)。而DS18B20那么在檢測(cè)到總線被拉底后等待15微秒然后從15us到45us開始對(duì)總線采樣,在采樣期內(nèi)總線為高電平那么為1,假設(shè)采樣期內(nèi)總線為低電平那么為0。寫周期時(shí)序圖如圖6所示。圖6DS18B20寫周期時(shí)序圖/*****************************************************************函數(shù)名:Ds18b20WriteByte*函數(shù)功能:向18B20寫入一個(gè)字節(jié)*輸入:com*輸出 :無****************************************************************/voidDs18b20WriteByte(unsignedchardat){ unsignedinti,j; for(j=0;j<8;j++) { Desport=0; //每寫入一位數(shù)據(jù)之前先把總線拉低1us i++; Desport=dat&0x01;//然后寫入一個(gè)數(shù)據(jù),從最低位開始 i=6; while(i--);//延時(shí)68us,持續(xù)時(shí)間最少60us Desport=1; //然后釋放總線,至少1us給總線恢復(fù)時(shí)間才能接著寫入第二個(gè)數(shù)值 dat>>=1; }}3.4DS18B20讀周期讀周期是從主機(jī)把單總線拉低1微秒之后就得釋放單總線為高電平,以讓DS18B20把數(shù)據(jù)傳輸?shù)絾慰偩€上。作為從機(jī)DS18B20在檢測(cè)到總線被拉低1微秒后,便開始送出數(shù)據(jù),假設(shè)是要送出0就把總線拉為低電平直到讀周期結(jié)束。假設(shè)要送出1那么釋放總線為高電平。主機(jī)在一開始拉低總線1微秒后釋放總線,然后在包括前面的拉低總線電平1微秒在內(nèi)的15微秒時(shí)間內(nèi)完成對(duì)總線進(jìn)行采樣檢測(cè),采樣期內(nèi)總線為低電平那么確認(rèn)為0。采樣期內(nèi)總線為高電平那么確認(rèn)為1。完成一個(gè)讀時(shí)序過程至少需要60微秒才能完成。其讀周期的時(shí)序圖如圖7所示。圖7DS18B20讀周期時(shí)序圖/********************************************************************函數(shù)名:Ds18b20ReadByte*函數(shù)功能:讀取一個(gè)字節(jié)*輸入:com*輸出 :無****************************************************************/unsignedcharDs18b20ReadByte(){ unsignedcharbyte,bi; unsignedinti,j; for(j=8;j>0;j--) { Dsport=0;//先將總線拉低1us i++; Dsport=1;//然后釋放總線 i++; i++;//延時(shí)6us等待數(shù)據(jù)穩(wěn)定 bi=Dsport; //讀取數(shù)據(jù),從最低位開始讀取 byte=(byte>>1)|(bi<<7);/*將byte左移一位,然后與上右移7位后的bi,注意移動(dòng)之后移掉那位補(bǔ)0。*/ i=4; //讀取完之后等待48us再接著讀取下一個(gè)數(shù) while(i--); } returnbyte;}3.5溫度讀取程序簡單的讀取溫度值的步驟如下:跳過ROM操作發(fā)送溫度轉(zhuǎn)換命令跳過ROM操作發(fā)送讀取溫度命令讀取溫度值〔1〕溫度轉(zhuǎn)換指令:/*************************************************************函數(shù)名:Ds18b20ChangTemp*函數(shù)功能:讓18b20開始轉(zhuǎn)換溫度*輸入:com*輸出 :無************************************************************/voidDs18b20ChangTemp(){ Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); //跳過ROM操作命令 Ds18b20WriteByte(0x44); //溫度轉(zhuǎn)換命令 Delay1ms(100);}〔2〕溫度讀取指令/*************************************************************函數(shù)名:Ds18b20ReadTempCom*函數(shù)功能:發(fā)送讀取溫度命令*輸入:com*輸出 :無************************************************************/voidDs18b20ReadTempCom(){ Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); //跳過ROM操作命令 Ds18b20WriteByte(0xbe); //發(fā)送讀取溫度命令}〔3〕讀取溫度:/**************************************************************************函數(shù)名:Ds18b20ReadTemp*函數(shù)功能:讀取溫度*輸入:com*輸出 :無*************************************************************************/intDs18b20ReadTemp(){ unsignedinttemp=0; unsignedchartmh,tml; Ds18b20ChangTemp(); //先寫入轉(zhuǎn)換命令 Ds18b20ReadTempCom();//然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令 tml=Ds18b20ReadByte(); //讀取溫度值共16位,先讀低字節(jié) tmh=Ds18b20ReadByte(); //再讀高字節(jié) temp=tmh; temp<<=8; temp|=tml; returntemp;}4.顯示模塊程序設(shè)計(jì)4.1LCD1602初始化表1LCD1602指令表指令碼功能00001DCBD=1開顯示;D=0關(guān)顯示C=1顯示光標(biāo);C=0不顯示光標(biāo)B=1光標(biāo)閃爍;B=0光標(biāo)不顯示000001NSN=1當(dāng)讀或?qū)懸粋€(gè)字符后地址指針加一,且光標(biāo)加一N=0當(dāng)讀或?qū)懸粋€(gè)字符后地址指針減一,且光標(biāo)減一S=1當(dāng)寫一個(gè)字符時(shí),整屏顯示左移〔N=1〕或右移〔N=0〕,以得到光標(biāo)不移動(dòng)而屏幕移動(dòng)的效果S=0當(dāng)寫一個(gè)字符,整屏顯示不移動(dòng)01H顯示清屏:所有顯示清零80H+地址碼〔0-27H,40H-67H〕設(shè)置數(shù)據(jù)地址/*****************************************************************函數(shù)名:LcdInit()*函數(shù)功能:初始化LCD屏*輸入:無*輸出:無****************************************************************/voidLcdInit() //LCD初始化子程序{ LcdWriteCom(0x38);//設(shè)置顯示模式 LcdWriteCom(0x0c);//開顯示不顯示光標(biāo),光標(biāo)不閃爍 LcdWriteCom(0x06);//寫一個(gè)指針加1 LcdWriteCom(0x01);//清屏 LcdWriteCom(0x80);//設(shè)置數(shù)據(jù)指針起點(diǎn)}4.2LCD1602寫周期時(shí)序圖如圖8所示,RS=0為寫命令,RS=1為寫數(shù)據(jù)。在寫周期,R/W=0,E為寫數(shù)據(jù)或命令使能輸入。圖8LCD1602寫時(shí)序圖〔1〕寫命令:/*****************************************************************函數(shù)名:LcdWriteCom*函數(shù)功能:向LCD寫入一個(gè)字節(jié)的命令*輸入:com*輸出:無****************************************************************/voidLcdWriteCom(unsignedcharcom) //寫入命令{ RS=0; RW=0; GPIO_LCD=com; Delay1ms(10); E=1; Delay1ms(10); E=0;}〔2〕寫數(shù)據(jù)/***************************************************************************函數(shù)名:LcdWriteData*函數(shù)功能:向LCD寫入一個(gè)字節(jié)的數(shù)據(jù)*輸入:dat*輸出:無**************************************************************************/voidLcdWriteData(unsignedchardat) //寫入數(shù)據(jù){ RS=1; RW=0; GPIO_LCD=dat; Delay1ms(10); E=1; Delay1ms(10); E=0;}5.定時(shí)模塊程序設(shè)計(jì)定時(shí)/計(jì)數(shù)器實(shí)質(zhì)上是一個(gè)加1計(jì)數(shù)器。它隨著計(jì)數(shù)器的輸入脈沖進(jìn)行自加1,也就是每來一個(gè)脈沖,計(jì)數(shù)器就自動(dòng)加1,當(dāng)加到計(jì)數(shù)器為全1時(shí),再輸入一個(gè)脈沖就使計(jì)數(shù)器回零,且計(jì)數(shù)器的溢出使相應(yīng)的中斷標(biāo)志位置1,向CPU發(fā)出中斷請(qǐng)求〔定時(shí)/計(jì)數(shù)器中斷允許時(shí)〕。如果定時(shí)/計(jì)數(shù)器工作于定時(shí)模式,那么表示定時(shí)時(shí)間已到;如果工作于計(jì)數(shù)模式,那么表示計(jì)數(shù)值已滿。與定時(shí)器相關(guān)的存放器如下:TCOND7D6D5D4D3D2D1D0功能TF1TR1TF0TR0IE1IT1IE0IT0TF1和TF0:T1和T0的溢出標(biāo)志位,溢出后由硬件自動(dòng)置1發(fā)出定時(shí)器中斷請(qǐng)求。中斷響應(yīng)后標(biāo)志位自動(dòng)清零。IE1和IE0:INT1和INT0的標(biāo)志位,引腳狀態(tài)變化后由硬件自動(dòng)置1發(fā)出外部中斷請(qǐng)求,中斷響應(yīng)后標(biāo)志位自動(dòng)清零。IT1和IT0:INT1和INT0的觸發(fā)方式選擇位。TMODD7D6D5D4D3D2D1D0功能GATEC/TM1M0GATEC/TM1M0GATE:門控制為0時(shí)僅有運(yùn)行控制位TRx來控制定時(shí)/計(jì)數(shù)器的開啟。為1時(shí)由TRx和外部中斷脈沖計(jì)數(shù)。〔用于計(jì)算外部中斷負(fù)跳變的次數(shù)〕C/T:計(jì)數(shù)器模式和定時(shí)器模式選擇為0時(shí)選擇定時(shí)器模式,為1時(shí)選為計(jì)數(shù)器模式。方式1的計(jì)數(shù)位數(shù)是16位,由TL0作為低8位、TH0作為高8位,組成了16位加1計(jì)數(shù)器。如圖9所示。圖9定時(shí)器模式1示意圖5.1定時(shí)器設(shè)置/***************************************************************************函數(shù)名:Timer*函數(shù)功能:設(shè)置定時(shí)器并開始計(jì)時(shí)*輸入:無*輸出:無**************************************************************************/voidTimer(){TMOD=0X01;//定時(shí)器選擇工作模式1TH0=0x3C; //定時(shí)器賦初值TL0=0xB0;//定時(shí)50msEA=1; //開啟中斷ET0=1;//開啟定時(shí)器中斷TR0=1; //啟動(dòng)定時(shí)器}5.2定時(shí)器中斷子程序定時(shí)器中斷子程序完成的功能有:定時(shí)器重新賦初值;統(tǒng)計(jì)中斷次數(shù),并在LCD上顯示剩余時(shí)間;判斷是否到達(dá)定時(shí)終點(diǎn)以啟動(dòng)蜂鳴器。/***************************************************************************函數(shù)名:Timer0()interrupt1*函數(shù)功能:設(shè)置定時(shí)器中斷執(zhí)行程序,LCD顯示定時(shí)剩余時(shí)間*輸入:無*輸出:無**************************************************************************/voidTimer0()interrupt1{TH0=0x3C; TL0=0xB0;//定時(shí)器重新賦值Time++;k++;//中斷次數(shù)計(jì)數(shù)if(k==20)//20次中斷,即1s{LCDwritecom(0xc2);LCDwritedat('0'+(--j)/10);LCDwritedat('0'+(j)%10);//定時(shí)顯示剩余時(shí)間k=0;} if(Time==full)//判斷是否到達(dá)定時(shí)時(shí)間{for(i=0;i<100;i++){sound=1;//啟用無源蜂鳴器Delay1ms(1);sound=0;Delay1ms(1);}Time=0;j=full/20;//計(jì)數(shù)初始化}}6.中斷模塊程序設(shè)計(jì)中斷是指CPU在執(zhí)行當(dāng)前程序的過程中,由于某種隨機(jī)出現(xiàn)的外設(shè)請(qǐng)求或CPU內(nèi)部的異常事件,使CPU暫停正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行相應(yīng)的效勞處理程序;當(dāng)效勞處理程序運(yùn)行完畢后,CPU再返回到暫停處繼續(xù)執(zhí)行原來的程序。51單片機(jī)的中斷系統(tǒng)如圖10所示。圖10中斷系統(tǒng)結(jié)構(gòu)圖6.1外部中斷設(shè)置/***************************************************************************函數(shù)名:IntConfiguration()*函數(shù)功能:設(shè)置外部中斷*輸入:無*輸出:無**************************************************************************/voidIntConfiguration(){ IT0=1;//外部中斷0跳變沿觸發(fā)方式〔下降沿〕 EX0=1;//翻開INT0的中斷允許。 EA=1;//翻開總中斷 }6.2鍵盤掃描中斷子程序中斷程序完成的功能有:〔1〕判斷按鍵是否按下;〔2〕執(zhí)行對(duì)應(yīng)按鍵的功能。/***************************************************************************函數(shù)名:Scankey()*函數(shù)功能:鍵盤掃描,并執(zhí)行對(duì)應(yīng)按鍵的程序*輸入:無*輸出:無**************************************************************************/voidScankey(){if(key1==0)//判斷按鍵是否按下{Delay1ms(10);//延時(shí)消抖if(key1==0)//判斷按鍵是否按下{for(;;){if(key1==0)continue;elsebreak;}for(;;){while(key1==0);//檢測(cè)按鍵是否松開if(key1==0)continue;elsebreak;…….//執(zhí)行對(duì)應(yīng)按鍵的程序}}
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于2025年度區(qū)塊鏈技術(shù)應(yīng)用合作協(xié)議3篇
- 2025年度汽車租賃市場(chǎng)拓展合作協(xié)議合同4篇
- 2025年度二零二五年度獼猴桃包裝設(shè)計(jì)及品牌推廣合同4篇
- 二零二五版建筑工程安全施工許可證申請(qǐng)合同3篇
- 2025版信托資金借貸合同爭(zhēng)議解決爭(zhēng)議管轄條款3篇
- 2025年度健康管理機(jī)構(gòu)臨時(shí)健康管理師勞動(dòng)合同4篇
- 二零二五年度海上旅游船租賃服務(wù)合同范本3篇
- 個(gè)人住宅買賣法律合同(2024年修訂)版B版
- 2025年度戶外運(yùn)動(dòng)用品門店承包管理服務(wù)協(xié)議4篇
- 二零二五年柑桔加工副產(chǎn)品回收利用合同2篇
- 道路瀝青工程施工方案
- 《田口方法的導(dǎo)入》課件
- 內(nèi)陸?zhàn)B殖與水產(chǎn)品市場(chǎng)營銷策略考核試卷
- 票據(jù)業(yè)務(wù)居間合同模板
- 承包鋼板水泥庫合同范本(2篇)
- DLT 572-2021 電力變壓器運(yùn)行規(guī)程
- 公司沒繳社保勞動(dòng)仲裁申請(qǐng)書
- 損傷力學(xué)與斷裂分析
- 2024年縣鄉(xiāng)教師選調(diào)進(jìn)城考試《教育學(xué)》題庫及完整答案(考點(diǎn)梳理)
- 車借給別人免責(zé)協(xié)議書
- 應(yīng)急預(yù)案評(píng)分標(biāo)準(zhǔn)表
評(píng)論
0/150
提交評(píng)論