?? ds18b20.c
字號:
#include"ds18b20.h"
#include<stm32f10x_lib.h>
#include"mytype.h"
#define DS_PORT GPIOA //選擇外設(shè)GPIOA
#define DS_DQIO GPIO_Pin_1 //選擇管腳Pa1
#define ResetDQ() GPIO_ResetBits(DS_PORT,DS_DQIO) //拉低DQ
#define SetDQ() GPIO_SetBits(DS_PORT,DS_DQIO) //拉高DQ
#define GetDQ() GPIO_ReadInputDataBit(DS_PORT,DS_DQIO) //讀取DQ的電平
void delay_1ms(int cnt)
{
int i;
while(cnt--)
for(i=0;i<8300;i++);
}
void delay_1us(U32 value)
{
SysTick->LOAD=value*9; //時間加載
SysTick->CTRL|=0x01; //開始倒數(shù)
while(!(SysTick->CTRL&(1<<16))); //等待時間到達(dá)
SysTick->CTRL=0x00000000; //關(guān)閉計數(shù)器
SysTick->VAL=0x00000000; //清空計數(shù)器
}
void Init_ds18b20(void) //初始化DS18B20
{
SetDQ();
delay_1us(30); //保持高電平一段時間時間
ResetDQ(); //總線將其拉低電平
delay_1us(600); //延時400us-960us,這里延時600us
SetDQ(); //總線釋放低電平
delay_1us(30); //延時15us-60us,這里延時30us
while(GetDQ()); //若為高電平則出錯,等待一直循環(huán)
delay_1us(500); //將剩余時間消耗完
SetDQ(); //總線將電平拉高
}
void DS18B20WriteByte(U8 Dat)
{
U8 i;
for(i=8;i>0;i--)
{
ResetDQ(); //在15us內(nèi)送數(shù)到數(shù)據(jù)線,在15-60us內(nèi)采樣
delay_1us(5);
if(Dat&0x01) //讀數(shù)據(jù)的最低位
SetDQ();
else
ResetDQ();
delay_1us(65); //將剩余時間消耗完
SetDQ();
delay_1us(2); //寫兩個位之間間隔大于1us
Dat>>=1; //右移一位,
}
}
U8 DS18B20ReadByte(void)
{
U8 i,Dat;
SetDQ();
delay_1us(5);
for(i=0;i<8;i++)
{
Dat>>=1;
ResetDQ(); //從讀時序開始到采樣信號線必須在15us內(nèi),且采樣盡量安排在15us最后
delay_1us(5);
SetDQ(); //釋放總線,然后才能進(jìn)行采樣,否則無意義。只有低電平
delay_1us(5);
if(GetDQ())
Dat|=0x80;
else
Dat&=0x7f;
delay_1us(65); //消耗剩余時間
SetDQ(); //拉高總線
}
return Dat;
}
U8 readtemperature(void)
{
U8 a,b;
Init_ds18b20(); //初始化
DS18B20WriteByte(skipRom);
DS18B20WriteByte(convert); //開始轉(zhuǎn)換溫度
delay_1ms(550); //延時,等待溫度轉(zhuǎn)換完成
Init_ds18b20();
DS18B20WriteByte(skipRom);
DS18B20WriteByte(readTemp); //讀取暫存器
a=DS18B20ReadByte(); //讀取低8位
b=DS18B20ReadByte(); //讀取高8位
b<<=4;
b+=(a&=0xf0)>>4;
return b;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -