智能水杯軟件設(shè)計_第1頁
智能水杯軟件設(shè)計_第2頁
智能水杯軟件設(shè)計_第3頁
智能水杯軟件設(shè)計_第4頁
智能水杯軟件設(shè)計_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

目錄前言2總體設(shè)計框架22.1實現(xiàn)的功能22.2總體程序流程圖3水溫采集模塊程序設(shè)計5DS18B20簡介5DS18B20的初始化6DS18B20寫周期8DS18B20讀周期103.5溫度讀取程序12顯示模塊程序設(shè)計15LCD1602初始化15LCD1602寫周期16定時模塊程序設(shè)計195.1定時器設(shè)置205.2定時器中斷子程序21中斷模塊程序設(shè)計236.1外部中斷設(shè)置236.2鍵盤掃描中斷子程序24整體編程的實現(xiàn)26設(shè)計過程中的問題及解決方案26收獲與感悟27前言隨著社會進步與經(jīng)濟發(fā)展,人們對生活質(zhì)量的要求越來越高,每天的飲水量是衡量健康的重要指標。但有多少人因為忙碌的工作而全天忘記喝水?當你感到口渴想要喝水的時候,體內(nèi)的失水已經(jīng)達到2%,口渴本身其實是體內(nèi)已經(jīng)嚴重缺水的表現(xiàn),這是造成“亞健康”狀態(tài)的致命習(xí)慣之一。同時,越不注意喝水,喝水的欲望就會越低,人就會變得越來越缺水。研究表明,通常情況下,正常人每次喝水應(yīng)控制在300ml,間隔時間為30到60分鐘。本課程設(shè)計就此設(shè)計出一款智能水杯,用來智能顯示水溫和提醒喝水,既方便了生活,又保持了健康。本報告針對智能水杯的軟件系統(tǒng)進行闡述,軟件編程在keil上操作??傮w設(shè)計框架2.1實現(xiàn)的功能圖1硬件結(jié)構(gòu)簡圖水溫檢測使用DS18B20溫度傳感器,完成水溫的時時檢測功能。水溫及定時時間顯示使用LCD1602液晶顯示屏,完成水溫及定時時間的顯示功能。智能提醒使用定時器0,開啟定時器中斷,蜂鳴器提醒。定時時間設(shè)置使用外部中斷0擴展電路,用三個按鍵觸發(fā)中斷,完成對應(yīng)定時開啟和定時時間加減的功能。2.2總體程序流程圖總體程序流程圖分為主程序和中斷程序兩部分,其中中斷程序分為外部中斷程序和定時器中斷程序。流程圖如下圖所示。

