基于DS18B20數(shù)字溫度計(jì)設(shè)計(jì)
本試驗(yàn)結(jié)合溫度傳感器DS18B20及單線技術(shù)實(shí)現(xiàn)數(shù)字溫度計(jì)的設(shè)計(jì)。
本文引用地址:http://butianyuan.cn/article/201611/315963.htm主要器件:
1、AT89C52單片機(jī)芯片,控制溫度傳感器和數(shù)據(jù)處理。
2、單線數(shù)字溫度傳感器DS18B20。
試驗(yàn)流程圖:實(shí)驗(yàn)電路圖:
試驗(yàn)程序代碼:
//DigThermo.h程序
#ifndef_DIGTHERMO_H//防止DigThermo.h被重復(fù)引用
#define_DIGTHERMO_H
#include
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar tplsb,tpmsb;//溫度值低位、高位字節(jié)
sbit DQ = P3^5;//數(shù)據(jù)通信線DQ
#endif
//DigThermo.c程序
#include "DigThermo.h"
/*延時(shí)t毫秒*/
void delay(uint t)
{
uint i;
while(t--)
{
/*對(duì)于11.0592M時(shí)鐘,約延時(shí)1ms */
for (i=0;i<125;i++)
{}
}
}
/*產(chǎn)生復(fù)位脈沖初始化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--;
}
/*等待應(yīng)答脈沖*/
void RxWait(void)
{
uint i;
while(DQ);
while(~DQ);//檢測(cè)到應(yīng)答脈沖
i = 4;
while (i>0)i--;
}
/*讀取數(shù)據(jù)的一位,滿足讀時(shí)隙要求*/
bit RdBit(void)
{
uint i;
bit b;
DQ = 0;
i++;
DQ = 1;
i++;i++;//延時(shí)15us以上,讀時(shí)隙下降沿后15us,DS18B20輸出數(shù)據(jù)才有效
b = DQ;
i = 8;
while(i>0) i--;
return (b);
}
/*讀取數(shù)據(jù)的一個(gè)字節(jié)*/
uchar RdByte(void)
{
uchar i,j,b;
b = 0;
for (i=1;i<=8;i++)
{
j = RdBit();
b = (j<<7)|(b>>1);
}
return(b);
}
/*寫數(shù)據(jù)的一個(gè)字節(jié),滿足寫1和寫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)
{
/*寫1 */
DQ = 0;
i++;i++;//延時(shí),使得15us以內(nèi)拉高
DQ = 1;
i = 8;
while(i>0) i--;//整個(gè)寫1時(shí)隙不低于60us
}
else
{
/*寫0 */
DQ = 0;
i = 8;
while(i>0) i--;//保持低在60us到120us之間
DQ = 1;
i++;
i++;
}
}
}
/*啟動(dòng)溫度轉(zhuǎn)換*/
void convert(void)
{
TxReset();//產(chǎn)生復(fù)位脈沖,初始化DS18B20
RxWait();//等待DS18B20給出應(yīng)答脈沖
delay(1);//延時(shí)
WrByte(0xcc);// skip rom命令
WrByte(0x44);// convert T命令
}
/*讀取溫度值*/
void RdTemp(void)
{
TxReset();//產(chǎn)生復(fù)位脈沖,初始化DS18B20
RxWait();//等待DS18B20給出應(yīng)答脈沖
delay(1);//延時(shí)
WrByte(0xcc);// skip rom命令
WrByte(0xbe);// read scratchpad命令
tplsb = RdByte();//溫度值低位字節(jié)(其中低4位為二進(jìn)制的“小數(shù)”部分)
tpmsb = RdByte();//高位值高位字節(jié)(其中高5位為符號(hào)位)
}
/*主程序,讀取的溫度值最終存放在tplsb和tpmsb變量中。
tplsb其中低4位為二進(jìn)制的“小數(shù)”部分;tpmsb其中高
5位為符號(hào)位。真正通過(guò)數(shù)碼管輸出時(shí),需要進(jìn)行到十進(jìn)
制有符號(hào)實(shí)數(shù)(包括小數(shù)部分)的轉(zhuǎn)換。*/
void main(void)
{
do
{
delay(1);//延時(shí)1ms
convert();//啟動(dòng)溫度轉(zhuǎn)換,需要750ms
delay(1000);//延時(shí)1s
RdTemp();//讀取溫度
}
while(1);
}
評(píng)論