msp430f149+ds18b20读取温度数据全为1?串口显示正常,读回温度为-00.0625,设置断点看ds18b20读回的数据全为1 ?使用系统默认DCO频率
#include <msp430x14x.h>
#include <intrinsics.h>
#define CPU_F ((double)800000)
#define DelayNus(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define uint unsigned int
#define uchar unsigned char
#define DQ1 P1OUT |= BIT6
#define DQ0 P1OUT &= ~BIT6
#define DQ_in P1DIR &= ~BIT6
#define DQ_out P1DIR |= BIT6
#define DQ_val (P1IN & BIT6)
unsigned char Init_18B20(void);
void Write_18B20(uchar wdata);
unsigned char Read_18B20(void);
void Skip(void);
void Convert(void);
void Read_SP(void);
void Do1Convert(uchar *str);uint tm[2];
uchar Init_18B20(void)
{
uchar Error;
DQ_out; _DINT();
DQ0;
DelayNus(500);
DQ1;
DelayNus(55);
DQ_in;
_NOP();
if(DQ_val) {
Error = 1; //初始化失败
}
else
{
Error = 0; //初始化成功
}
DQ_out;
DQ1;
_EINT();
DelayNus(400);
return Error;
}
void Write_18B20(uchar wdata)
{
uchar i;
_DINT();
for(i = 0; i < 8;i++)
{
DQ_out;
DQ1;
_NOP();
_NOP();
DQ0;
DelayNus(6); //延时6us
if(wdata & 0x01) DQ1;
else DQ0;
wdata >>= 1;
DelayNus(65); //延时50us
DQ1;
DelayNus(10); //延时10us
}
_EINT();
}
uchar Read_18B20(void)
{
uchar i;
uchar temp = 0;
_DINT();
for(i = 0;i < 8;i++)
{ DQ_out;
_NOP();
DQ1;
DelayNus(2);
temp >>= 1;
DQ0;
DelayNus(6); //延时6us
DQ1;
DelayNus(8); //延时9us
DQ_in;
_NOP();
if(DQ_val) temp |= 0x80;
DelayNus(60); //延时45us
P2OUT=temp;
delay_ms(1000);
P2OUT=0xff;
delay_ms(200);
DQ_out;
DQ1;
DelayNus(10); //延时10us
}
_EINT();
return temp;
}
void Skip(void)
{
Write_18B20(0xcc);
}
void Convert(void)
{
Write_18B20(0x44);
}
void Read_SP(void)
{
Write_18B20(0xbe);
}
void Do1Convert(uchar *str) //DS18B20启动转换数据
{ uchar i;
uchar temp_low,temp_high;
do
{
i = Init_18B20();
}
while(i);
Skip();
Convert();
delay_ms(1000); //延时1秒等待转换结束
delay_ms(1000);
do
{
i = Init_18B20();
}
while(i);
Skip();
Read_SP();
temp_low = Read_18B20(); //读低位数据 temp_high = Read_18B20(); //读高位数据
// temp_low = 0x5e; //读低位数据 // temp_high = 0xff; //读高位数据
if ( temp_high>0x0f) //判断正负
{str[0] = '-';
temp_low=(~temp_low)+1;
if(temp_low==0)
{
temp_high=(~temp_high)+1;
}
else
{
temp_high=(~temp_high);
}
tm[0]= temp_low&0x0f;
temp_low=temp_low>>4;
tm[1]=temp_high<<4;
tm[1]=tm[1] | temp_low;
if(tm[1]/100==0)
{
str[1] = tm[1]%100/10 + 0x30;
str[2] =tm[1]%10 + 0x30;
str[3] = '.';
tm[0]= tm[0]*625;
str[4] = tm[0]/1000 + 0x30;
str[5] = tm[0]%1000/100 + 0x30;
str[6] = tm[0]%1000%100/10 + 0x30;
str[7] = tm[0]%10+0x30;
str[8] = '\0';
}
else
{
str[1] = tm[1]/100 + 0x30;
str[2] = tm[1]%100/10 + 0x30;
str[3] =tm[1]%10 + 0x30;
str[4] = '.';
tm[0]= tm[0]*625;
str[5] = tm[0]/1000 + 0x30;
str[6] = tm[0]%1000/100 + 0x30;
str[7] = tm[0]%1000%100/10 + 0x30;
str[8] = tm[0]%10+0x30;
str[9] = '\0';
}
}
else
{
tm[0]= temp_low&0x0f;
temp_low=temp_low>>4;
tm[1]=temp_high<<4;
tm[1]=tm[1] | temp_low;
if(tm[1]/100==0)
{
str[0] = tm[1]%100/10 + 0x30;
str[1] =tm[1]%10 + 0x30;
str[2] = '.';
tm[0]= tm[0]*625;
str[3] = tm[0]/1000 + 0x30;
str[4] = tm[0]%1000/100 + 0x30;
str[5] = tm[0]%1000%100/10 + 0x30;
str[6] = tm[0]%10+0x30;
str[7] = '\0';
}
else
{
str[0] = tm[1]/100 + 0x30;
str[1] = tm[1]%100/10 + 0x30;
str[2] =tm[1]%10 + 0x30;
str[3] = '.';
tm[0]= tm[0]*625;
str[4] = tm[0]/1000 + 0x30;
str[5] = tm[0]%1000/100 + 0x30;
str[6] = tm[0]%1000%100/10 + 0x30;
str[7] = tm[0]%10+0x30;
str[8] = '\0';
}
}}
void init() //系统初始化
{
WDTCTL = WDTPW + WDTHOLD;
P3SEL|=0x30;
P2DIR=0xff;
P2OUT=0xff;
}
void initusart0() //串口初始化
{
UCTL0=PENA+PEV+CHAR;
UTCTL0=SSEL0;
UBR00=0x03;
UBR10=0x00;
UMCTL0=0x4A;
ME1|=URXE0+UTXE0;
UCTL0&=~SWRST;
}
void sendonechar(uchar data)//发送一个字节
{
while(!(IFG1 & UTXIFG0));
TXBUF0=data;
}
void sendmuchchar(uchar *ptr)//发送一串字符,带\N
{
while(*ptr!='\0')
{
sendonechar(*ptr++);
}
while(!(IFG1 & UTXIFG0));
TXBUF0='\n';
}
void sendmuchchar0(uchar *ptr)//发送一串字符
{
while(*ptr!='\0')
{
sendonechar(*ptr++);
}
}
int main( void )
{ uchar buffer[10]; //存储显示的十进制数
init();
initusart0();
buffer[9]='\0'; //字符串终止符
while(1)
{
Do1Convert(buffer);
sendmuchchar0("liang chao – The temprature is:");//数据通过串口显示
sendmuchchar(buffer);
}
}
George Peter:
你的问题已经解决了吗?今天我也遇到同样的问题,不过通过一个由51改过来的代码解决了。我想你也直接用下看。
Jason Wang83:
18b20基本是51开发板上都有的经典传感器了,同楼上一样,建议楼主先认真阅读51上成功的程序,对照传感器说明进行理解,然后移植起来很快的。
Fuchong Wang:
回复 Jason Wang83:
提供一个理论实践证明可靠的msp430源代码嘛