嵌入式系統(tǒng)課程設(shè)計 基于ARM+LCD的菜單設(shè)計_第1頁
嵌入式系統(tǒng)課程設(shè)計 基于ARM+LCD的菜單設(shè)計_第2頁
嵌入式系統(tǒng)課程設(shè)計 基于ARM+LCD的菜單設(shè)計_第3頁
嵌入式系統(tǒng)課程設(shè)計 基于ARM+LCD的菜單設(shè)計_第4頁
嵌入式系統(tǒng)課程設(shè)計 基于ARM+LCD的菜單設(shè)計_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第1章概述1.1課題目的與意義隨著人們生活水平的提高,人們對生活質(zhì)量的要求也越來越高。對電子產(chǎn)品的要求也越來越苛刻。特別是對便攜式電子產(chǎn)品,不僅要求功能全,性能好,還必須具有超低的功耗?!坝忠岏R兒跑,又不讓馬兒吃草”,這條理念在電子產(chǎn)品中體現(xiàn)得淋漓盡致。處理器必須在不怎么增加主頻和功耗的條件下干更多的活兒,這就要求我們在設(shè)計電子產(chǎn)品中必須拋棄那些傳統(tǒng)的、功耗大的單片機(jī)及其它設(shè)備,選擇當(dāng)前先進(jìn)的、超低功耗的單片機(jī)及IC,以滿足人們的需要。這也符合我國正在提出的低碳生活要求。1.2課題現(xiàn)狀隨著經(jīng)濟(jì)的復(fù)蘇和市場的進(jìn)一步改革開放,人民的生活水平在不斷的奔向小康,促進(jìn)著電子顯示的快速發(fā)展,同時許多電子類產(chǎn)品商家也敏銳地嗅到了這一產(chǎn)業(yè)的商機(jī),注定著這個行業(yè)的競爭越來越激烈。因此,要在這個競爭激烈的市場中獲勝并且穩(wěn)步前進(jìn)就要降低的成本,提高效益。雖然不同的電子類產(chǎn)品所要顯示的內(nèi)容和格式的標(biāo)準(zhǔn)不同,但是每個顯示方向都可以使用管理信息工具來提高本企業(yè)的核心競爭力。綜上所述,LCD顯示運(yùn)用嵌入式系統(tǒng)設(shè)計的思想,采用目前最先進(jìn)的嵌入式技術(shù),從而實現(xiàn)實時顯示的要求。第2章總體設(shè)計方案2.1設(shè)計任務(wù)對于各種便攜式的電子產(chǎn)品,最重要的莫過于界面的顯示。一個信息量豐富的顯示界面絕對是吸引人們注意力的一大因素。但在現(xiàn)實的生活當(dāng)中,特別是在一些中低檔的便攜式電子產(chǎn)品中,信息的顯示都是一些顯示信息量非常小的液晶模塊或單調(diào)的LED數(shù)碼管顯示。這完全不能滿足人們的信息需求。特別是對中高端的電子產(chǎn)品,三、四級的菜單隨處可以。菜單的界面可以給予人們豐富的信息,便于人們進(jìn)行各種操作。低功耗加上信息豐富的液晶顯示是未來電子產(chǎn)品發(fā)展的主流。本文主要介紹基于STM32低功耗單片機(jī)和液晶模塊組成的多級菜單顯示系統(tǒng)。符合現(xiàn)代電子產(chǎn)品發(fā)展的主流,通過簡單的修改就可以在各種平臺上進(jìn)行移植,具有很強(qiáng)的實用性。2.2系統(tǒng)組成與工作原理方案以STM32單片機(jī)系統(tǒng)為核心,通過按鍵控制LCD液晶顯示模塊進(jìn)行各種信息的顯示,包括實時的時鐘顯示、實時的波形顯示、存儲的波形顯示以及各種菜單的顯示。如圖1.1所示,該方案通過按鍵對各種菜單進(jìn)行操作以執(zhí)行相應(yīng)的功能。本系統(tǒng)結(jié)構(gòu)簡單,但程序卻并不簡單,需要大量的編程操作才能完成。液晶顯示模塊單片機(jī)按鍵控制液晶顯示模塊單片機(jī)按鍵控制電源電源圖2.1系統(tǒng)設(shè)計第3章硬件設(shè)計3.1嵌入式系統(tǒng)介紹Cortex-M3是一個32位處理器內(nèi)核。內(nèi)部的數(shù)據(jù)路徑是32位的,寄存器是32位的,存儲器接口也是32位的。CM3采用了哈佛結(jié)構(gòu),擁有獨立的指令總線和數(shù)據(jù)總線,可以讓取指與數(shù)據(jù)訪問并行不悖。這樣一來數(shù)據(jù)訪問不再占用指令總線,從而提升了性能。為實現(xiàn)這個特性,CM3內(nèi)部含有好幾條總線接口,每條都為自己的應(yīng)用場合優(yōu)化過,并且它們可以并行工作。比較復(fù)雜的應(yīng)用可能需要更多的存儲系統(tǒng)功能,為此CM3提供-一個可選的MPU,而且在需要的情況下也可以使用外部的cache。另外在CM3中,Both小端模式和大端模式都是支持的。CM3內(nèi)部還附贈了好多調(diào)試組件,用于在硬件水平上支持調(diào)試操作,如指令斷點,數(shù)據(jù)觀察點等。另外,為支持更高級的調(diào)試,還有其它可選組件,包括指令跟蹤和多種類型的調(diào)試接口。它的內(nèi)部結(jié)構(gòu)圖如圖3.1所示:圖3.1STM-32內(nèi)核結(jié)構(gòu)STM32特征如下:1.內(nèi)核(1)ARM32位的CortexM-M3CPU;(2)72MHz,1.25DMips/MHz,零等待周期的存儲器;(3)單周期乘法和硬件除法。2.存儲器(1)從32K字節(jié)至128K字節(jié)的閃存程序存儲器;(2)從6K字節(jié)至64K字節(jié)的SRAM。3.時鐘、復(fù)位和電源管理(1)2.0至3.6伏供電和I/0管腳;(2).上電/斷電復(fù)位(POR/PDR)、可編程電壓監(jiān)測器(PVD):(3)內(nèi)嵌4至16MHz高速晶體振蕩器;(4)內(nèi)嵌經(jīng)出廠調(diào)校的8MHz的RC振蕩器;(5)內(nèi)嵌40kHz的RC振蕩器:(6)PLL供應(yīng)CPU時鐘;(7)帶校準(zhǔn)功能的32kHzRTC振蕩器。4.低功耗為了使功耗更低,以及能源利用效率更高,Cortex-M3在設(shè)計時加入了很多針對性的功能。首先,在節(jié)能模式上,它提供了睡眠模式和深度睡眠模式。芯片以及整個系統(tǒng)在設(shè)計時通過與內(nèi)核的節(jié)能模式相呼應(yīng),就可以根據(jù)應(yīng)用的要求,在空閑時降低功耗。第二,它精練的設(shè)計使得門數(shù)很低,并且在工作狀態(tài)下電路的活動更少,所以CM3自己也是“身先士卒”地以身作則了。而且,由于CM3的程序代碼密度高,程序容量也可以變得更少:同時,再加上它強(qiáng)大的性能減少了程序執(zhí)行時間,使得系統(tǒng)能以最快的速度回到睡眠中,以削低對能源的用量。它可以工作在這三種模式:睡眠、停機(jī)和待機(jī)模式,并且可以在這三種模式下動態(tài)切換。睡眠模式:在睡眠模式,只有CPU停止,所有外設(shè)處于工作狀態(tài)并可在發(fā)生中斷事件時喚醒CPU.停機(jī)模式:在保持SRAM和寄存器內(nèi)容不丟失的情況下,停機(jī)模式可以達(dá)到最低的電能消耗。在停機(jī)模式下,停止所有內(nèi)部1.8V部分的供電,PLL、HSI和HSE的RC振蕩器被關(guān)閉,調(diào)壓器可以被置于普通模式或低功耗模式??梢酝ㄟ^任--配置成EXTI的信號把微控制器從停機(jī)模式中喚醒,EXTI信號可以是16個外部I/0口之一、PVD的輸出、RTC鬧鐘或USB的喚醒信號。待機(jī)模式:在待機(jī)模式下可以達(dá)到最低的電能消耗。內(nèi)部的電壓調(diào)壓器被關(guān)閉,因此所有內(nèi)部1.8V部分的供電被切斷;PLL、HSI和HSE的RC振蕩器也被關(guān)閉;進(jìn)入待機(jī)模式后,SRAM和寄存器的內(nèi)容將消失,但后備寄存器的內(nèi)容仍然保留,待機(jī)電路仍工作。從待機(jī)模式退出的條件是:NRST上的外部復(fù)位信號、IWDG復(fù)位、WKUP管腳上的一個,上升邊沿或RTC的鬧鐘到時。綜上所述,Cortex-M3的能效要高于大多的8位或16位單片機(jī)。3.2主要單元電路設(shè)計3.3.1電源模塊該模塊主要由USB下載線提供5V的電源供電。然后通過LM117降壓到3.3V供單片機(jī)工作如圖3.1所示圖3.1電源模塊3.3.2電源濾波模塊濾波電路設(shè)計如圖3.2所示。由于采用STM32單片機(jī)內(nèi)部的AD進(jìn)行數(shù)據(jù)的采集,因此良好的濾波電路是必要的。同時也為單片機(jī)的穩(wěn)定工作奠定了基礎(chǔ)。圖3.2電源濾波模塊3.3.3液晶顯示模塊該模塊主要采用內(nèi)部升壓的模式給LCD供電。據(jù)此電路圖我們可知:如果內(nèi)部升壓成功,則根據(jù)如表1-3所示的寄存器配置,測得C51兩端電壓應(yīng)該是6.154V-17.986V。根據(jù)寄存器的配置不同,VLCD腳對應(yīng)不同的電壓。這可以作為我們初始化液晶是否成功的一個判據(jù)。如圖3.3所示圖3.3液晶顯示模塊第4章軟件設(shè)計4.1軟件總體設(shè)計開始,初始化時間日期,采集溫度,訣以時問,任冊布工顯示溫度和時間,判斷KEY是否為低電平,如果是就對時間日期進(jìn)行設(shè)定,否就回到初始化狀態(tài)。如果設(shè)定了時間,再判定是否按下清除鍵,如果按下,則清除LCD屏?xí)r間日期,回到溫度沒按下清除鍵,則直接回到采集溫度。如圖4.1所示圖4.1主程序流程圖4.2各功能模塊的軟件設(shè)計4.2.1STM單片機(jī)初始化在STM32的時鐘配置方面,ST公司已經(jīng)為我們提供了例程,我們只需要在例程中修改相應(yīng)的數(shù)據(jù)達(dá)到我們想要的時鐘速率即可,不必要我們自己再去編寫程序配置時鐘,這樣大大減少了我們的開發(fā)周期,提高了我們的開發(fā)效率。例如:voidRead_18B20(void)unsignedchartempl=0,temp2=0;int16temperature=0;if(Reset_18B200){DelayNS__us(7200);Writebyte_18B20(0xcc);DelayNS__us(7200);Writebyte_18B20(0x44);DelayNS__us(8000);if(Reset_18B200)DelayNS__us(8000);Writebyte_,18B20(0xcc);DelayNS__us(8000);Writebyte_,18B20(0xbe);templ=Readbyte_18B200;DelayNS__us(720);temp2=Readbyte_18B200);Reset_18B200;if(temp2&0xf8){temperature=((temp2<<8)Itemp1);temperature=((~temperature)+1);ftemperature=temperature*(-0.0625);else{temperature=((temp2<<8)|temp1);ftemperature=(fp64)(temperature*0.0625);}}else{;}}4.2.2STM32啟動方式前面介紹過,STM32單片機(jī)有三種不同的啟動模式,根據(jù)不同的啟動模式我們需要寫不同的代碼以及在編譯環(huán)境上進(jìn)行不同的設(shè)置。ST公司提供了這樣的一個例程:voidNVIC_Configuration(void){#ifdefVECT_TAB_RAM/*SettheVectorTablebaselocationat0x20000000*/NVIC_SetVectorTable(NVIC_VectTab__RAM,0x0);#else/*VECT_TAB_FLASH*//*SettheVectorTablebaselocationat0x08000000*/NVIC__SetVectorTable(NVIC_VectTab_FLASH,0x0);#endif這個例程就是針對不同的啟動模式而進(jìn)行編寫的。如果我們要在內(nèi)部RAM中進(jìn)行程序的調(diào)試,首先我們需要根據(jù)下表4.2所示的表進(jìn)行STM32單片機(jī)外部引腳的配置,然后我們需要在Kei13的IDE中進(jìn)行設(shè)置。啟動模式選擇管腳啟動模式說明B00T1B00T0X0用戶閃存存儲器用戶閃存存儲器被選為啟動01系統(tǒng)存儲器系統(tǒng)存儲器被選為啟動區(qū)域11內(nèi)嵌SRAM內(nèi)嵌SRAM被選為啟動區(qū)域表4.2系統(tǒng)啟動方式4.2.3字模的提取由于該屏在列方向_上一次要寫六點,即三個字節(jié)。所以我們在用字模軟件取字模時,一定要注意這樣的問題,以保證程序編寫的方便。比如說,如果我們用橫向取模的方式,每次得判斷一個字節(jié),即八個點,但是列方向上我們只能六個點六個點的去寫。所以,橫向取模的方式是不可取的。在縱向取模的方式中,我們應(yīng)該取字模列方向是六的倍數(shù)。比如12、18、24等。在行方向上,我們盡量取八的倍數(shù)。這樣在編寫程序時,極大的降低了程序編寫的難度。比如我們?nèi) 爸袊边@兩個漢字的字模,我們?nèi)?4*24的。在字模軟件中,我們設(shè)置這樣的取模方式:縱向取模、字節(jié)正序??梢跃帉戇@樣的程序來達(dá)到在液晶.上顯示的目的。for(k=0;k<3;k++){for(j=0;j<8;j++){for(i=m;i<m+24;i++)//先取前24個字節(jié)24*24if(reverse==1){temp=~(p[i]);//取第一個字節(jié)else{temp=p[i];//取第-一個字節(jié)if((temp&value)=value)//如果最高位是1buffer._msb=0xf0;//buffer高四位為1,顯示黑點buffer=buffer._msb|buffer_lsb;WriteDat(buffer);value=value》1;}m=m+24;value=0x80;首先定義一個緩沖區(qū),該緩沖區(qū)有兩部分組成:buffer._msb,buffer_lsb.該程序有三個循環(huán):最內(nèi)的循環(huán)是先取這24個字節(jié)的最高位,然后判斷這24個字節(jié)的第-一個字節(jié)的最高位是0或者是1.如果是0,則buffer._msb=0xf0,否則buffer.msb=0x00;然后再判斷這24個字節(jié)的第二個字節(jié)的最高位是0還是1。如果是0,則buffer.1sb=0xOf,否則buffer_1sb=0x00;然后buffer=buffer._msb|buffer_.1sb;這樣就組成了-個新的值buffer.然后就把這個新值送給液晶。相當(dāng)于一次送了兩個點。次循環(huán)是把這24個字節(jié)從高位依次顯示到最低位。外邊的大循環(huán)是顯示幾行,對于這個函數(shù)來說,就是24行。這樣就可以把這個字模完整的顯示到液晶中去了。4.2.4菜單框架的設(shè)計由于該系統(tǒng)涉及到的菜單級數(shù)比較多,多達(dá)四級的菜單。所以我們在設(shè)計菜單的整體框架時要考慮到這些因素。不能一一個屏-一個框架,這樣我們的單片機(jī)可能沒有那么多的空間讓我們?nèi)ソ⒛敲炊嗟目蚣茏帜?。?dāng)然這個屏提供的各種掃描方式也為我們在設(shè)計框架時提供了方便。例如我們在畫--條線時,我們只需要設(shè)置行的起始地址和結(jié)束地址是一個值,然后改變列的地址我們就可以得到一-條想要的直線。例如:在0xlc行畫一條直線,該屏的起始列地址是0x18,列地址從0x18到0x67共80大列,因為每次寫是以三個點為單位的,所以這一條直線是從第一列到最到一列。//配置窗口WriteCmd(0xf5);//setrowstartaddressWriteCmd(0x1c);//startaddress=0x00WriteCmd(0xf7);//setrowendaddressWriteCmd(0x1c);//rowendaddress0xlc=28WriteCmd(0xf4);//setoolumnstartaddressWriteCmd(0x18);//startaddress=0WriteCmd(0xf6);//setcolumnendaddressWriteCmd(0x67);//窗口內(nèi)部編程WriteCmd(0xf8);//insidemodefor(i=0;i<120;i++){WriteDat(0xff);}如果要畫一條豎線,則可以通過如下的配置:WriteCmd(0x75);//setrowMSBaddressWriteCmd(0x64);//setrowLSBaddressWriteCmd(0x14);//setcolumnMSBaddress列的起始地址WriteCmd(0x0b);//setcolumnLSBaddress//配置窗口WriteCmd(0xf5);//setrowstartaddressWriteCmd(0x54);//startaddress=0x00WriteCmd(0xf7);//setrowendaddressWriteCmd(0x54);//rowendaddressWriteCmd(0xf4);//setoolumnstartaddressWriteCmd(0x4b);//startaddress=0WriteCmd(0xf6);//setcolumnendaddressWriteCmd(0x67);

第5章系統(tǒng)調(diào)試本設(shè)計仿真軟件采用keiluvision3軟件。KeilSoftware公司推出的Uision3是一款可用于多種8051MCU的集成開發(fā)環(huán)境(IDE),該IDE同時也是PK51及其它開發(fā)套件的一個重要組件。除增加了源代碼、功能導(dǎo)航器、模板編輯以及改進(jìn)的搜索功能外,Uvision3還提供了一個配置向?qū)Чδ?,加速了啟動代碼和配置文件的生成。此外其內(nèi)置的仿真器可模擬目標(biāo)MCU,包括指令集、片上外圍設(shè)備及外部信號等。Uvision3提供邏輯分析器,可監(jiān)控基于MCUI/O引腳和外設(shè)狀態(tài)變化下的程序變量。Uvision3提供對多種最新的8051類微處理器的支持,包括AnalogDevices的ADUC83x和ADUC84x,以及Infineon的XC866等。系統(tǒng)調(diào)試如下:5.1調(diào)試方法如圖5.1所示:圖5.1原理調(diào)試圖5.2調(diào)試結(jié)果與分析加斷點運(yùn)行,運(yùn)行到斷點,暫停等待調(diào)試員下一步調(diào)試。如圖5.2所示。圖5.2單步運(yùn)行調(diào)試圖加斷點運(yùn)行,運(yùn)行到斷點,暫停等待調(diào)試員下一步調(diào)試。如圖5.3所示。圖5.3加點運(yùn)行調(diào)試圖