圖2圖2主程序流程圖圖3外部按鍵中斷流程圖圖4定時器中斷程序設(shè)計流程圖水溫采集模塊程序設(shè)計3.1DS18B20簡介DS18B20單線數(shù)字溫度傳感器,即“一線器件”,其具有獨特的優(yōu)點:(1) 采用單總線的接口方式,與微處理器連接時,僅需要一條口線即可實現(xiàn)微處理器與DS18B20的雙向通訊。單總線具有經(jīng)濟性好,抗干擾能力強,適合于惡劣環(huán)境的現(xiàn)場溫度測量,使用方便等優(yōu)點,使用戶可輕松地組建傳感器網(wǎng)絡(luò),為測量系統(tǒng)的構(gòu)建引入全新概念。(2) 測量溫度范圍寬,測量精度高DS18B20的測量范圍為-55°C~+125°C;在-10~+85°C范圍內(nèi),精度為土0.5°C。(4)持多點組網(wǎng)功能多個DS18B20可以并聯(lián)在惟一的單線上,實現(xiàn)多點測溫。(5) 供電方式靈活DS18B20可以通過內(nèi)部寄生電路從數(shù)據(jù)線上獲取電源。因此,當數(shù)據(jù)線上的時序滿足一定的要求時,可以不接外部電源,從而使系統(tǒng)結(jié)構(gòu)更趨簡單,可靠性更高。(6) 測量參數(shù)可配置DS18B20的測量分辨率可通過程序設(shè)定9~12位。3.2DS18B20的初始化主機首先發(fā)出一個480-960微秒的低電平脈沖,然后釋放總線變?yōu)楦唠娖?,并在隨后的480微秒時間內(nèi)對總線進行檢測,如果有低和蛉化過品I?棚嘎城沖”4S0牌[rikwum和蛉化過品I?棚嘎城沖”4S0牌[rikwum知1居matimtjm柱割器版4M皓ininimufflDS1S20虬?4叩$電平出現(xiàn)說明總線上有器件已做出應(yīng)答。若無低電平出現(xiàn)一直都是高電平說明總線上無器件應(yīng)答。作為從圖5DS18B20初始化時序圖器件的DS18B20在一上電后就一直在檢測總線上是否有480-960微秒的低電平出現(xiàn),如果有,在總線轉(zhuǎn)為高電平后等待15-60微秒后將總線電平拉低60-240微秒做出響應(yīng)存在脈沖,告訴主機本器件已做好準備。若沒有檢測到就一直在檢測等待。初始化時序圖如圖5所示。/""""""""""""""""""""""""""""""""""""""""""""""""""""""/******************************************************""""""""""***********函數(shù)名 :Ds18b20Init*函數(shù)功能:初始化*輸入 :無*輸出 :初始化成功返回1,失敗返回0“““““““““““““““““““““““““““““““““““““““““““““““““““““““*******************************************************"""""""""/*********unsignedcharDs18b20Init(){unsignedinti;Desport=0; //將總線拉低480us~960usi=70;while(i--);//延時642usDsport=1;//然后拉高總線,若DS18B20做出反應(yīng)會將在15us~60us后將總線拉低i=0;while(Desport)//等待DS18B20拉低總線{i++;if(i>50000)//等待>50MSreturn0;//初始化失敗}return1;//初始化成功}3.3DS18B20寫周期寫周期最少為60微秒,最長不超過120微秒。寫周期一開始做為主機先把總線拉低1微秒表示寫周期開始。隨后若主機想寫0,則將總線置為低電平,若主機想寫1,則將總線置為高電平,持續(xù)時間最少60微秒直至寫周期結(jié)束,然后釋放總線為高電平至少1微秒給總線恢復(fù)。而DS18B20則在檢測到總線被拉底后等待15微秒然后從15us到45us開始對總線采樣,在采樣期內(nèi)總線為高電平則為1,若采樣期內(nèi)總線為低電平則為0。寫周期時序圖如圖6所示。圖6DS18B20寫周期時序圖/""""""""""""""""""""""""""""""""""""""""""""""""""""""/******************************************************""""""""""***********函數(shù)名 :Ds18b20WriteByte*函數(shù)功能:向18B20寫入一個字節(jié)*輸入 :com*輸出 :無“““““““““““““““““““““““““““““““““““““““““““““““““““““““*******************************************************"""""""""/*********voidDs18b20WriteByte(unsignedchardat){unsignedinti,j;for(j=0;j<8;j++){Desport=0; //每寫入一位數(shù)據(jù)之前先把總線拉低1usi++;Desport=dat&0x01;//然后寫入一個數(shù)據(jù),從最低位開始i=6;while(i--);//延時68us,持續(xù)時間最少60usDesport=1;//然后釋放總線,至少1us給總線恢復(fù)時間才能接著寫入第二個數(shù)值dat>>=1;3.4DS18B20讀周期讀周期是從主機把單總線拉低1微秒之后就得釋放單總線為高電平,以讓DS18B20把數(shù)據(jù)傳輸?shù)絾慰偩€上。作為從機DS18B20在檢測到總線被拉低1微秒后,便開始送出數(shù)據(jù),若是要送出0就把總線拉為低電平直到讀周期結(jié)束。若要送出1則釋放總線為高電平。主機在一開始拉低總線1微秒后釋放總線,然后在包括前面的拉低總線電平1微秒在內(nèi)的15微秒時間內(nèi)完成對總線進行采樣檢測,采樣期內(nèi)總線為低電平則確認為0。采樣期內(nèi)總線為高電平則確認為1。完成一個讀時序過程至少需要60微秒才能完成。其讀周期的時序圖如圖7所示。圖7DS18B20讀周期時序圖/**********************************************************"""""""""**********函數(shù)名 :Ds18b20ReadByte*函數(shù)功能:讀取一個字節(jié)*輸入 :com*輸出 :無“““““““““““““““““““““““““““““““““““““““““““““““““““““““*******************************************************"""""""""/*********unsignedcharDs18b20ReadByte(){unsignedcharbyte,bi;unsignedinti,j;for(j=8;j>0;j--){Dsport=0;//先將總線拉低1usi++;Dsport=1;//然后釋放總線i++;i++;//延時6us等待數(shù)據(jù)穩(wěn)定bi=Dsport;//讀取數(shù)據(jù),從最低位開始讀取byte=(byte>>1)|(bi<<7);/*將byte左移一位,然后與上右移7位后的bi,注意移動之后移掉那位補0。*/i=4; 〃讀取完之后等待48us再接著讀取下一個數(shù)while(i--);}returnbyte;}3.5溫度讀取程序簡單的讀取溫度值的步驟如下:跳過ROM操作---發(fā)送溫度轉(zhuǎn)換命令---跳過ROM操作---發(fā)送讀取溫度命令讀取溫度值溫度轉(zhuǎn)換指令:/""""""""""""""""""""""""""""""""""""""""""""""""""""""/******************************************************""""""*******函數(shù)名 :Ds18b20ChangTemp*函數(shù)功能:讓18b20開始轉(zhuǎn)換溫度*輸入 :com*輸出 :無“““““““““““““““““““““““““““““““““““““““““““““““““““““““************************************************************/voidDs18b20ChangTemp(){Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc); //跳過ROM操作命令Ds18b20WriteByte(0x44); //溫度轉(zhuǎn)換命令Delay1ms(100);}溫度讀取指令/""""""""""""""""""""""""""""""""""""""""""""""""""""""/******************************************************""""""*******函數(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;顯示模塊程序設(shè)計4.1LCD1602初始化表1LCD1602指令表指令碼功能00001DCBD=1開顯示; D=0關(guān)顯示C-1顯示光標;C-0不顯示光標B=1光標閃爍;B-0光標不顯示000001NSN-1當讀或?qū)懸粋€字符后地址指針加一,且光標加一N-0當讀或?qū)懸粋€字符后地址指針減一,且光標減一S-1當寫一個字符時,整屏顯示左移(N-1)或右移(N-0),以得到光標不移動而屏幕移動的效果S-0當寫一個字符,整屏顯示不移動01H顯示清屏:所有顯示清零80H+地址碼(0-27H,40H-67H)設(shè)置數(shù)據(jù)地址/""""""""""""""""""""""""""""""""""""""""""""""""""""""/******************************************************““““““““““***********函數(shù)名:LcdInit()*函數(shù)功能:初始化LCD屏*輸入:無*輸出:無"""""""""""""""""""""""""""""""""""""""""""""""""""""""*******************************************************"""""""""/*********voidLcdInit() //LCD初始化子程序{LcdWriteCom(0x38);//設(shè)置顯示模式LcdWriteCom(0x0c);//開顯示不顯示光標,光標不閃爍LcdWriteCom(0x06);//寫一個指針加1LcdWriteCom(0x01);//清屏LcdWriteCom(0x80);//設(shè)置數(shù)據(jù)指針起點}4.2LCD1602寫周期時序圖如圖8所示,RS=0為寫命令,RS=1為寫數(shù)據(jù)。在寫周期,R/W=0,E為寫數(shù)據(jù)或命令使能輸入。圖8LCD1602寫時序圖寫命令:/*****************************************************************函數(shù)名 :LcdWriteCom*函數(shù)功能:向LCD寫入一個字節(jié)的命令*輸入 :com*輸出 :無****************************************************************voidLcdWriteCom(unsignedcharcom) //寫入命令{RS=0;RW=0;GPIO_LCD=com;Delay1ms(10);E=1;Delay1ms(10);E=0;}寫數(shù)據(jù)/""""""""""""""""""""""""""""""""""""""""""""""""""""""/******************************************************""""""""""""""""""""*********************函數(shù)名 :LcdWriteData*函數(shù)功能:向LCD寫入一個字節(jié)的數(shù)據(jù)*輸入 :dat*輸出 :無“““““““““““““““““““““““““““““““““““““““““““““““““““““““*******************************************************"""""""""""""""""""/*******************voidLcdWriteData(unsignedchardat) //寫入數(shù)據(jù){RS=1;RW=0;GPIO_LCD=dat;Delay1ms(10);E=1;Delay1ms(10);E=0;定時模塊程序設(shè)計定時/計數(shù)器實質(zhì)上是一個加1計數(shù)器。它隨著計數(shù)器的輸入脈沖進行自加1,也就是每來一個脈沖,計數(shù)器就自動加1,當加到計數(shù)器為全1時,再輸入一個脈沖就使計數(shù)器回零,且計數(shù)器的溢出使相應(yīng)的中斷標志位置1,向CPU發(fā)出中斷請求(定時/計數(shù)器中斷允許時)。如果定時7計數(shù)器工作于定時模式,則表示定時時間已到;如果工作于計數(shù)模式,則表示計數(shù)值已滿。與定時器相關(guān)的寄存器如下:TCOND7D6D5D4D3D2D1D0功能TF1TR1TF0TR0IE1IT1IE0IT0TF1和TF0:T1和T0的溢出標志位,溢出后由硬件自動置1發(fā)出定時器中斷請求。中斷響應(yīng)后標志位自動清零。IE1和IE0:INT1和INT0的標志位,引腳狀態(tài)變化后由硬件自動置1發(fā)出外部中斷請求,中斷響應(yīng)后標志位自動清零。IT1和IT0:INT1和INT0的觸發(fā)方式選擇位。TMODD7D6D5D4D3D2D1D0功能GATEC/TM1M0GATEC/TM1M0GATE:門控制為0時僅有運行控制位TRx來控制定時/計數(shù)器的開啟。為1時由TRx和外部中斷脈沖計數(shù)。(用于計算外部中斷負跳

