?? ds18b20.c
字號:
#include "main.h"
//#include "reg52.h"
unsigned char Temperature_Lsm;
unsigned char Temperature_Msm;
sbit P1_0=P1^0;
float Temperature_Buffer; // 溫度值的變量;
unsigned char Flag=0; // 結果為負和正的標志位。
void Delay (unsigned int count)
{
unsigned int i;
while (count)
{
i =200;
while (i>0)
i--;
count--;
}
}
float Data_Process(unsigned char H_Temperature,unsigned char L_Temperature)
{
unsigned char i;
unsigned char Temper;
float Buffer_Float=0.0;
Flag=H_Temperature&0x08; //若最高位為1則為負溫
if(Flag)
{
H_Temperature=~H_Temperature+1; //如果為負溫則取原碼 /*采集的數據是用補碼表示的*/
L_Temperature=~L_Temperature+1; //如果為負溫則取原碼 /*采集的數據是用補碼表示的*/
}
else
{
H_Temperature=H_Temperature; //如果為正溫則保持
L_Temperature=L_Temperature; //如果為正溫則保持
}
Temper=L_Temperature;
for(i=0;i<4;i++)
{
if(Temper&0x01)
{
Buffer_Float=Buffer_Float+(1.0/(1<<(4-i))); //計算小數值
Temper>>=1;
}
else
Temper>>=1;
}
L_Temperature>>=4; //高四位的值移道小數位去
H_Temperature=((H_Temperature<<4)&0x7f); //高字節的數據作移四位并把符號位清零
//以便與低字節的數據進行或操作
Buffer_Float=(H_Temperature|L_Temperature)+Buffer_Float; //最后的溫度值
return (Buffer_Float);
}
void Temperature_Reset(void) // 發送復位和初始化
{
unsigned int i;
P1_0 = 0;
i = 103;
while (i>0)
i--; // 延時
P1_0 = 1;
i = 4;
while (i>0)
i--;
}
bit Temperature_Readbit(void) // 讀取數據的一位
{
unsigned int i;
bit dat;
P1_0 = 0;
i++;
P1_0 = 1;
i++;
i++; //延時
dat = P1_0;
i = 8;
while (i>0)
i--; // 延時
return (dat);
}
unsigned char Temperature_Readchar(void) //讀一個字節
{
unsigned char i,j,dat;
dat = 0;
for (i=1;i<=8;i++)
{
j =Temperature_Readbit();
dat = (j << 7) | (dat >> 1);
}
return (dat);
}
void Temperature_Write(unsigned char dat) //寫一個字節
{
unsigned int i;
unsigned char j;
bit testb;
for (j=1;j<=8;j++)
{
testb = dat & 0x01;
dat = dat >> 1;
if (testb)
{
P1_0 = 0; // 寫0
i++;
i++;
P1_0 = 1;
i = 8;
while (i>0)
i--;
}
else
{
P1_0 = 0; // 寫0
i = 8;
while (i>0)
i--;
P1_0 = 1;
i++;
i++;
}
}
}
void Temperature_Change(void) // ds1820 開始轉換
{
Temperature_Reset(); // 復位
//tmpre (); // 等待存在脈沖
Delay (1); // 延時
Temperature_Write(0xcc); // 跳過序列號命令
Temperature_Write(0x44); // 發轉換命令 44H,
}
void Read_Temperature(void) // 讀取溫度
{
Temperature_Reset(); // 復位
Delay (1); // 延時
Temperature_Write(0xcc); // 跳過序列號命令
Temperature_Write(0xbe); // 發送讀取命令
Temperature_Lsm= Temperature_Readchar(); // 讀取低位溫度
Temperature_Msm= Temperature_Readchar(); //讀取高位溫度
Temperature_Buffer=Data_Process(Temperature_Msm,Temperature_Lsm); //進行整數和小數的處理
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -