一 DS18B20通過單總線初始化時序如下: 由上圖可見,當主機要操作DS18B20時,需要把總線打底,并持續480us以960us 然后釋放總線(即拉高),當時間流逝15-60us的時候,DS18B20若存在且沒有壞的話,它會把總線拉低,并持續60-240us .在這段時間主機可以查看總線狀態,來確定初始化完成 . 二 DS18B20通過單總線讀寫時序如下:
由上圖可以看出,主機要讀或寫DS18B20時,需要要將總線接低并持續15us, 上面的兩個時序是寫的時序,主機在接低總線的15us后繼續拉低總線,持續15-30us. 在這個時間內DS18B20采樣0,完成0的寫入.主機拉低總線15us后拉高總線然后持續15-30us等待DS18B20采樣 完成 1的寫入. 下面的兩個圖是讀的時序圖.主機拉低總線并持續15us后,釋放總線.如果DS18B20要輸出0就繼續拉低總線,若要輸出1 就拉高總線,并持續15-30us,等待主機查詢總線狀態完成 0或者1的讀寫.
三 DS18B20的ROM操作命令如下:
四 DS18B20的存儲器操作命令如下:
五 DS18B20內部9個字節存儲器以及E2RAM:
六 DS18B20內部存儲溫度字節格式:
七 DS18B20操作的C語言程序:
- /*************************此部分為18B20的驅動程序*************************************/
- #include <reg52.H>
- #include <intrins.h>
- sbit D18B20=P3^7;
- #define NOP() _nop_() /* 定義空指令 */
- #define _Nop() _nop_() /*定義空指令*/
- void TempDelay (unsigned char idata us);
- void Init18b20 (void);
- void WriteByte (unsigned char idata wr); //單字節寫入
- void read_bytes (unsigned char idata j);
- unsigned char CRC (unsigned char j);
- void GemTemp (void);
- void Config18b20 (void);
- void ReadID (void);
- void TemperatuerResult(void);
- bit flag;
- unsigned int idata Temperature,D[10];
- unsigned char idata temp_buff[9]; //存儲讀取的字節,read scratchpad為9字節,read rom ID為8字節
- unsigned char idata id_buff[8];
- unsigned char idata *p,TIM;
- unsigned char idata crc_data;
- 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};
- //
- /************************************************************
- *Function:延時處理
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- void TempDelay (unsigned char idata us)
- {
- while(us--);
- }
- /************************************************************
- *Function:18B20初始化
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- void Init18b20 (void)
- {
- D18B20=1;
- _nop_();
- D18B20=0;
- TempDelay(50); //delay 530 uS//80
- _nop_();
- D18B20=1;
- TempDelay(10); //delay 100 uS//14
- _nop_();
- _nop_();
- _nop_();
-
- if(D18B20==0)
- flag = 1; //detect 1820 success!
- else
- flag = 0; //detect 1820 fail!
- TempDelay(15); //20
- _nop_();
- _nop_();
- D18B20 = 1;
- }
- /************************************************************
- *Function:向18B20寫入一個字節
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- void WriteByte (unsigned char idata wr) //單字節寫入
- {
- unsigned char idata i;
- for (i=0;i<8;i++)
- {
- D18B20 = 0;
- _nop_();
- D18B20=wr&0x01;
- TempDelay(3); //delay 45 uS //5
- _nop_();
- _nop_();
- D18B20=1;
- wr >>= 1;
- }
- }
- /************************************************************
- *Function:讀18B20的一個字節
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- unsigned char ReadByte (void) //讀取單字節
- {
- unsigned char idata i,u=0;
- for(i=0;i<8;i++)
- {
- D18B20 = 0;
- u >>= 1;
- D18B20 = 1;
- if(D18B20==1)
- u |= 0x80;
- TempDelay (2);
- _nop_();
- }
- return(u);
- }
- /************************************************************
- *Function:讀18B20
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- void read_bytes (unsigned char idata j)
- {
- unsigned char idata i;
- for(i=0;i<j;i++)
- {
- *p = ReadByte();
- p++;
- }
- }
- /************************************************************
- *Function:CRC校驗
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- unsigned char CRC (unsigned char j)
- {
- unsigned char idata i,crc_data=0;
- for(i=0;i<j;i++) //查表校驗
- crc_data = CrcTable[crc_data^temp_buff[ i]];
- return (crc_data);
- }
- /************************************************************
- *Function:讀取溫度
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- void GemTemp (void)
- {
- read_bytes (9);
- if (CRC(9)==0) //校驗正確
- {
- Temperature = temp_buff[1]*0x100 + temp_buff[0];
- // Temperature *= 0.625;
- Temperature /= 16;
- TempDelay(1);
- }
- }
- /************************************************************
- *Function:內部配置
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- void Config18b20 (void) //重新配置報警限定值和分辨率
- {
- Init18b20();
- WriteByte(0xcc); //skip rom
- WriteByte(0x4e); //write scratchpad
- WriteByte(0x19); //上限
- WriteByte(0x1a); //下限
- WriteByte(0x7f); //set 11 bit (0.125)
- Init18b20();
- WriteByte(0xcc); //skip rom
- WriteByte(0x48); //保存設定值
- Init18b20();
- WriteByte(0xcc); //skip rom
- WriteByte(0xb8); //回調設定值
- }
- /************************************************************
- *Function:讀18B20ID
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- void ReadID (void)//讀取器件 id
- {
- Init18b20();
- WriteByte(0x33); //read rom
- read_bytes(8);
- }
- /************************************************************
- *Function:18B20ID全處理
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- void TemperatuerResult(void)
- {
- p = id_buff;
- ReadID();
- Config18b20();
- Init18b20 ();
- WriteByte(0xcc); //skip rom
- WriteByte(0x44); //Temperature convert
- Init18b20 ();
- WriteByte(0xcc); //skip rom
- WriteByte(0xbe); //read Temperature
- p = temp_buff;
- GemTemp();
- }
- unsigned int TempTick=0;
- void GetTemp()
- {
- if(TIM==1)
- { TIM=0;
- TemperatuerResult();
- D[5]=Temperature;
- }
- }
- /*************************************
- [ t1 (0.5ms)中斷] 中斷中做 PWM 輸出
- ------------1000/(0.02ms*250)=200Hz
- *************************************/
- void T1zd(void) interrupt 3
- {
- TH1 = 0xfe; //11.0592
- TL1 = 0x33;
- TIM++;
- }
復制代碼
|