|
stc12c5A60S2,用32M的晶振,18B20的程序該怎么寫?怎么改都讀不到溫度,求大神帶~~
下面是原始的調用程序
void delayus(uint us)
{
while (us--);
}
void init_ds18b20()//ds18b20復位,初始化函數
{
unsigned int n;
shujuxian=1;
delayus(30);
shujuxian=0;
delayus(600);
shujuxian=1;
delayus(40);
n=shujuxian;
while(!shujuxian);//等待它釋放總線,釋放了,非1,退出
}
void wendu_write_byte(unsigned char dat)//寫一個字節,一位一位的寫,這里低位在前
{
unsigned char i;
for(i=0;i<8;i++)
{
shujuxian=0;
shujuxian=dat&0x01;//把寫的數給shujuxian,從最低位0x01寫起
delayus(30);
shujuxian=1;//因為要傳下一位數據
dat>>=1;//最低位在最前面,右移一位數據等下一次循環給shujuxian
delayus(30);//再稍微延時一會兒
}
}
unsigned char read_byte()//讀一個字節
{
unsigned char i,value;
for(i=0;i<8;i++)
{
shujuxian=0;
value>>=1;
shujuxian=1;
delayus(2);
if(shujuxian)
value|=0x80;
delayus(25);
}
return value;
}
unsigned char du_wendu()//讀溫度
{
unsigned char a,b;
init_ds18b20();
wendu_write_byte(0xcc);//跳過ROM,因為只有一個傳感器,窮啊
wendu_write_byte(0x44);//啟動溫度測量
delayus(800);//讓其有足夠的時間讀數據
init_ds18b20();//ds18b20初始化
wendu_write_byte(0xcc);//跳過ROM,因為只有一個傳感器,窮啊
wendu_write_byte(0xbe);//可以讀溫度了
a=read_byte();//讀低八位
b=read_byte();//讀高八位
b<<=4;
b+=((a&0xf0)>>4);//這兩句把小數點后的刪了,把正數的數據都存在高八位
return b;
}
求大神指點迷津
|
|