|
调了两天的DS18B20,好无奈啊。延时是用AVR STUDIO仿真查看的。手上没有示波器。求帮我看看哪里错误了。
呜呜。路过的人帮我看下啊。我用的是ATMEGA128 外部16MHZ晶振。 PS : #define E 3
void delay_us (unsigned x)//延时
{
for(;x>0;x--)
{
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
//asm("NOP");
}
}
char ds18b20_reset(void)
{ char a=1;
DDRE|=BIT(E); //设置为输出
PORTE&=~BIT(E);//拉低电平
delay_us(950); //延迟600微妙 480-960US
PORTE|=BIT(E); //高电平释放总线 15-60us
delay_us(120);//延迟75us
PORTE|=BIT(E);
DDRE&=~BIT(E); //设置为上拉输入状态
a=(PINE&BIT(E))>>3; //读取BITE
delay_us(680); //延时420
DDRE|=BIT(E); //设置为输出
PORTE|=BIT(E); //高电平释放总线
delay_us(1);
return a;
}
void ds18b20_write(unsigned char data)
{
unsigned char i;
DDRE|=BIT(E); //设置输出
for(i=0;i<8;i++)
{
PORTE&=~BIT(E); //拉低总线
delay_us(18); //12US 写数据前15US总线需要被控制器拉至低电平
if(data&0x01) PORTE|=BIT(E); //为1写1
else PORTE&=~BIT(E); //为0写0
delay_us(95);//60US DS18B20在下降沿15s后开始数据采样
DDRE|=BIT(E); //设置输出
PORTE|=BIT(E); //释放总线
data>>1;
delay_us(1);
}
}
unsigned char ds18b20_read(void)
{
unsigned char i,temp=0;
for(i=0;i<8;i++)
{
temp>>=1;
DDRE|=BIT(E); //输出状态
PORTE&=~BIT(E);//拉低总线
delay_us(4); //3us 大于1us
PORTE|=BIT(E);//释放总线
delay_us(4); //延时3us等18b20挂起数据
DDRE&=~BIT(E);//设置为输入状态
if((PINE&BIT(E))==BIT(E)) temp|=0x80; //下降沿15us内完成
delay_us(95); //延迟60微秒
DDRE|=BIT(E); //输出状态
PORTE|=BIT(E);//释放总线
delay_us(1);
}
return temp;
}
unsigned int read_temperature(void)
{
unsigned int temp1=0,temp2=0;
ds18b20_reset();
ds18b20_write(0xcc);//跳过rom
ds18b20_write(0x44);//温度转换
delay(1000);
delay(1000);
ds18b20_reset();
ds18b20_write(0xcc);//跳过rom
ds18b20_write(0xbe);//读取RAM寄存器
temp1=(unsigned int)ds18b20_read();
temp2=(unsigned int)ds18b20_read();
ds18b20_reset(); //复位终止
return ((temp2<<8)|temp1)*6.25; //*0.0625为真实温度 这里取整数
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|