始終顯示讀到高電平,多次檢查時序不知道問題出在哪里,這是我的代碼
單片機源程序如下:
- #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); //啟動溫度轉換
- }
復制代碼 |