|
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;
}
求大神指点迷津
|
|