|
stc12c5A60S2,用32M的晶振,18B20的程序該怎么寫?怎么改都讀不到溫度,求大神帶~~
下面是原始的調(diào)用程序
void delayus(uint us)
{
while (us--);
}
void init_ds18b20()//ds18b20復(fù)位,初始化函數(shù)
{
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)//寫一個(gè)字節(jié),一位一位的寫,這里低位在前
{
unsigned char i;
for(i=0;i<8;i++)
{
shujuxian=0;
shujuxian=dat&0x01;//把寫的數(shù)給shujuxian,從最低位0x01寫起
delayus(30);
shujuxian=1;//因?yàn)橐獋飨乱晃粩?shù)據(jù)
dat>>=1;//最低位在最前面,右移一位數(shù)據(jù)等下一次循環(huán)給shujuxian
delayus(30);//再稍微延時(shí)一會(huì)兒
}
}
unsigned char read_byte()//讀一個(gè)字節(jié)
{
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);//跳過(guò)ROM,因?yàn)橹挥幸粋(gè)傳感器,窮啊
wendu_write_byte(0x44);//啟動(dòng)溫度測(cè)量
delayus(800);//讓其有足夠的時(shí)間讀數(shù)據(jù)
init_ds18b20();//ds18b20初始化
wendu_write_byte(0xcc);//跳過(guò)ROM,因?yàn)橹挥幸粋(gè)傳感器,窮啊
wendu_write_byte(0xbe);//可以讀溫度了
a=read_byte();//讀低八位
b=read_byte();//讀高八位
b<<=4;
b+=((a&0xf0)>>4);//這兩句把小數(shù)點(diǎn)后的刪了,把正數(shù)的數(shù)據(jù)都存在高八位
return b;
}
求大神指點(diǎn)迷津
|
|