導航:首頁 > 編程語言 > ds18b20溫度感測器編程

ds18b20溫度感測器編程

發布時間:2023-05-15 02:53:21

1. ds18b20溫度感測器程序 求解釋!!! 延時時間怎麼計算的

比如
while(t--)
{
_nop_();
}
t在delayus(10)中已經賦值,即t=10,飢清_nop_()是一個空操作NOP(匯編語言中),即一個機器周期,主掘肢舉判碧頻12Mhz中就是1um.

2. DS18B20溫度採集模塊編程思想

DS18B20內部結構主要由四部分組成:64位光刻ROM、溫度感測器、非揮發的溫度報警觸發器TH和TL、配置寄存器。光刻ROM中的64位序列號是出廠前被光刻好的,它可以看作是該DS18B20的地址序列碼。64位光刻ROM的排列是:開始8位(28H)是產品類型標號,接著的48位是該DS18B20自身的序列號,最後8位是前面56位的循環冗餘校驗碼(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一個DS18B20都各不相同,這樣就可以實現一根匯流排上掛接多個DS18B20的目的,也就是你要做的是配置寄存器。根據DS18B20的通訊協議,主機控制DS18B20完成溫度轉換必須經過三個步驟:每一次讀寫之前都要對DS18B20進行復位,復位成功讓啟敏後發送一條ROM指令,最後發送RAM指令,這樣才能對DS18B20進行預定的操作。復位要求主CPU將數據線下拉500微秒,然後釋放,DS18B20收到信號旁缺後等待16~60微秒左右坦枝,後發出60~240微秒的存在低脈沖,主CPU收到此信號表示復位成功。

3. 急需用溫度感測器ds18b20,數碼管顯示溫度的單片機的C語言程序,運用的是89c52單片機,附上電路圖,謝謝!

#include<銷舉鬧reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P1^4; //ds18b20與單片機連介面
unsignedcharcodestr[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//共陰數碼管字答早碼表
unsignedcharcodestr1[]={0x0bf,0x86,0x0db,0x0cf,0x0e6,0x0ed,0x0fd,0x87,0x0ff,0x0ef};//個位帶小數點字碼表
unsignedcharcodewei[]={0x0fe,0x0fd,0x0fb,0x0f7};
uchardatadisdata[5];
uint tvalue; //溫度值
uchartflag; //溫度正負標志
/**********ds1820程序************/
voiddelay_18B20(unsignedinti) //延時1微秒
{
while(i--);
}
voidds1820rst() /*ds1820復位*/
{
unsignedcharx=0;
DQ=1; //DQ復位
delay_18B20(4); //延時
DQ=0; //DQ拉低
delay_18B20(100);//精確延時大於 480us
DQ=1; //拉高
delay_18B20(40);
}
uchards1820rd() /*讀數據*/
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0; //給脈沖信號
dat>>=1;
DQ=1; //給脈沖信號
if(DQ) dat|=0x80;
delay_18B20(10);
}
return(dat);
}
voidds1820wr(ucharwdata) /*寫數據*/
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=wdata&0x01;
delay_18B20(10);
DQ=1;
wdata>>=1;
}
}
read_temp() /*讀取溫度值並轉換*/
{
uchara,b;
ds1820rst();
ds1820wr(0xcc);//跳過讀序列虧罩號
ds1820wr(0x44);//啟動溫度轉換
ds1820rst();
ds1820wr(0xcc);//跳過讀序列號
ds1820wr(0xbe);//讀取溫度
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{
tvalue=~tvalue+2;tflag=1; //負溫度
}
tvalue=tvalue*(0.625); //溫度值擴大10倍,精確到1位小數
return(tvalue);
}
/*********************************/
voidds1820disp() //溫度值顯示
{
uchari;
disdata[0]=tvalue/1000; //百位數
disdata[1]=tvalue%1000/100;//十位數
disdata[2]=tvalue%100/10; //個位數
disdata[3]=tvalue%10; //小數位
if(tflag==0)
{
if(disdata[0]==0x00)
{
disdata[0]=0x0a; //百位數位為0不顯示
if(disdata[1]==0x00) disdata[1]=0x0a; //十位數位為0不顯示
}
}
else //負溫度
{
disdata[0]=0x0b; //負溫度百位顯示負號:-
if(disdata[1]==0x00) disdata[1]=0x0a; //十位數位為0不顯示
}
for(i=0;i<150;i++)
{
P2=wei[0];
P0=str[disdata[3]];
delay_18B20(20);
P2=wei[1];
P0=str1[disdata[2]];
delay_18B20(20);
P2=wei[2];
P0=str[disdata[1]];
delay_18B20(20);
P2=wei[3];
P0=str[disdata[0]];
delay_18B20(20);
}
}
/************主程序**********/
voidmain()
{
ds1820rst(); //初始化顯示
while(1)
{
read_temp(); //讀取溫度
ds1820disp(); //顯示
}
}