總結(jié)本系統(tǒng)主要是為便攜式產(chǎn)品的界面進(jìn)行的設(shè)計。電子產(chǎn)品的界面設(shè)計的工作量相對來說是比較大的,我們在設(shè)計程序架構(gòu)時應(yīng)考慮到這一一點。在編寫液晶的各種顯示函數(shù)時盡量編寫成子函數(shù)的形式,而且盡可能的提高函數(shù)的可伸縮性,這樣就可以大大的減少程序的代碼量,也為整個程序的結(jié)構(gòu)設(shè)計提供了方便。在界面框架設(shè)計方面,盡可能的提前畫好框圖,在整個程序設(shè)計中,不要隨意的更改這個框架,否則給人以混亂的感覺。對自己各級的菜單框架設(shè)計也會帶來不便,在器件的選取方面,低功耗是便攜式產(chǎn)品的一個硬指標(biāo)。沒有超低的功耗,產(chǎn)品在銷售市場便沒有競爭力。在單片機(jī)的選取方面,盡量選擇低功耗的、內(nèi)部存儲容量大,內(nèi)部RAM空間大的單片機(jī)。因為在界面的顯示過程中,需要建立大量的字庫存放在單片機(jī)的FLASH或內(nèi)部RAM中,涉及到的菜單級數(shù)比較多,列表選項較多,數(shù)據(jù)量比較大,一般8位或16位的單片機(jī)沒有這么大的存儲空間供我們使用。在這方面,STM32系列的單片機(jī)是首選。對于液晶的選取,低功耗仍然是不可缺少的,但液晶操作的靈活性也是-大因素。在這方面,信利的這款液晶模塊做的很好,它的窗口模式為我們局部進(jìn)行界面的更新、畫線等功能提供了極大的便利,不需要我們整屏的去刷屏顯示,這樣也降低了整個液晶模塊的功耗。在系統(tǒng)的調(diào)試方面,液晶初始化時需要我們注意,如果液晶初始化成功,那么它的內(nèi)部升壓將工作。VLCD端的電壓將高達(dá)十幾伏。如果沒有初始化成功則VLCD端是測不到高電壓的。我們需要結(jié)合STM32單片機(jī)工作的頻率與液晶內(nèi)部控制器的操作時序來寫這個初始化函數(shù)。特別是要注意STM32單片機(jī)的主頻可以達(dá)到72MHZ,在編寫寫命令或?qū)憯?shù)據(jù)的函數(shù)時,要加入適當(dāng)?shù)难訒r。