變的次數(shù))C/T:計數(shù)器模式和定時器模式選擇為0時選擇定時器模式,為1時選為計數(shù)器模式。方式1的計數(shù)位數(shù)是16位,由TL0作為低8位、TH0作為高8位,TCOND0D7組成了16TCOND0D7組成了16位加1計數(shù)器。如圖9所示。圖9定時器模式1示意圖5.1定時器設(shè)置/**************************************************************************函數(shù)名:Timer函數(shù)功能:設(shè)置定時器并開始計時:無輸入輸出:無**************************************************************************voidTimer(){TMOD=0X01;//定時器選擇工作模式1TH0=0x3C; //定時器賦初值TL0=0xB0;//定時50msEA=1; //開啟中斷ET0=1;//開啟定時器中斷TR0=1;//啟動定時器}5.2定時器中斷子程序定時器中斷子程序完成的功能有:定時器重新賦初值;統(tǒng)計中斷次數(shù),并在LCD上顯示剩余時間;判斷是否達到定時終點以啟動蜂鳴器。/""""""""""""""""""""""""""""""""""""""""""""""""""""""/******************************************************""""""""""""""""""""*********************函數(shù)名 :Timer0()interrupt1*函數(shù)功能 :設(shè)置定時器中斷執(zhí)行程序,LCD顯示定時剩余時間*輸入 :無*輸出 :無“““““““““““““““““““““““““““““““““““““““““““““““““““““““*******************************************************"""""""""""""""""""/*******************/voidTimer0()interrupt1{TH0=0x3C;TL0=0xB0;//定時器重新賦值Time++;k++;//中斷次數(shù)計數(shù)if(k==20)//20次中斷,即1s{LCDwritecom(0xc2);LCDwritedat('0'+(--j)/10);LCDwritedat('0'+(j)%10);//定時顯示剩余時間k=0;}if(Time==full)//判斷是否達到定時時間{for(i=0;i<100;i++){sound=1;//啟用無源蜂鳴器Delay1ms(1);sound=0;Delay1ms(1);

}Time=0;j=full/20;//計數(shù)初始化}}中斷模塊程序設(shè)計中斷是指CPU在執(zhí)行當前程序的過程中,由于某種隨機出現(xiàn)的外設(shè)請求或CPU內(nèi)部的異常事件,使CPU暫停正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行相應(yīng)的服務(wù)處理程序;當服務(wù)處理程序運行完畢后,CPU再返回到暫停處繼續(xù)執(zhí)行原來的程序。51單片機的中斷系統(tǒng)如圖10所示。InQTOTPFiIIIXInQTOTPFiIIIXRX中聒櫬志高繳中都諧或康低^中斷請求WuD,「D圖10中斷系統(tǒng)結(jié)構(gòu)圖6.1外部中斷設(shè)置