4. 跪求用溫度感測器ds18b20顯示溫度的單片機程序

把返回值放到你數碼管顯示子程序中分解顯示即可
sbit DQ=P1^6; //採集溫度數據線
sbit SPK=P3^7;
unsigned char tflag;
unsigned int tive;
float temper;

/****************************************
函數功能:短暫延時
入口參數:num
出口參數:
*****************************************/
void delay(unsigned int num)
{
while(num--);
}

/****************************************
函數功能:DS18B20初始化
入口參數:
出口參數:
*****************************************/
void init_DS18B20(void)
{
//主機發送復位脈沖
DQ=1;
DQ=0;
delay(600); //x
DQ=1;
//等待DS18B20發送應答信號
delay(60); //防止DS18B20本身問題而讀不出數據採用確認法
while(!DQ);

// delay(480); //DS18B20本身沒有問題,可以延時將應答過程忽略

}
/****************************************
函數功能:讀一個位元組
入口參數:
出口參數:
*****************************************/
readchar(void) //從低位開始讀
{
unsigned char i=0;
unsigned char dat=0;

for(i=0;i<8;i++)
{
DQ=1;
DQ=0;
delay(10); //CPU緩沖時間 采樣時間
dat>>=1; //從高到低先存放一位數據
DQ=1;
if(DQ) //如果是1,將數據存放
dat|=0x80;
DQ=1;
delay(9); //數據讀取時間,下一次數據讀取前需要延時
}
return(dat);
}
/****************************************
函數功能:寫一個位元組
入口參數:
出口參數:
*****************************************/
writechar(unsigned char dat)
{
unsigned char i=0;

for(i=0;i<8;i++)
{
DQ=1;
DQ=0; //等待接收緩沖區的來臨,整個過程的時間為60~120us
delay(15); //
DQ=dat&0x01; //第一次寫最低位,將位元組變為位
delay(15); //
dat>>=1; //准備寫入下一位數據。
}
}
/****************************************
函數功能:讀取溫度
入口參數:
出口參數:
*****************************************/
read_temperature(void)
{
unsigned int a,b;

init_DS18B20(); //初始化子程序
writechar(0xcc); //寫入指令
writechar(0x44);

init_DS18B20();
writechar(0xcc);
writechar(0xbe);

a=readchar(); //低八位
b=readchar(); //高八位
tive=b;
tive<<=8;
tive=tive|a;
if(tive>0x0800) //溫度為負溫度第13位到15為為1,溫度為正溫度 //第13位到15為為0,所以值小於0x800說明為正溫度
tive=~tive+1;
else
tive=tive;

temper=tive*0.0625; //採用12位解析度所以每次的增量是0.0625

temper=temper*10; //保留小數點後面一位

return(temper);
}

閱讀全文

與ds18b20溫度感測器編程相關的資料

熱點內容
php志願者網站源碼 瀏覽:870
貿易pdf 瀏覽:495
dbug命令 瀏覽:351
開逛app如何加好友 瀏覽:958
ftpdos命令下載文件 瀏覽:75
華為如何打開語音伺服器 瀏覽:242
python中的idle 瀏覽:1000
五軸聯動數控編程 瀏覽:965
換一台電腦如何遠程雲伺服器 瀏覽:132
阿里雲怎麼買雲伺服器 瀏覽:664
java提取文字 瀏覽:97
阿里雲伺服器同人賬號問題 瀏覽:420
5分鍾解壓軸題 瀏覽:341
安卓桌面二級文件夾 瀏覽:188
eps文檔加密 瀏覽:261
手機怎麼做pdf 瀏覽:162
ug曲面pdf 瀏覽:279
液化氣還是壓縮氣 瀏覽:950
阿里雲公共ntp伺服器地址 瀏覽:991
金字塔學習機編程 瀏覽:684