資源簡介
單片機與溫度傳感器DS18B20的程序設計
void read_ds1820() //讀
{
uchar delay,i,j,k,temp,temph,templ;
j=2; //讀2位字節數據
do
{
for(i=8;i>0;i--) //一個字節分8位讀取
{
temp>>=1; //讀取1位右移1位
TMDAT=0; //數據線置低電平
delay=1;
while(--delay); //延時2us
TMDAT=1; //拉高總線
delay=4;
while(--delay); //延時8us
if(TMDAT)temp|=0x80; //讀取1位數據
delay=25;
while(--delay); //讀取1位數據后延時50us
}
if(j==2)templ=temp;
//讀取的第一字節存templ
else temph=temp; //讀取的第二字節存temph
}while(--j);
f=0; //初始溫度標志為正
if((temph&0xf8)!=0x00) //若溫度為負的處理,對二進制補碼的處理
{
f=1; //為負溫度f置1
temph=~temph;
templ=~templ;
k=templ+1;
templ=k;
if(k>255)
{
temph++;
}
}
tempdf=templ&0x0f; //將讀取的數據轉換成溫度值,整數部分存tempint,小數部分存tempdf
templ>>=4;
temph<<=4;
tempint=temph|templ;
}
... ...
void read_ds1820() //讀
{
uchar delay,i,j,k,temp,temph,templ;
j=2; //讀2位字節數據
do
{
for(i=8;i>0;i--) //一個字節分8位讀取
{
temp>>=1; //讀取1位右移1位
TMDAT=0; //數據線置低電平
delay=1;
while(--delay); //延時2us
TMDAT=1; //拉高總線
delay=4;
while(--delay); //延時8us
if(TMDAT)temp|=0x80; //讀取1位數據
delay=25;
while(--delay); //讀取1位數據后延時50us
}
if(j==2)templ=temp;
//讀取的第一字節存templ
else temph=temp; //讀取的第二字節存temph
}while(--j);
f=0; //初始溫度標志為正
if((temph&0xf8)!=0x00) //若溫度為負的處理,對二進制補碼的處理
{
f=1; //為負溫度f置1
temph=~temph;
templ=~templ;
k=templ+1;
templ=k;
if(k>255)
{
temph++;
}
}
tempdf=templ&0x0f; //將讀取的數據轉換成溫度值,整數部分存tempint,小數部分存tempdf
templ>>=4;
temph<<=4;
tempint=temph|templ;
}
... ...
代碼片段和文件信息
/************************************************
************順達電子*丫丫設計屋?*****************
硬件結構框架:
????????????1,單總線溫度傳感器DS18B20
2?MCU??STC89C52
3,四位八段共陰數碼管
????????????4,晶振:12M11.0592M
顯示效果:
1,顯示實時溫度,精度0.5度
相關知識點:
1,單總線溫度傳感器DS18B20
************************************************/
#include“AT89x52.h“
#define?uint?unsigned?int
#define?uchar?unsigned?char
sbit?DUAN=P2^0;?????//74HC573的LE端????LED的段選端
sbit?WEI=P2^1;??????//74HC573的LE端????LED的位選端
sbit?TMDAT=P1^7;????//DS1820溫度接口
uchar?Temp[]={0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f0x390x40};??//共陰顯示字庫
uchar?Temp_1[]={0xbf0x860xdb0xcf0xe60xed0xfd0x870xff0xef};??????????//共陰==帶小數點
bit?f;?????????????//負溫度標志
bit?flag;??????????//DS1820初始化成功標志
uchar?tempinttempdf; ??????????//溫度整數部分和小數部分
void?wei_1(uchar?wei)?????????????//數碼管位控制
{
WEI=1;
P0=wei;
WEI=0;
}
void?duan_1(uchar?duan)???????????//數碼管段控制
{
uint?i;
DUAN=1;
P0=Temp[duan];
DUAN=0;
for(i=500;i>0;i--);
}
void?duan_2(uchar?duan)???????????//數碼管段控制
{
uint?i;
DUAN=1;
P0=Temp_1[duan];
DUAN=0;
for(i=500;i>0;i--);
}
void?set_ds1820()??????????????//初始化DS1820
{
while(1)
{
uchar?delay;
flag=0;
TMDAT=1;??????????????????//總線高電平
delay=1;
while(--delay);???????????//稍微延時
TMDAT=0;??????????????????//總線拉低
delay=250;
while(--delay);???????????//延時500us
TMDAT=1;??????????????????//拉高總線
delay=30;
while(--delay);???????????//延時60us
while(!TMDAT)?????????????//當DS1820拉低總線
{
delay=120;??
while(--delay);????????//延時240us
if(TMDAT)
{
flag=1;?????????????//DS1820初始化成功標志
break;
}
}
if(flag)??????????????????//初始化成功后再延時480us時序要求
{
delay=240;
while(--delay);
break;
}
}
}
void?write_ds1820(uchar?command)??//寫8位
{
uchar?delayi;
for(i=8;i>0;i--)???????????????//循環8次寫入
{
TMDAT=0;????????????????????//拉低總線
delay=6;
while(--delay);?????????????//延時12us
TMDAT=command&0x01;?????????//將數據放在總線上,進行采樣
delay=25;
while(--delay);?????????????//延時50us,采樣完畢
command=command>>1;?????????//數據右移一位,準備下次數據
TMDAT=1;????????????????????//釋放總線
}
}
void?read_ds1820()????????????????//讀
{
uchar?delayijktemptemphtempl;
j=2;???????????????????????????//讀2位字節數據
do
{
for(i=8;i>0;i--)????????????//一個字節分8位讀取
{
temp>>=1;????????????????//讀取1位右移1位
TMDAT=0;?????????????????//數據線置低電平
delay=1;
while(--delay);??????????//延時2us
TMDAT=1;?????????????????//拉高總線
delay=4;
while(--delay);??????????//延時8us
if(TMDAT)temp|=0x80;?????//讀取1位數據
delay=25;
while(--delay);??????????//讀取1位數據后延時50us
}
if(j==2)templ=temp;?????????//讀取的第一字節存templ
else?temph=temp;????????????//讀取的第二字節存temph
}while(--j);
f=0;???????????????????????????//初始溫度標志為正
if((temph&0xf8)!=0x00)?????????//若溫度為負的處理,對二進制補碼的處理
{
f=1;????????????????????????//為負溫度f置1
temph=~temph;
templ=~templ;
k=templ+1;
templ=k;
if(k>
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????3527??2009-04-19?00:13??DS18B20溫度測試LED顯示\DS1820溫度
?????文件???????8610??2009-04-19?00:13??DS18B20溫度測試LED顯示\DS1820溫度.LST
?????文件??????15511??2009-04-19?00:13??DS18B20溫度測試LED顯示\DS1820溫度.M51
?????文件???????4761??2009-04-19?00:13??DS18B20溫度測試LED顯示\DS1820溫度.OBJ
?????文件????????971??2009-04-19?00:28??DS18B20溫度測試LED顯示\DS1820溫度.Opt
?????文件???????1667??2002-01-11?20:07??DS18B20溫度測試LED顯示\DS1820溫度.Uv2
?????文件???????4805??2009-04-19?00:13??DS18B20溫度測試LED顯示\DS1820溫度.c
?????文件???????1673??2009-04-19?00:13??DS18B20溫度測試LED顯示\DS1820溫度.hex
?????文件?????????52??2009-04-19?00:13??DS18B20溫度測試LED顯示\DS1820溫度.lnp
?????文件????????604??2009-04-19?00:28??DS18B20溫度測試LED顯示\DS1820溫度.plg
?????文件????????971??2002-01-11?20:10??DS18B20溫度測試LED顯示\DS1820溫度_Opt.Bak
?????文件???????1663??2002-01-26?08:12??DS18B20溫度測試LED顯示\DS1820溫度_Uv2.Bak
?????目錄??????????0??2010-10-07?21:26??DS18B20溫度測試LED顯示
-----------?---------??----------?-----??----
????????????????44815????????????????????13
評論
共有 條評論