/""""""""""""""""""""""""""""""""""""""""""""""""""""""/******************************************************""""""""""""""""""""********************函數(shù)名:IntConfiguration()函數(shù)功能函數(shù)名:IntConfiguration()函數(shù)功能:設(shè)置外部中斷:無輸入輸出:無“““““““““““““““““““““““““““““““““““““““““““““““““““““““*******************************************************"""""""""""""""""""/*******************voidIntConfiguration()IT0=1;//外部中斷0跳變沿觸發(fā)方式(下降沿)EX0=1;//打開INT0的中斷允許。EA=1;//打開總中斷6.2鍵盤掃描中斷子程序中斷程序完成的功能有:(1)判斷按鍵是否按下;(2)執(zhí)行對應(yīng)按鍵的功能。/""""""""""""""""""""""""""""""""""""""""""""""""""""""******************************************************""""""""""""""""""""*********************函數(shù)名:Scankey()*函數(shù)功能 :鍵盤掃描,并執(zhí)行對應(yīng)按鍵的程序*輸入 :無*輸出 :無"""""""""""""""""""""""""""""""""""""""""""""""""""""""*******************************************************"""""""""""""""""""/*******************voidScankey(){if(key1==0) 〃判斷按鍵是否按下{Delay1ms(10);//延時消抖if(key1==0) 〃判斷按鍵是否按下{for(;;){if(key1==0)continue;elsebreak;}for(;;){while(key1==0); //檢測按鍵是否松開if(key1==0)continue;elsebreak;……. //執(zhí)行對應(yīng)按鍵的程序

整體編程的實現(xiàn) lfiH

溫馨提示

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

評論

0/150

提交評論