AVR接DS18B20,我在OURAVR上发过
//m26温度测量通过串口传到电脑;8MHZ
#define CL_DQ PORTD&=~(1<<PD7)
#define SET_DQ PORTD|=(1<<PD7)
#define SET_OUT DDRD|=(1<<PD7)
#define SET_IN DDRD&=~(1<<PD7)
#define IN_DQ PIND&(1<<PD7)
void write_1820(uchar x)
{ uchar m;
CLI();
for(m=0;m<8;m++)
{
CL_DQ;
if(x&(1<<m)) //写数据,从低位开始
{Delay_nus(2);SET_DQ; }
else
CL_DQ;
Delay_nus(60); //15~60us
SET_DQ;
Delay_nus(10);
}
SET_DQ;
SEI();
}
uchar read_1820()
{ uchar temp,k,n;
CLI();
temp="0";
for(n=0;n<8;n++)
{
CL_DQ;
//Delay_nus(2);
SET_DQ;
//delay(3);
SET_IN;
Delay_nus(1);
k="IN"_DQ; //读数据,从低位开始
if(k)
temp|=(1<<n);
else
temp&=~(1<<n);
Delay_nus(70); //60~120us
SET_OUT;
}
SEI();
return (temp);
}
void init_1820(void)
{CLI();
SET_OUT;
SET_DQ;//输出1
CL_DQ;
Delay_nus(550);//拉低一段时间
SET_DQ;//释放
SET_IN;//输入
Delay_nus(60);
while(IN_DQ) {;}//等待回复
Delay_nus(240);//回复的低电平在60到240US
SET_OUT;
SET_DQ;//回到初始DQ=1;
SEI();
}
void Temper(void) //主函数
{
uint j,tem;
uchar i,temh,teml;
init_1820(); //复位18b20
write_1820(0xcc); // 发出转换命令 搜索器件
write_1820(0x44); //启动
for(j=1000;j>1;j--)
Delay_nus(1000);//转换一次12位的 最多750MS
init_1820();
write_1820(0xcc); //发出读命令
write_1820(0xbe);
teml="read"_1820(); //读数据
temh="read"_1820();
tem=(teml>>4)+(temh<<4);
Int_to_Char(tem,Date);
puts(Date);
if(LCD)
{
LCD_write_string(2,1,"is :");
LCD_write_string(8,1,Date);
LCD_write_string(13,1,"du");
}
//每次转换需要延时
Delay_nms(100);
}
文章评论(0条评论)
登录后参与讨论