參考文獻(xiàn)[1]高鋒單片機(jī)應(yīng)用系統(tǒng)設(shè)計及實用技術(shù).北京:機(jī)械工業(yè)出版社,2004.4[2]郭強(qiáng)液晶顯示器的驅(qū)動和控制.北京:北京清華蓬遠(yuǎn)科貿(mào)公司,1999.4[3]李朝青單片機(jī)原理及接口技術(shù).北京:北京航空航天大學(xué)出版社,2003.4[4]徐惠民,安德寧單片微型計算機(jī)原理、接口及應(yīng)用.北京:北京郵電大學(xué)出版社,2000.8[5]童詩白,華成英著.模擬電子技術(shù)[M].北京:高等教育出版社2005.1[6]王占廣基于C51的液晶顯示模塊的研究與應(yīng)用.甘肅科技報,2005.1[7]張鵬飛單片機(jī)技術(shù)應(yīng)用的發(fā)展?fàn)顩r研究.浙江工商職業(yè)技術(shù)學(xué)院學(xué)報,2005.1[8]高志華,沈小麗液晶驅(qū)動芯片及其硬件軟件設(shè)計中國計量學(xué)院,1997.1[9]嚴(yán)義,包鍵單片機(jī)實現(xiàn)多路LCD直接驅(qū)動杭州電子工業(yè)學(xué)院,1998.2[10]杜忠良,高旭光液晶顯示控制器SED的特性與應(yīng)用電測與儀表,1999.4[11]陳忠波,胡鵬程液晶顯示控制原理及應(yīng)用.沈陽:鐵路計算機(jī)應(yīng)用,1999.6[12]程加力,司玉娟用液晶驅(qū)動芯片驅(qū)動有機(jī)發(fā)光顯示屏的設(shè)計發(fā)光學(xué)報,2004.10

