當(dāng)前位置: 首頁 > 傳感測量產(chǎn)品 > 工業(yè)傳感器 > 溫度傳感器
發(fā)布日期:2022-10-09 點(diǎn)擊率:36
//此部分為18B20的驅(qū)動程序
//本程序驗(yàn)證通過,晶振為12MHz
#include
sbit D18B20=P3^7; //DQ接P3^7
#define NOP() _nop_()
#define _Nop() _nop_()
void TempDelay (unsigned char idata us); //延時函數(shù)定義
void Init18b20 (void); //初始化函數(shù)定義
void WriteByte (unsigned char idata wr); //單字節(jié)寫入
void read_bytes (unsigned char idata j); //定義多字節(jié)數(shù)據(jù)讀取
unsigned char CRC (unsigned char j);//定義校驗(yàn)碼數(shù)組
void GemTemp (void); //數(shù)據(jù)處理
void Config18b20 (void); //配置上下限即處理位數(shù)(9/10/11)
void ReadID (void); //讀取器件ID,即ROM中的數(shù)據(jù)
void TemperatuerResult(void); //最終數(shù)據(jù)輸出
//bit flag;
unsigned int idata Temperature,D[10]; //定義溫度數(shù)組
unsigned char idata temp_buff[9]; //定義RAM數(shù)據(jù)暫存數(shù)組
//存儲讀取的字節(jié),read scratchpad為9字節(jié),read rom ID為8字節(jié)
unsigned char idata id_buff[8]; //定義ROM數(shù)據(jù)暫存數(shù)組
unsigned char idata *p,TIM; //指針變量
unsigned char idata crc_data; //CRC計(jì)算變量定義
unsigned char code CrcTable [256]={
0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};
//CRC數(shù)據(jù)表
//Function:延時處理
void TempDelay (unsigned char idata us)
{
while(us--);
}
//Function:18B20初始化
void Init18b20 (void)
{
D18B20=1; //偵測到下跳沿,初始化
_nop_();
D18B20=0;
TempDelay(160); //delay480 us (480)
_nop_();
D18B20=1; //釋放總線
TempDelay(30); //delay 96 us (60-112)
_nop_();
_nop_();
_nop_(); //18B20偵測到此上升沿,會自動應(yīng)答
//發(fā)送presence信號
//if(D18B20==0)
// flag=1; //detect 1820 success!
//else
// flag=0; //detect 1820 fail!
TempDelay(30); //delay 96 us(60-240)
_nop_(); //發(fā)送應(yīng)答脈沖
_nop_();
D18B20=1; //釋放總線
}
//Function:向18B20寫入一個字節(jié)
void WriteByte (unsigned char idata wr) //單字節(jié)寫入
{
unsigned char idata i;
for (i=0;i
//Function:讀18B20的一個字節(jié)
unsigned char ReadByte (void) //讀取單字節(jié)
{
unsigned char idata i,u=0;
for(i=0;i
//Function:讀18B20
void read_bytes (unsigned char idata j)
{
unsigned char idata i;
for(i=0;i<j;i++) {="" *p="ReadByte();" p++;="" }="" function:crc校驗(yàn)="" unsigned="" char="" crc="" (unsigned="" j)="" idata="" i,crc_data="0;" for(i="0;i<j;i++)" 查表校驗(yàn)="" crc_data="CrcTable[crc_data^temp_buff[i]];" return="" (crc_data);="" 返回i="8時的crc_data" 若為0,校驗(yàn)正確,即此時的temp_buff[8]="0x00;" function:讀取溫度="" void="" gemtemp="" (void)="" read_bytes="" (9);="" if="" (crc(9)="=0)" 校驗(yàn)正確="" 暫存器第0字節(jié)低8位,第一字節(jié)為高8位。="" temperature="temp_buff[1]*0x100" +="" temp_buff[0];="" *="0.625;" =16;="" 轉(zhuǎn)換成10進(jìn)制="" tempdelay(1);="" function:內(nèi)部配置="" config18b20="" 重新配置報警限定值和分辨率="" init18b20();="" writebyte(0xcc);="" skip="" rom="" writebyte(0x4e);="" 配置暫存器2,3,4字節(jié)數(shù)據(jù)="" writebyte(0x19);="" 上限="" writebyte(0x1a);="" 下限="" writebyte(0x7f);="" set="" 11="" bit="" (0.125)="" writebyte(0x48);="" 保存設(shè)定值="" writebyte(0xb8);="" 回調(diào)設(shè)定值="" function:讀18b20id="" readid="" 讀取器件="" id="" writebyte(0x33);="" read="" read_bytes(8);="" function:18b20id全處理="" temperatuerresult(void)="" p="id_buff;" readid();="" 讀取器件id="" config18b20();="" rom配置="" init18b20="" ();="" 初始化="" 單點(diǎn)檢測,跳過rom檢索="" writebyte(0x44);="" 啟用溫度轉(zhuǎn)換="" writebyte(0xbe);="" 讀取暫存器的全部內(nèi)容="" gemtemp();="" int="" temptick="0;" gettemp()="" if(tim="=1)" tim="0;" temperatuerresult();="" d[5]="Temperature;" 刷新時間="" t1zd(void)="" interrupt="" 3="" th1="0xfe;" tl1="0x33;" tim++;=""
基于DS18B20數(shù)字溫度傳感器的溫度計(jì)設(shè)計(jì)
本報告為哈爾濱工業(yè)大學(xué)電子與信息工程學(xué)院大二學(xué)期微機(jī)原理課程的課設(shè)報告。請注意,本文所述代碼均在Quartus II 13.0程序內(nèi)使用匯編語言運(yùn)行。
一、課程設(shè)計(jì)任務(wù)要求
利用數(shù)字溫度傳感器DS18B20與AT89C51單片機(jī)結(jié)合來測量溫度,并在LED數(shù)碼管上顯示相應(yīng)的溫度值。溫度測量范圍為-55~125℃,精確至0.5℃。測量的溫度采用數(shù)字顯示,用三位共陽極LED數(shù)碼管來實(shí)現(xiàn)溫度顯示。
二、工作原理
DS18B20數(shù)字溫度傳感器是美國DALLAS半導(dǎo)體公司推出的一種改進(jìn)型具有單總線接口的智能溫度傳感器。與傳統(tǒng)的熱敏電阻等測溫元件相比,它能直接讀出被測溫度,并且可根據(jù)實(shí)際要求通過簡單的編程實(shí)現(xiàn)9~12位的數(shù)字讀數(shù)方式。DS18B20的基本性能及詳細(xì)資料請參考相關(guān)資料。
三、單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)及原理圖
DS18B20數(shù)字溫度傳感器數(shù)據(jù)端口DQ接于P1.7,單片機(jī)接電源和晶振,八位共陽數(shù)碼管位選接于P1.2~P1.6,斷碼接于P0.0~P0.7并連接排阻。
四、實(shí)現(xiàn)方法及擴(kuò)展創(chuàng)新
基本功能實(shí)現(xiàn)方法
利用 DS18B20 數(shù)字溫度傳感器的數(shù)據(jù)傳輸機(jī)制編寫程序,將溫度數(shù)值從溫度傳感器中取回到 AT89C51 之中,再根據(jù)數(shù)據(jù)的轉(zhuǎn)換形式,在單片機(jī)中對數(shù)據(jù)進(jìn)行處理變換成十進(jìn)制,并動態(tài)顯示在數(shù)碼管中。
擴(kuò)展創(chuàng)新設(shè)計(jì)
根據(jù)實(shí)驗(yàn)要求:精度在 0.5℃范圍內(nèi),則不必四舍五入,取出整數(shù)部分直接處理,只需考查數(shù)據(jù)的小數(shù)第一位,來決定小數(shù)點(diǎn)顯示位置顯示 0 或者 5,便可保證精度;并且在個位位置附加上小數(shù)點(diǎn);最后補(bǔ)充符號位,負(fù)溫度時顯示負(fù)號。
五、實(shí)現(xiàn)步驟
首先需要了解 DS18B20 的數(shù)據(jù)傳輸方式,因?yàn)檫@一芯片只有一個數(shù)據(jù)通信口,需要遵守嚴(yán)格的時序,脈沖的規(guī)則,介紹如下。
首先設(shè)定 DQ 為總線數(shù)據(jù)位,連接于 P1.7。
1.復(fù)位功能
主機(jī)首先發(fā)出一個 480~960us 的低電平脈沖,然后釋放總線變?yōu)楦唠娖?,并在隨后的480us 時間內(nèi)對總線進(jìn)行檢測,如果有低電平出現(xiàn)說明總線上有器件已做出應(yīng)答。若無低電平出現(xiàn)一直都是高電平說明總線上無器件應(yīng)答。
作為從器件的 DS18B20 在一上電后就一直在檢測總線上是否有 480-960 us 的低電平出現(xiàn),如果有,在總線轉(zhuǎn)為高電平后等待 15-60us 后將總線電平拉低60~240us 做出響應(yīng)存在脈沖,告訴主機(jī)本器件已做好準(zhǔn)備。若沒有檢測到就一直在檢測等待。
這一段程序設(shè)計(jì)加入 FLAG 位變量作為傳感器是否相應(yīng),正常工作的標(biāo)志:
2.寫入操作
寫周期最少為 60us,最長不超過 120us。寫周期一開始做為主機(jī)先把總線拉低1us 表示寫周期開始。隨后若主機(jī)想寫 0,則繼續(xù)拉低電平最少 60us 直至寫周期結(jié)束,然后釋放總線為高電平。若主機(jī)想寫 1,在一開始拉低總線電平 1us 后就釋放總線為高電平,一直到寫周期結(jié)束。而做為從機(jī)的 DS18B20 則在檢測到總線被拉底后等待 15 us 然后從 15us 到 45us 開始對總線采樣,在采樣期內(nèi)總線為高電平則為1,若采樣期內(nèi)總線為低電平則為 0。
寫入要遵守規(guī)則,需要先復(fù)位,跳過 ROM,才能進(jìn)行讀寫,更改初值等操作。
3.讀數(shù)操作
對于讀數(shù)據(jù)操作時序也分為讀 0 時序和讀 1 時序兩個過程。讀時隙是從主機(jī)把單總線拉低之后,在 1us 之后就得釋放單總線為高電平,以讓 DS18B20 把數(shù)據(jù)傳輸?shù)絾慰偩€上。DS18B20 在檢測到總線被拉低 1us 后,便開始送出數(shù)據(jù),若是要送出0 就把總線拉為低電平直到讀周期結(jié)束。若要送出 1 則釋放總線為高電平。主機(jī)在一開始拉低總線 1us 后釋放總線,然后在包括前面的拉低總線電平 1us在內(nèi)的 15us 時間內(nèi)完成對總線進(jìn)行采樣檢測,采樣期內(nèi)總線為低電平則確認(rèn)為0。采樣期內(nèi)總線為高電平則確認(rèn)為 1。完成一個讀時序過程,至少需要 60us 才能完成。
讀數(shù)代碼如下,在讀數(shù)的時候要同樣要復(fù)位,跳 ROM,寫入操作碼再讀寫。
4.設(shè)定溫度分辨率
由于溫度傳感器的溫度精度為 0.0625℃,對于要求的精度太高,可以適當(dāng)減少精度,使小數(shù)點(diǎn)后四位僅余一位有效,在符合條件的情況下理想化后三位。
5.主程序編寫
主程序應(yīng)完全按照通信規(guī)則進(jìn)行。
DS18B20 單線通信功能是分時完成的,他有嚴(yán)格的時隙概念,如果出現(xiàn)序列混亂,1-WIRE 器件將不響應(yīng)主機(jī),因此讀寫時序很重要。系統(tǒng)對 DS18B20 的各種操作必須按協(xié)議進(jìn)行。根據(jù) DS18B20 的協(xié)議規(guī)定,微控制器控制 DS18B20 完成溫度的轉(zhuǎn)換必須經(jīng)過以下三個步驟 :
每次讀寫前對 DS18B20 進(jìn)行復(fù)位初始化;發(fā)送一條 ROM 指令;發(fā)送存儲器指令。
現(xiàn)在我們做的是讓DS18B20進(jìn)行一次溫度轉(zhuǎn)換,那具體操作如下:
主機(jī)先作復(fù)位操作;主機(jī)再寫跳過ROM的操作(CCH)命令;然后主機(jī)接著寫個轉(zhuǎn)換溫度的操作命令,后面釋放總線至少 1s,讓DS18B20 完成轉(zhuǎn)換的操作。在這里要注意的是每個命令字節(jié)在寫的時候都是低字節(jié)先寫,例如 CCH 的二進(jìn)制為 ,在寫到總線上時要從低位開始寫,寫的順序是“1、1、0、0、1、1、0、0”。
讀取 RAM 內(nèi)的溫度數(shù)據(jù)同樣也要接照三個步驟:
主機(jī)發(fā)出復(fù)位操作并接收 DS18B20 的應(yīng)答(存在)脈沖。主機(jī)發(fā)出跳過對 ROM 操作的命令(CCH)。主機(jī)發(fā)出讀取 RAM 的命令(BEH),隨后主機(jī)依次讀取 DS18B20 發(fā)出的從第0 到第 8,共九個字節(jié)的數(shù)據(jù)。如果只想讀取溫度數(shù)據(jù),那在讀完第 0 和第 1 個數(shù)據(jù)后就不再理會后面 DS18B20 發(fā)出的數(shù)據(jù)即可。同樣讀取數(shù)據(jù)也是低位在前的。
故主函數(shù)設(shè)置如下:
6.數(shù)據(jù)處理與顯示
對于傳回的數(shù)據(jù),DS18B20 的數(shù)據(jù)格式如下:
溫度二進(jìn)制表示十六進(jìn)制表示+ D0H+25. H+10. A2H+0. H H-0. FFF8H-10. FF5EH-25. FE6FH- FC90H
故我們可以由如下步驟分析:
判斷溫度的正負(fù)。首先可知,取回原始數(shù)據(jù)的最后四位無效,這就保證了數(shù)據(jù)在取回絕對值時不會溢出。此時檢查數(shù)據(jù)的最高位,如果是正數(shù),則正常執(zhí)行;如果是負(fù)數(shù),則進(jìn)行取反加一的操作,得到絕對值,并保留原數(shù),為判斷是否顯示負(fù)號做準(zhǔn)備。取出絕對值放入地址中作為二進(jìn)制整數(shù)。利用進(jìn)位標(biāo)志位 C,將八高位的后四位傳入低八位的前四位,得到絕對值。判斷小數(shù)后第一位是 0 還是 1,得到小數(shù)位顯示為 0 或 5。這時需要在新地址存儲00H,05H,為顯示做準(zhǔn)備。 此時我們可以發(fā)現(xiàn)對于絕對值小數(shù)位為.0~.4 的,則顯示的十分位置 0,絕對值小數(shù)位為.5~.9 的,則顯示的十分位置 5,且不影響去掉小數(shù)位的整數(shù)值,整數(shù)值依舊存在。由此可知,顯示數(shù)字和真實(shí)數(shù)字的關(guān)系并不符合四舍五入,但在精度范圍之內(nèi),這樣做減少了數(shù)據(jù)處理的復(fù)雜度,增加了數(shù)碼管顯示數(shù)量,是本實(shí)驗(yàn)的創(chuàng)新之處。整數(shù)部分轉(zhuǎn)為十進(jìn)制。DIV 指令提供了方便,我們只需執(zhí)行兩次除以10 的操作,便可以得到個,十,百位。顯示:顯示采用共陽八位數(shù)碼管。首先由數(shù)據(jù)的正負(fù),判斷是否輸出負(fù)號(g 亮,即 BFH),否則輸出全滅狀態(tài)(即 FFH)。再依次輸出個十百位,注意個位為表達(dá)準(zhǔn)確,需要加上小數(shù)點(diǎn),故要對正常的數(shù)碼表最高位置零(即最高位減 8),故個位要查最高位置零后的表以顯示小數(shù)點(diǎn)。再根據(jù)小數(shù)位提前存儲的00H,05H,判斷小數(shù)第一位的狀態(tài),輸出相應(yīng)的 0 和 5。延時函數(shù)不必多說。
實(shí)際代碼如下:
至此,課程設(shè)計(jì)原理全部介紹完畢。
六、數(shù)據(jù)記錄與結(jié)果分析
經(jīng)過試驗(yàn)得到如下仿真結(jié)果:
-32.3℃顯示結(jié)果
49.6℃顯示結(jié)果
113.2℃顯示結(jié)果
七、實(shí)驗(yàn)程序
完整程序代碼:
一、概述
本文引用地址:
火災(zāi)自動報警系統(tǒng)(Fire Alarm
System,簡稱FAS系統(tǒng))是人們?yōu)榱嗽缙诎l(fā)現(xiàn)通報火災(zāi),并及時采取有效措施,控制和撲滅火災(zāi),而設(shè)置在建筑物中或其它場所的一種自動消防設(shè)施,是人們同火災(zāi)作斗爭的有力工具。
本設(shè)計(jì)中以溫度探頭和煙霧傳感器作為火災(zāi)報警器的傳感裝置,并以LED和蜂鳴器作為示警裝置。
二、功能
●高溫檢測。傳感器選用DS18B20,當(dāng)環(huán)境溫度大于40℃,高溫報警指示燈亮,LCD1602第一行顯示溫度。
●環(huán)境煙霧濃度檢測。傳感器選用MQ2煙霧傳感器,AD0809作模數(shù)轉(zhuǎn)換傳煙霧濃度數(shù)據(jù)給單片機(jī)。當(dāng)環(huán)境煙霧濃度大于50時,煙霧濃度指示燈亮,LCD1602第二行顯示煙霧濃度。
當(dāng)溫度和煙霧濃度同時過高時,蜂鳴器發(fā)出報警聲音。
三、硬件設(shè)計(jì)
溫度傳感器:DS18B20
煙霧傳感器:MQ2。MQ2輸出的模擬電壓信號,使用ADC0809作模數(shù)轉(zhuǎn)換后輸入單片機(jī)。
四、程序設(shè)計(jì)
部分程序段:
○LCD1602顯示部分程序
#define LCD_DATA P0 //lcd1602的引腳
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
void LCD_Init(void)
{
Delay20ms();
LCD_WriteCmd(0x38); //8位機(jī)接口、雙行顯示、5×7字符點(diǎn)陣;
LCD_WriteCmd(0x0c); //顯示開啟、光標(biāo)不顯示也不閃爍;
LCD_WriteCmd(0x01); //清屏;
LCD_WriteCmd(0x06); //光標(biāo)右移一位、整屏不移動;
LCD_Goto(0,0);
}
void LCD_WriteDat(unsigned char lcd_dat)
{
unsigned char tmp;
tmp=LCD_ReadStatus(); //讀狀態(tài);
while((tmp & 0x80)) //是否忙 ?
{
tmp=LCD_ReadStatus();
}
LCD_RS=1;
LCD_RW=0;
LCD_DATA=lcd_dat;
_nop_();
LCD_EN=0;
_nop_();
_nop_();
LCD_EN=1;
}
void LCD_WriteCmd(unsigned char lcd_cmd)
{
unsigned char tmp;
tmp=LCD_ReadStatus();
while((tmp & 0x80))
{
tmp=LCD_ReadStatus();
}
LCD_RS=0;
LCD_RW=0;
LCD_DATA=lcd_cmd;
_nop_();
LCD_EN=0;
_nop_();
_nop_();
LCD_EN=1;
}
unsigned char LCD_ReadStatus(void)
{
unsigned char tmp;
#if 0
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
tmp=LCD_DATA;
LCD_EN=0;
#endif
LCD_DATA=0xff;
LCD_RS=0;
LCD_RW=1;
LCD_EN=0;
_nop_();
_nop_();
LCD_EN=1;
tmp=LCD_DATA;
return tmp;
}
void LCD_Goto(unsigned char x,unsigned char y)
{
unsigned char tmp;
if(y) //若是第二行;
{
tmp=0xc0 + x;
LCD_WriteCmd(tmp);
}
else
{
tmp=0x80 + x;
LCD_WriteCmd(tmp);
}
}
void LCD_Display(unsigned char row,unsigned char *str)
{
if(row)
{
LCD_Goto(0,1);
}
else
{
LCD_Goto(0,0);
}
while(*str !='?')
{
LCD_WriteDat(*str++);
}
}
○ADC0809部分程序
//AD0809的IO口以及變量定義
sbit OE=P2^7;
sbit EOC=P2^6;
sbit START=P3^0;
void AD0809()//0809轉(zhuǎn)換數(shù)據(jù)
{
START=0;_nop_();
START=1;_nop_();
START=0;_nop_();
while(EOC==0);
OE=1;_nop_();
density=P1;_nop_();
OE=0;
}
○DS18B20部分程序
sbit DQ=P2^3; //DS18B20數(shù)據(jù)端
//2、DS18B2模塊
void delay_18B20(unsigned int i)
{
while(i--);
}
//ds18b20初始化函數(shù)
void Init_DS18B20(void)
{
unsigned char x=0;
DQ=1; //DQ復(fù)位
delay_18B20(2); //稍做延時
DQ=0; //單片機(jī)將DQ拉低
delay_18B20(60); //精確延時 大于 480us
DQ=1; //拉高總線
delay_18B20(2);
x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
delay_18B20(15);
}
//ds18b20讀一個字節(jié)
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat=0;
for (i=8;i>0;i--)
{
DQ=0; // 給脈沖信號
dat>>=1;
DQ=1; // 給脈沖信號
if(DQ)
dat |=0x80;
delay_18B20(4);
}
return(dat);
}
//ds18b20寫一個字節(jié)
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ=0;
DQ=dat&0x01;
delay_18B20(2);
DQ=1;
dat>>=1;
}
}
五、仿真圖
圖3 火災(zāi)報警器仿真圖
#include "REG51.H"
#include "INTRINS.H"
typedef unsigned char BYTE;
sbit DQ=P3^3; //DS18B20的數(shù)據(jù)口位P3.3
BYTE TPH; //存放溫度值的高字節(jié)
BYTE TPL; //存放溫度值的低字節(jié)
void DelayXus(BYTE n);
void DS18B20_Reset();
void DS18B20_WriteByte(BYTE dat);
BYTE DS18B20_ReadByte();
void main()
{
DS18B20_Reset(); //設(shè)備復(fù)位
DS18B20_WriteByte(0xCC); //跳過ROM命令
DS18B20_WriteByte(0x44); //開始轉(zhuǎn)換命令
while (!DQ); //等待轉(zhuǎn)換完成
DS18B20_Reset(); //設(shè)備復(fù)位
DS18B20_WriteByte(0xCC); //跳過ROM命令
DS18B20_WriteByte(0xBE); //讀暫存存儲器命令
TPL=DS18B20_ReadByte(); //讀溫度低字節(jié)
TPH=DS18B20_ReadByte(); //讀溫度高字節(jié)
while (1);
}
void DelayX0us(BYTE n)
{
while (n--)
{
_nop_();
_nop_();
}
}
void DS18B20_Reset()
{
CY=1;
while (CY)
{
DQ=0; //送出低電平復(fù)位信號
DelayX0us(48); //延時至少480us
DQ=1; //釋放數(shù)據(jù)線
DelayX0us(6); //等待60us
CY=DQ; //檢測存在脈沖
DelayX0us(42); //等待設(shè)備釋放數(shù)據(jù)線
}
}
BYTE DS18B20_ReadByte()
{
BYTE i;
BYTE dat=0;
for (i=0; i
#include
下一篇: PLC、DCS、FCS三大控
上一篇: 電氣控制線路圖控制原