板子就接了個32K的晶振,設置DS18B20DE 的信號口選擇在P1.6調試了三個程序,debug都讀不到數據,附上程序,下面一個是被我屏蔽的程序。望大神指教。
#include<msp430x14x.h>
#define delay_10uS() ( _NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP())
#define delay_6uS() ( _NOP(),_NOP(),_NOP(),_NOP(),_NOP())
#define delay_9uS() ( _NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP())
#define delay_15uS() ( _NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP(),_NOP())
#define uchar unsigned char
#define uint unsigned int
#define DQ_OUT P1DIR|=BIT6
#define DQ_IN P1DIR&=~BIT6
#define DQ_LOW P1OUT&=~BIT6
#define DQ_HIGH P1OUT|=BIT6
#define DQ_DATA P1IN&BIT6
uint j=0;
uint l=0;
uchar MSB; //溫度高字節
uchar LSB; //溫度低字節
int t1=0; //溫度整數部分數值
uint t2=0; //溫度小數部分數值
uchar flag; //負溫度標志
void Delayus(uint us)
{
while(us--)
{
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
}
}
//初始化DS18B20
void DS18B20Init(void)
{
DQ_OUT;//設置為輸出方向
DQ_LOW;//拉低總線
Delayus(50);
DQ_HIGH;//釋放總線
Delayus(3);
DQ_IN;//設置為輸入方向
while(DQ_DATA);//等待應答信號
while(~DQ_DATA);//等待釋放總線
delay_10uS();
delay_15uS();
}
//讀一個字節
uchar ReadByte(void)
{
uchar i;
uchar ReadData=0;
for(i=0;i<8;i++)
{
ReadData>>=1;
DQ_LOW;
delay_6uS();
DQ_HIGH;
delay_9uS();
DQ_IN;
_NOP();
if(DQ_DATA) ReadData|=0x80;
delay_10uS();
delay_10uS();
delay_10uS();
delay_10uS();
DQ_OUT;
DQ_HIGH;
delay_10uS();
}
return ReadData;
}
//寫一個字節
void WriteByte(uchar WriteData)
{
uchar i;
uchar tmpData;
for(i=0;i<8;i++)
{
DQ_OUT;
DQ_LOW;
tmpData=WriteData&0x80;
delay_6uS();
if(tmpData)
{
DQ_HIGH;
}
else
{
DQ_LOW;
}
delay_10uS();
delay_10uS();
delay_10uS();
delay_10uS();
delay_10uS();
DQ_HIGH;
WriteData<<=1;
}
delay_10uS();
}
//溫度計算程序
void GetT()
{
if((MSB&0xF0)>0)
{ //判斷是否為負溫度
flag=1;
}
else
{
flag=0;
}
if(flag)
{ //如果為負溫度取反加1
MSB=~MSB;
LSB=~LSB+1;
}
t1=MSB<<4; //得到溫度整數部分
t1|=(LSB>>4);
t2=(uint)((LSB&0x0F)*0.0625*10000); //得到溫度小數部分并擴大10000 倍
}
void main()
{
WDTCTL=WDTPW+WDTHOLD;//關閉看門狗
while(1)
{
DS18B20Init();
WriteByte(0xCC); //跳過ROM 配置
WriteByte(0x44);//啟動溫度轉換
Delayus(1000);
DS18B20Init();
WriteByte(0xCC); //跳過ROM 配置
WriteByte(0xBE); //跳過ROM 配置
LSB=ReadByte(); //讀溫度數據低字節
MSB=ReadByte(); //讀溫度數據高字節
GetT(); //計算溫度
}
}
/*
uchar init_18b20(void)
{
uchar Error;
DQ_out;
_DINT();
DQ0;
DelayNus(50);
DQ1;
DelayNus(6);
DQ_in;
_NOP();
if(DQ_val)
{
Error = 1; //初始化失敗
}
else
{
Error = 0; //初始化成功
}
DQ_out;
DQ1;
DelayNus(40);
return Error;
}
void Write_18B20(uchar wdata)
{
uchar i;
for(i = 0; i < 8;i++)
{
DQ0;
delay_6uS(); //延時6us
if(wdata & 0X01) DQ1;
else DQ0;
wdata >>= 1;
DelayNus(5); //延時50us
DQ1;
delay_10uS(); //延時10us
}
}
uchar Read_18B20(void)
{
uchar i;
uchar temp = 0;
for(i = 0;i < 8;i++)
{
temp >>= 1;
DQ0;
delay_6uS(); //延時6us
DQ1;
delay_9uS(); //延時9us
DQ_in;
_NOP();
if(DQ_val) temp |= 0x80;
DelayNus(5); //延時45us
DQ_out;
DQ1;
delay_10uS(); ; //延時10us
}
return temp;
}
void Convert(void)
{
Write_18B20(0x44);
}
void Read_SP(void)
{
Write_18B20(0xbe);
}
void Skip(void)
{
Write_18B20(0xcc);
}
uint ReadTemp(void)
{
uchar temp_low;
uint temp;
temp_low = Read_18B20(); //讀低位
temp = Read_18B20(); //讀高位
temp = (temp<<8) | temp_low;
return temp;
}
uint Do1Convert(void)
{
uchar i;
do
{
i = init_18b20();
}
while(i);
Skip();
Convert();
for(i = 20;i > 0;i--)
DelayNus(60000); //延時800ms以上
do
{
i = init_18b20();
}
while(i);
Skip();
Read_SP();
return ReadTemp();
}
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
P1DIR=0x00;
P1SEL=0x00;
while(1)
{
Do1Convert();
}
}
*/
|