欧美成人黄色网_欧美精品久久_国产在线一区二区三区_免费视频久久久_亚洲二区视频_欧美大片免费高清观看

產(chǎn)品分類

當(dāng)前位置: 首頁 > 傳感測量產(chǎn)品 > 工業(yè)傳感器 > 溫度傳感器

類型分類:
科普知識
數(shù)據(jù)分類:
溫度傳感器

基于ds18b20的溫度傳感器:基于51單片機(jī)的DS18B20溫度傳感器驅(qū)動程序加詳解

發(fā)布日期:2022-10-09 點(diǎn)擊率:36


基于ds18b20的溫度傳感器:基于51單片機(jī)的DS18B20溫度傳感器驅(qū)動程序加詳解

//此部分為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)程序
完整程序代碼:

基于ds18b20的溫度傳感器:基于51單片機(jī)的DS18B20溫度傳感器驅(qū)動程序加詳解  第1張

基于ds18b20的溫度傳感器:基于DS18B20溫度傳感器和MQ2煙霧傳感器的火災(zāi)報警器設(shè)計(jì)

  一、概述
本文引用地址:
  火災(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)報警器仿真圖

基于ds18b20的溫度傳感器:基于51單片機(jī)的DS18B20溫度傳感器驅(qū)動程序加詳解  第2張

基于ds18b20的溫度傳感器:基于DS18B20溫度傳感器的溫度計(jì)設(shè)計(jì)c程序

#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三大控

上一篇: 電氣控制線路圖控制原

推薦產(chǎn)品

更多
主站蜘蛛池模板: 全亚洲最大最好的私人影剧院 | 亚洲欧美视频网站 | 国产伦精品免编号公布 | 一级毛片在线免费播放 | 亚洲中文字幕第一页在线 | 国产一区二区三区四区在线 | 国产福利在线永久视频 | 精品国产av无码一区二区三区 | 亚洲一区免费 | 尤物在线观看网站 | 男人天堂亚洲 | 日本一道本 | 久久精品视频免费观看 | 欧美性狂猛bbbbbxxxxx | 欧美日本韩国国产 | 亚洲碰碰人人av熟女天堂 | 免费看特级淫片日本 | 公与淑婷厨房猛烈进出视频免费 | 成人免费无码大片a毛片软件 | 91日韩视频在线观看 | 成人欧美视频在线看免费 | 欧美成人r级在线播放 | 久久久www成人免费毛片 | 天天操人人干 | 浓毛老太交欧美老妇热爱乱 | 欧美综合视频在线观看 | 45分钟免费真人视频 | 精品欧美一区二区三区四区 | 亲嘴扒胸摸屁股激烈网站 | 国产真人性做爰久久网站 | 精品久久久久久成人av | 国产片a国产片免费看视频 国产片久久 | 黄色毛片在线播放 | 爱爱久久 | 亚洲精品久久久久久动漫器材一区 | 求欧美精品网址 | 精品精品国产高清a毛片牛牛 | 国产美女一级高清免费观看 | 国产一区二区三区成人久久片 | 中文天堂最新版在线精品 | 国产精品欧美日韩视频一区 |