資源簡介
2線DS18B20程序
代碼片段和文件信息
//*************DS18B20寄生供電模式程序開始*******************/
//數據口P3.6強上拉口P3.7,系統時鐘3.2768MHz
//*******************************************************/
#include?
#define?uint?unsigned?int?
#define?uchar?unsigned?char
uchar?BIT_Array[8]={BIT0BIT1BIT2BIT3BIT4BIT5BIT6BIT7};
uchar?flag;//判斷復位是否成功
uchar?sunx;//溫度值
//******************聲明引用的子函數*********************/
uchar?Read_DQ(uchar?num);//設置IO口為輸入模式
void?Set_DQ(uchar?numuchar?dat);//設置IO口為輸出模式
void?delay(uint?count);//延時函數
uchar?ReadOneChar(void);//讀一個字節
void?WriteOneChar(uchar?dat);//寫一個字節
void?Init_DS18B20(void);//復位
void?tmpchange(void);//啟動溫度轉換
uchar?ReadTemperature(void);//讀取溫度值
//****************啟動DS18B20進行溫度轉換****************/
void?tmpchange(void)
{
??Init_DS18B20();
??if(flag==1)//判斷復位是否成功
??{
???delay(1);
???WriteOneChar(0xCC);?//?跳過讀序號列號的操作
???WriteOneChar(0x44);?//?啟動溫度轉換
???Set_DQ(70);????????//強上拉使能P3.7
??}
}
//********************從18b20讀取溫度值******************/
//定義P3.6為DQ口。DQ表示與18b20相連的io口;
uchar?ReadTemperature(void)
?{
??uchar?aa=0;
??uchar?bb=0;
??uint??t=0;
??uint?tt=0;
??Set_DQ(71); //強上拉關閉P3.7
??Init_DS18B20();
??delay(5);
??if(flag==1)//判斷復位是否成功
???{
????delay(1);
????WriteOneChar(0xCC);?//跳過讀序號列號的操作
????WriteOneChar(0xBE);?//讀取溫度寄存器等(共可讀9個寄存器)?前兩個就是溫度
????aa=ReadOneChar();
????bb=ReadOneChar();
????Init_DS18B20();
????delay(5);
????t=bb;
????t<<=8;
????t=t|aa;
????tt=t*0.0625;
????return(tt);
????}
??else
????return(0);
?}
//***********************延時函數***********************/
void?delay(uint?count)
{
?while(count--);
?}
/*--------初始化18b20------*/
//內部的具體延時時間需要調整,因為晶振頻率不同;
void?Init_DS18B20(void)
{
?uchar?x=0;
??Set_DQ(61);????//DQ復位
??delay(5);???????//稍做延時
??Set_DQ(60);????//單片機將DQ拉低
??delay(400);?????//480us--960us
??Set_DQ(61);????//拉高總線
??delay(40);??????//大于60us
??x=Read_DQ(6);???//如果x=0則初始化成功?x=1則初始化失敗
??if(x==0)
????{
?????flag=1;
?????Set_DQ(61);
?????delay(300);
????}
??else
????{
?????flag=0;
?????Set_DQ(61);
?????delay(300);
????}
?}
//**********************讀一個字節**********************/
uchar?ReadOneChar(void)
?{
??uchar?i=0;
??uchar?j=0;
??uchar?dat?=?0;
??for?(i=8;i>0;i--)
???{
????Set_DQ(61);
????delay(1);
????
評論
共有 條評論