『壹』 嵌入式linux操作系統的源代碼怎麼下載下載之後怎麼閱讀怎麼通過源代碼生成操作系統操作系統怎麼運行
下載內核在:www.kernel.org。閱讀內核一般在windows上用sourceinsight。內核源代碼不分什麼嵌入式還是pc機。通過交叉編譯工具可以生產內核鏡像,把鏡像燒到板子就可以運行了。燒制方法一般賣板子的廠家都會提供的。一般的燒制步驟是U-Boot,linux內核,linux文件系統,Qt。Qt是一個圖形界面。
總之,你自己裝個linux系統,建議ubuntu,自己重新編譯下內核,你就會明白怎麼編譯內核的。你去買個arm9或者arm11的開發板,自己弄弄就會明白交叉編譯工具怎麼用的。
『貳』 嵌入式C語言重點知識點
嵌入式LINUX
嵌入式Linux 是將日益流行的Linux操作系統進行裁剪修改,使之能在嵌入式計算機系統上運行的一種操作系統。Linux做嵌入式的優勢,首先,Linux是開放源代碼;其次,Linux的內核小、效率高,可以定製,其系統內核最小隻有約134KB;第三,Linux是免費的OS,Linux還有著嵌入式操作系統所需要的很多特色,突出的就是Linux適應於多種CPU和多種硬體平台而且性能穩定,裁剪性很好,開發和使用都很容易。同時,Linux內核的結構在網路方面是非常完整的,Linux對網路中最常用的TCP/IP協議有最完備的支持。提供了包括十兆、百兆、千兆的乙太網絡,以及無線網路,Token Ring(令牌環網)、光纖甚至衛星的支持。
移植步驟:
1.Bootloader的移植;
2.嵌入式Linux操作系統內核的移植;
3.嵌入式Linux操作系統根文件系統的創建;
4.電路板上外設Linux驅動程序的編寫。
WinCE
WinCE是微軟公司嵌入式、移動計算平台的基礎,它是一個開放的、可升級的32位嵌入式操作系統,是基於掌上型電腦類的電子設備操作系統,它是精簡的Windows 95,Win CE的圖形用戶界面相當出色。WinCE是從整體上為有限資源的平台設計的多線程、完整優先權、多任務的操作系統。它的模塊化設計允許它對於從掌上電腦到專用的工業控制器的用戶電子設備進行定製。操作系統的基本內核需要至少200K的ROM。
一般來說,一個WinCE系統包括四層結構:應用程序、WinCE內核映像、板級支持包(BSP)、硬體平台。而基本軟體平台則主要由WinCE系統內核映像(OS Image)和板卡支持包(BSP)兩部分組成。因為WinCE系統是一個軟硬體緊密結合的系統,因此即使CPU處理器相同,但是如果開發板上的外圍硬體不相同,這個時候還是需要修改BSP來完成一個新的BSP。因此換句話說,就是WinCE的移植過程主要是改寫BSP的過程。
Android
Android 是一個包括操作系統,中間件以及一些重要應用程序的專門針對移動設備的層次結構的軟體集。Android 作為一個完全開源的.操作系統,是由操作系統Linux、中間件以及核心應用程序組成的軟體棧。通過 android SDK 提供的 API 以及相應的開發工具, 程序員可以很方便的開發android平台上的應用程序。其整個系統由應用程序,應用程序框架,應用程序庫,Android運行庫,Linux內核(Linux Kernel)五個部分組成。Android操作系統內置了一部分應用程序, 包括電子郵件客戶端、SMS程序、日歷、地圖、瀏覽器、通訊錄以及其他的程序,值得一提的是這些所有的程序都是用java編寫的。
移植的主要的工作是驅動,硬體抽象層的移植。為了更好地理解和調試系統,也應該適當地了解上層對硬體抽象層的調用情況。
TinyOS
TinyOS是一個開源的嵌入式操作系統,它是由加州大學的伯利克分校開發出來的,主要應用於無線感測器網路方面。程序採用的是模塊化設計,所以它的程序核心往往都很小,一般來說核心代碼和數據大概在400 Bytes左右,能夠突破感測器存儲資源少的限制。TinyOS提供一系列可重用的組件,一個應用程序可以通過連接配置文件(A Wiring Specification)將各種組件連接起來,以完成它所需要的功能。
嵌入式實時操作系統(RTOS)
在工業控制、 軍事設備、航空航天等領域對系統的響應時間有苛刻的要求,這就需要使用實時系統。當外界事件或數據產生時,能夠接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間之內來控制生產過程或對處理系統作出快速響應,並控制所有實時任務協調一致運行的嵌入式操作系統。故對嵌入式實時操作系統的理解應該建立在對嵌入式系統的理解之上加入對響應時間的要求。
FreeRTOS
FreeRTOS是一個迷你操作系統內核的小型嵌入式系統。作為一個輕量級的操作系統,功能包括:任務管理、時間管理、信號量、消息隊列、內存管理、記錄功能等,可基本滿足較小系統的需要。FreeRTOS任務可選擇是否共享堆棧,並且沒有任務數限制,多個任務可以分配相同的優先權。相同優先順序任務的輪轉調度,同時可設成可剝奪內核或不可剝奪內核。
FreeRTOS 的移植主要需要改寫如下三個文件。
1.portmacro.h
2.port.c
3. port.asm
μTenux
μTenux基於ARM微控制器平台,對uT最適用於ARM Cortex M0-M4系列的微控制器,代碼開源、免費,是一個功能強大的搶占式實時多任務操作系統。μTenux除具有實時嵌入式操作系統的一般特性:可移植性,可固化,可裁剪等特性以外,它還具有如下優點:
(1)微內核。無MMU, ROM/RAM佔用量小,所佔ROM最大60KB,最小10KB;RAM最大12KB,最小2KB;
(2)開源免費;
(3)支持所有32位ARM7/9和Cortex M系列的微控制器;
(4)可配置多達到256個任務以及140個任務優先順序;
(5)有良好的商業支持, T-Engine論壇進行總的維護。
移植主要包括:晶元系統時鍾移植,外設移植和通用輸出/輸入埠的移植以及看門狗模塊移植。由於考慮到內核代碼的重要性以及其在整個移植中的重要意義,且為了整個系統有更好的實時性,可選用匯編語言編寫操作系統的啟動代碼。
VxWorks
VxWorks系統提供多處理器間和任務間高效的信號燈、消息隊列、管道、網路透明的套接字。實時系統的另一關鍵特性是硬體中斷處理。為了獲得最快速可靠的中斷響應,VxWorks系統的中斷服務程序ISR有自己的上下文。VxWorks實時操作系統由400多個相對獨立的、短小精煉的目標模塊組成,用戶可根據需要選擇適當模塊來裁剪和配置系統,這有效地保證了系統的安全性和可靠性。系統的鏈接器可按應用的需要自動鏈接一些目標模塊。這樣,通過目標模塊之間的按需組合,可得到許多滿足功能需求的應用。
移植過程可以參考網路上一些BSP代碼,BSP的英文全稱為board support package,即板級支持包,它的作用是針對特殊的硬體平台,為VxWorks內核提供操作的介面。
μClinux
嵌入式Linux作為一個開放源代碼的操作系統,以價格低廉、功能強大又易移植的特性正在被廣泛應用,μClinux是專門針對沒有MMU的處理器而設計的嵌入式Linux,非常適合中低端嵌入式系統的需求。 在GNU通用公共許可證的授權下,μClinux操作系統的用戶可以使用幾乎所有Linux的API函數,不會因為沒有內存管理單元MMU而受到影響;而且,μClinux在標準的Linux基礎上進行了適當的裁剪和優化,形成了一個高度優化的、代碼緊湊的嵌入式Linux,體積小了,但是仍然保留了Linux的大多數的優點,比如穩定性好、強大的網路功能、良好的可移植性、完備的文件系統支持功能、以及標准豐富的應用程序介面API等,可以支持類似ARM7TDMI等類型多的小巧玲瓏的中央處理器。
eCos
eCos中文翻譯為嵌入式可配置操作系統或嵌入式可配置實時操作系統。適合於深度嵌入式應用,主要應用對象包括消費電子、電信、車載設備、手持設備以及其他一些低成本和攜帶型應用。eCos是一種開發源代碼軟體,無任何版權費用。 eCos最大的特點是模塊化,內核可配置。如果說嵌入式Linux太龐大了,那麼eCos可能就能夠滿足要求。它是一個針對16位、32位和64位處理器的可移植開放源代碼的嵌入式RTOS。和嵌入式Linux不同,它是由專門設計嵌入式系統的工作組設計的。eCos具有相當豐富的特性和一個配置工具,後者能夠讓你選取你所需要的特性。
eCos的軟體分了若乾的模塊,移植工作主要在他的hal層進行,所謂hal(硬體抽象層)就是把和硬體相關的軟體湊到一起。
μC/OS-II
μC/OS-II是一個完整的、可移植、可固化、可裁剪的佔先式實時多任務內核。μC/OS-II絕大部分的代碼是用ANSI的C語言編寫的,包含一小部分匯編代碼,使之可供不同架構的微處理器使用。其結構小巧簡潔且支持搶占式的多任務調度與管理。此實時操作系統管理任務數多達64個,且提供內部程序存儲器管理、系統運行時間管理、多任務實時調度與管理等功能。由於它的作者佔用和保留了8個任務,所以留給用戶應用程序最多可有56個任務。賦予各個任務的優先順序必須是不相同的。這意味著μC/OS-II不支持時間片輪轉調度法。μC/OS-II為每個任務設置獨立的堆棧空間,可以快速實現任務切換。
將μC/OS-II操作系統移植到目標處理器上,需要從硬體和軟體兩方面來考慮。硬體方面,目標處理器需滿足以下條件:
①處理器的C編譯器能產生可重入代碼;
②用C語言可以開/關中斷;
③處理器支持中斷,並且能夠產生定時中斷(通常在10~1000 Hz之間);
④處理器能夠支持容納一定量數據的硬體堆棧;
⑤處理器有將堆棧指針和其他寄存器讀出和存儲到堆棧或內存中的指令。
軟體方面,主要是一些與處理器相關的代碼移植,其分布在OS_CPU.H、OS_CPU_C.C和OS_CPU_A.ASM這3個不同的文件中。
『叄』 嵌入式ucos2 是軟體 還是一段源代碼 拷到keil裡面就是了。 老師讓自己回去看。。一點頭緒都沒有。。。
ucos2即抄 ucos_II 它是一堆程序代碼,它的源代碼是完全開放的,也就是說在網上能免費下載到這些程序代碼,這些源代碼不針對特定的晶元CPU,可以在很多晶元上運行。它是一個完整的整體,能實現任務新建、任務處理、任務切換等等功能,
在Keil編設環境下使用ucos_II:
1、首先電腦上要有ucos_II的源代碼;
2、然後,最簡單的可以用Add Files to Group將ucos_ii的C文件添加到工程中。
建議:ucos_ii的源代碼最好復制到工程文件夾中再添加。
另:關於在工程中應用ucos_ii,還有很多其他應注意的地方。你確實需要一本書或其他更詳細的資料。
『肆』 嵌入式linux課程設計
Ⅰ 跪求 ARM嵌入式linux系統開發詳解(珍藏版)pdf
珍藏版啊。。
Ⅱ 學嵌入式linux需要先學什麼
剛入門的時候,淘寶買一塊cortex m3開發板即可入手,通過項目,你需要了解:任務調度、進程間通信、內存管理、設備驅動、文件系統、TCP/IP協議棧、同步非同步、中斷、軟體架構插件化等等基本原理,這些對你後面轉Linux應用開發,安卓開發,後台開發大有好處。
到這一步,就看自己職業方向想往哪裡發展,如果是想深入IOT物聯網做端雲連接,那麼可以把幾種基本匯流排驅動,I2C、SPI、USART理解透,如果是想擁抱互聯網轉入應用開發,那麼可以把基礎組件,如協議棧、文件系統吃透,BAT面試不是很難,問的都是這些基礎。
順便說一下,學東西就要學對市場有用的,不要過於學習屠龍之術,炫技給個人帶來不了財富,公司需要的是能幹活的人。
不準備講過於偏硬體的知識如Cortex-M3的多種中斷模式,操作寄存器組,晶元降噪等內容,而是專注於操作系統基本知識和項目經驗,這些對於開發者後面接觸Linux系統大有脾益,這些軟體開發經驗也是去互聯網公司看重的能力。如有需要學習Linux命令請如下查找:
Ⅲ 基於linux嵌入式平台井字棋課程設計
基於linux嵌入式平台井字棋課程
這么肯定還好的
確
Ⅳ 跪求一份完整的嵌入式Linux方面的C項目實例
怎樣的人適合學習嵌入式?
學習嵌入式需要有一定的基礎,這些基礎大概包括下面兩點:
學過c語言,匯編;
對微控制器有一定了解。
一般理工類(計算機,自動化,電子類專業)的學生大三學比較合適。因為到了大三,一般學過了c語言及匯編,雖然大部分學生沒有獨立寫過一個程序,但至少上過這門課,自己也看過相關知識點;而且上過8051等微控制器原理的課程,也看過類似的教課書。
具備以上基礎的人,也不是誰都可以學。因為嵌入式學習門檻比較高,難度比較大,不但要有一定的毅力,而且要觸類旁通,如果太死板也很難學會。
概括的說學習嵌入式還必備下列性格:
熱愛研發!
切忌浮躁!
執著,頑強,自信!
舉一反三!
如果你符合以上條件,完全可以經過努力把嵌入式學好,我了解到的在華清遠見學習的一個同學,之前基本上什麼基礎都沒有,寫一個「hello world」程序都為難,編譯了幾次才通過,但是經過四個月的努力,在華清遠見專業老師和同學們的熱心幫助下,從一個完全的菜鳥變成了入門級別的linux工程師了,找到了一份做應用開發的工作,工資大概有四千吧,還算不錯。
LZ要自學的話,可以多到華清遠見的網站上看看他們的課程設置,就知道自己該學些什麼,還有很多學習資料和視頻可以下載,另外華清遠見出版的40多本嵌入式專業暢銷書,外面各大書店和圖書館都有,你都可以去翻翻看看。
祝你早日學有所成!
請參考,希望能幫到你。
Ⅳ 做嵌入式原理課程設計 linux內核精簡 是什麼意思,該怎麼做
OK 我發給你 .
Ⅵ 求嵌入式linux開發詳細流程(步驟)
建立以Linux系統為基礎的開發環境;
配置開發主機(MINICOM調試嵌入式開發板、NFS網路文件系統,防火牆);
建立引導裝載程序BOOTLOADER(公開源代碼的BOOTLOADER,如U-BOOT、BLOB、VIVI、LILO、ARM-BOOT、RED-BOOT等);
下載別人已經移植好的Linux操作系統(如μCLinux、ARM-Linux、PPC-Linux等);
建立根文件系統(包括:/etc/init.d/rc.S、/etc/profile、/etc/.profile等);
建立應用程序的Flash磁碟分區,一般使用JFFS2或YAFFS文件系統;
開發應用程序,應用程序可以放入根文件系統中,也可以放入YAFFS、JFFS2文件系統中;
燒寫內核、根文件系統、應用程序、發布產品。
Ⅶ 嵌入式Linux課程設計源代碼
Linux課程體系了解一來下:
Linux雲計源算網路管理實戰
Linux系統管理及服務配置實戰
Linux Shell自動化運維編程實戰
Linux雲計算網路管理實戰
大型網站高並發架構及自動化運維項目
網站安全滲透測試及性能調優項目實戰
公有雲運維技術項目實戰
企業私有雲架構及運維實戰
Python自動化運維開發基礎
Python自動化運維開發項目實戰
Ⅷ 嵌入式ARM/LINUX畢業設計
有辦法的話找個附近的嵌入式公司選他們的板子在上面做個小擴展性開發。最好選嵌入式教授采購實驗設備的代理 之類的,甚至可以「開發」一款他們已有的功能,抄一下寫個論文即可。
Ⅸ 學習嵌入式linux流程
嵌入式學習是一個循序漸進的過程,有C語言基礎還是比較好的,C++的話不搞上層應用就用不上,如果是希望向嵌入式Linux方向發展的話,關於這個方向,我認為大概分3個階段:
1、嵌入式linux上層應用,包括QT的GUI開發
2、嵌入式linux系統開發
3、嵌入式linux驅動開發
嵌入式目前主要面向的幾個操作系統是,LINUX,WINCE、VxWorks等等
Linux是開源免費的,而且其源代碼是開放的,更加適合我們學習嵌入式。
你可以嘗試以下路線:
(1) C語言是所有編程語言中的強者,單片機、DSP、類似ARM的種種晶元的編程都可以用C語言搞定),因此必須非常熟練的掌握。
推薦書籍:《The C Programming Language》 這本經典的教材是老外寫的,也有中譯版本。
(2) 操作系統原理,是必需的,如果你是計算機專業畢業那也就無所謂了,如果是非計算機專業的就必須找一本比較淺顯的計算機原理書籍看一看,把啥叫「進程」「線程」「系統調度」等等基本問題搞清楚。
(3)Linux操作系統就是用C語言編寫的,所以你也應該先學習下Linux方面的編程,只有你會應用了,才能近一步去了解其內核的精髓。
推薦書籍:《UNIX環境高級編程》(第2版)
(4) 了解ARM的架構,原理,以及其匯編指令,我們在嵌入式開發中,一般很少去寫匯編,但是最起碼的要求是能夠看懂arm匯編。
(5) 系統移植的時候,就需要你從最下層的bootloader開始,然後內核移植,文件系統移植等。而移植這部分對硬體的依賴是非常大的,其配置步驟也相對復雜,也沒有太多詳細資料。
(6) 驅動開發
linux驅動程序設計既是個極富有挑戰性的領域,又是一個博大精深的內容。
linux驅動程序設計本質是屬於linux內核編程范疇的,因而是對linux內核和內核編程是有要求的。在學習前你要想了解linux內核的組成,因為每一部分要詳細研究的話足夠可以擴展成一本厚書。
以上只不過是大概的框架,在實際的開發中還會涉及很多東西,比如:交叉編譯、makefile、shell腳本等等,所以說學習嵌入式的周期較長,門檻較高,自學的話更是需要較強的學習能力和專業功底。只要能堅持下來一定會取得成功!
其實LZ可以到一些嵌入式培訓機構的網站上看一下他們的課程設置,就會在腦子里有個清晰的思路,比如華清遠見的官方網站,上面的嵌入式內容很豐富,嵌入式方面的信息更新也很迅速,沒事可以去轉轉。
Ⅹ 求嵌入式Linux 課程設計,隨便什麼題目,用C或C++寫的!要有完整的源代碼,有實驗報告就更好了!
網上很多啊,自己去搜一個就好了,但是要改動一下,不然會重復的...弱弱的問一下,你是南京某高校的么?
『伍』 嵌入式溫濕度感測器C語言代碼求幫忙注釋
#include "ioCC2430.h" //包含頭文件,相應的板子以及感測器一些信息
#include "hal.h"
#include <math.h>
//#include <intrins.h>
#include <stdio.h>
typedef union //定義聯合體,
{
unsigned int i;
float f;
} value; //定義聯合體類型名稱為value
#define noACK 0
#define ACK 1
#define STATUS_REG_W 0x06 //0x06 = 0000 0110
#define STATUS_REG_R 0x07 //0x07 = 0000 0111
#define MEASURE_TEMP 0x03 //0x03 = 0000 0011
#define MEASURE_HUMI 0x05 //0x05 = 0000 0101
#define RESET 0x1e //0x1e = 0001 1110
#define SDA P1_6 //定義SDA代表的是P1_6腳
#define SCL P1_7
#define begin P2_0
unsigned char d1,d2,d3,d4,d5,d6,d7; //定義無符號字元型變數
void Wait(unsigned int ms) //定義wait函數,主要用於軟體循環,延時作用
{
unsigned char g,k;
while(ms)
{
for(g = 0;g <= 167; g++)
{
for(k = 0;k <= 48; k++);
}
ms--;
}
}
void QWait() //1us的延時
{
asm("NOP"); //加入匯編操作語句,空操作,主要用於機器周期執行
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
}
void initUART(void) //初始化單片機的串口
{
IO_PER_LOC_USART0_AT_PORT0_PIN2345(); //具體函數的定義與用法,你得參考頭文件中的程序代碼了
IO_DIR_PORT_PIN(1, 6, IO_OUT);
IO_DIR_PORT_PIN(1, 7, IO_OUT);
//IO_IMODE_PORT_PIN(1, 6, IO_IMODE_TRI);
//IO_IMODE_PORT_PIN(1, 7, IO_IMODE_TRI);
IO_DIR_PORT_PIN(2, 0, IO_OUT);
IO_FUNC_PORT_PIN(2, 0, IO_FUNC_GIO);
//SET_MAIN_CLOCK_SOURCE(RC);
SET_MAIN_CLOCK_SOURCE(CRYSTAL);
UART_SETUP(0, 115200, HIGH_STOP); //設置傳輸數據的波特率115200
UTX0IF = 1;
U0CSR |= 0XC7; //U0CSR = U0CSR | 0x1010 0111 (進行位或操作)
IEN0 |= 0x84;
SDA = 1;
SCL = 0;
}
int putchar (int c) //定義輸入字元函數,給的參數是一個整型的數
{
if (c == ' ') //判斷參數c的值是否和' '的值相等
{
while (!UTX0IF); //執行的時候UTX0IF的值是0,此處不是很理解?
UTX0IF = 0; //給UTX0IF賦0
U0DBUF = 0x0d; //U0DBUF賦值0x0d = 0000 1011
}
while (!UTX0IF);
UTX0IF = 0;
return (U0DBUF = c); //如果c的值不是' '也就是換行符的時候,將c的值傳遞到U0DBUF寄存器中
}
char s_write_byte(unsigned char value) //定義寫位元組函數(8位)
{
unsigned char i,error = 0;
for (i = 0x80;i > 0;i /= 2) //i 賦初始值0x80 = 128, 執行判斷是i > 0,執行語句是i = i / 2; 即i = 128,64,32,16,8,4,2,1,0.5(0),8位
{
if (i & value)
SDA = 1;
else
SDA = 0;
SCL = 1; //此時SCL埠處,也就是p1_7引腳處是高電平
QWait(); //因為寫入需要時間,所以程序之中加入下面幾條語句
QWait();
QWait();
QWait();
QWait();
SCL = 0; //使能p1_7眼角處低電平,使的數據寫入(具體需要看單片機控制晶元的手冊
asm("NOP");
asm("NOP");
}
SDA = 1;
SCL = 1;
asm("NOP");
error = SDA;
QWait();
QWait();
QWait();
SDA = 1;
SCL = 0;
return error;
}
char s_read_byte(unsigned char ack) //讀取數據,按照位元組位的順序讀取(8位)128 = 1000 0000 ,64 = 0100 0000, 32 = 0010 0000 ,16 = 0001 0000, 8 = 0000 1000, 4 = 0000 0100 , 2 = 0000 0010, 1 = 0000 0001
{
unsigned char i,val = 0;
SDA= 1;
for(i = 0x80;i > 0;i /= 2) //同上
{
SCL = 1;
if (SDA) //判斷SDA處是否有高電平
val = (val | i); //進行或操作
else
val = (val | 0x00);
SCL = 0;
QWait();
QWait();
QWait();
QWait();
QWait();
}
SDA = !ack;
SCL = 1;
QWait();
QWait();
QWait();
QWait();
QWait();
SCL = 0;
SDA = 1;
return val; //返回讀取到的數據,一個位元組,八位
}
void s_transstart(void) //傳輸使能函數,就是給控制器引腳處相應電平,使對應模塊工作
{
SDA = 1;
SCL = 0;
QWait();
QWait();
SCL = 1;
QWait();
QWait();
SDA = 0;
QWait();
QWait();
SCL = 0;
QWait();
QWait();
QWait();
QWait();
QWait();
SCL = 1;
QWait();
QWait();
SDA = 1;
QWait();
QWait();
SCL = 0;
QWait();
QWait();
}
void s_connectionreset(void) //復位操作函數
{
unsigned char i;
SDA = 1;
SCL = 0;
for(i = 0;i < 9; i++)
{
SCL = 1;
QWait();
QWait();
SCL = 0;
QWait();
QWait();
}
s_transstart(); //調用開始函數
}
char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) //函數,主要統計傳輸的數據個數
{
unsigned er = 0;
unsigned int i,j;
s_transstart();
switch(mode)
{
case 3 :er += s_write_byte(3);
break;
case 5 :er += s_write_byte(5);
break;
default :break;
}
for(i = 0;i < 65535;i++)
{
for(j = 0;j < 65535;j++)
{if(SDA == 0)
{
break;
}
}
if(SDA == 0)
{
break;
}
}
if(SDA)
{
er += 1;
}
*(p_value) = s_read_byte(ACK);
*(p_value + 1) = s_read_byte(ACK);
*p_checksum = s_read_byte(noACK);
d6 = *(p_value);
d7=*(p_value + 1);
return er;
}
void calc_sth11(float *p_humidity ,float *p_temperature)//計算溫度值
{
const float C1 =- 4.0;
const float C2 =+ 0.0405;
const float C3 =- 0.0000028;
const float T1 =+ 0.01;
const float T2 =+ 0.00008;
float rh =* p_humidity;
float t =* p_temperature;
float rh_lin;
float rh_true;
float t_C;
t_C = t * 0.01 - 44.0 ;
rh_lin = C3 * rh * rh + C2 * rh + C1;
rh_true = (t * 0.01 - 40.0 - 25) * (T1 + T2 * rh) + rh_lin;
if(rh_true > 100)
{
rh_true = 100;
}
if(rh_true < 0.1)
{
rh_true = 0.1;
}
*p_temperature = t_C;
*p_humidity = rh_true;
}
void main() //主函數
{
value humi_val,temp_val; //聲明兩個聯合體變數
unsigned char error,checksum; //聲明兩個無符號的字元型變數
initUART(); //初始化串口
P1INP |= 0xC0; //初始化P1引腳 , 0xC0 = 1010 0000 ,使P1_7和P1_5引腳為1
begin = 0;
s_connectionreset();
while(1) //無限循環操作
{
error = 0;
error += s_measure((unsigned char*) &humi_val.i,&checksum,5); //讀入串口的數據進行溫度的計算
d1 = d6;
d2 = d7;
error += s_measure((unsigned char*) &temp_val.i,&checksum,3);
d3 = d6;
d4 = d7;
if(error != 0)
s_connectionreset();
else
{
humi_val.f = (float)humi_val.i;
temp_val.f = (float)temp_val.i;
humi_val.f = d1 * 256 + d2;
temp_val.f = d3 * 256 + d4;
calc_sth11(&humi_val.f,&temp_val.f);
printf("temp:%5.1fC humi:%5.1f%% ",temp_val.f,humi_val.f);
// printf("t1:%x h1:%x ",d1,d2);
//printf("t2:%x h2:%x ",d3,d4);
}
Wait(150);
}
}