高级会员
主题
回帖0
积分236
阅读权限30
注册时间2010-11-29
最后登录1970-1-1
在线时间 小时
|
头都快大了,濒临绝望!弄了无数次都没有成功。
程序也是参照本论坛的,也不行。 我用的单片机是:12c5a60s2 晶振12M 16X80的led点阵屏
现在温度总显示16.0度。用吹风筒吹ds18b20,数据不变。。。
麻烦各位大侠为小弟解答下。
sbit DQ =P2^6; // -- 定义通信端口
extern unsigned char T_int,T_dec;
unsigned char code t_tab[16]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9}; //小数第一位查表
void delay(unsigned char i) //(2*i+3) us
{
while(--i);
}
unsigned char DS18B20_init(void) //初始化函数
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(240); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(10); //15~60us
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(50); //60~240us
return(x);
}
unsigned char ReadOneChar(void)//读一个字节
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(40); //60~120us
}
return(dat);
}
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(20); //15~60us
DQ = 1;
dat>>=1;
}
}
void ReadTemperature(void)//读取温度
{
unsigned char data_H,data_L;
DS18B20_init();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
DS18B20_init();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
data_L=ReadOneChar();
data_H=ReadOneChar();
if(data_H>15) data_H=(~data_H+1),data_L=(~data_L+1); //低于零度为补码,取反加1
T_int=(data_H<<4)|(data_L>>4); //合并后得到原始温度数据 整数部分
T_dec=t_tab[(data_L&0x0F)];
} |
|