溫度傳感器cc2530源碼_第1頁
溫度傳感器cc2530源碼_第2頁
溫度傳感器cc2530源碼_第3頁
溫度傳感器cc2530源碼_第4頁
溫度傳感器cc2530源碼_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、-作者xxxx-日期xxxx溫度傳感器cc2530源碼【精品文檔】/*溫度傳感器頭文件(.h文件);*/* ds18b20程序。 本程序使用說明: 在使用之前必須在相應(yīng)的代碼文件里全局位置加入一段代碼: / #define FLOAT_MODE 1#if FLOAT_MODE unsigned char Temperature8; /小數(shù)模式需要8個(gè)字節(jié); #define Temp_Len_ 7 /溫度值字符串有效長度;#else unsigned char Temperature5; /整數(shù)模式需要5個(gè)字節(jié); #define Temp_Len_ 4 /溫度值字符串有效長度;#endif 加入

2、此段代碼后可以通過是否注釋 #define FLOAT_MODE 1這句代碼來選擇是獲取整數(shù)溫度還是獲取小數(shù)溫度,注釋后為獲取整數(shù)溫度。 獲取溫度的函數(shù)如下: TemperatureConver(); 不需要參數(shù),結(jié)果以字符串的形式保存在Temperaturex中,通過字符串操作方式操作該數(shù)組變量; 該程序在cc2530采用外部晶振32MHZ時(shí)使用,如果頻率不是32MHZ,會(huì)因?yàn)檠訒r(shí)不正確導(dǎo)致時(shí)序問題,故在其他頻率下使用需自行調(diào)試延時(shí)函數(shù)的函數(shù)體。 void ds18b20_delay_us(unsigned int x)*/#ifndef _DS18B20_H_#define _DS18B2

3、0_H_#include <ioCC2530.h>/引腳定義,即ds18b20的數(shù)據(jù)線;#define Ds18b20_Data P0_7 /根據(jù)實(shí)際更改;/*/ 開啟下列定義表示讀取的溫度精確 到小數(shù),注釋后精度為整數(shù);*/默認(rèn)注釋/ #define FLOAT_MODE 1 /默 認(rèn) 下 不 開 啟 ;<<<<<<-/自 行 更 改;/#if FLOAT_MODE extern unsigned char Temperature8; /小數(shù)模式需要8個(gè)字節(jié); #define Temp_Len_ 7 /溫度值字符串有效長度;#else exte

4、rn unsigned char Temperature5; /整數(shù)模式需要5個(gè)字節(jié); #define Temp_Len_ 4 /溫度值字符串有效長度; #endif/端口配置;#define INPUT_MODE P0DIR &= 0x7f#define OUTPUT_MODE P0DIR |= 0x80/32MHZ下,供溫度傳感器使用的us延時(shí)函數(shù);void ds18b20_delay_us(unsigned int x);/ds18b20初始化函數(shù);unsigned char DS18B20_Init(void); /讀一個(gè)字節(jié)函數(shù):unsigned char ReadByte(

5、void);/寫一個(gè)字節(jié)函數(shù);void WriteByte(unsigned char Byte);/讀取溫度函數(shù);unsigned int ReadTemperature(void);/溫度轉(zhuǎn)換函數(shù);void TemperatureConver(void);#endif/*溫度傳感器源文件;*/ #include "ds18b20.h"/#include "OnBoard.h"void ds18b20_delay_us(unsigned int x) unsigned int i,j; for(i=0;i<x;i+) for(j=0;j<2

6、;j+); /* while(x-) asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); */unsigned char DS18B20_Init(void) unsigned char IS_FINISH = 0; /若ds18b20復(fù)位成功,置1,默認(rèn)為0; unsigned int Count

7、 = 0; /獲取ds18b20復(fù)位成功與否時(shí)防止超時(shí)的變量; OUTPUT_MODE; /溫度傳感器IO口為輸出模式; Ds18b20_Data = 1; /初始時(shí)確保ds18b20數(shù)據(jù)線為高; ds18b20_delay_us(100); /稍作延時(shí); Ds18b20_Data = 0; /復(fù)位ds18b20; ds18b20_delay_us(600);/精確延時(shí),必須滿足480us960us; Ds18b20_Data = 1; /在480us960us后拉高數(shù)據(jù)線,ds18b20會(huì)在在1560us產(chǎn)生脈沖; ds18b20_delay_us(40);/精確延時(shí),1560us后接收數(shù)據(jù)

