NE76003單片機調試DS18B20 步驟

一.硬件部分函數

GND腳接地;spa

DQ腳接P03,外加4K7上拉電阻;ip

VCC腳接3.3v供電;it

二.軟件部分io

1.配置P03爲準準雙向 IO類型:變量

void Init_power_gpio(void)
{
  P03_Quasi_Mode; //DS18B20
  P03=1;
}軟件

2.配置定時器2(可任意選用定時器):配置

void Timer2_init(void)
{ //系統上電默認16M高速時鐘源使能,並做爲系統時鐘硬件

  clr_TR2;      //TR2中止時寫入從新裝載值定時器

  TIMER2_DIV_16;   //使用1/16分頻 一秒震動爲16000000/16

  TIMER2_Auto_Reload_Delay_Mode; //配置爲自動重裝載模式
  RCMP2L =(65536-1)/256;    
  RCMP2H =(65536-1)%256;
  TL2 = 0;        //重裝載值
  TH2 = 0;        

//  set_ET2;       //使能定時器3中斷
//  set_EA;       //使能全部中斷
  set_TR2;       //使能定時器3
}

3.初始化:

/*----------------------------------------------------------
函數名稱:void Init_DS18B20(void)
函數功能:初始化
描述:480-960微妙低電平,而後釋放爲高電平 完成一次復位
--------------------------------------------------------*/
void Init_DS18B20(void)
{
  P03=1; //起始位高電平
  TL2=0;
  TH2=0;
  while((TH2*256+TL2)<900);
  P03=0; // 拉低
  TL2=0;
  TH2=0;
  while((TH2*256+TL2)<500);// 延時約500us, 符合協議要求480-960微秒的低電平脈衝
  P03=1; //產生一個上升沿, 進入等待應答狀態
}

4.

/*----------------------------------------------------------
函數名稱:void Wait_DS18B20(void)
函數功能:等待應答
描述:
--------------------------------------------------------*/
void Wait_DS18B20()
{
  while(P03); //等待應答
  while(~P03) //檢測到應答脈衝
  // {
  // printf("應答\n");
  // }
  TL2=0;
  TH2=0;
  while((TH2*256+TL2)<70);
}

5.

/*----------------------------------------------------------
函數名稱:bit ReadOneBit(void)
函數功能:讀取一字節
讀一位, 讓DS18B20一小週期低電平, 而後兩小週期高電平,
以後DS18B20則會輸出持續一段時間的一位數據
-------------------------------------------------------*/
bit ReadOneBit(void)
{
  bit b;
  P03 = 0;
  TL2=0;
  TH2=0;
  while((TH2*256+TL2)<10); //延時約10us, 符合協議要求至少保持1us
  P03 = 1;
  TL2=0;
  TH2=0;
  while((TH2*256+TL2)<20); //延時約20us, 符合協議要求的至少延時15us以上
  b = P03;
  TL2=0;
  TH2=0;
  while((TH2*256+TL2)<70); //延時約70us, 符合讀時隙不低於60us要求
  return b;
}

6.

/*********************************************
函數功能:向DS18B20讀一字節數據
入口參數:dat

***********************************************/
unsigned char ReadOneByte()
{
  unsigned int i;
  unsigned char j, dat;
  dat = 0;
  for(i=0; i<8; i++)
  {
  j = ReadOneBit();
  //最早讀出的是最低位數據
  dat = (j << 7) | (dat >> 1);
  }
  return dat;
}

7.

/*********************************************
函數功能:向DS18B20寫一字節數據
入口參數:dat
描述:寫0:拉低1us-15us後拉低最少60,最長120us,再釋放高電平
寫1:拉低1us-15us後釋放高最少60,最長120us直到週期結束
***********************************************/
void WriteOneByte(unsigned char dat)
{
unsigned char j;
bit b;
for(j = 0; j < 8; j++)
{
b = dat & 0x01;
dat >>= 1;
//寫"1", 拉低15us後, 在15us~60us內將DQ拉高, 即完成寫1
if(b)
{
P03 = 0;
TL2=0;
TH2=0;
while((TH2*256+TL2)<3); //拉低約3usus, 符合協議要求1~15us內,提示寫開始
P03 = 1;
TL2=0;
TH2=0;
while((TH2*256+TL2)<70); //延時約70us, 符合寫時隙不低於60us要求
}
else //寫"0", 將DQ拉低60us~120us
{
P03 = 0;
TL2=0;
TH2=0;
while((TH2*256+TL2)<70); //延時約70us, 符合寫時隙不低於60us要求
P03 = 1;
TL2=0;
TH2=0;
while((TH2*256+TL2)<3); //整個寫0時隙過程已經超過60us, 這裏就不用像寫1那樣, 再延時64us了
}
}
}

8.

/*********************************************
函數名:SendChangeCmd
參數:
返回值:
功能:向DS18B20發送溫度轉換命令
***********************************************/
void SendChangeCmd()
{
Init_DS18B20(); //初始化DS18B20, 不管什麼命令, 首先都要發起初始化
Wait_DS18B20(); //等待DS18B20應答
TL2=0;
TH2=0;
while((TH2*256+TL2)<200); //延時1ms, 由於DS18B20會拉低DQ 60~240us做爲應答信號
WriteOneByte(0xcc); //寫入跳過序列號命令字 Skip Rom
WriteOneByte(0x44); //寫入溫度轉換命令字 Convert T
}

9.

/*********************************************
函數名:SendReadCmd
參數:
返回值:
功能:向DS18B20發送讀取數據命令
***********************************************/
//
void SendReadCmd()
{
Init_DS18B20();
Wait_DS18B20();
TL2=0;
TH2=0;
while((TH2*256+TL2)<200); //延時1ms, 由於DS18B20會拉低DQ 60~240us做爲應答信號
WriteOneByte(0xcc); //寫入跳過序列號命令字 Skip Rom
WriteOneByte(0xbe); //寫入讀取數據令字 Read Scratchpad
}

10.

/*********************************************
函數名:GetTmpValue
參數:
返回值:
功能:獲取當前溫度值
***********************************************/
int GetTmpValue()
{
unsigned int tmpvalue;
int value; //存放溫度數值
float t;
unsigned char low, high;
SendReadCmd();
//連續讀取兩個字節數據
low = ReadOneByte();
high = ReadOneByte();
//將高低兩個字節合成一個整形變量
//計算機中對於負數是利用補碼來表示的
//如果負值, 讀取出來的數值是用補碼錶示的, 可直接賦值給int型的value
tmpvalue = high;
tmpvalue <<= 8;
tmpvalue |= low;
value = tmpvalue;

//使用DS18B20的默認分辨率12位, 精確度爲0.0625度, 即讀回數據的最低位表明0.0625度
t = value * 0.0625;
//將它放大100倍, 使顯示時可顯示小數點後兩位, 並對小數點後第三進行4舍5入
//如t=11.0625, 進行計數後, 獲得value = 1106, 即11.06 度
//如t=-11.0625, 進行計數後, 獲得value = -1106, 即-11.06 度
value = t * 100 + (value > 0 ? 0.5 : -0.5); //大於0加0.5, 小於0減0.5
return value;
}

11.

void main (void)

{

  int tempValue;

  InitialUART0_Timer1(115200);   //串口0使用timer1

while(1)

{

  SendChangeCmd();
  tempValue=GetTmpValue();
  printf(" %d \n ",tempValue);

}

}

相關文章
相關標籤/搜索