欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
小白想請問大佬一個關于DS18B20溫度傳感器的單片機程序問題
[打印本頁]
作者:
gaoky
時間:
2020-2-15 16:49
標題:
小白想請問大佬一個關于DS18B20溫度傳感器的單片機程序問題
我已經用DS18B20測出了溫度的值,想要這個溫度低于自己設定的溫度后,led燈就閃爍,但是測得的值是整數部分和小數部分,不知道怎么用if語句來寫
void DS18B20_Read_Celsius_Drive()
{
static xdata u16 count=0;//為了利用狀態機進行復位
float num;//定義一個浮點數的變量
u8 xdata Value_High,Value_Low;//定義兩個高低位的變量,用以保存
count++;
switch(count)
{
case 1: DS18B20_DQ=0;break;//count=1,第一步把DQ拉低
case 35: DS18B20_DQ=1;break;//根據圖顯示,然后拉高
case 60:
DS18B20_Write_Reg(0xcc);//開始寫入指令
DS18B20_Write_Reg(0x44);//同上
break;
case 4000: DS18B20_DQ=0;break;
case 4035: DS18B20_DQ=1;break;
case 4060:
DS18B20_Write_Reg(0xcc);
DS18B20_Write_Reg(0xbe);//發送指令BE
Value_Low=DS18B20_Read_Data();//然后開始讀取兩次數據,步驟6
Value_High=DS18B20_Read_Data();
Value_High<<=4;//高字節左移四位,剩下一個藍三個紅
Value_High+=(Value_Low&0xf0)>>4;//先將低字節高四位取出來11110000,再右移四位,然后加上高字節的四位
DS18B20_Read_Buffer[0]=Value_High;//整數部分已經保存好了
num=(Value_Low&0x0f)*0.0625;
DS18B20_Read_Buffer[1]=(u8)(num*100);
break;
case 8000: count=0;break;
}
}
作者:
wulin
時間:
2020-2-15 21:21
修改了部分語句,未必符合樓主需求,就算提供一個思路。
void DS18B20_Read_Celsius_Drive()
{
static xdata u16 count=0;//為了利用狀態機進行復位
// float num;//定義一個浮點數的變量
u16 temp;
u8 TempH,TempL;
bit negative;//負數標志
u8 xdata Value_High,Value_Low;//定義兩個高低位的變量,用以保存
count++;
switch(count)
{
case 1: DS18B20_DQ=0;break;//count=1,第一步把DQ拉低
case 35: DS18B20_DQ=1;break;//根據圖顯示,然后拉高
case 60:
DS18B20_Write_Reg(0xcc);//開始寫入指令
DS18B20_Write_Reg(0x44);//同上
break;
case 4000: DS18B20_DQ=0;break;
case 4035: DS18B20_DQ=1;break;
case 4060:
DS18B20_Write_Reg(0xcc);
DS18B20_Write_Reg(0xbe);//發送指令BE
Value_Low=DS18B20_Read_Data();//然后開始讀取兩次數據,步驟6
Value_High=DS18B20_Read_Data();
temp=Value_High<<8|Value_Low;
if(temp&0x8000)
{
negative=1; //負號標志
temp=~temp; //取反加1
temp +=1;
}
else negative=0; //正數
TempH=temp>>4; //分解出整數
TempL=temp&0x0F; //分解出小數
TempL=TempL*6/10; //保留一位小數
if(negative==1)
DS18B20_Read_Buffer[0]=0x40;//顯示負號
else if(TempH/100==0)//小于100
DS18B20_Read_Buffer[0]=0; //百位消隱
else
DS18B20_Read_Buffer[0]=smgdu[TempH/100]; //顯示百位溫度
if((TempH/100==0)&&((TempH%100)/10==0))
DS18B20_Read_Buffer[1]=0; //十位消隱
else
DS18B20_Read_Buffer[1]=smgdu[(TempH%100)/10]; //顯示十位溫度
DS18B20_Read_Buffer[2]=smgdu[(TempH%100)%10]|0x80;//顯示個位溫度,帶小數點
DS18B20_Read_Buffer[3]=smgdu[TempL]; //顯示小數溫度1位
if(TempH>=preset && negative==0)//溫度超過正預設值,LED燈亮
led=0;
else led=1;
// Value_High<<=4;//高字節左移四位,剩下一個藍三個紅
// Value_High+=(Value_Low&0xf0)>>4;//先將低字節高四位取出來11110000,再右移四位,然后加上高字節的四位
// DS18B20_Read_Buffer[0]=Value_High;//整數部分已經保存好了
// num=(Value_Low&0x0f)*0.0625;
// DS18B20_Read_Buffer[1]=(u8)(num*100);
break;
case 8000: count=0;break;
}
}
復制代碼
作者:
gaoky
時間:
2020-2-16 09:16
wulin 發表于 2020-2-15 21:21
修改了部分語句,未必符合樓主需求,就算提供一個思路。
謝謝大佬,學習到了
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1