基于DS18B20數字溫度計設計
本試驗結合溫度傳感器DS18B20及單線(xiàn)技術(shù)實(shí)現數字溫度計的設計。
本文引用地址:http://dyxdggzs.com/article/201611/315963.htm主要器件:
1、AT89C52單片機芯片,控制溫度傳感器和數據處理。
2、單線(xiàn)數字溫度傳感器DS18B20。
試驗流程圖:
實(shí)驗電路圖:

試驗程序代碼:
//DigThermo.h程序
#ifndef_DIGTHERMO_H//防止DigThermo.h被重復引用
#define_DIGTHERMO_H
#include
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar tplsb,tpmsb;//溫度值低位、高位字節
sbit DQ = P3^5;//數據通信線(xiàn)DQ
#endif
//DigThermo.c程序
#include "DigThermo.h"
/*延時(shí)t毫秒*/
void delay(uint t)
{
uint i;
while(t--)
{
/*對于11.0592M時(shí)鐘,約延時(shí)1ms */
for (i=0;i<125;i++)
{}
}
}
/*產(chǎn)生復位脈沖初始化DS18B20 */
void TxReset(void)
{
uint i;
DQ = 0;
/*拉低約900us */
i = 100;
while (i>0)i--;
DQ = 1;//產(chǎn)生上升沿
i = 4;
while (i>0)i--;
}
/*等待應答脈沖*/
void RxWait(void)
{
uint i;
while(DQ);
while(~DQ);//檢測到應答脈沖
i = 4;
while (i>0)i--;
}
/*讀取數據的一位,滿(mǎn)足讀時(shí)隙要求*/
bit RdBit(void)
{
uint i;
bit b;
DQ = 0;
i++;
DQ = 1;
i++;i++;//延時(shí)15us以上,讀時(shí)隙下降沿后15us,DS18B20輸出數據才有效
b = DQ;
i = 8;
while(i>0) i--;
return (b);
}
/*讀取數據的一個(gè)字節*/
uchar RdByte(void)
{
uchar i,j,b;
b = 0;
for (i=1;i<=8;i++)
{
j = RdBit();
b = (j<<7)|(b>>1);
}
return(b);
}
/*寫(xiě)數據的一個(gè)字節,滿(mǎn)足寫(xiě)1和寫(xiě)0的時(shí)隙要求*/
void WrByte(uchar b)
{
uint i;
uchar j;
bit btmp;
for(j=1;j<=8;j++)
{
btmp = b&0x01;
b = b>>1;//取下一位(由低位向高位)
if (btmp)
{
/*寫(xiě)1 */
DQ = 0;
i++;i++;//延時(shí),使得15us以?xún)壤?/p>
DQ = 1;
i = 8;
while(i>0) i--;//整個(gè)寫(xiě)1時(shí)隙不低于60us
}
else
{
/*寫(xiě)0 */
DQ = 0;
i = 8;
while(i>0) i--;//保持低在60us到120us之間
DQ = 1;
i++;
i++;
}
}
}
/*啟動(dòng)溫度轉換*/
void convert(void)
{
TxReset();//產(chǎn)生復位脈沖,初始化DS18B20
RxWait();//等待DS18B20給出應答脈沖
delay(1);//延時(shí)
WrByte(0xcc);// skip rom命令
WrByte(0x44);// convert T命令
}
/*讀取溫度值*/
void RdTemp(void)
{
TxReset();//產(chǎn)生復位脈沖,初始化DS18B20
RxWait();//等待DS18B20給出應答脈沖
delay(1);//延時(shí)
WrByte(0xcc);// skip rom命令
WrByte(0xbe);// read scratchpad命令
tplsb = RdByte();//溫度值低位字節(其中低4位為二進(jìn)制的“小數”部分)
tpmsb = RdByte();//高位值高位字節(其中高5位為符號位)
}
/*主程序,讀取的溫度值最終存放在tplsb和tpmsb變量中。
tplsb其中低4位為二進(jìn)制的“小數”部分;tpmsb其中高
5位為符號位。真正通過(guò)數碼管輸出時(shí),需要進(jìn)行到十進(jìn)
制有符號實(shí)數(包括小數部分)的轉換。*/
void main(void)
{
do
{
delay(1);//延時(shí)1ms
convert();//啟動(dòng)溫度轉換,需要750ms
delay(1000);//延時(shí)1s
RdTemp();//讀取溫度
}
while(1);
}
評論