附錄#include"config.h"#include"string.h"#include"DS18B20.h"#include"LCD12864_Driver.h"#include"key.h"uint32uiDatas;.uint32uiTimes;voidDelayNS(uint32uiDly){uint32i;for(;uiDly>0;uiDly--){for(i=0;i<50000;i++);}voidRTCInit(void){PREINT=Fpclk/32768-1;PREFRAC=Fpclk-(Fpclk/32768)*32768;CCR=0x00;YEAR=2008;MONTH=04;DOM.=07;DOW=4;HOUR=15;MIN=52;SEC=59;.CIIR.=0x01;CCR=0x01;voidDisp__Time(voiduint32bak;uiTimes=CTIME0;uiDatas=CTIME1;LCD_Disp_Strs(2,1,"日期:");.bak=(uiDatas>>16)&0oxfff;LCD_Disp_NUM(2,4,bak);LCD_Disp_Ascii(2,5,'-);bak=(uiDatas>>8)&0xOf;LCD_Disp_NUM(2,6,bak);LCD_Disp_Ascii(2,7,');.bak=uiDatas&0x1f;LCD_Disp_NUM(2,8,bak);LCD_Disp_Strs(3,1,"時間:");.bak=(uiTimes>>24)&0x07;LCD_Disp_Strs(3,1,"星期:);LCD_Disp_NUM(3,5,bak);bak=(uiTimes>>16)&0x1f;LCD_Disp_NUM(3,6,bak);LCD_Disp__Ascii(3,7,:);bak=(uiTimes>>8)&0x3f;LCD_Disp_NUM(3,5,bak);LCD_Disp_Ascii(3,7,':);bak=uiTimes&0x3f;LCD_Disp_NUM(3,7,bak);intmain(void)charstr[20];.uint32bak;PINSEL0=PINSEL0&(~0x0F);PINSEL0=PINSEL0|0x05;Temp_init();.LCD_Initial();RTCInit();while(1)Read_18B200;sprintf(str,"\nTEMP=%of",ftemperature);LCD_Disp__Strs(1,1,str);.while(0==(ILR&0x01));LR=0x01;Disp__Time(;while(IO0PIN&KEY))Set__Time();if(checkKEYCLR))LCD_Erase();RTCInit();}DelayNS(10);return0;#include"config.h"#include"DS18B20.h"volatilefp64ftemperature=0.0;voidDelayNS__us(uint32uiDly)uint32i;for(;uiDly>0;uiDly--)for(i=0;i<8;i++);voidTemp_init(void){PINSEL1=PINSEL1&(~(0x03<<2));.}intReset_18B20(void)IO0DIR=IO0DIRIDS18B20;IO0SET=IO0SETIDS18B20;DelayNS__us(50);IO0CLR=IO0CLRIDS18B20;DelayNS__us(700);IO0SET=IO0SET|DS18B20;DelayNS__us(20);IO0DIR=IO0DIR&(~DS18B20);.DelayNS_us(30);if(IO0PIN&DS18B20)return0;elsereturn1;unsignedcharReadbyte_18B20(void){unsignedchari,temp=0;for(i=0;i<8;i++)temp>>>=1;IO0DIR=IO0DIRIDS18B20;IO0SET=IO0SETIDS18B20;DelayNS__us(20);IO0CLR=IO0CLRIDS18B20;DelayNS__us(10);IO0DIR=IO0DIR&(~DS18B20);DelayNS__us(5);if(IO0PIN&DS18B20)temp|=0x80;IO0DIR=IO0DIR|DS18B20;IO0SET=IO0SETIDS18B20;DelayNS(45);returntemp;voidWritebyte_.18B20(unsignedchardata)unsignedchari;for(i=0;i<8;i++)IO0DIR=IO0DIRIDS18B20;IO0SET|=DS18B20;DelayNS_us(10);if(data&0x01)IO0CLR|=DS18B20;DelayNS__us(12);IO0SET|=DSI8B20;DelayNS__us(60);}elseIO0CLR|=DS18B20;DelayNS__us(72);IO0SET|=DS18B20;DelayNS__us(62);data>>=1;}voidRead_18B20(void)unsignedchartemp1=0,temp2=0;int16temperature=0;if(Reset_18B200)DelayNS__us(7200);Writebyte_18B20(0xcc);DelayNS__us(7200);Writebyte_18B20(0x44);DelayNS__us(8000);if(Reset_18B200)DelayNS_us(8000);Writebyte_.18B20(0xcc);DelayNS__us(8000);Writebyte_,18B20(0xbe);templ=Readbyte_18B200);DelayNS__us(720);temp2=Readbyte_18B200);Reset_18B200);if(temp2&0xf8){temperature=((temp2<<8)|temp1);temperature=((~temperature)+1);ftemperature=temperature*(-0.0625);else{temperature=((temp2<<8)|templ);.ftemperature=(fp64)(temperature*0.0625);}else}#include"config.h"#defineSCK0(1<<8)#defineMOSI0(1<<12)#defineCPHA(1<<3)#defineCPOL(1<<4)#defineMSTR(1<<5)#defineLSBF(1<<6)#defineSPIMODEMSTRuint8uiDisp__Addr=0x00;voiddelay(uint32uiDly)uint32i;for(;uiDly>0;uiDly-)for(i=0;i<5000;i++);voidLCD_SPLInitial()PINSELOI=(SCKOIMOSI0);SPI_SPCCR=8;SPI_SPCR=SPI_MODE;voidLCD_Serial_Send(uint8uidata,uint8uimark)uint8uiComorData;switch(uimark)case0:uiComorData=0xfa;break;case1:uiComorData=0xf8;break;}SPISPDR=uiComorData;while((SPI_SPSR&0x80)==0);delay(1);SPISPDR=(uidata&0xf0);while((SPLSPSR&0x80)==0);delay(1);SPISPDR=((uidata&0x0f)<<4);while((SPI_SPSR&0x80)===0);delay(1);voidLCD_Initial()LCD_SerialSend(0x30,1);LCD_Serial_Send(0x04,1);LCD_Serial_Send(0x0c,1);LCD_Serial_Send(0x01,1);LCD_Serial_Send(0x02,1);LCD_Serial_Send(0x80,1);voidLCD_Erase()LCD_SerialSend(0x01,1);voidLCD_Position_Select(uint8uiline,uint8uirow)if(uiline==1)uiDisp__Addr=0x80+uirow-1;elseif(uiline==:=2)uiDisp_Addr=0x90+uirow-1;elseif(uiline====3)uiDisp__Addr=0x88+uirow-1;.elseuiDisp_Addr=0x98+uirow-1;voidLCD_Disp__Char(uint8uiline,uint8uirow,uint8uichar)LCD__Position_Select(uiline,uirow);LCD_SerialSend(uiDisp_Addr,1);LCD_SerialSend(uichar,0);voidLCD__Disp_Strs(uint8uiline,uint8uirow,char*pchstrs)uint8uiNum;.LCD__Position_Select(uiline,uirow);LCD_SerialSend(uiDisp_Addr,1);for(uiNum=0;*(pchstrs+uiNum)!=^\0';uiNum++)LCD_SerialSend(*(pchstrs+uiNum),0);voidLCD_Disp__Ascii(uint8uiline,uint8uirow,uint8uisignal)LCD__Position_Select(uiline,uirow);LCD_SerialSend(uiDisp_Addr,1);LCD_SerialSend(uisignal,0);voidLCD_Disp_NUM(

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論