command
data
高地位組合即為溫度數(shù)據(jù)
1. 初始化時鐘
void Init_DS18B20(void)
{
char CY = 1;
while (CY)
{
DQ_OUT();
DQ_SET_H();
delay_us(20);
DQ_SET_L(); //送出低電平復(fù)位信號
delay_us(360); //延時至少480us
delay_us(240);
DQ_SET_H(); //釋放數(shù)據(jù)線
delay_us(50); //等待60us
DQ_IN();
CY = DQ_READ(); //檢測存在脈沖
delay_us(240);
}
}
特別注意讀寫字節(jié)數(shù)據(jù)順序由低到高,不可弄錯
2.主機寫入數(shù)據(jù)
void WriteOneChar(unsigned char dat)
{
DQ_OUT();
unsigned char i=0; //數(shù)據(jù)線從高電平拉至低電平,產(chǎn)生寫起始信號。15us之內(nèi)將所需寫的位送到數(shù)據(jù)線上,
for(i=0;i<8;i++) //在15~60us之間對數(shù)據(jù)線進行采樣,如果是高電平就寫1,低寫0發(fā)生。
{
DQ_SET_L(); //在開始另一個寫周期前必須有1us以上的高電平恢復(fù)期。
delay_us(1);
if(dat&0x01)
{
DQ_SET_H();
// delay_us(1);
}
else
DQ_SET_L();
delay_us(60);
DQ_SET_H();
// delay_us(1);
dat>>=1;
}
}
3.讀時序
char ReadOneChar() //主機數(shù)據(jù)線先從高拉至低電平1us以上,再使數(shù)據(jù)線升為高電平,從而產(chǎn)生讀信號
{
unsigned char i=0; //每個讀周期最短的持續(xù)時間為60us,各個讀周期之間必須有1us以上的高電平恢復(fù)期
unsigned char dat=0;
for (i=0;i<8;i++) //一個字節(jié)有8位
{
DQ_OUT();
DQ_SET_L(); //低起始
dat>>=1;
//DQ_SET_H();
DQ_IN();
if(DQ_READ()==1)
dat|=0x80;
delay_us(45);
// DQ_OUT();
DQ_SET_H();
}
return(dat);
}
讀取溫度數(shù)據(jù)文章來源:http://www.zghlxwxcb.cn/news/detail-506407.html
char ReadTemperature(void)
{
unsigned char tempL=0; //設(shè)全局變量
unsigned char tempH=0;
unsigned int TEMPZ;//測量到的溫度的整數(shù)部分
Init_DS18B20(); //初始化
// while(chack_ds18b20())
// {
// printf("err");
// }
WriteOneChar(0xcc); //跳過讀序列號的操作
WriteOneChar(0x44); //啟動溫度轉(zhuǎn)換
// chack_ds18b20();
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳過讀序列號的操作
WriteOneChar(0xbe); //讀溫度寄存器(頭兩個值分別為溫度的低位和高位)
tempL=ReadOneChar(); //讀出溫度的低位LSB
tempH=ReadOneChar(); //讀出溫度的高位MSB
TEMPZ= ((tempH<<4)|(tempL>>4));
if(TEMPZ>=128)
{
TEMPZ=~TEMPZ+1;
}
return TEMPZ;
}
感謝大佬的分享
https://blog.csdn.net/weixin_47457689/article/details/124081703文章來源地址http://www.zghlxwxcb.cn/news/detail-506407.html
到了這里,關(guān)于DS18B20-STM32溫度讀取的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!