欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機小白求助,用msp430單片機驅動DS18B20
[打印本頁]
作者:
2023orsu
時間:
2023-2-22 17:01
標題:
單片機小白求助,用msp430單片機驅動DS18B20
始終顯示讀到高電平,多次檢查時序不知道問題出在哪里,這是我的代碼
單片機源程序如下:
#include "tempature.h"
#include "msp430f5529_gpio.h"
/*******************************************
函數名稱: B20_Init
功 能: 復位DS18B20
參 數: 無
返回值 : 無
********************************************/
void B20_Init(void)
{
unsigned char flag=0;
GPIO_Init(DS18B20_PORT,DS18B20_PIN,GPO);//P6.5輸出
DS18B20_OUT = 1;//總線拉高
DELAY_US(5);//稍微延時約5微秒
DS18B20_OUT = 0;//總線拉低
DELAY_US(500);//延時500微秒復位脈沖
DS18B20_OUT = 1;//總線拉高
DELAY_US(40); //等待40微秒
GPIO_Init(DS18B20_PORT,DS18B20_PIN,GPI);//P6.5輸入
if(DS18B20_IN)//檢測是否為高電平
flag=1;
else
flag=0;
DELAY_US(480);//若讀到了數據線上的低電平“做延時,其延時的時間從發出的高電平算起,延時480微秒。
GPIO_Init(DS18B20_PORT,DS18B20_PIN,GPO);
DS18B20_OUT = 1;//將數據線再次拉高到高電平“1”后結束
}
/*******************************************
函數名稱: B20_ReadByte
功 能: 讀取一個字節的數據
參 數: 無
返回值 : data--返回的一個字節數據
********************************************/
uint8_t B20_ReadByte(void)
{
uint8_t i,val=0;
for(i=0;i < 8;i++) //位計數值
{
val>>=1; //右移,準備接受新的數據位
GPIO_Init(DS18B20_PORT,DS18B20_PIN,GPO);
DS18B20_OUT = 1; //拉高
DELAY_US(2); //等待5微秒
DS18B20_OUT = 0;//拉低,啟動讀數據位
DELAY_US(2); //等待5微秒
DS18B20_OUT = 1; //釋放總線
DELAY_US(4); //等待5微秒
GPIO_Init(DS18B20_PORT,DS18B20_PIN,GPI);
if(DS18B20_IN)//該位是否為高
val|=0x80; //是就將此位置高
GPIO_Init(DS18B20_PORT,DS18B20_PIN,GPO);
DELAY_US(60); //等待50微秒
}
return val; //將讀到的一個字節返回
}
/*******************************************
函數名稱: B20_WriteByte
功 能: 寫入一個字節的數據
參 數: data--要寫入的數據
返回值 : 無
********************************************/
void B20_WriteByte(uint8_t data)
{
uint8_t i;
for(i=0;i<8;i++) //位計數值
{
GPIO_Init(DS18B20_PORT,DS18B20_PIN,GPO);
DS18B20_OUT = 0;//拉低,啟動寫數據位
DELAY_US(2); //等待1微秒
if(data&0x01) //此位數據是否為高
{
DS18B20_OUT = 1;//是高則將單總線拉高
}
else
{
DS18B20_OUT = 0;//是低則將單總線拉低
}
DELAY_US(60); //等待50微秒
data>>=1; //右移,為寫入新的數據位做準備
}
DS18B20_OUT = 1;//釋放總線
}
/*******************************************
函數名稱: B20_Read_temp
功 能: 讀取溫度值
參 數: 無
返回值 : 溫度值(單位:攝氏度)
********************************************/
float B20_Read_temp(void)
{
uint8_t templ,temph;
uint16_t temp;
float tempature;
Init_DS18b20();
templ=B20_ReadByte();
temph=B20_ReadByte();
temp = (temph<<8)|templ;//合并為16位
tempature = temp*0.0625;//轉換為溫度值
temp = (int)(tempature*10+0.5);//精確到小數點后1位
return temp; //返回數據
}
void Init_DS18b20()
{
B20_Init(); //復位18b20
DELAY_MS(2);
B20_WriteByte(0xcc); //跳過ROM
B20_WriteByte(0x44); //啟動溫度轉換
}
復制代碼
作者:
2023orsu
時間:
2023-2-23 18:32
更新:在復位函數里怎么調整時序都沒辦法檢測到應答的低電平
/*****************************************************************************
** 對DS18b20進行復位
******************************************************************************/
void DS_reset()
{
unsigned char flag=0;
DS_SET_OUT;//設置為輸出
DS_1;//輸出高電平
delay_us(15);
DS_0;//拉低延時750微秒
delay_us(750);
DS_1;
delay_us(1);
DS_SET_IN;//讀取電平
while(DS_IN&&flag<240){
delay_us(1);
flag++;
}
DS_SET_OUT;
DS_1;
}
復制代碼
作者:
2023orsu
時間:
2023-2-23 18:34
重寫了一遍,始終讀不到低電平
/*****************************************************************************
** 對DS18b20進行復位
******************************************************************************/
void DS_reset()
{
unsigned char flag=0;
DS_SET_OUT;
DS_1;
delay_us(15);
DS_0;
delay_us(750);
DS_1;
delay_us(15);
DS_SET_IN;
while(DS_IN&&flag<240){
delay_us(1);
flag++;
}
DS_SET_OUT;
DS_1;
}
復制代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1