8、線上60240us的存在脈沖; INPUT_MODE; /溫度傳感器IO口為輸入模式; do Count+; IS_FINISH = Ds18b20_Data; /讀IO口狀態(tài); while(IS_FINISH != 0) && (Count<400); /大約3ms,這段時(shí)間等待響應(yīng); OUTPUT_MODE; /溫度傳感器IO口為輸出模式; Ds18b20_Data = 1; /歸還數(shù)據(jù)線; ds18b20_delay_us(100); /稍作延時(shí); /如果讀取的脈沖為0,說明初始化成功,否則失敗; return IS_FINISH; unsigned char Re

9、adByte(void) unsigned char i,Byte = 0; /Byte為讀取的字節(jié); OUTPUT_MODE; /溫度傳感器IO口為輸出模式; Ds18b20_Data = 1; /初始時(shí)確保ds18b20數(shù)據(jù)線為高; ds18b20_delay_us(100); /稍作延時(shí); for(i=0;i<8;i+) /8位,讀8次; Byte >>= 1; /騰出一位用于存入下次的讀取位值; Ds18b20_Data = 0; /ds18b20在拉低4us后沿拉高產(chǎn)生10us的讀間隙; ds18b20_delay_us(4); /精確延時(shí); Ds18b20_Dat

10、a = 1; /拉高; ds18b20_delay_us(2); /稍作延時(shí); if(Ds18b20_Data = 1) /判斷數(shù)據(jù)位是否為高,若高,做運(yùn)算,低則保留; Byte |= 0x80; /最高位置1; ds18b20_delay_us(20); /稍作延時(shí); return Byte;void WriteByte(unsigned char Byte) unsigned char i; OUTPUT_MODE; /溫度傳感器IO口為輸出模式; Ds18b20_Data = 1; /初始時(shí)確保ds18b20數(shù)據(jù)線為高; ds18b20_delay_us(100); /稍作延時(shí); for

11、(i=0;i<8;i+) Ds18b20_Data = 0;/拉低數(shù)據(jù)線后的15us為寫入位時(shí)間間隙; Ds18b20_Data = Byte & 0x01; /數(shù)據(jù)位寫入,寫入后的45us內(nèi)ds18b20采樣,完成寫/入位工作; ds18b20_delay_us(40); /40us延時(shí)后保證采樣成功; Ds18b20_Data = 1; /數(shù)據(jù)線重新置高; Byte >>= 1;/移出已經(jīng)寫入的位; ds18b20_delay_us(10); /稍作延時(shí);/*讀取溫度的步驟:1.啟動(dòng)溫度轉(zhuǎn)換;(1.復(fù)位 2.發(fā)Skip ROM命令,即0xcc 3.發(fā)Convert

12、 T命令,即0x44);2.復(fù)位;3.發(fā)Skip ROM命令,即0xcc;4.讀ds18b20寄存器命令,即0xbe;5.讀兩字節(jié)溫度;(低字節(jié) 高字節(jié))6.溫度格式轉(zhuǎn)換;*/unsigned int ReadTemperature(void) unsigned int Temperature = 0, /最終的返回值,同時(shí)也用來存放高字節(jié); low = 0; /低字節(jié); DS18B20_Init(); /復(fù)位; WriteByte(0xcc); /skip ROM命令; WriteByte(0x44); /Conver T命令; ds18b20_delay_us(5); /稍作延時(shí); DS1

13、8B20_Init(); /復(fù)位; WriteByte(0xcc); /skip ROM命令; WriteByte(0xbe); /讀寄存器命令,前兩個(gè)寄存器存放溫度值; low = ReadByte(); /讀取第一個(gè)寄存器,即低位溫度值; Temperature = ReadByte(); /讀取第二個(gè)寄存器,即高位溫度值; Temperature <<= 8; /高字節(jié)移動(dòng)到高8位,低8位用來放低字節(jié); Temperature += low; /存入低字節(jié); return Temperature;/返回讀取值;void TemperatureConver(void) #if

