电路图设计:
链接:https://pan.baidu.com/s/1Bdh_iB6P-lDhjchZogIrdQ
提取码:1234
部分参考代码:
#include <iom16v.h>
#include <macros.h>
#include "ds18b20.h"
//#include "lcd1602.h"
//微妙级延迟函数avr 16 以8MHz为例加上for循环,他需要执行1142条指令才是1ms,
void delay_1us(void)
{
asm("nop");
}
void Delay_1us(unsigned int x)//所以这里存在一定的偏差。
{
unsigned int i=0;
for( i=0;i<x;i++)delay_1us();
}
//DS18B20复位函数
void DS18B20_Reset(void)
{ /*
DQ_1; //输出低电平
DQ_OUT; //DQ为输出状态
DQ_0; //输出低电平
Delay_1us(500); //延迟500微妙
DQ_1; //释放总线
Delay_1us(60); //延迟60微妙
DQ_IN; //DQ位输入状态
while(DQ_RD); //等待从机DS18B20应答(低电平有效)
while(!(DQ_RD));*/ //等待从机DS18B20释放总线机DS18B20释放总线
//这里要加个括号判断优先级
while(1)
{
DQ_OUT;
DQ_0;
Delay_1us(480); //延时480us
DQ_1;
Delay_1us(60);
DQ_IN; //设置为输入端,接收应答信号
if(!(DQ_RD)) //收到应答信号
{
DQ_1;
Delay_1us(240);
break;
} //延时240us
}
}
//DS18B20写字节函数
void DS18B20_Write(unsigned char Data)
{
unsigned char i;
DQ_OUT; //DQ为输出
for(i=0;i<8;i++)
{
DQ_0; //拉低总线
Delay_1us(10); //延迟10微妙(最大15微妙)
if(Data&0x01)DQ_1;
else DQ_0;
Delay_1us(40); //延迟40微妙(最大45微妙)
DQ_1; //释放总线
Delay_1us(1); //稍微延迟
Data>>=1;
}
}
//DS18B20读字节函数
unsigned char DS18B20_Read(void)
{
unsigned char i,Temp;
for(i=0;i<8;i++)
{
Temp>>=1; //数据右移
DQ_OUT; //DQ为输出状态
DQ_0; //拉低总线,启动输入
DQ_1; //释放总线
DQ_IN; //DQ为输入状态
Delay_1us(2);
if(DQ_RD) Temp|=0x80;
Delay_1us(60); //延迟45微妙(最大45微妙)
}
return Temp;
}
/*void GetROMSequence()//读地址号代码,用lcd1602显示
{
unsigned char i,temp;
DS18B20_Reset();
DS18B20_Write(READ_ROM);
for (i = 0; i < 8; i++)
ROMData1[i] = DS18B20_Read();
lcd_com(0x80);
for(i=0;i<8;i++)
{
temp=ROMData1[i]>>4;
if(temp<10)
{
lcd_dat(0x30+temp);
}
else
{
lcd_dat(0x37+temp);
}
temp=ROMData1[i]&0x0f;
if(temp<10)
{
lcd_dat(0x30+temp);
}
else
{
lcd_dat(0x37+temp);
}
}
}*/
.