14、FLOAT_MODE unsigned char TempH,TempL; unsigned int Temp; Temp = ReadTemperature(); /讀取當(dāng)前溫度; if(Temp & 0x80000) /最高位為1時(shí)表示溫度為負(fù)數(shù); Temperature0 = '-' /負(fù)號(hào)標(biāo)志,表示溫度為負(fù)數(shù); Temp = Temp; /取反 Temp += 1; /加1; /當(dāng)讀出數(shù)為負(fù)的時(shí),必須做取反加1操作; /if else Temperature0 = ' ' /溫度為正時(shí),第一位置空; /整數(shù)部分; TempH = Temp >

15、;> 4; /將溫度整數(shù)部分存放在TempH中,整數(shù)部分包括高字節(jié)的低4位/和低字節(jié)的高4位; /小數(shù)部分; TempL = (unsigned char)(Temp & 0x000f); /將溫度小數(shù)部分存放在TempL中,小數(shù)部分由/ 低字節(jié)的低4位決定; /小數(shù)近似處理,處理原理見下表:/-/* 二進(jìn)制:1 1 1 1 十進(jìn)制: 8 4 2 1 小數(shù): 存在一個(gè)整數(shù)6,使得十進(jìn)制數(shù)與小數(shù)點(diǎn)后的值的轉(zhuǎn)換關(guān)系近似相等: 8*6 = 48 偏差 2 4*6 = 24 1 2*60 = 120 忽略 1*600 = 600 于是,若我們只需要小數(shù)點(diǎn)后兩位,則只需要 *6 即可,需要

16、后一位的話 *6/10; 若還想提高精度,可加一個(gè)修正值,該值建議為:1或者2;*/-/ TempL = TempL * 6; /近似處理轉(zhuǎn)換,兩位小數(shù); TempL += 1; /修正值; /百位溫度值; if(TempH/100 = 0) Temperature1 = ' ' else Temperature1 = TempH/100+'0' /十位溫度值; if(TempH/100 = 0)&&(TempH%100)/10=0) Temperature2 = ' ' else Temperature2 = (TempH%10

17、0)/10+'0' /個(gè)位溫度; Temperature3 = (TempH%100)%10+'0' /小數(shù)點(diǎn); Temperature4 = '.' /小數(shù)部分; Temperature5 = TempL/10 + '0' Temperature6 = TempL%10 + '0' /字符串結(jié)束符; Temperature7 = '0' /_1ms(); /稍作延時(shí); ds18b20_delay_us(5); #else unsigned int Temp; Temp = ReadTemperat

18、ure(); /讀取當(dāng)前溫度; if(Temp & 0x80000) /最高位為1時(shí)表示溫度為負(fù)數(shù); Temperature0 = '-' /負(fù)號(hào)標(biāo)志,表示溫度為負(fù)數(shù); Temp = Temp; /取反 Temp += 1; /加1; /當(dāng)讀出數(shù)為負(fù)的時(shí),必須做取反加1操作; /if else Temperature0 = ' ' /溫度為正時(shí),第一位置空; /整數(shù)部分; Temp >>= 4; /將低4位移除,因?yàn)檫@4位為小數(shù)部分; /百位溫度值; if(Temp/100 = 0) Temperature1 = ' ' el

19、se Temperature1 = Temp/100+'0' /十位溫度值; if(Temp/100 = 0)&&(Temp%100)/10=0) Temperature2 = ' ' else Temperature2 = (Temp%100)/10+'0' /個(gè)位溫度; Temperature3 = (Temp%100)%10+'0' /字符串結(jié)束符; Temperature4 = '0' /_1ms(); /稍作延時(shí); ds18b20_delay_us(5);#endif/*主函數(shù)所在文件,用做測(cè)試;*/* USART0發(fā)送溫度程序測(cè)試。*/#include <IOcc2530.h>#include <string.h>#include "ds18b20.h"/* 使用ds18b20需引用的一段代碼 */ #define FLOAT_MODE 1#if FLOAT_MODE unsigned char Temperature8; /小數(shù)模式需要8個(gè)字節(jié); #define Temp_Len_ 7 /溫度值字符串有效長度;#else unsigned char Temperat

溫馨提示

  • 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)論